From 45153b5ee66048db20f99c67f6fbfaa0fe6fc0c5 Mon Sep 17 00:00:00 2001 From: Shang Date: Sat, 6 Jun 2026 23:04:59 +0800 Subject: [PATCH 001/231] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/maven-build.yml | 4 +- .github/workflows/maven-deploy.yml | 6 +- JDK21_UPGRADE_PLAN.md | 210 +++++++++++ cat-alarm/pom.xml | 4 +- .../cat/build/CatDatabaseConfigurator.java | 2 +- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- cat-boot/pom.xml | 99 +++++ .../dianping/cat/boot/CatBootApplication.java | 11 + .../dianping/cat/boot/EmbeddedCatServer.java | 52 +++ cat-client/pom.xml | 9 +- .../message/context/MessageIdFactoryTest.java | 40 +- .../src/test/resources/log4j.properties | 4 + cat-consumer/pom.xml | 33 +- .../cat/consumer/state/StateAnalyzer.java | 4 + .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../cat/consumer/cross/CrossAnalyzerTest.java | 2 +- .../cat/consumer/event/EventAnalyzerTest.java | 4 +- .../heartbeat/HeartbeatAnalyzerTest.java | 2 +- .../consumer/matrix/MatrixAnalyzerTest.java | 3 +- .../consumer/problem/ProblemAnalyzerTest.java | 2 + .../transaction/TransactionAnalyzerTest.java | 4 +- .../src/test/resources/logback-test.xml | 11 + cat-core/pom.xml | 23 +- .../cat/build/CatDatabaseConfigurator.java | 2 +- .../message/codec/PlainTextMessageCodec.java | 7 +- .../cat/message/spi/DefaultMessageTree.java | 4 +- .../resources/META-INF/wizard/jdbc/wizard.xml | 8 +- cat-core/src/test/resources/log4j.properties | 4 + cat-core/src/test/resources/logback-test.xml | 11 + cat-home/pom.xml | 97 +++-- .../cat/build/CatDatabaseConfigurator.java | 2 +- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- cat-home/src/main/resources/logback.xml | 12 + .../cat/report/task/TaskHelperTest.java | 17 +- docker/Dockerfile | 14 +- docker/datasources.xml | 4 +- docker/docker-compose.yml | 36 +- lib/java/pom.xml | 6 +- pom.xml | 352 +++++++++++------- 39 files changed, 807 insertions(+), 304 deletions(-) create mode 100644 JDK21_UPGRADE_PLAN.md create mode 100644 cat-boot/pom.xml create mode 100644 cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java create mode 100644 cat-boot/src/main/java/com/dianping/cat/boot/EmbeddedCatServer.java create mode 100644 cat-client/src/test/resources/log4j.properties create mode 100644 cat-consumer/src/test/resources/logback-test.xml create mode 100644 cat-core/src/test/resources/log4j.properties create mode 100644 cat-core/src/test/resources/logback-test.xml create mode 100644 cat-home/src/main/resources/logback.xml diff --git a/.github/workflows/maven-build.yml b/.github/workflows/maven-build.yml index 4644326e6e..62105f110a 100644 --- a/.github/workflows/maven-build.yml +++ b/.github/workflows/maven-build.yml @@ -24,10 +24,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 8 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: - java-version: '8' + java-version: '21' distribution: 'temurin' cache: 'maven' diff --git a/.github/workflows/maven-deploy.yml b/.github/workflows/maven-deploy.yml index 4fe4df9144..ca62d454f4 100644 --- a/.github/workflows/maven-deploy.yml +++ b/.github/workflows/maven-deploy.yml @@ -17,10 +17,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 8 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: - java-version: '8' + java-version: '21' distribution: 'temurin' cache: 'maven' server-id: ossrh @@ -43,4 +43,4 @@ jobs: env: MAVEN_USERNAME: ${{ secrets.MAVEN_USER }} MAVEN_PASSWORD: ${{ secrets.MAVEN_TOKEN }} - MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} \ No newline at end of file + MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} diff --git a/JDK21_UPGRADE_PLAN.md b/JDK21_UPGRADE_PLAN.md new file mode 100644 index 0000000000..2f68e3597f --- /dev/null +++ b/JDK21_UPGRADE_PLAN.md @@ -0,0 +1,210 @@ +# CAT JDK 21 升级计划 + +## 目标 + +将当前 CAT 工程升级到 JDK 21 构建和运行,替换高风险历史依赖,并逐步从“外置 Tomcat + WAR”部署方式迁移到“JDK 21 + 可执行 JAR + 内嵌容器”部署方式。 + +这次升级不只改版本号。项目仍依赖 `javax.servlet`、`web.xml`、Unidal MVC、Plexus 组件、JSP、历史 Log4j 1.x API 和 MySQL/Netty/Hadoop 等基础库。升级需要分阶段推进,每个阶段都要保持可编译、可测试、可打包、可启动。 + +## 当前推荐路线 + +推荐采用“两步容器迁移”: + +1. 先把工程构建、运行时和主要基础依赖升级到 JDK 21 可用状态。 +2. 新增 `cat-boot` 过渡模块,用 Spring Boot 4 稳定版作为启动外壳,但 Web 容器暂时锁定在 Tomcat 9 线,继续兼容现有 `javax.servlet` / JSP / Unidal MVC。 +3. Docker 从外置 Tomcat 镜像切换为 JDK 21 runtime 镜像,通过 `java -jar /app/cat-boot.jar` 启动。 +4. 后续单独评估 Jakarta 迁移,确认 Unidal MVC、JSP、Servlet Filter 和插件体系可行后,再考虑真正切换到 Spring Boot 4 原生 Jakarta Web 栈。 + +不建议第一步直接把现有 Web 层 Jakarta 化。Spring Boot 4 的 Web 生态基于 Jakarta Servlet,而当前项目大量代码和依赖仍是 `javax.servlet`,直接切换会把 JDK、容器、MVC、JSP、Filter、依赖树问题混在一起,风险过高。 + +## 已完成的升级项 + +### 1. JDK 21 构建基线 + +- 根 POM 已改为 `21`。 +- Maven Enforcer 已要求 Java `[21,22)` 和 Maven `[3.9.0,)`。 +- Maven 插件已升级到 JDK 21 兼容版本,包括 compiler、surefire、war、shade、source、javadoc、enforcer。 +- GitHub Actions 已从 JDK 8 切换到 JDK 21。 +- Docker 构建镜像已切换到 `maven:3.9.12-eclipse-temurin-21`。 + +### 2. 测试兼容性修复 + +- 修复 `DefaultMessageTree.copyForTest()` 对消息长度头的处理,并释放 `ByteBuf`。 +- `PlainTextMessageCodec` 解码后补充完成态设置。 +- 多个 consumer analyzer 测试补充 `setCompleted()`。 +- `TaskHelperTest` 移除 PowerMock,用普通 JUnit/Mockito 风格验证。 +- `StateAnalyzer` 增加测试所需的 `setMIp(String ip)`。 + +### 3. 日志组件迁移到 Logback + +- Logback 已升级到 `1.5.34`。 +- SLF4J 使用 `2.0.17` 稳定线。 +- 服务端模块引入 `logback-classic` 和 `log4j-over-slf4j`。 +- 排除 Hadoop 传递进来的旧 `slf4j-log4j12` 和 `log4j`。 +- 新增 `cat-home/src/main/resources/logback.xml`。 +- 测试模块新增 `logback-test.xml` 或测试用 `log4j.properties`,避免测试日志绑定冲突。 +- 保留 `log4j:log4j` 的 optional/provided 兼容依赖,用于 CAT 客户端对外暴露的 Log4j 1.x Appender API;它不应作为服务端运行时日志实现。 + +### 4. JSON 组件迁移到 fastjson2 + +- `com.alibaba:fastjson` 已替换为 `com.alibaba.fastjson2:fastjson2`。 +- fastjson2 已升级到 `2.0.62`。 +- 当前源码未发现直接使用 `com.alibaba.fastjson.*` import,本阶段主要是依赖坐标迁移。 + +### 5. 低风险依赖升级 + +- JUnit 升级到 `4.13.2`。 +- Netty 升级到 `4.1.128.Final`,不采用 Netty 5 alpha。 +- Gson 升级到 `2.13.2`。 +- HttpClient/HttpMime 升级到 `4.5.14`。 +- Commons Codec 升级到 `1.19.0`。 +- Snappy 升级到 `1.1.10.8`。 +- Freemarker 升级到 `2.3.34`。 +- c3p0 升级到 `0.11.2`。 +- Plexus Utils 升级到 `4.0.2`。 +- java-saml 升级到 `2.9.0`。 +- MySQL 驱动坐标从 `mysql:mysql-connector-java` 切换为 `com.mysql:mysql-connector-j:9.7.0`。 +- MySQL 驱动类配置更新为 `com.mysql.cj.jdbc.Driver`。 + +### 6. Spring Boot 过渡启动模块 + +- 新增 `cat-boot` 模块。 +- `cat-boot` 引入 Spring Boot `4.0.2` 稳定版作为启动外壳。 +- `cat-boot` 显式使用 `tomcat-embed-core` / `tomcat-embed-jasper` `9.0.112`,继续兼容现有 `javax.servlet` Web 层。 +- `cat-boot` 打包时复制 `cat-home.war` 到 classpath,并通过 shade 生成可执行 JAR。 +- `CatBootApplication` 启动 Spring Boot 后,由 `EmbeddedCatServer` 解出 `cat-home.war` 并部署到 `/cat`。 +- shade 配置已排除 `META-INF/*.SF`、`META-INF/*.DSA`、`META-INF/*.RSA`,避免 JDK 21 下 fat jar 签名校验失败。 + +### 7. Docker 运行方式切换 + +- Docker runtime 镜像已从 Tomcat/JRE 8 切换为 `eclipse-temurin:21-jre`。 +- Docker 运行入口已改为 `java -Dcat.home=/data/appdatas/cat -Dserver.port=8080 -jar /app/cat-boot.jar`。 +- `docker-compose.yml` 已改为基于当前 Dockerfile 构建 `cat:4.0-RC1-jdk21`,不再默认拉取旧的 `meituaninc/cat:3.0.1` 镜像。 + +## 当前验证结果 + +已通过的验证: + +- `mvn -pl cat-consumer -am test` +- `mvn -pl cat-alarm -am test` +- `mvn -pl cat-boot -am package -DskipTests` +- `mvn package -DskipTests` +- `mvn test` +- `java -Dserver.port=0 -jar cat-boot/target/cat-boot-4.0-RC1.jar` 短启动验证 +- `java -Dcat.home=.tmp-cat-home -Dserver.port=18080 -jar cat-boot/target/cat-boot-4.0-RC1.jar` 短启动和 HTTP 探测 + +短启动中已确认: + +- Spring Boot `4.0.2` 启动。 +- Embedded Tomcat `9.0.112` 启动。 +- CAT Web 应用部署到 `/cat`。 +- Netty receiver 启动日志出现。 +- 本地未配置 `datasources.xml` / `server.xml` 时会出现数据源缺失日志,这是运行环境配置问题,不是构建失败。 +- 使用临时 `cat.home` 访问 `/cat/r` 可到达 Web 层,但返回 500;堆栈指向缺少数据源和 top service 注册,不是 Spring Boot/Tomcat 启动失败。 +- 当前机器未安装或未暴露 `docker` 命令,Docker build/compose 端到端验证尚未执行。 + +## 待完成验证 + +### 1. 全量打包复验 + +在最终提交前继续执行: + +```bash +mvn package -DskipTests +``` + +通过后确认: + +- `cat-home/target/cat-home-4.0-RC1.war` 存在。 +- `cat-boot/target/cat-boot-4.0-RC1.jar` 存在。 + +### 2. Docker 构建验证 + +需要在可用 Docker 环境中执行: + +```bash +docker build -f docker/Dockerfile . +``` + +验收标准: + +- Maven 构建阶段成功。 +- runtime 镜像只依赖 JDK 21 runtime,不依赖外置 Tomcat。 +- 镜像内存在 `/app/cat-boot.jar`。 + +### 3. Docker Compose 端到端验证 + +需要执行: + +```bash +docker compose -f docker/docker-compose.yml up --build +``` + +验收标准: + +- MySQL 容器启动并初始化 `cat` schema。 +- CAT 容器启动成功。 +- `8080` Web 端口可访问。 +- `2280` TCP 接收端口可监听。 +- `/cat/r`、`/cat/s` 等路由可访问。 +- JSP 页面和静态资源可正常加载。 +- Logback 日志正常输出。 +- JSON 输出结构保持兼容。 + +### 4. 带真实配置的运行冒烟 + +需要提供或挂载真实配置: + +- `client.xml` +- `server.xml` +- `datasources.xml` + +验收标准: + +- MySQL 数据源初始化成功。 +- 服务端能写入和读取 CAT 配置。 +- 客户端上报链路可打通。 +- 报表页面可访问。 +- 告警配置和通知链路无启动异常。 + +## 仍需单独评估的升级项 + +### 1. Jakarta / Spring Boot 原生 Web 栈迁移 + +当前 `cat-boot` 是过渡方案,不等于已经完成 Spring Boot 4 原生 Web 迁移。后续需要单独评估: + +- `javax.servlet.*` 到 `jakarta.servlet.*` 的代码迁移。 +- `web.xml` namespace 和 Servlet/JSP/JSTL 依赖迁移。 +- Unidal MVC 是否支持 Jakarta。 +- Plexus 组件初始化顺序是否受影响。 +- JSP 在新容器中的渲染兼容性。 +- Filter dispatch、权限过滤、Domain 过滤是否保持兼容。 + +### 2. Unidal 升级 + +Maven 版本检查显示 Unidal framework 有 4.x 线,但它影响 MVC、Plexus、DAL、代码生成和运行时组件,不应和当前 JDK/Spring Boot 过渡升级混在一起。建议后续单独开分支验证。 + +### 3. Hadoop 升级 + +Hadoop `2.4.1` 到 3.x 是高风险升级,会影响 HDFS/logview 相关行为和传递依赖。建议单独处理,并补充 HDFS 场景验证。 + +### 4. 历史兼容 API + +CAT 客户端仍对外提供 Log4j 1.x Appender 等历史集成 API。服务端运行时可以迁移到 Logback,但客户端 API 是否彻底移除需要单独评估兼容性和用户影响。 + +## 提交拆分建议 + +建议按以下顺序拆分提交: + +1. JDK 21 构建基线、Maven 插件、CI 配置。 +2. JDK 21 下的测试修复。 +3. Logback 迁移。 +4. fastjson2 迁移。 +5. 低风险依赖升级。 +6. 新增 `cat-boot` 过渡启动模块。 +7. Docker 从外置 Tomcat 切换为 `java -jar`。 +8. 升级计划文档和验证记录。 + +## 当前结论 + +当前推荐方案已经进入可继续验证状态:JDK 21 构建、Logback、fastjson2、低风险依赖和 `cat-boot` 可执行 JAR 已完成初步升级。接下来重点不是继续扩大版本升级范围,而是完成 Docker/MySQL/JSP/路由/上报链路的端到端验证,并把 Jakarta 迁移作为后续独立阶段处理。 diff --git a/cat-alarm/pom.xml b/cat-alarm/pom.xml index 0d7c8058ce..62f05c71d4 100644 --- a/cat-alarm/pom.xml +++ b/cat-alarm/pom.xml @@ -72,8 +72,8 @@ httpmime - com.alibaba - fastjson + com.alibaba.fastjson2 + fastjson2 junit diff --git a/cat-alarm/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java b/cat-alarm/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java index 0902ecb56c..a64b6ae00f 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java +++ b/cat-alarm/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java @@ -29,7 +29,7 @@ final class CatDatabaseConfigurator extends AbstractJdbcResourceConfigurator { public List defineComponents() { List all = new ArrayList(); - // all.add(defineJdbcDataSourceComponent("cat", "com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/cat", "root", "***", "")); + // all.add(defineJdbcDataSourceComponent("cat", "com.mysql.cj.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/cat", "root", "***", "")); defineSimpleTableProviderComponents(all, "cat", com.dianping.cat.alarm._INDEX.getEntityClasses()); defineDaoComponents(all, com.dianping.cat.alarm._INDEX.getDaoClasses()); diff --git a/cat-alarm/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-alarm/src/main/resources/META-INF/wizard/jdbc/wizard.xml index 9e08c7e17d..9a44d7f8bf 100644 --- a/cat-alarm/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-alarm/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -2,7 +2,7 @@ - com.mysql.jdbc.Driver + com.mysql.cj.jdbc.Driver jdbc:mysql://127.0.0.1:3306/cat root diff --git a/cat-boot/pom.xml b/cat-boot/pom.xml new file mode 100644 index 0000000000..e477487093 --- /dev/null +++ b/cat-boot/pom.xml @@ -0,0 +1,99 @@ + + + + com.dianping.cat + parent + 4.0-RC1 + + 4.0.0 + cat-boot + cat-boot + jar + + + + org.springframework.boot + spring-boot + ${spring-boot.version} + + + org.apache.tomcat.embed + tomcat-embed-core + ${tomcat9.version} + + + org.apache.tomcat.embed + tomcat-embed-jasper + ${tomcat9.version} + + + com.dianping.cat + cat-home + war + runtime + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.9.0 + + + copy-cat-home-war + process-resources + + copy + + + + + com.dianping.cat + cat-home + ${project.version} + war + ${project.build.outputDirectory} + cat-home.war + + + + + + + + org.apache.maven.plugins + maven-shade-plugin + + + package + + shade + + + false + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + com.dianping.cat.boot.CatBootApplication + + + + + + + + + diff --git a/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java b/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java new file mode 100644 index 0000000000..d4aa3b9486 --- /dev/null +++ b/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java @@ -0,0 +1,11 @@ +package com.dianping.cat.boot; + +import org.springframework.boot.SpringApplication; + +public class CatBootApplication { + + public static void main(String[] args) throws Exception { + SpringApplication.run(CatBootApplication.class, args); + new EmbeddedCatServer().start(); + } +} diff --git a/cat-boot/src/main/java/com/dianping/cat/boot/EmbeddedCatServer.java b/cat-boot/src/main/java/com/dianping/cat/boot/EmbeddedCatServer.java new file mode 100644 index 0000000000..f5b2f5b2ad --- /dev/null +++ b/cat-boot/src/main/java/com/dianping/cat/boot/EmbeddedCatServer.java @@ -0,0 +1,52 @@ +package com.dianping.cat.boot; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.apache.catalina.Context; +import org.apache.catalina.startup.Tomcat; + +public class EmbeddedCatServer { + + private static final String WAR_RESOURCE = "cat-home.war"; + + private static final String CONTEXT_PATH = "/cat"; + + public void start() throws IOException { + int port = Integer.parseInt(System.getProperty("server.port", "8080")); + Path baseDir = Files.createTempDirectory("cat-boot-"); + Path appBase = Files.createDirectories(baseDir.resolve("webapps")); + Path warFile = copyWar(baseDir); + + Tomcat tomcat = new Tomcat(); + tomcat.setBaseDir(baseDir.toString()); + tomcat.setPort(port); + tomcat.getConnector().setURIEncoding("UTF-8"); + tomcat.getHost().setAppBase(appBase.toString()); + + Context context = tomcat.addWebapp(CONTEXT_PATH, warFile.toString()); + context.setParentClassLoader(getClass().getClassLoader()); + + try { + tomcat.start(); + tomcat.getServer().await(); + } catch (Exception e) { + throw new IllegalStateException("Failed to start embedded CAT web application.", e); + } + } + + private Path copyWar(Path baseDir) throws IOException { + Path warFile = baseDir.resolve(WAR_RESOURCE); + + try (InputStream input = getClass().getClassLoader().getResourceAsStream(WAR_RESOURCE)) { + if (input == null) { + throw new IllegalStateException("Missing " + WAR_RESOURCE + " on classpath."); + } + Files.copy(input, warFile); + } + + return warFile; + } +} diff --git a/cat-client/pom.xml b/cat-client/pom.xml index 0a4015ec5f..9163891a00 100644 --- a/cat-client/pom.xml +++ b/cat-client/pom.xml @@ -39,11 +39,10 @@ - - org.apache.maven.plugins - maven-shade-plugin - 3.3.0 - + + org.apache.maven.plugins + maven-shade-plugin + package diff --git a/cat-client/src/test/java/com/dianping/cat/message/context/MessageIdFactoryTest.java b/cat-client/src/test/java/com/dianping/cat/message/context/MessageIdFactoryTest.java index 255fe11979..8f4c6d5023 100644 --- a/cat-client/src/test/java/com/dianping/cat/message/context/MessageIdFactoryTest.java +++ b/cat-client/src/test/java/com/dianping/cat/message/context/MessageIdFactoryTest.java @@ -53,9 +53,7 @@ public static void main(String... args) throws Exception { @Test public void testDefaultDomain() throws IOException { - File baseDir = new File("target/mark"); - - new File(baseDir, "default-domain.mark").delete(); + File baseDir = newMarkDir("default-domain"); MessageIdFactory factory = new MockMessageIdFactory(baseDir, "default-domain"); @@ -66,9 +64,7 @@ public void testDefaultDomain() throws IOException { @Test public void testGivenDomain() throws IOException { - File baseDir = new File("target/mark"); - - new File(baseDir, "given-domain.mark").delete(); + File baseDir = newMarkDir("given-domain"); MessageIdFactory factory = new MockMessageIdFactory(baseDir, "default-domain"); @@ -79,9 +75,7 @@ public void testGivenDomain() throws IOException { @Test public void testDefaultDomainInParallel() throws Exception { - File baseDir = new File("target/mark"); - - new File(baseDir, "default-parallel.mark").delete(); + File baseDir = newMarkDir("default-parallel"); final MessageIdFactory factory = new MockMessageIdFactory(baseDir, "default-parallel"); final Set ids = Collections.synchronizedSet(new HashSet()); @@ -101,10 +95,11 @@ public void run() { } pool.shutdown(); - pool.awaitTermination(2000, TimeUnit.MILLISECONDS); + boolean completed = pool.awaitTermination(30, TimeUnit.SECONDS); int total = threads * messagesPerThread; + Assert.assertTrue("Not all threads completed in time.", completed); Assert.assertEquals("Not all threads completed in time.", total, ids.size()); Assert.assertEquals(true, ids.contains(String.format("default-parallel-c0a81f9e-403215-%s", total - 1))); Assert.assertEquals(String.format("default-parallel-c0a81f9e-403215-%s", total), factory.getNextId()); @@ -112,9 +107,7 @@ public void run() { @Test public void testGivenDomainInParallel() throws Exception { - File baseDir = new File("target/mark"); - - new File(baseDir, "given-parallel.mark").delete(); + File baseDir = newMarkDir("given-parallel"); final MessageIdFactory factory = new MockMessageIdFactory(baseDir, "default-parallel"); final Set ids = Collections.synchronizedSet(new HashSet()); @@ -134,10 +127,11 @@ public void run() { } pool.shutdown(); - pool.awaitTermination(2000, TimeUnit.MILLISECONDS); + boolean completed = pool.awaitTermination(30, TimeUnit.SECONDS); int total = threads * messagesPerThread; + Assert.assertTrue("Not all threads completed in time.", completed); Assert.assertEquals("Not all threads completed in time.", total, ids.size()); Assert.assertEquals(true, ids.contains(String.format("given-parallel-c0a81f9e-403215-%s", total - 1))); Assert.assertEquals(String.format("given-parallel-c0a81f9e-403215-%s", total), @@ -146,9 +140,7 @@ public void run() { @Test public void testDefaultDomainResume() throws IOException { - File baseDir = new File("target/mark"); - - new File(baseDir, "default-resume.mark").delete(); + File baseDir = newMarkDir("default-resume"); // first round MessageIdFactory factory = new MockMessageIdFactory(baseDir, "default-resume"); @@ -169,9 +161,7 @@ public void testDefaultDomainResume() throws IOException { @Test public void testGivenDomainResume() throws IOException { - File baseDir = new File("target/mark"); - - new File(baseDir, "given-resume.mark").delete(); + File baseDir = newMarkDir("given-resume"); // first round MessageIdFactory factory = new MockMessageIdFactory(baseDir, "default-resume"); @@ -303,4 +293,12 @@ protected String getIpAddress() { return "c0a81f9e"; } } -} \ No newline at end of file + + private File newMarkDir(String name) { + File baseDir = new File("target/mark/" + name); + + Files.forDir().delete(baseDir, true); + + return baseDir; + } +} diff --git a/cat-client/src/test/resources/log4j.properties b/cat-client/src/test/resources/log4j.properties new file mode 100644 index 0000000000..42a4b984de --- /dev/null +++ b/cat-client/src/test/resources/log4j.properties @@ -0,0 +1,4 @@ +log4j.rootLogger=WARN, CONSOLE +log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender +log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout +log4j.appender.CONSOLE.layout.ConversionPattern=[%d{HH:mm:ss.SSS}] [%-5p] [%c{1}] %m%n diff --git a/cat-consumer/pom.xml b/cat-consumer/pom.xml index fb48f73398..4953fb9c30 100644 --- a/cat-consumer/pom.xml +++ b/cat-consumer/pom.xml @@ -24,21 +24,26 @@ test-framework test - - com.google.code.gson - gson - test - - - junit - junit - test - - - mysql - mysql-connector-java - runtime + + com.google.code.gson + gson + test + + + ch.qos.logback + logback-classic + test + + + junit + junit + test + + com.mysql + mysql-connector-j + runtime + xmlunit xmlunit diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateAnalyzer.java index eca9eab543..30603a7bcf 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateAnalyzer.java @@ -221,6 +221,10 @@ public boolean isEligable(MessageTree tree) { return heartbeats.size() > 0; } + public void setMIp(String ip) { + m_ip = ip; + } + @Override protected void loadReports() { // do nothing diff --git a/cat-consumer/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-consumer/src/main/resources/META-INF/wizard/jdbc/wizard.xml index b1e00faeab..6999990366 100644 --- a/cat-consumer/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-consumer/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -2,7 +2,7 @@ - com.mysql.jdbc.Driver + com.mysql.cj.jdbc.Driver jdbc:mysql://192.168.7.43:3306/cat dpcom_cat password diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossAnalyzerTest.java index a0831857af..f3ec92c154 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossAnalyzerTest.java @@ -116,7 +116,7 @@ protected MessageTree generateMessageTree(int i) { t.addChild(eventApp); } - t.complete(); + t.setCompleted(); t.setDurationInMillis(i * 2); t.setTimestamp(m_timestamp + 1000); tree.setMessage(t); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventAnalyzerTest.java index 844f8ec6ae..c3e7d9a6aa 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventAnalyzerTest.java @@ -97,7 +97,7 @@ protected MessageTree generateMessageTree(int i) { event1.setTimestamp(m_timestamp + 5 * 60 * 1000); t2.addChild(event1); - t2.complete(); + t2.setCompleted(); t2.setDurationInMillis(i); t.addChild(t2); @@ -113,7 +113,7 @@ protected MessageTree generateMessageTree(int i) { event.setStatus(Message.SUCCESS); t.addChild(event); - t.complete(); + t.setCompleted(); t.setDurationInMillis(i * 2); t.setTimestamp(m_timestamp + 1000); t2.setTimestamp(m_timestamp + 2000); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.java index d33830955e..70d1706261 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.java @@ -89,7 +89,7 @@ protected MessageTree generateMessageTree(int i) throws IOException { t.addChild(heartbeat); - t.complete(); + t.setCompleted(); t.setDurationInMillis(i * 2); t.setTimestamp(m_timestamp + 1000); tree.setMessage(t); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.java index 24081d7bc7..437a4aa354 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.java @@ -103,9 +103,10 @@ protected MessageTree generateMessageTree(int i) { event.setTimestamp(m_timestamp + 5 * 60 * 1000); event.setDurationInMillis(i); event.setStatus(Message.SUCCESS); + event.setCompleted(); t.addChild(event); - t.complete(); + t.setCompleted(); t.setDurationInMillis(i * 2); t.setTimestamp(m_timestamp + 1000); tree.setMessage(t); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.java index a83e4809b3..7a28fc45d9 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.java @@ -134,6 +134,8 @@ protected MessageTree generateMessageTree(int i) { DefaultTransaction transaction = new DefaultTransaction("Transaction", "Transaction"); transaction.setStatus(Transaction.SUCCESS); + transaction.setCompleted(); + t.setCompleted(); t.addChild(transaction); t.addChild(error); t.addChild(exception); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.java index 7e8cfbfed3..eca8341ee0 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.java @@ -102,7 +102,7 @@ protected MessageTree generateMessageTree(int i) { t2.setStatus(Message.SUCCESS); } - t2.complete(); + t2.setCompleted(); t2.setDurationInMillis(i); t.addChild(t2); @@ -113,7 +113,7 @@ protected MessageTree generateMessageTree(int i) { t.setStatus(Message.SUCCESS); } - t.complete(); + t.setCompleted(); t.setDurationInMillis(i * 2); t.setTimestamp(m_timestamp + 1000); t2.setTimestamp(m_timestamp + 2000); diff --git a/cat-consumer/src/test/resources/logback-test.xml b/cat-consumer/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..31b2c13de8 --- /dev/null +++ b/cat-consumer/src/test/resources/logback-test.xml @@ -0,0 +1,11 @@ + + + + + [%d{HH:mm:ss.SSS}] [%-5level] [%logger{36}] %msg%n + + + + + + diff --git a/cat-core/pom.xml b/cat-core/pom.xml index 80229a3af0..6246b91df8 100644 --- a/cat-core/pom.xml +++ b/cat-core/pom.xml @@ -42,15 +42,20 @@ true provided - - org.unidal.framework - test-framework - test - - - com.google.code.gson - gson - + + org.unidal.framework + test-framework + test + + + ch.qos.logback + logback-classic + test + + + com.google.code.gson + gson + junit junit diff --git a/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java index 267fcedac3..95e8086918 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java @@ -29,7 +29,7 @@ public final class CatDatabaseConfigurator extends AbstractJdbcResourceConfigura public List defineComponents() { List all = new ArrayList(); - // all.add(defineJdbcDataSourceComponent("cat", "com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/cat", "root", "***", "")); + // all.add(defineJdbcDataSourceComponent("cat", "com.mysql.cj.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/cat", "root", "***", "")); defineSimpleTableProviderComponents(all, "cat", com.dianping.cat.core.dal._INDEX.getEntityClasses()); defineDaoComponents(all, com.dianping.cat.core.dal._INDEX.getDaoClasses()); diff --git a/cat-core/src/main/java/com/dianping/cat/message/codec/PlainTextMessageCodec.java b/cat-core/src/main/java/com/dianping/cat/message/codec/PlainTextMessageCodec.java index d0c52124ff..a0e08347bb 100644 --- a/cat-core/src/main/java/com/dianping/cat/message/codec/PlainTextMessageCodec.java +++ b/cat-core/src/main/java/com/dianping/cat/message/codec/PlainTextMessageCodec.java @@ -168,6 +168,7 @@ protected Message decodeLine(Context ctx, DefaultTransaction parent, Stack - com.mysql.jdbc.Driver + com.mysql.cj.jdbc.Driver jdbc:mysql://127.0.0.1:3306/cat root @@ -30,7 +30,7 @@ - com.mysql.jdbc.Driver + com.mysql.cj.jdbc.Driver jdbc:mysql://127.0.0.1:3306/cat root @@ -47,7 +47,7 @@ - com.mysql.jdbc.Driver + com.mysql.cj.jdbc.Driver jdbc:mysql://127.0.0.1:3306/cat root @@ -64,7 +64,7 @@ - com.mysql.jdbc.Driver + com.mysql.cj.jdbc.Driver jdbc:mysql://127.0.0.1:3306/cat root diff --git a/cat-core/src/test/resources/log4j.properties b/cat-core/src/test/resources/log4j.properties new file mode 100644 index 0000000000..42a4b984de --- /dev/null +++ b/cat-core/src/test/resources/log4j.properties @@ -0,0 +1,4 @@ +log4j.rootLogger=WARN, CONSOLE +log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender +log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout +log4j.appender.CONSOLE.layout.ConversionPattern=[%d{HH:mm:ss.SSS}] [%-5p] [%c{1}] %m%n diff --git a/cat-core/src/test/resources/logback-test.xml b/cat-core/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..31b2c13de8 --- /dev/null +++ b/cat-core/src/test/resources/logback-test.xml @@ -0,0 +1,11 @@ + + + + + [%d{HH:mm:ss.SSS}] [%-5level] [%logger{36}] %msg%n + + + + + + diff --git a/cat-home/pom.xml b/cat-home/pom.xml index edf4703d01..47f4277133 100755 --- a/cat-home/pom.xml +++ b/cat-home/pom.xml @@ -26,14 +26,22 @@ org.unidal.webres WebResServer - - org.unidal.framework - web-framework - - - javax.servlet - servlet-api - provided + + org.unidal.framework + web-framework + + + ch.qos.logback + logback-classic + + + org.slf4j + log4j-over-slf4j + + + javax.servlet + servlet-api + provided org.unidal.framework @@ -47,11 +55,11 @@ javax.servlet jstl - - org.codehaus.plexus - plexus-utils - 3.0.24 - + + org.codehaus.plexus + plexus-utils + 4.0.2 + org.mortbay.jetty jsp-api-2.1 @@ -66,11 +74,11 @@ org.freemarker freemarker - - mysql - mysql-connector-java - runtime - + + com.mysql + mysql-connector-j + runtime + junit junit @@ -106,33 +114,22 @@ commons-jexl3 3.0 - - com.onelogin - java-saml - 2.2.0 - + + com.onelogin + java-saml + 2.9.0 + - - xmlunit - xmlunit - 1.6 - test - - - org.powermock - powermock-api-mockito - 1.6.5 - test - - - org.powermock - powermock-module-junit4 - 1.6.5 - test - - - - + + xmlunit + xmlunit + 1.6 + test + + + + ${project.artifactId} + ${basedir}/src/main/resources false @@ -200,13 +197,11 @@ - - org.apache.maven.plugins - maven-war-plugin - 2.1.1 - - ${project.artifactId} - + + org.apache.maven.plugins + maven-war-plugin + + src/main/resources false diff --git a/cat-home/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java index 922b338bd5..a146c6d698 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java @@ -29,7 +29,7 @@ final class CatDatabaseConfigurator extends AbstractJdbcResourceConfigurator { public List defineComponents() { List all = new ArrayList(); - // all.add(defineJdbcDataSourceComponent("cat", "com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/cat", "root", "***", "")); + // all.add(defineJdbcDataSourceComponent("cat", "com.mysql.cj.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/cat", "root", "***", "")); defineSimpleTableProviderComponents(all, "cat", com.dianping.cat.home.dal.report._INDEX.getEntityClasses()); defineDaoComponents(all, com.dianping.cat.home.dal.report._INDEX.getDaoClasses()); diff --git a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml index 3eb9583706..c362615833 100644 --- a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -2,7 +2,7 @@ - com.mysql.jdbc.Driver + com.mysql.cj.jdbc.Driver jdbc:mysql://127.0.0.1:3306/cat root diff --git a/cat-home/src/main/resources/logback.xml b/cat-home/src/main/resources/logback.xml new file mode 100644 index 0000000000..f31590c712 --- /dev/null +++ b/cat-home/src/main/resources/logback.xml @@ -0,0 +1,12 @@ + + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger{36}] %msg%n + + + + + + + diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/TaskHelperTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/TaskHelperTest.java index cd8823cf21..e71b659d23 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/TaskHelperTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/TaskHelperTest.java @@ -25,12 +25,7 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -@RunWith(PowerMockRunner.class) public class TaskHelperTest { @Before public void setUp() throws Exception { @@ -74,12 +69,10 @@ public void testTodayZero() { Assert.assertEquals(cal.getTimeInMillis(), todayZero.getTime() + 1L); } - @PrepareForTest({TaskHelper.class}) @Test - public void testTodayZero2() throws Exception { + public void testTodayZero2() { Date date = new Date(1562774400000L); - PowerMockito.whenNew(Date.class).withAnyArguments().thenReturn(date); - Assert.assertEquals(date, TaskHelper.todayZero(null)); + Assert.assertEquals(date, TaskHelper.todayZero(date)); } @Test @@ -137,13 +130,11 @@ public void testThisHour() { Assert.assertEquals(new Date(1562767200000L), TaskHelper.thisHour(new Date(1562767504000L))); } - @PrepareForTest({TaskHelper.class}) @Test - public void testTomorrowZero1() throws Exception { + public void testTomorrowZero1() { Date date = new Date(1562671353000L); Date date2 = new Date(1562688000000L); - PowerMockito.whenNew(Date.class).withAnyArguments().thenReturn(date); - Assert.assertEquals(date2, TaskHelper.tomorrowZero(null)); + Assert.assertEquals(date2, TaskHelper.tomorrowZero(date)); } @Test diff --git a/docker/Dockerfile b/docker/Dockerfile index 0626cd34b8..8443fac60c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.8.4-openjdk-8 as mavenrepo +FROM maven:3.9.12-eclipse-temurin-21 AS mavenrepo WORKDIR /app COPY cat-alarm cat-alarm @@ -7,16 +7,16 @@ COPY cat-hadoop cat-hadoop COPY cat-client cat-client COPY cat-core cat-core COPY cat-home cat-home +COPY cat-boot cat-boot COPY pom.xml pom.xml RUN mvn clean package -DskipTests -FROM tomcat:8.5.41-jre8-alpine +FROM eclipse-temurin:21-jre ENV TZ=Asia/Shanghai -COPY --from=mavenrepo /app/cat-home/target/cat-home.war /usr/local/tomcat/webapps/cat.war +WORKDIR /app +COPY --from=mavenrepo /app/cat-boot/target/cat-boot-4.0-RC1.jar /app/cat-boot.jar COPY docker/datasources.xml /data/appdatas/cat/datasources.xml COPY docker/datasources.sh datasources.sh -RUN sed -i "s/port=\"8080\"/port=\"8080\"\ URIEncoding=\"utf-8\"/g" $CATALINA_HOME/conf/server.xml && chmod +x datasources.sh -RUN ln -s /lib /lib64 \ - && apk add --no-cache bash tini libc6-compat linux-pam krb5 krb5-libs +RUN chmod +x datasources.sh -CMD ["/bin/sh", "-c", "./datasources.sh && catalina.sh run"] +CMD ["/bin/sh", "-c", "./datasources.sh && java -Dcat.home=/data/appdatas/cat -Dserver.port=8080 -jar /app/cat-boot.jar"] diff --git a/docker/datasources.xml b/docker/datasources.xml index 252795fbf3..c9ca124b1b 100644 --- a/docker/datasources.xml +++ b/docker/datasources.xml @@ -7,11 +7,11 @@ 10m 1000 - com.mysql.jdbc.Driver + com.mysql.cj.jdbc.Driver MYSQL_USERNAME MYSQL_PASSWD - \ No newline at end of file + diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 94f0cd1fe2..5d723a0051 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -6,30 +6,26 @@ networks: services: cat: - image: meituaninc/cat:3.0.1 + image: cat:4.0-RC1-jdk21 container_name: cat - - ######## build from Dockerfile ########### - # build: - # context: ../ - # dockerfile: ./docker/Dockerfile - ######## End -> build from Dockerfile ########### - + build: + context: ../ + dockerfile: ./docker/Dockerfile environment: - # if you have your own mysql, config it here, and disable the 'mysql' config blow - - MYSQL_URL=cat-mysql # links will maintain /etc/hosts, just use 'container_name' + # If you have your own MySQL, configure it here and disable the mysql service below. + - MYSQL_URL=cat-mysql - MYSQL_PORT=3306 - MYSQL_USERNAME=root - MYSQL_PASSWD= - MYSQL_SCHEMA=cat - # 必须设置成你的机器IP地址 + # 必须设置成你的机器 IP 地址 # - SERVER_IP=YOUR IP volumes: - # 默认127.0.0.1,可以修改为自己真实的服务器集群地址 + # 默认 127.0.0.1,可以修改为真实的服务器集群地址 - "./client.xml:/data/appdatas/cat/client.xml" - # 默认使用环境变量设置。可以启用本注解,并修改为自己的配置 + # 默认使用环境变量设置。也可以启用本注释,并修改为自己的配置 # - "./datasources.xml:/data/appdatas/cat/datasources.xml" - command: /bin/sh -c 'ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2 && ./datasources.sh && catalina.sh run' + command: /bin/sh -c './datasources.sh && java -Dcat.home=/data/appdatas/cat -Dserver.port=8080 -jar /app/cat-boot.jar' links: - mysql depends_on: @@ -37,18 +33,18 @@ services: ports: - "8080:8080" - "2280:2280" - networks: + networks: - cat - # disable this if you have your own mysql + # Disable this if you have your own MySQL. mysql: container_name: cat-mysql image: mysql:5.7.37 - # expose 3306 to client (navicat) + # Expose 3306 to clients such as Navicat. ports: - - 3306:3306 + - 3306:3306 volumes: - # change './docker/mysql/volume' to your own path + # Change './docker/mysql/volume' to your own path. # WARNING: without this line, your data will be lost. - "./mysql/volume:/var/lib/mysql" - "../script/:/docker-entrypoint-initdb.d/" @@ -57,5 +53,5 @@ services: MYSQL_ALLOW_EMPTY_PASSWORD: "true" MYSQL_DATABASE: "cat" MYSQL_PASSWORD: "" - networks: + networks: - cat diff --git a/lib/java/pom.xml b/lib/java/pom.xml index 6ed95e2d06..44e4c80e2a 100644 --- a/lib/java/pom.xml +++ b/lib/java/pom.xml @@ -14,7 +14,7 @@ io.netty netty-all - 4.1.42.Final + 4.1.128.Final log4j @@ -40,7 +40,7 @@ ch.qos.logback logback-classic - 1.1.7 + 1.5.32 true provided @@ -59,7 +59,7 @@ junit junit - 4.13.1 + 4.13.2 test diff --git a/pom.xml b/pom.xml index beae60ea0e..9052ab12ef 100644 --- a/pom.xml +++ b/pom.xml @@ -34,9 +34,10 @@ cat-client cat-core cat-consumer - cat-hadoop - cat-home - cat-alarm + cat-hadoop + cat-home + cat-alarm + cat-boot @@ -60,11 +61,17 @@ cat-consumer ${project.version} - - com.dianping.cat - cat-alarm - ${project.version} - + + com.dianping.cat + cat-alarm + ${project.version} + + + com.dianping.cat + cat-home + ${project.version} + war + org.unidal.framework dal-jdbc @@ -90,11 +97,11 @@ WebResServer 1.2.1 - - junit - junit - 4.13.1 - + + junit + junit + 4.13.2 + org.mortbay.jetty jetty @@ -131,71 +138,101 @@ jsp-api 2.1 - - mysql - mysql-connector-java - 8.0.28 - - - org.apache.hadoop - hadoop-client - 2.4.1 - - - io.netty - netty-all - 4.1.50.Final - - - com.google.code.gson - gson - 2.3.1 - - - org.apache.httpcomponents - httpclient - 4.5.3 - - - org.apache.httpcomponents - httpmime - 4.5.3 - - - com.alibaba - fastjson - 1.2.83 - - - commons-codec - commons-codec - 1.8 - + + com.mysql + mysql-connector-j + 9.7.0 + + + org.apache.hadoop + hadoop-client + 2.4.1 + + + org.slf4j + slf4j-log4j12 + + + log4j + log4j + + + + + io.netty + netty-all + 4.1.128.Final + + + com.google.code.gson + gson + 2.13.2 + + + org.apache.httpcomponents + httpclient + 4.5.14 + + + org.apache.httpcomponents + httpmime + 4.5.14 + + + com.alibaba.fastjson2 + fastjson2 + ${fastjson2.version} + + + commons-codec + commons-codec + 1.19.0 + commons-lang commons-lang 2.6 - - org.xerial.snappy - snappy-java - 1.1.2 - - - log4j - log4j - 1.2.14 - - - org.freemarker - freemarker - 2.3.9 - - - com.mchange.v2 - c3p0 - 0.9.5.1 - + + org.xerial.snappy + snappy-java + 1.1.10.8 + + + log4j + log4j + 1.2.14 + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + log4j-over-slf4j + ${slf4j.version} + + + ch.qos.logback + logback-core + ${logback.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + org.freemarker + freemarker + 2.3.34 + + + com.mchange.v2 + c3p0 + 0.11.2 + @@ -239,23 +276,23 @@ - - maven-surefire-plugin - 2.9 - - - **/AllTests.java - + + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/AllTests.java + - - org.apache.maven.surefire - surefire-junit47 - 2.9 - - - + + org.apache.maven.surefire + surefire-junit47 + ${maven-surefire-plugin.version} + + + maven-eclipse-plugin 2.9 @@ -266,10 +303,10 @@ .settings/org.eclipse.jdt.core.prefs @@ -305,21 +342,21 @@ org.eclipse.jdt.core.compiler.compliance=1.8 ${deploy.autoRelease} - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10.4 - - - attach-javadocs - - jar - - - -Xdoclint:none - - - + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + + attach-javadocs + + jar + + + none + + + org.apache.maven.plugins @@ -335,34 +372,70 @@ org.eclipse.jdt.core.compiler.compliance=1.8 - - org.apache.maven.plugins - maven-source-plugin - 2.2.1 - - - attach-sources + + org.apache.maven.plugins + maven-source-plugin + ${maven-source-plugin.version} + + + attach-sources jar-no-fork - - org.apache.maven.plugins - maven-compiler-plugin - 3.2 - - 1.8 - 1.8 - - - - - - - org.apache.maven.plugins - maven-source-plugin + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.release} + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + + org.apache.maven.plugins + maven-shade-plugin + ${maven-shade-plugin.version} + + + org.apache.maven.plugins + maven-enforcer-plugin + ${maven-enforcer-plugin.version} + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + enforce-build-environment + + enforce + + + + + [21,22) + + + [3.9.0,) + + + + + + + + org.apache.maven.plugins + maven-source-plugin org.apache.maven.plugins @@ -395,11 +468,24 @@ org.eclipse.jdt.core.compiler.compliance=1.8 unidal.releases http://unidal.org/nexus/content/repositories/releases/ - - - utf-8 - false - + + + utf-8 + 21 + 3.14.1 + 3.5.6 + 3.5.1 + 3.6.2 + 3.3.1 + 3.12.0 + 3.6.2 + 2.0.17 + 1.5.34 + 2.0.62 + 4.0.2 + 9.0.112 + false + ossrh From 25654b773122ad32128585e09fee2f5bf1390827 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 7 Jun 2026 10:59:52 +0800 Subject: [PATCH 002/231] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=88=B0springboot4+?= =?UTF-8?q?JDK21?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cat-boot/pom.xml | 12 ++ .../dianping/cat/boot/CatBootApplication.java | 27 ++++ cat-boot/src/main/resources/logback.xml | 145 ++++++++++++++++++ .../config/server/ServerConfigManager.java | 8 +- cat-home/pom.xml | 7 + .../cat/logging/Slf4jForwardingLogger.java | 115 ++++++++++++++ .../Slf4jTimedConsoleLoggerManager.java | 12 ++ .../main/resources/META-INF/plexus/plexus.xml | 12 ++ cat-home/src/main/resources/logback.xml | 12 -- lib/java/pom.xml | 2 +- pom.xml | 27 +++- 11 files changed, 358 insertions(+), 21 deletions(-) create mode 100644 cat-boot/src/main/resources/logback.xml create mode 100644 cat-home/src/main/java/com/dianping/cat/logging/Slf4jForwardingLogger.java create mode 100644 cat-home/src/main/java/com/dianping/cat/logging/Slf4jTimedConsoleLoggerManager.java create mode 100644 cat-home/src/main/resources/META-INF/plexus/plexus.xml delete mode 100644 cat-home/src/main/resources/logback.xml diff --git a/cat-boot/pom.xml b/cat-boot/pom.xml index e477487093..d28e0227c7 100644 --- a/cat-boot/pom.xml +++ b/cat-boot/pom.xml @@ -28,6 +28,18 @@ tomcat-embed-jasper ${tomcat9.version} + + ch.qos.logback + logback-classic + + + org.slf4j + log4j-over-slf4j + + + org.slf4j + jul-to-slf4j + com.dianping.cat cat-home diff --git a/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java b/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java index d4aa3b9486..a1126b68bd 100644 --- a/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java +++ b/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java @@ -1,11 +1,38 @@ package com.dianping.cat.boot; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.slf4j.bridge.SLF4JBridgeHandler; import org.springframework.boot.SpringApplication; public class CatBootApplication { public static void main(String[] args) throws Exception { + applyDefaultCatProperties(); + routeJavaUtilLoggingToSlf4j(); SpringApplication.run(CatBootApplication.class, args); new EmbeddedCatServer().start(); } + + private static void applyDefaultCatProperties() throws Exception { + String catHome = System.getProperty("cat.home"); + + if (catHome == null || catHome.isBlank()) { + catHome = Paths.get(System.getProperty("user.home"), ".cat").toString(); + System.setProperty("cat.home", catHome); + } + + if (System.getProperty("cat.log.path") == null || System.getProperty("cat.log.path").isBlank()) { + System.setProperty("cat.log.path", Paths.get(catHome, "logs").toString()); + } + + Files.createDirectories(Path.of(System.getProperty("cat.log.path"))); + } + + private static void routeJavaUtilLoggingToSlf4j() { + SLF4JBridgeHandler.removeHandlersForRootLogger(); + SLF4JBridgeHandler.install(); + } } diff --git a/cat-boot/src/main/resources/logback.xml b/cat-boot/src/main/resources/logback.xml new file mode 100644 index 0000000000..e7f172da3d --- /dev/null +++ b/cat-boot/src/main/resources/logback.xml @@ -0,0 +1,145 @@ + + + cat-boot + + + + + + + + + ${CAT_CONSOLE_LEVEL:-INFO} + + + ${CONSOLE_LOG_PATTERN} + UTF-8 + + + + + ${LOG_HOME}/debug.log + + ${FILE_LOG_PATTERN} + UTF-8 + + + ${LOG_HOME}/debug-%d{yyyy-MM-dd}.%i.log.gz + 200MB + 7 + 20GB + true + + + DEBUG + ACCEPT + DENY + + + + + ${LOG_HOME}/info.log + + ${FILE_LOG_PATTERN} + UTF-8 + + + ${LOG_HOME}/info-%d{yyyy-MM-dd}.%i.log.gz + 200MB + 30 + 20GB + true + + + INFO + + + + + ${LOG_HOME}/warn.log + true + + ${FILE_LOG_PATTERN} + UTF-8 + + + ${LOG_HOME}/warn-%d{yyyy-MM-dd}.%i.log.gz + 200MB + 30 + 10GB + true + + + WARN + ACCEPT + DENY + + + + + ${LOG_HOME}/error.log + true + + ${FILE_LOG_PATTERN} + UTF-8 + + + ${LOG_HOME}/error-%d{yyyy-MM-dd}.%i.log.gz + 200MB + 30 + 10GB + true + + + ERROR + ACCEPT + DENY + + + + + false + 8192 + 20 + true + + + + + false + 8192 + 0 + false + + + + + false + 4096 + 0 + true + + + + + true + 4096 + 0 + true + + + + + + + + + + + + + + + diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java index c410f1b9d5..cc65eab271 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java @@ -407,11 +407,11 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); } catch (Exception ex) { - m_logger.error(e.getMessage()); + m_logger.error("Failed to initialize server config from database fallback.", ex); Cat.logError(ex); } } catch (Exception e) { - m_logger.error(e.getMessage()); + m_logger.error("Failed to load server config from database.", e); Cat.logError(e); } @@ -422,7 +422,7 @@ public void initialize() throws InitializationException { m_logger.info("init cat server with cat server xml " + localServerFile); initialize(localServerFile); } catch (Exception e) { - m_logger.error(e.getMessage()); + m_logger.error("Failed to initialize server config from local server.xml.", e); Cat.logError(e); } } @@ -436,7 +436,7 @@ public void initialize() throws InitializationException { try { refreshServer(); } catch (Exception e) { - m_logger.error(e.getMessage()); + m_logger.error("Failed to refresh server config.", e); Cat.logError(e); } diff --git a/cat-home/pom.xml b/cat-home/pom.xml index 47f4277133..1e7ef43bb1 100755 --- a/cat-home/pom.xml +++ b/cat-home/pom.xml @@ -33,10 +33,17 @@ ch.qos.logback logback-classic + provided org.slf4j log4j-over-slf4j + provided + + + org.slf4j + slf4j-api + provided javax.servlet diff --git a/cat-home/src/main/java/com/dianping/cat/logging/Slf4jForwardingLogger.java b/cat-home/src/main/java/com/dianping/cat/logging/Slf4jForwardingLogger.java new file mode 100644 index 0000000000..3c2cc21b5a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/logging/Slf4jForwardingLogger.java @@ -0,0 +1,115 @@ +package com.dianping.cat.logging; + +import org.codehaus.plexus.logging.Logger; +import org.slf4j.LoggerFactory; + +public class Slf4jForwardingLogger implements Logger { + + private final Logger m_delegate; + + private final org.slf4j.Logger m_logger; + + public Slf4jForwardingLogger(Logger delegate) { + m_delegate = delegate; + m_logger = LoggerFactory.getLogger(delegate.getName()); + } + + @Override + public void debug(String message) { + m_delegate.debug(message); + } + + @Override + public void debug(String message, Throwable throwable) { + m_delegate.debug(message, throwable); + } + + @Override + public void error(String message) { + m_delegate.error(message); + m_logger.error(message); + } + + @Override + public void error(String message, Throwable throwable) { + m_delegate.error(message, throwable); + m_logger.error(message, throwable); + } + + @Override + public void fatalError(String message) { + m_delegate.fatalError(message); + m_logger.error(message); + } + + @Override + public void fatalError(String message, Throwable throwable) { + m_delegate.fatalError(message, throwable); + m_logger.error(message, throwable); + } + + @Override + public Logger getChildLogger(String name) { + return this; + } + + @Override + public String getName() { + return m_delegate.getName(); + } + + @Override + public int getThreshold() { + return m_delegate.getThreshold(); + } + + @Override + public void info(String message) { + m_delegate.info(message); + } + + @Override + public void info(String message, Throwable throwable) { + m_delegate.info(message, throwable); + } + + @Override + public boolean isDebugEnabled() { + return m_delegate.isDebugEnabled(); + } + + @Override + public boolean isErrorEnabled() { + return m_delegate.isErrorEnabled(); + } + + @Override + public boolean isFatalErrorEnabled() { + return m_delegate.isFatalErrorEnabled(); + } + + @Override + public boolean isInfoEnabled() { + return m_delegate.isInfoEnabled(); + } + + @Override + public boolean isWarnEnabled() { + return m_delegate.isWarnEnabled(); + } + + @Override + public void setThreshold(int threshold) { + m_delegate.setThreshold(threshold); + } + + @Override + public void warn(String message) { + m_delegate.warn(message); + } + + @Override + public void warn(String message, Throwable throwable) { + m_delegate.warn(message, throwable); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/logging/Slf4jTimedConsoleLoggerManager.java b/cat-home/src/main/java/com/dianping/cat/logging/Slf4jTimedConsoleLoggerManager.java new file mode 100644 index 0000000000..5ac65a4cf5 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/logging/Slf4jTimedConsoleLoggerManager.java @@ -0,0 +1,12 @@ +package com.dianping.cat.logging; + +import org.codehaus.plexus.logging.Logger; +import org.unidal.lookup.logger.TimedConsoleLoggerManager; + +public class Slf4jTimedConsoleLoggerManager extends TimedConsoleLoggerManager { + + @Override + public Logger createLogger(int threshold, String name) { + return new Slf4jForwardingLogger(super.createLogger(threshold, name)); + } +} diff --git a/cat-home/src/main/resources/META-INF/plexus/plexus.xml b/cat-home/src/main/resources/META-INF/plexus/plexus.xml new file mode 100644 index 0000000000..1537cd598e --- /dev/null +++ b/cat-home/src/main/resources/META-INF/plexus/plexus.xml @@ -0,0 +1,12 @@ + + + + + org.codehaus.plexus.logging.LoggerManager + com.dianping.cat.logging.Slf4jTimedConsoleLoggerManager + + true + + + + diff --git a/cat-home/src/main/resources/logback.xml b/cat-home/src/main/resources/logback.xml deleted file mode 100644 index f31590c712..0000000000 --- a/cat-home/src/main/resources/logback.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger{36}] %msg%n - - - - - - - diff --git a/lib/java/pom.xml b/lib/java/pom.xml index 44e4c80e2a..7808497f3c 100644 --- a/lib/java/pom.xml +++ b/lib/java/pom.xml @@ -53,7 +53,7 @@ org.projectlombok lombok - 1.18.2 + 1.18.46 provided diff --git a/pom.xml b/pom.xml index 9052ab12ef..091b82213c 100644 --- a/pom.xml +++ b/pom.xml @@ -213,6 +213,11 @@ log4j-over-slf4j ${slf4j.version} + + org.slf4j + jul-to-slf4j + ${slf4j.version} + ch.qos.logback logback-core @@ -229,13 +234,19 @@ 2.3.34 - com.mchange.v2 + com.mchange c3p0 0.11.2 - - - + + org.projectlombok + lombok + ${lombok.version} + provided + + + + ossrh @@ -391,6 +402,13 @@ org.eclipse.jdt.core.compiler.compliance=21 ${maven-compiler-plugin.version} ${maven.compiler.release} + + + org.projectlombok + lombok + ${lombok.version} + + @@ -482,6 +500,7 @@ org.eclipse.jdt.core.compiler.compliance=21 2.0.17 1.5.34 2.0.62 + 1.18.46 4.0.2 9.0.112 false From 1c7c2c2e422313862d9b0e9ee388d80ab87237de Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 7 Jun 2026 13:17:50 +0800 Subject: [PATCH 003/231] =?UTF-8?q?config=E8=A1=A8=E7=9A=84DAO=E5=B1=82?= =?UTF-8?q?=E6=8D=A2=E6=88=90mybatis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cat-alarm/pom.xml | 24 ++ .../alarm/spi/config/AlertConfigManager.java | 4 +- .../alarm/spi/config/AlertPolicyManager.java | 4 +- .../alarm/spi/config/SenderConfigManager.java | 4 +- .../resources/META-INF/plexus/components.xml | 6 +- .../dianping/cat/boot/CatBootApplication.java | 9 +- cat-consumer/pom.xml | 42 ++- .../config/AllReportConfigManager.java | 6 +- .../resources/META-INF/plexus/components.xml | 8 +- cat-core/pom.xml | 64 +++-- .../build/CatCoreDatabaseConfigurator.java | 11 + .../cat/build/CatDatabaseConfigurator.java | 11 + .../config/AtomicMessageConfigManager.java | 6 +- .../cat/config/ReportReloadConfigManager.java | 4 +- .../config/sample/SampleConfigManager.java | 4 +- .../config/server/ServerConfigManager.java | 4 +- .../server/ServerFilterConfigManager.java | 4 +- .../TpValueStatisticConfigManager.java | 4 +- .../cat/core/config/dao/ConfigMapper.java | 21 ++ .../cat/core/config/dao/data/ConfigDO.java | 18 ++ .../config/repository/ConfigRepository.java | 239 ++++++++++++++++++ .../resources/META-INF/plexus/components.xml | 24 +- .../resources/mybatis/mapper/ConfigMapper.xml | 62 +++++ cat-home/pom.xml | 38 ++- .../cat/build/ComponentsConfigurator.java | 11 + .../exception/ExceptionRuleConfigManager.java | 4 +- .../spi/config/BaseRuleConfigManager.java | 4 +- .../report/page/DomainGroupConfigManager.java | 4 +- .../config/TopoGraphFormatConfigManager.java | 6 +- .../graph/TopologyGraphConfigManager.java | 4 +- .../config/HeartbeatDisplayPolicyManager.java | 4 +- .../task/CapacityUpdateStatusManager.java | 4 +- .../config/StorageGroupConfigManager.java | 4 +- .../permission/ResourceConfigManager.java | 4 +- .../page/permission/UserConfigManager.java | 4 +- .../router/config/RouterConfigManager.java | 6 +- .../resources/META-INF/plexus/components.xml | 46 ++-- .../cat/report/task/ConfigsBackupTest.java | 8 +- pom.xml | 12 + 39 files changed, 628 insertions(+), 118 deletions(-) create mode 100644 cat-core/src/main/java/com/dianping/cat/core/config/dao/ConfigMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/config/dao/data/ConfigDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java create mode 100644 cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml diff --git a/cat-alarm/pom.xml b/cat-alarm/pom.xml index 62f05c71d4..a36131e317 100644 --- a/cat-alarm/pom.xml +++ b/cat-alarm/pom.xml @@ -130,6 +130,30 @@ + + maven-resources-plugin + + + copy-generated-plexus-descriptor + prepare-package + + copy-resources + + + ${project.build.outputDirectory} + + + ${basedir}/src/main/resources + + META-INF/plexus/components.xml + + false + + + + + + diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java index d5eaa9fe90..c8643d1a08 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java @@ -31,7 +31,7 @@ import com.dianping.cat.alarm.receiver.transform.DefaultSaxParser; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; @Named @@ -40,7 +40,7 @@ public class AlertConfigManager implements Initializable { private static final String CONFIG_NAME = "alertConfig"; @Inject - private ConfigDao m_configDao; + private ConfigRepository m_configDao; @Inject private ContentFetcher m_fetcher; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java index 6d784f4fa1..4b49b3b3e7 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java @@ -36,7 +36,7 @@ import com.dianping.cat.alarm.spi.AlertChannel; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; @Named @@ -49,7 +49,7 @@ public class AlertPolicyManager implements Initializable { private static final String DEFAULT_GROUP = "default"; @Inject - private ConfigDao m_configDao; + private ConfigRepository m_configDao; @Inject private ContentFetcher m_fetcher; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java index f6e60201ab..f54cb965fc 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java @@ -33,7 +33,7 @@ import com.dianping.cat.alarm.sender.transform.DefaultSaxParser; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; @Named @@ -42,7 +42,7 @@ public class SenderConfigManager implements Initializable { private static final String CONFIG_NAME = "senderConfig"; @Inject - private ConfigDao m_configDao; + private ConfigRepository m_configDao; @Inject private ContentFetcher m_fetcher; diff --git a/cat-alarm/src/main/resources/META-INF/plexus/components.xml b/cat-alarm/src/main/resources/META-INF/plexus/components.xml index abac527c05..01ef6f2e72 100644 --- a/cat-alarm/src/main/resources/META-INF/plexus/components.xml +++ b/cat-alarm/src/main/resources/META-INF/plexus/components.xml @@ -60,7 +60,7 @@ com.dianping.cat.alarm.spi.config.SenderConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -84,7 +84,7 @@ com.dianping.cat.alarm.spi.config.AlertPolicyManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -195,7 +195,7 @@ com.dianping.cat.alarm.spi.config.AlertConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher diff --git a/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java b/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java index a1126b68bd..eca14762b1 100644 --- a/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java +++ b/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java @@ -18,12 +18,19 @@ public static void main(String[] args) throws Exception { private static void applyDefaultCatProperties() throws Exception { String catHome = System.getProperty("cat.home"); + String legacyCatHome = System.getProperty("CAT_HOME"); if (catHome == null || catHome.isBlank()) { - catHome = Paths.get(System.getProperty("user.home"), ".cat").toString(); + catHome = legacyCatHome == null || legacyCatHome.isBlank() + ? Paths.get(System.getProperty("user.home"), ".cat").toString() + : legacyCatHome; System.setProperty("cat.home", catHome); } + if (legacyCatHome == null || legacyCatHome.isBlank()) { + System.setProperty("CAT_HOME", catHome); + } + if (System.getProperty("cat.log.path") == null || System.getProperty("cat.log.path").isBlank()) { System.setProperty("cat.log.path", Paths.get(catHome, "logs").toString()); } diff --git a/cat-consumer/pom.xml b/cat-consumer/pom.xml index 4953fb9c30..6388871388 100644 --- a/cat-consumer/pom.xml +++ b/cat-consumer/pom.xml @@ -82,10 +82,10 @@ - - org.unidal.maven.plugins - plexus-maven-plugin - + + org.unidal.maven.plugins + plexus-maven-plugin + generate plexus component descriptor process-classes @@ -95,11 +95,35 @@ com.dianping.cat.consumer.build.ComponentsConfigurator - - - - - + + + + + maven-resources-plugin + + + copy-generated-plexus-descriptor + prepare-package + + copy-resources + + + ${project.build.outputDirectory} + + + ${basedir}/src/main/resources + + META-INF/plexus/components.xml + + false + + + + + + + + utf-8 diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java index 45a4b8d400..7a8b9d4ab0 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java @@ -41,7 +41,7 @@ import com.dianping.cat.consumer.all.config.entity.Type; import com.dianping.cat.consumer.all.config.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -52,7 +52,7 @@ public class AllReportConfigManager implements Initializable, LogEnabled { private static final String CONFIG_NAME = "all-report-config"; @Inject - private ConfigDao m_configDao; + private ConfigRepository m_configDao; @Inject private ContentFetcher m_fetcher; @@ -201,4 +201,4 @@ public boolean validate(String reportName, String type, String name) { return false; } -} \ No newline at end of file +} diff --git a/cat-consumer/src/main/resources/META-INF/plexus/components.xml b/cat-consumer/src/main/resources/META-INF/plexus/components.xml index 052cc8406b..cf2981df31 100644 --- a/cat-consumer/src/main/resources/META-INF/plexus/components.xml +++ b/cat-consumer/src/main/resources/META-INF/plexus/components.xml @@ -781,7 +781,7 @@ com.dianping.cat.config.AtomicMessageConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -793,7 +793,7 @@ com.dianping.cat.config.server.ServerConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -805,7 +805,7 @@ com.dianping.cat.config.transaction.TpValueStatisticConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -820,7 +820,7 @@ com.dianping.cat.consumer.config.AllReportConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher diff --git a/cat-core/pom.xml b/cat-core/pom.xml index 6246b91df8..4499830529 100644 --- a/cat-core/pom.xml +++ b/cat-core/pom.xml @@ -27,13 +27,21 @@ org.xerial.snappy snappy-java - - org.unidal.framework - dal-jdbc - - - javax.servlet - servlet-api + + org.unidal.framework + dal-jdbc + + + org.mybatis + mybatis + + + org.projectlombok + lombok + + + javax.servlet + servlet-api provided @@ -100,10 +108,10 @@ - - org.unidal.maven.plugins - plexus-maven-plugin - + + org.unidal.maven.plugins + plexus-maven-plugin + generate plexus component descriptor process-classes @@ -113,11 +121,35 @@ com.dianping.cat.build.ComponentsConfigurator - - - - - + + + + + maven-resources-plugin + + + copy-generated-plexus-descriptor + prepare-package + + copy-resources + + + ${project.build.outputDirectory} + + + ${basedir}/src/main/resources + + META-INF/plexus/components.xml + + false + + + + + + + + utf-8 diff --git a/cat-core/src/main/java/com/dianping/cat/build/CatCoreDatabaseConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/CatCoreDatabaseConfigurator.java index 89a6faca6a..285ecfbc56 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/CatCoreDatabaseConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/CatCoreDatabaseConfigurator.java @@ -22,19 +22,30 @@ import java.util.List; import org.unidal.dal.jdbc.configuration.AbstractJdbcResourceConfigurator; +import org.unidal.dal.jdbc.datasource.DataSourceManager; import org.unidal.lookup.configuration.Component; +import com.dianping.cat.core.config.repository.ConfigRepository; + final class CatCoreDatabaseConfigurator extends AbstractJdbcResourceConfigurator { + private static final String CONFIG_DAO_ROLE = "com.dianping.cat.core.config.ConfigDao"; + @Override public List defineComponents() { List all = new ArrayList(); defineSimpleTableProviderComponents(all, "cat", com.dianping.cat.core.config._INDEX.getEntityClasses()); defineDaoComponents(all, com.dianping.cat.core.config._INDEX.getDaoClasses()); + removeConfigDaoComponent(all); + all.add(C(ConfigRepository.class).req(DataSourceManager.class)); defineSimpleTableProviderComponents(all, "cat", com.dianping.cat.core.dal._INDEX.getEntityClasses()); defineDaoComponents(all, com.dianping.cat.core.dal._INDEX.getDaoClasses()); return all; } + + private void removeConfigDaoComponent(List components) { + components.removeIf(component -> CONFIG_DAO_ROLE.equals(component.getModel().getRole())); + } } diff --git a/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java index 95e8086918..621b2aface 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java @@ -22,9 +22,14 @@ import java.util.List; import org.unidal.dal.jdbc.configuration.AbstractJdbcResourceConfigurator; +import org.unidal.dal.jdbc.datasource.DataSourceManager; import org.unidal.lookup.configuration.Component; +import com.dianping.cat.core.config.repository.ConfigRepository; + public final class CatDatabaseConfigurator extends AbstractJdbcResourceConfigurator { + private static final String CONFIG_DAO_ROLE = "com.dianping.cat.core.config.ConfigDao"; + @Override public List defineComponents() { List all = new ArrayList(); @@ -36,7 +41,13 @@ public List defineComponents() { defineSimpleTableProviderComponents(all, "cat", com.dianping.cat.core.config._INDEX.getEntityClasses()); defineDaoComponents(all, com.dianping.cat.core.config._INDEX.getDaoClasses()); + removeConfigDaoComponent(all); + all.add(C(ConfigRepository.class).req(DataSourceManager.class)); return all; } + + private void removeConfigDaoComponent(List components) { + components.removeIf(component -> CONFIG_DAO_ROLE.equals(component.getModel().getRole())); + } } diff --git a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java index 8a07f1956a..2de330a931 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java @@ -31,7 +31,7 @@ import com.dianping.cat.configuration.message.entity.Property; import com.dianping.cat.configuration.message.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.task.TimerSyncTask; @@ -43,7 +43,7 @@ public class AtomicMessageConfigManager implements Initializable { private static final String DEFAULT_DOMAIN = "default"; @Inject - protected ConfigDao m_configDao; + protected ConfigRepository m_configDao; @Inject protected ContentFetcher m_fetcher; @@ -225,4 +225,4 @@ private boolean storeConfig() { return true; } -} \ No newline at end of file +} diff --git a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java index aa4b46d6a9..52c562eadd 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java @@ -37,7 +37,7 @@ import com.dianping.cat.configuration.reload.entity.ReportType; import com.dianping.cat.configuration.reload.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -50,7 +50,7 @@ public class ReportReloadConfigManager implements Initializable { private static final String DEFAULT = "default"; @Inject - protected ConfigDao m_configDao; + protected ConfigRepository m_configDao; @Inject protected ContentFetcher m_fetcher; diff --git a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java index 056232600d..cfdaf9fa7b 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java @@ -27,7 +27,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.sample.entity.SampleConfig; import com.dianping.cat.sample.transform.DefaultSaxParser; @@ -40,7 +40,7 @@ public class SampleConfigManager implements Initializable { private static final String CONFIG_NAME = "sampleConfig"; @Inject - protected ConfigDao m_configDao; + protected ConfigRepository m_configDao; @Inject protected ContentFetcher m_fetcher; diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java index cc65eab271..9678e83719 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java @@ -57,7 +57,7 @@ import com.dianping.cat.configuration.server.entity.StorageConfig; import com.dianping.cat.configuration.server.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -90,7 +90,7 @@ public class ServerConfigManager implements LogEnabled, Initializable { public ExecutorService m_threadPool; @Inject - protected ConfigDao m_configDao; + protected ConfigRepository m_configDao; @Inject protected ContentFetcher m_fetcher; diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java index 89b89886cf..ae05a88516 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java @@ -36,7 +36,7 @@ import com.dianping.cat.configuration.server.filter.entity.ServerFilterConfig; import com.dianping.cat.configuration.server.filter.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -47,7 +47,7 @@ public class ServerFilterConfigManager implements Initializable { private static final String CONFIG_NAME = "serverFilter"; @Inject - protected ConfigDao m_configDao; + protected ConfigRepository m_configDao; @Inject protected ContentFetcher m_fetcher; diff --git a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java index e32cff1637..b4b411e709 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java @@ -34,7 +34,7 @@ import com.dianping.cat.configuration.tp.entity.TpValueStatisticConfig; import com.dianping.cat.configuration.tp.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.task.TimerSyncTask; @@ -46,7 +46,7 @@ public class TpValueStatisticConfigManager implements Initializable { private static final String CONFIG_NAME = "tp-value-statistic-config"; @Inject - protected ConfigDao m_configDao; + protected ConfigRepository m_configDao; @Inject protected ContentFetcher m_fetcher; diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/dao/ConfigMapper.java b/cat-core/src/main/java/com/dianping/cat/core/config/dao/ConfigMapper.java new file mode 100644 index 0000000000..eccd4b3b11 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/config/dao/ConfigMapper.java @@ -0,0 +1,21 @@ +package com.dianping.cat.core.config.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.config.dao.data.ConfigDO; + +public interface ConfigMapper { + int deleteById(@Param("id") Integer id); + + ConfigDO findById(@Param("id") Integer id); + + ConfigDO findByName(@Param("name") String name); + + List queryAll(); + + int insert(ConfigDO config); + + int updateById(ConfigDO config); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/dao/data/ConfigDO.java b/cat-core/src/main/java/com/dianping/cat/core/config/dao/data/ConfigDO.java new file mode 100644 index 0000000000..66bf50c658 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/config/dao/data/ConfigDO.java @@ -0,0 +1,18 @@ +package com.dianping.cat.core.config.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class ConfigDO { + private Integer id; + + private String name; + + private String content; + + private Date creationDate; + + private Date modifyDate; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java new file mode 100644 index 0000000000..f8c4dc05c6 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java @@ -0,0 +1,239 @@ +package com.dianping.cat.core.config.repository; + +import java.io.IOException; +import java.io.Reader; +import java.sql.Connection; +import java.util.List; +import java.util.stream.Collectors; + +import javax.sql.DataSource; + +import org.apache.ibatis.builder.xml.XMLMapperBuilder; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.core.config.Config; +import com.dianping.cat.core.config.dao.ConfigMapper; +import com.dianping.cat.core.config.dao.data.ConfigDO; + +public class ConfigRepository { + private static final String DATA_SOURCE_NAME = "cat"; + + private static final String MAPPER_RESOURCE = "mybatis/mapper/ConfigMapper.xml"; + + @Inject + private DataSourceManager m_dataSourceManager; + + private volatile SqlSessionFactory m_sqlSessionFactory; + + public Config createLocal() { + return new Config(); + } + + public int deleteByPK(Config proto) throws DalException { + try (SqlSession session = openSession()) { + int count = session.getMapper(ConfigMapper.class).deleteById(proto.getKeyId()); + + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when deleting config by primary key: " + proto, e); + } + } + + public List findAllConfig(Readset readset) throws DalException { + try (SqlSession session = openSession()) { + return session.getMapper(ConfigMapper.class).queryAll().stream() + .map(this::toConfig) + .collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when finding all config records.", e); + } + } + + public Config findByName(String name, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + ConfigDO config = session.getMapper(ConfigMapper.class).findByName(name); + + return requireFound(config, "name", name); + } catch (DalException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when finding config by name: " + name, e); + } + } + + public Config findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + ConfigDO config = session.getMapper(ConfigMapper.class).findById(keyId); + + return requireFound(config, "id", String.valueOf(keyId)); + } catch (DalException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when finding config by primary key: " + keyId, e); + } + } + + public int insert(Config proto) throws DalException { + try (SqlSession session = openSession()) { + ConfigDO config = toConfigDO(proto); + int count = session.getMapper(ConfigMapper.class).insert(config); + + session.commit(); + proto.setId(config.getId()); + proto.setKeyId(config.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when inserting config: " + proto, e); + } + } + + public int updateByPK(Config proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + int count = session.getMapper(ConfigMapper.class).updateById(toConfigDO(proto)); + + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when updating config by primary key: " + proto, e); + } + } + + private SqlSessionFactory getSqlSessionFactory() { + SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + synchronized (this) { + sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + sqlSessionFactory = newSqlSessionFactory(); + m_sqlSessionFactory = sqlSessionFactory; + } + } + } + + return sqlSessionFactory; + } + + private SqlSession openSession() { + return getSqlSessionFactory().openSession(false); + } + + private Config requireFound(ConfigDO config, String field, String value) throws DalNotFoundException { + if (config == null) { + throw new DalNotFoundException(String.format("No config found by %s(%s).", field, value)); + } + + return toConfig(config); + } + + private SqlSessionFactory newSqlSessionFactory() { + Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), + new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); + + configuration.addMapper(ConfigMapper.class); + loadMapperXml(configuration); + return new SqlSessionFactoryBuilder().build(configuration); + } + + private void loadMapperXml(Configuration configuration) { + try (Reader reader = Resources.getResourceAsReader(MAPPER_RESOURCE)) { + XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, MAPPER_RESOURCE, + configuration.getSqlFragments()); + + mapperParser.parse(); + } catch (IOException e) { + throw new IllegalStateException("Error when loading MyBatis mapper: " + MAPPER_RESOURCE, e); + } + } + + private Config toConfig(ConfigDO configDO) { + Config config = new Config(); + + config.setId(configDO.getId()); + config.setName(configDO.getName()); + config.setContent(configDO.getContent()); + config.setCreationDate(configDO.getCreationDate()); + config.setModifyDate(configDO.getModifyDate()); + config.afterLoad(); + return config; + } + + private ConfigDO toConfigDO(Config config) { + ConfigDO configDO = new ConfigDO(); + + configDO.setId(config.getKeyId() > 0 ? config.getKeyId() : config.getId()); + configDO.setName(config.getName()); + configDO.setContent(config.getContent()); + configDO.setCreationDate(config.getCreationDate()); + configDO.setModifyDate(config.getModifyDate()); + return configDO; + } + + private static final class UnidalDataSource implements DataSource { + private final DataSourceManager m_dataSourceManager; + + private final String m_dataSourceName; + + private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { + m_dataSourceManager = dataSourceManager; + m_dataSourceName = dataSourceName; + } + + @Override + public Connection getConnection() throws java.sql.SQLException { + return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); + } + + @Override + public Connection getConnection(String username, String password) throws java.sql.SQLException { + return getConnection(); + } + + @Override + public int getLoginTimeout() { + return 0; + } + + @Override + public java.io.PrintWriter getLogWriter() { + return null; + } + + @Override + public java.util.logging.Logger getParentLogger() { + return java.util.logging.Logger.getGlobal(); + } + + @Override + public boolean isWrapperFor(Class iface) { + return false; + } + + @Override + public void setLoginTimeout(int seconds) { + } + + @Override + public void setLogWriter(java.io.PrintWriter out) { + } + + @Override + public T unwrap(Class iface) throws java.sql.SQLException { + throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); + } + } +} diff --git a/cat-core/src/main/resources/META-INF/plexus/components.xml b/cat-core/src/main/resources/META-INF/plexus/components.xml index cde672900d..afeacc8359 100644 --- a/cat-core/src/main/resources/META-INF/plexus/components.xml +++ b/cat-core/src/main/resources/META-INF/plexus/components.xml @@ -18,7 +18,7 @@ com.dianping.cat.config.server.ServerConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -71,7 +71,7 @@ com.dianping.cat.config.server.ServerFilterConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -115,7 +115,7 @@ com.dianping.cat.config.sample.SampleConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -136,7 +136,7 @@ com.dianping.cat.config.ReportReloadConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -197,7 +197,7 @@ com.dianping.cat.config.transaction.TpValueStatisticConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -212,7 +212,7 @@ com.dianping.cat.config.AtomicMessageConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -256,11 +256,11 @@ - com.dianping.cat.core.config.ConfigDao - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository + com.dianping.cat.core.config.repository.ConfigRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager @@ -688,11 +688,11 @@ - com.dianping.cat.core.config.ConfigDao - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository + com.dianping.cat.core.config.repository.ConfigRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager diff --git a/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml b/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml new file mode 100644 index 0000000000..16115ea640 --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + id, + name, + content, + creation_date, + modify_date + + + + INSERT INTO config + (name, content, creation_date, modify_date) + VALUES + (#{name}, #{content}, NOW(), NOW()) + + + + + + + + + + DELETE FROM config + WHERE id = #{id} + + + + UPDATE config + SET name = #{name}, + content = #{content}, + modify_date = NOW() + WHERE id = #{id} + + + diff --git a/cat-home/pom.xml b/cat-home/pom.xml index 1e7ef43bb1..6f2a65ae17 100755 --- a/cat-home/pom.xml +++ b/cat-home/pom.xml @@ -188,10 +188,10 @@ - - org.unidal.maven.plugins - plexus-maven-plugin - + + org.unidal.maven.plugins + plexus-maven-plugin + generate plexus component descriptor process-classes @@ -201,9 +201,33 @@ com.dianping.cat.build.ComponentsConfigurator - - - + + + + + maven-resources-plugin + + + copy-generated-plexus-descriptor + prepare-package + + copy-resources + + + ${project.build.outputDirectory} + + + ${basedir}/src/main/resources + + META-INF/plexus/components.xml + + false + + + + + + org.apache.maven.plugins maven-war-plugin diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index b947b29ab8..9816cabefb 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -22,6 +22,7 @@ import java.util.List; import org.unidal.dal.jdbc.configuration.AbstractJdbcResourceConfigurator; +import org.unidal.dal.jdbc.datasource.DataSourceManager; import org.unidal.initialization.DefaultModuleManager; import org.unidal.initialization.ModuleManager; import org.unidal.lookup.configuration.Component; @@ -37,6 +38,7 @@ import com.dianping.cat.build.report.ReportComponentConfigurator; import com.dianping.cat.build.report.StorageComponentConfigurator; import com.dianping.cat.build.report.TransactionComponentConfigurator; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.mvc.PayloadNormalizer; import com.dianping.cat.report.HourlyReportContentTableProvider; @@ -65,6 +67,8 @@ import com.dianping.cat.system.page.permission.UserConfigManager; public class ComponentsConfigurator extends AbstractJdbcResourceConfigurator { + private static final String CONFIG_DAO_ROLE = "com.dianping.cat.core.config.ConfigDao"; + public static void main(String[] args) { generatePlexusComponentsXmlFile(new ComponentsConfigurator()); } @@ -143,6 +147,9 @@ public List defineComponents() { // web, please keep it last all.addAll(new WebComponentConfigurator().defineComponents()); + removeConfigDaoComponent(all); + all.add(C(ConfigRepository.class).req(DataSourceManager.class)); + return all; } @@ -175,4 +182,8 @@ private List defineTableProviderComponents() { return all; } + + private void removeConfigDaoComponent(List components) { + components.removeIf(component -> CONFIG_DAO_ROLE.equals(component.getModel().getRole())); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java index ab2356544f..78cf067ca9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java @@ -30,7 +30,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.home.exception.entity.ExceptionExclude; import com.dianping.cat.home.exception.entity.ExceptionLimit; @@ -47,7 +47,7 @@ public class ExceptionRuleConfigManager implements Initializable { public static String TOTAL_STRING = "Total"; @Inject - private ConfigDao m_configDao; + private ConfigRepository m_configDao; @Inject private ContentFetcher m_fetcher; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java index c2550eeb33..6107630cc3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java @@ -47,7 +47,7 @@ import com.dianping.cat.alarm.rule.transform.DefaultSaxParser; import com.dianping.cat.alarm.spi.rule.RuleType; import com.dianping.cat.config.content.ContentFetcher; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.helper.MetricType; import com.dianping.cat.message.Event; @@ -59,7 +59,7 @@ public abstract class BaseRuleConfigManager { @Inject - protected ConfigDao m_configDao; + protected ConfigRepository m_configDao; @Inject protected UserDefinedRuleManager m_manager; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java index 1db7411b81..3386794d8e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java @@ -30,7 +30,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.home.group.entity.Domain; @@ -44,7 +44,7 @@ public class DomainGroupConfigManager implements Initializable { private static final String CONFIG_NAME = "domainGroup"; @Inject - private ConfigDao m_configDao; + private ConfigRepository m_configDao; @Inject private ContentFetcher m_fetcher; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java index 6c1569abe7..cfe8a26165 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java @@ -31,7 +31,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.home.dependency.format.entity.ProductLine; @@ -44,7 +44,7 @@ public class TopoGraphFormatConfigManager implements Initializable { private static final String CONFIG_NAME = "topoGraphFormat"; @Inject - private ConfigDao m_configDao; + private ConfigRepository m_configDao; @Inject private ContentFetcher m_fetcher; @@ -130,4 +130,4 @@ private boolean storeConfig() { } return true; } -} \ No newline at end of file +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java index bfb902e901..35410374ef 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java @@ -38,7 +38,7 @@ import com.dianping.cat.consumer.dependency.model.entity.Dependency; import com.dianping.cat.consumer.dependency.model.entity.Index; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.helper.Chinese; import com.dianping.cat.home.dependency.config.entity.DomainConfig; @@ -66,7 +66,7 @@ public class TopologyGraphConfigManager implements Initializable { private static final String CONFIG_NAME = "topologyConfig"; @Inject - private ConfigDao m_configDao; + private ConfigRepository m_configDao; @Inject private ContentFetcher m_fetcher; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java index 64b609f378..8c4acfeeb8 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java @@ -33,7 +33,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.home.heartbeat.entity.Group; import com.dianping.cat.home.heartbeat.entity.HeartbeatDisplayPolicy; @@ -47,7 +47,7 @@ public class HeartbeatDisplayPolicyManager implements Initializable { private static final String CONFIG_NAME = "heartbeat-display-policy"; @Inject - private ConfigDao m_configDao; + private ConfigRepository m_configDao; @Inject private ContentFetcher m_fetcher; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java index 961a297836..de5c2a8b8c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java @@ -26,7 +26,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.home.dal.report.OverloadDao; import com.dianping.cat.home.dal.report.OverloadEntity; @@ -37,7 +37,7 @@ public class CapacityUpdateStatusManager implements Initializable { private static final String CONFIG_NAME = "capacityUpdateStatus"; @Inject - private ConfigDao m_configDao; + private ConfigRepository m_configDao; @Inject private OverloadDao m_overloadDao; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java index 132843d2f5..534f4ca519 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java @@ -34,7 +34,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.home.storage.entity.Link; import com.dianping.cat.home.storage.entity.Storage; @@ -54,7 +54,7 @@ public class StorageGroupConfigManager implements Initializable { private static final String CONFIG_NAME = "storageGroup"; @Inject - private ConfigDao m_configDao; + private ConfigRepository m_configDao; @Inject private ContentFetcher m_fetcher; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java index 9e9daacaf8..b5c1bdfaad 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java @@ -30,7 +30,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.home.resource.entity.Resource; import com.dianping.cat.home.resource.entity.ResourceConfig; @@ -48,7 +48,7 @@ public class ResourceConfigManager implements Initializable { private static final String ALL = "*"; @Inject - protected ConfigDao m_configDao; + protected ConfigRepository m_configDao; @Inject protected ContentFetcher m_fetcher; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java index 2df5844b70..f9a152c845 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java @@ -27,7 +27,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.home.user.entity.User; import com.dianping.cat.home.user.entity.UserConfig; @@ -43,7 +43,7 @@ public class UserConfigManager implements Initializable { private static final String CONFIG_NAME = "user-config"; @Inject - protected ConfigDao m_configDao; + protected ConfigRepository m_configDao; @Inject protected ContentFetcher m_fetcher; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java index 92cd00b4e8..7a19f2d2b3 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java @@ -22,7 +22,7 @@ import com.dianping.cat.Constants; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.core.dal.*; import com.dianping.cat.helper.TimeHelper; @@ -57,7 +57,7 @@ public class RouterConfigManager implements Initializable, LogEnabled { private static final String CONFIG_NAME = "routerConfig"; @Inject - private ConfigDao m_configDao; + private ConfigRepository m_configDao; @Inject private ContentFetcher m_fetcher; @@ -417,4 +417,4 @@ public boolean validate(final RouterConfig routerConfig) { return true; } -} \ No newline at end of file +} diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index f46ec3fd97..4e882b6152 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -77,7 +77,7 @@ com.dianping.cat.report.page.DomainGroupConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -333,7 +333,7 @@ com.dianping.cat.system.page.permission.UserConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -345,7 +345,7 @@ com.dianping.cat.system.page.permission.ResourceConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -398,7 +398,7 @@ com.dianping.cat.report.alert.transaction.TransactionRuleConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager @@ -521,7 +521,7 @@ com.dianping.cat.report.alert.event.EventRuleConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager @@ -894,7 +894,7 @@ com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager @@ -1047,7 +1047,7 @@ com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -1281,7 +1281,7 @@ com.dianping.cat.report.page.storage.config.StorageGroupConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -1440,7 +1440,7 @@ com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -1452,7 +1452,7 @@ com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -1706,7 +1706,7 @@ com.dianping.cat.system.page.router.config.RouterConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -2353,7 +2353,7 @@ com.dianping.cat.report.page.overload.task.CapacityUpdateStatusManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.home.dal.report.OverloadDao @@ -2669,7 +2669,7 @@ com.dianping.cat.alarm.spi.config.AlertConfigManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -2892,7 +2892,7 @@ com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.config.content.ContentFetcher @@ -2900,8 +2900,13 @@ - com.dianping.cat.core.config.ConfigDao - com.dianping.cat.core.config.ConfigDao + com.dianping.cat.core.config.repository.ConfigRepository + com.dianping.cat.core.config.repository.ConfigRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + com.dianping.cat.report.page.heartbeat.JspViewer @@ -3860,5 +3865,14 @@ + + com.dianping.cat.core.config.repository.ConfigRepository + com.dianping.cat.core.config.repository.ConfigRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java index 791b5b7fb2..6140a00bfb 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java @@ -29,14 +29,14 @@ import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; public class ConfigsBackupTest extends ComponentTestCase { @Test public void backupConfigsTest() { - ConfigDao dao = lookup(ConfigDao.class); + ConfigRepository dao = lookup(ConfigRepository.class); ConfigBackupTask task = new ConfigBackupTask(dao); Assert.assertTrue(task.backupConfigs()); @@ -46,9 +46,9 @@ public class ConfigBackupTask { private static final String BASE_DIR_PATH = "src/main/resources/config/"; - private ConfigDao m_dao; + private ConfigRepository m_dao; - public ConfigBackupTask(ConfigDao dao) { + public ConfigBackupTask(ConfigRepository dao) { m_dao = dao; } diff --git a/pom.xml b/pom.xml index 091b82213c..90abb84de2 100644 --- a/pom.xml +++ b/pom.xml @@ -183,6 +183,11 @@ fastjson2 ${fastjson2.version} + + org.mybatis + mybatis + ${mybatis.version} + commons-codec commons-codec @@ -416,6 +421,11 @@ org.eclipse.jdt.core.compiler.compliance=21 maven-war-plugin ${maven-war-plugin.version} + + org.apache.maven.plugins + maven-resources-plugin + ${maven-resources-plugin.version} + org.apache.maven.plugins maven-shade-plugin @@ -493,6 +503,7 @@ org.eclipse.jdt.core.compiler.compliance=21 3.14.1 3.5.6 3.5.1 + 3.3.1 3.6.2 3.3.1 3.12.0 @@ -500,6 +511,7 @@ org.eclipse.jdt.core.compiler.compliance=21 2.0.17 1.5.34 2.0.62 + 3.5.19 1.18.46 4.0.2 9.0.112 From eb7ad56a21e7d1f37dea65b3b2bad4937cd60f83 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 7 Jun 2026 14:28:21 +0800 Subject: [PATCH 004/231] =?UTF-8?q?DAO=E5=B1=82=E5=BC=95=E5=85=A5mybatis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cat-alarm/pom.xml | 8 + .../cat/alarm/service/AlertService.java | 4 +- .../cat/build/CatDatabaseConfigurator.java | 29 + .../generated/alert/dao/AlertMapper.java | 27 + .../generated/alert/dao/data/AlertDO.java | 32 + .../alarm/rule/dao/ServerAlarmRuleMapper.java | 21 + .../rule/dao/data/ServerAlarmRuleDO.java | 30 + .../define/rule/dao/UserDefineRuleMapper.java | 21 + .../rule/dao/data/UserDefineRuleDO.java | 18 + .../repository/alert/AlertRepository.java | 191 ++++++ .../alarm/rule/ServerAlarmRuleRepository.java | 152 +++++ .../define/rule/UserDefineRuleRepository.java | 130 ++++ .../resources/META-INF/plexus/components.xml | 20 +- .../resources/mybatis/mapper/AlertMapper.xml | 79 +++ .../mybatis/mapper/ServerAlarmRuleMapper.xml | 73 +++ .../mybatis/mapper/UserDefineRuleMapper.xml | 53 ++ .../build/ComponentsConfigurator.java | 26 +- .../resources/META-INF/plexus/components.xml | 46 +- .../build/CatCoreDatabaseConfigurator.java | 54 +- .../cat/build/CatDatabaseConfigurator.java | 53 +- .../business/BusinessConfigManager.java | 4 +- .../mybatis/MyBatisRepositorySupport.java | 128 ++++ .../config/dao/BusinessConfigMapper.java | 25 + .../config/dao/data/BusinessConfigDO.java | 20 + .../dao/BusinessReportMapper.java | 19 + .../dao/data/BusinessReportDO.java | 24 + .../content/dao/DailyReportContentMapper.java | 21 + .../dao/data/DailyReportContentDO.java | 26 + .../hostinfo/dao/HostinfoMapper.java | 23 + .../hostinfo/dao/data/HostinfoDO.java | 22 + .../dao/HourlyReportContentMapper.java | 21 + .../dao/data/HourlyReportContentDO.java | 24 + .../hourlyreport/dao/HourlyreportMapper.java | 23 + .../hourlyreport/dao/data/HourlyreportDO.java | 24 + .../dao/MonthlyReportContentMapper.java | 21 + .../dao/data/MonthlyReportContentDO.java | 24 + .../monthreport/dao/MonthreportMapper.java | 23 + .../monthreport/dao/data/MonthreportDO.java | 24 + .../operation/dao/OperationMapper.java | 19 + .../operation/dao/data/OperationDO.java | 22 + .../generated/project/dao/ProjectMapper.java | 25 + .../generated/project/dao/data/ProjectDO.java | 32 + .../generated/task/dao/TaskMapper.java | 31 + .../generated/task/dao/data/TaskDO.java | 40 ++ .../dao/WeeklyReportContentMapper.java | 21 + .../dao/data/WeeklyReportContentDO.java | 24 + .../weeklyreport/dao/WeeklyreportMapper.java | 23 + .../weeklyreport/dao/data/WeeklyreportDO.java | 24 + .../config/BusinessConfigRepository.java | 159 +++++ .../content/DailyReportContentRepository.java | 129 ++++ .../hostinfo/HostinfoRepository.java | 150 +++++ .../HourlyReportContentRepository.java | 132 ++++ .../hourlyreport/HourlyReportRepository.java | 156 +++++ .../MonthlyReportContentRepository.java | 128 ++++ .../monthreport/MonthlyReportRepository.java | 157 +++++ .../repository/project/ProjectRepository.java | 184 ++++++ .../repository/task/TaskRepository.java | 225 +++++++ .../WeeklyReportContentRepository.java | 128 ++++ .../weeklyreport/WeeklyReportRepository.java | 157 +++++ .../report/daily/dao/DailyReportMapper.java | 27 + .../report/daily/dao/data/DailyReportDO.java | 22 + .../repository/DailyReportRepository.java | 261 ++++++++ .../cat/report/DefaultReportManager.java | 12 +- .../report/service/AbstractReportService.java | 32 +- .../dianping/cat/service/HostinfoService.java | 4 +- .../dianping/cat/service/ProjectService.java | 4 +- .../com/dianping/cat/task/TaskManager.java | 4 +- .../resources/META-INF/plexus/components.xml | 326 +++++----- .../mybatis/mapper/BusinessConfigMapper.xml | 66 ++ .../mybatis/mapper/BusinessReportMapper.xml | 63 ++ .../mapper/DailyReportContentMapper.xml | 56 ++ .../mybatis/mapper/DailyReportMapper.xml | 85 +++ .../mybatis/mapper/HostinfoMapper.xml | 65 ++ .../mapper/HourlyReportContentMapper.xml | 56 ++ .../mybatis/mapper/HourlyreportMapper.xml | 78 +++ .../mapper/MonthlyReportContentMapper.xml | 56 ++ .../mybatis/mapper/MonthreportMapper.xml | 68 ++ .../mybatis/mapper/OperationMapper.xml | 60 ++ .../mybatis/mapper/ProjectMapper.xml | 84 +++ .../resources/mybatis/mapper/TaskMapper.xml | 100 +++ .../mapper/WeeklyReportContentMapper.xml | 56 ++ .../mybatis/mapper/WeeklyreportMapper.xml | 68 ++ .../cat/service/DefaultReportManagerTest.java | 8 +- cat-home/pom.xml | 22 +- .../cat/build/CatDatabaseConfigurator.java | 42 ++ .../cat/build/ComponentsConfigurator.java | 81 ++- .../alert/summary/dao/AlertSummaryMapper.java | 19 + .../summary/dao/data/AlertSummaryDO.java | 20 + .../alteration/dao/AlterationMapper.java | 27 + .../alteration/dao/data/AlterationDO.java | 42 ++ .../baseline/dao/BaselineMapper.java | 21 + .../baseline/dao/data/BaselineDO.java | 24 + .../dao/ConfigModificationMapper.java | 19 + .../dao/data/ConfigModificationDO.java | 24 + .../metric/graph/dao/MetricGraphMapper.java | 25 + .../metric/graph/dao/data/MetricGraphDO.java | 24 + .../metric/screen/dao/MetricScreenMapper.java | 31 + .../screen/dao/data/MetricScreenDO.java | 28 + .../overload/dao/OverloadMapper.java | 25 + .../overload/dao/data/OverloadDO.java | 32 + .../dao/TopologyGraphMapper.java | 21 + .../dao/data/TopologyGraphDO.java | 22 + .../alert/summary/AlertSummaryRepository.java | 122 ++++ .../alteration/AlterationRepository.java | 214 +++++++ .../baseline/BaselineRepository.java | 143 +++++ .../ConfigModificationRepository.java | 130 ++++ .../metric/graph/MetricGraphRepository.java | 162 +++++ .../metric/screen/MetricScreenRepository.java | 207 +++++++ .../overload/OverloadRepository.java | 174 ++++++ .../TopologyGraphRepository.java | 140 +++++ .../business/BusinessRuleConfigManager.java | 4 +- .../spi/config/UserDefinedRuleManager.java | 4 +- .../alert/summary/AlertSummaryService.java | 4 +- .../alert/summary/build/AlertInfoBuilder.java | 4 +- .../build/AlterationSummaryBuilder.java | 4 +- .../cat/report/page/alert/Handler.java | 4 +- .../cat/report/page/alteration/Handler.java | 4 +- .../graph/TopologyGraphManager.java | 4 +- .../task/DependencyReportBuilder.java | 4 +- .../service/DefaultBaselineService.java | 4 +- .../task/CapacityUpdateStatusManager.java | 4 +- .../overload/task/DailyCapacityUpdater.java | 12 +- .../overload/task/HourlyCapacityUpdater.java | 12 +- .../overload/task/MonthlyCapacityUpdater.java | 12 +- .../overload/task/TableCapacityService.java | 20 +- .../overload/task/WeeklyCapacityUpdater.java | 12 +- .../cat/report/page/storage/Handler.java | 4 +- .../cat/report/task/DefaultTaskConsumer.java | 4 +- .../task/reload/AbstractReportReloader.java | 8 +- .../config/BusinessTagConfigManager.java | 4 +- .../cat/system/page/config/Handler.java | 4 +- .../router/config/RouterConfigAdjustor.java | 4 +- .../router/config/RouterConfigHandler.java | 4 +- .../router/config/RouterConfigManager.java | 6 +- .../resources/META-INF/plexus/components.xml | 580 +++++++++++------- .../mybatis/mapper/AlertSummaryMapper.xml | 54 ++ .../mybatis/mapper/AlterationMapper.xml | 94 +++ .../mybatis/mapper/BaselineMapper.xml | 61 ++ .../mapper/ConfigModificationMapper.xml | 60 ++ .../mybatis/mapper/MetricGraphMapper.xml | 69 +++ .../mybatis/mapper/MetricScreenMapper.xml | 90 +++ .../mybatis/mapper/OverloadMapper.xml | 71 +++ .../mybatis/mapper/TopologyGraphMapper.xml | 61 ++ .../cat/report/service/ReportDaoTest.java | 4 +- 144 files changed, 7742 insertions(+), 583 deletions(-) create mode 100644 cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/alert/dao/AlertMapper.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/alert/dao/data/AlertDO.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/server/alarm/rule/dao/ServerAlarmRuleMapper.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/server/alarm/rule/dao/data/ServerAlarmRuleDO.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/user/define/rule/dao/UserDefineRuleMapper.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/user/define/rule/dao/data/UserDefineRuleDO.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java create mode 100644 cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml create mode 100644 cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml create mode 100644 cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/MyBatisRepositorySupport.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/business/config/dao/BusinessConfigMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/business/config/dao/data/BusinessConfigDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/businessreport/dao/BusinessReportMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/businessreport/dao/data/BusinessReportDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/daily/report/content/dao/DailyReportContentMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/daily/report/content/dao/data/DailyReportContentDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hostinfo/dao/HostinfoMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hostinfo/dao/data/HostinfoDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourly/report/content/dao/HourlyReportContentMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourly/report/content/dao/data/HourlyReportContentDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourlyreport/dao/HourlyreportMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourlyreport/dao/data/HourlyreportDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthly/report/content/dao/MonthlyReportContentMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthly/report/content/dao/data/MonthlyReportContentDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthreport/dao/MonthreportMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthreport/dao/data/MonthreportDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/operation/dao/OperationMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/operation/dao/data/OperationDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/project/dao/ProjectMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/project/dao/data/ProjectDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/task/dao/TaskMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/task/dao/data/TaskDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weekly/report/content/dao/WeeklyReportContentMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weekly/report/content/dao/data/WeeklyReportContentDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weeklyreport/dao/WeeklyreportMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weeklyreport/dao/data/WeeklyreportDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/DailyReportMapper.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/data/DailyReportDO.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java create mode 100644 cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml create mode 100644 cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml create mode 100644 cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml create mode 100644 cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml create mode 100644 cat-core/src/main/resources/mybatis/mapper/HostinfoMapper.xml create mode 100644 cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml create mode 100644 cat-core/src/main/resources/mybatis/mapper/HourlyreportMapper.xml create mode 100644 cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml create mode 100644 cat-core/src/main/resources/mybatis/mapper/MonthreportMapper.xml create mode 100644 cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml create mode 100644 cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml create mode 100644 cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml create mode 100644 cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml create mode 100644 cat-core/src/main/resources/mybatis/mapper/WeeklyreportMapper.xml create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alert/summary/dao/AlertSummaryMapper.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alert/summary/dao/data/AlertSummaryDO.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alteration/dao/AlterationMapper.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alteration/dao/data/AlterationDO.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/baseline/dao/BaselineMapper.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/baseline/dao/data/BaselineDO.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/config/modification/dao/ConfigModificationMapper.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/config/modification/dao/data/ConfigModificationDO.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/graph/dao/MetricGraphMapper.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/graph/dao/data/MetricGraphDO.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/screen/dao/MetricScreenMapper.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/screen/dao/data/MetricScreenDO.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/overload/dao/OverloadMapper.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/overload/dao/data/OverloadDO.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/topologygraph/dao/TopologyGraphMapper.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/topologygraph/dao/data/TopologyGraphDO.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java create mode 100644 cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java create mode 100644 cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml create mode 100644 cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml create mode 100644 cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml create mode 100644 cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml create mode 100644 cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml create mode 100644 cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml create mode 100644 cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml create mode 100644 cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml diff --git a/cat-alarm/pom.xml b/cat-alarm/pom.xml index a36131e317..46e6d15a42 100644 --- a/cat-alarm/pom.xml +++ b/cat-alarm/pom.xml @@ -31,6 +31,14 @@ org.unidal.framework dal-jdbc + + org.mybatis + mybatis + + + org.projectlombok + lombok + javax.servlet servlet-api diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java index 58a3bfa92b..865b485db9 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java @@ -29,7 +29,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.alarm.Alert; -import com.dianping.cat.alarm.AlertDao; +import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; import com.dianping.cat.alarm.spi.AlertEntity; import com.dianping.cat.alarm.spi.sender.SendMessageEntity; @@ -37,7 +37,7 @@ public class AlertService { @Inject - private AlertDao m_alertDao; + private AlertRepository m_alertDao; private Alert buildAlert(AlertEntity alertEntity, SendMessageEntity message) { Alert alert = new Alert(); diff --git a/cat-alarm/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java b/cat-alarm/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java index a64b6ae00f..9b51f796b5 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java +++ b/cat-alarm/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java @@ -19,12 +19,20 @@ package com.dianping.cat.build; import org.unidal.dal.jdbc.configuration.AbstractJdbcResourceConfigurator; +import org.unidal.dal.jdbc.datasource.DataSourceManager; import org.unidal.lookup.configuration.Component; +import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; +import com.dianping.cat.core.mybatis.repository.server.alarm.rule.ServerAlarmRuleRepository; +import com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository; + import java.util.ArrayList; import java.util.List; final class CatDatabaseConfigurator extends AbstractJdbcResourceConfigurator { + private static final String[] REPLACED_DAO_ROLES = { "com.dianping.cat.alarm.AlertDao", + "com.dianping.cat.alarm.ServerAlarmRuleDao", "com.dianping.cat.alarm.UserDefineRuleDao" }; + @Override public List defineComponents() { List all = new ArrayList(); @@ -33,7 +41,28 @@ public List defineComponents() { defineSimpleTableProviderComponents(all, "cat", com.dianping.cat.alarm._INDEX.getEntityClasses()); defineDaoComponents(all, com.dianping.cat.alarm._INDEX.getDaoClasses()); + removeReplacedDaoComponents(all); + addRepositoryComponents(all); return all; } + + private void addRepositoryComponents(List components) { + components.add(C(AlertRepository.class).req(DataSourceManager.class)); + components.add(C(ServerAlarmRuleRepository.class).req(DataSourceManager.class)); + components.add(C(UserDefineRuleRepository.class).req(DataSourceManager.class)); + } + + private boolean isReplacedDaoRole(String role) { + for (String replacedDaoRole : REPLACED_DAO_ROLES) { + if (replacedDaoRole.equals(role)) { + return true; + } + } + return false; + } + + private void removeReplacedDaoComponents(List components) { + components.removeIf(component -> isReplacedDaoRole(component.getModel().getRole())); + } } diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/alert/dao/AlertMapper.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/alert/dao/AlertMapper.java new file mode 100644 index 0000000000..91a079e216 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/alert/dao/AlertMapper.java @@ -0,0 +1,27 @@ +package com.dianping.cat.core.mybatis.generated.alert.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.alert.dao.data.AlertDO; + +public interface AlertMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + AlertDO findByPrimaryKey(@Param("id") Integer id); + + int insert(AlertDO record); + + List queryAll(); + + int updateByPrimaryKey(AlertDO record); + + List queryAlertsByTimeDomain(@Param("record") AlertDO record); + + List queryAlertsByTimeDomainCategories(@Param("record") AlertDO record); + + List queryAlertsByTimeCategoryDomain(@Param("record") AlertDO record); + + List queryAlertsByTimeCategory(@Param("record") AlertDO record); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/alert/dao/data/AlertDO.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/alert/dao/data/AlertDO.java new file mode 100644 index 0000000000..e8e45f689b --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/alert/dao/data/AlertDO.java @@ -0,0 +1,32 @@ +package com.dianping.cat.core.mybatis.generated.alert.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class AlertDO { + private Integer id; + + private String domain; + + private Date alertTime; + + private String category; + + private String type; + + private String content; + + private String metric; + + private Date creationDate; + + private Integer keyId; + + private Date startTime; + + private Date endTime; + + private String[] categories; +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/server/alarm/rule/dao/ServerAlarmRuleMapper.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/server/alarm/rule/dao/ServerAlarmRuleMapper.java new file mode 100644 index 0000000000..4881bdafba --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/server/alarm/rule/dao/ServerAlarmRuleMapper.java @@ -0,0 +1,21 @@ +package com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao.data.ServerAlarmRuleDO; + +public interface ServerAlarmRuleMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + ServerAlarmRuleDO findByPrimaryKey(@Param("id") Integer id); + + int insert(ServerAlarmRuleDO record); + + List queryAll(); + + int updateByPrimaryKey(ServerAlarmRuleDO record); + + List findAll(@Param("record") ServerAlarmRuleDO record); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/server/alarm/rule/dao/data/ServerAlarmRuleDO.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/server/alarm/rule/dao/data/ServerAlarmRuleDO.java new file mode 100644 index 0000000000..f1e2317b50 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/server/alarm/rule/dao/data/ServerAlarmRuleDO.java @@ -0,0 +1,30 @@ +package com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class ServerAlarmRuleDO { + private Integer id; + + private String category; + + private String endPoint; + + private String measurement; + + private String tags; + + private String content; + + private String type; + + private String creator; + + private Date creationDate; + + private Date updatetime; + + private Integer keyId; +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/user/define/rule/dao/UserDefineRuleMapper.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/user/define/rule/dao/UserDefineRuleMapper.java new file mode 100644 index 0000000000..e915bce9a4 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/user/define/rule/dao/UserDefineRuleMapper.java @@ -0,0 +1,21 @@ +package com.dianping.cat.core.mybatis.generated.user.define.rule.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.user.define.rule.dao.data.UserDefineRuleDO; + +public interface UserDefineRuleMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + UserDefineRuleDO findByPrimaryKey(@Param("id") Integer id); + + int insert(UserDefineRuleDO record); + + List queryAll(); + + int updateByPrimaryKey(UserDefineRuleDO record); + + List findMaxId(@Param("record") UserDefineRuleDO record); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/user/define/rule/dao/data/UserDefineRuleDO.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/user/define/rule/dao/data/UserDefineRuleDO.java new file mode 100644 index 0000000000..db049913fc --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/user/define/rule/dao/data/UserDefineRuleDO.java @@ -0,0 +1,18 @@ +package com.dianping.cat.core.mybatis.generated.user.define.rule.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class UserDefineRuleDO { + private Integer id; + + private String content; + + private Date creationDate; + + private Integer maxId; + + private Integer keyId; +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java new file mode 100644 index 0000000000..539bf443f3 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java @@ -0,0 +1,191 @@ +package com.dianping.cat.core.mybatis.repository.alert; + +import com.dianping.cat.alarm.Alert; +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.alert.dao.AlertMapper; +import com.dianping.cat.core.mybatis.generated.alert.dao.data.AlertDO; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class AlertRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/AlertMapper.xml"; + + @Override + protected Class getMapperClass() { + return AlertMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public Alert createLocal() { + return new Alert(); + } + + public int deleteByPK(Alert proto) throws DalException { + try (SqlSession session = openSession()) { + AlertMapper mapper = session.getMapper(AlertMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for Alert.", e); + } + } + + public List queryAlertsByTimeDomain(java.util.Date startTime, java.util.Date endTime, String domain, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + AlertMapper mapper = session.getMapper(AlertMapper.class); + AlertDO record = new AlertDO(); + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setDomain(domain); + return mapper.queryAlertsByTimeDomain(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing queryAlertsByTimeDomain for Alert.", e); + } + } + + public List queryAlertsByTimeDomainCategories(java.util.Date startTime, java.util.Date endTime, String domain, String[] categories, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + AlertMapper mapper = session.getMapper(AlertMapper.class); + AlertDO record = new AlertDO(); + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setDomain(domain); + record.setCategories(categories); + return mapper.queryAlertsByTimeDomainCategories(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing queryAlertsByTimeDomainCategories for Alert.", e); + } + } + + public List queryAlertsByTimeCategoryDomain(java.util.Date startTime, java.util.Date endTime, String category, String domain, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + AlertMapper mapper = session.getMapper(AlertMapper.class); + AlertDO record = new AlertDO(); + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setCategory(category); + record.setDomain(domain); + return mapper.queryAlertsByTimeCategoryDomain(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing queryAlertsByTimeCategoryDomain for Alert.", e); + } + } + + public List queryAlertsByTimeCategory(java.util.Date startTime, java.util.Date endTime, String category, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + AlertMapper mapper = session.getMapper(AlertMapper.class); + AlertDO record = new AlertDO(); + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setCategory(category); + return mapper.queryAlertsByTimeCategory(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing queryAlertsByTimeCategory for Alert.", e); + } + } + + public Alert findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + AlertMapper mapper = session.getMapper(AlertMapper.class); + AlertDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for Alert.", e); + } + } + + public int insert(Alert proto) throws DalException { + try (SqlSession session = openSession()) { + AlertMapper mapper = session.getMapper(AlertMapper.class); + AlertDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for Alert.", e); + } + } + + public int updateByPK(Alert proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + AlertMapper mapper = session.getMapper(AlertMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for Alert.", e); + } + } + + private Alert requireFound(AlertDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No Alert found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private Alert toModel(AlertDO record) { + Alert model = new Alert(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getDomain() != null) { + model.setDomain(record.getDomain()); + } + if (record.getAlertTime() != null) { + model.setAlertTime(record.getAlertTime()); + } + if (record.getCategory() != null) { + model.setCategory(record.getCategory()); + } + if (record.getType() != null) { + model.setType(record.getType()); + } + if (record.getContent() != null) { + model.setContent(record.getContent()); + } + if (record.getMetric() != null) { + model.setMetric(record.getMetric()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + model.afterLoad(); + return model; + } + + private AlertDO toRecord(Alert model) { + AlertDO record = new AlertDO(); + + record.setId(model.getId()); + record.setDomain(model.getDomain()); + record.setAlertTime(model.getAlertTime()); + record.setCategory(model.getCategory()); + record.setType(model.getType()); + record.setContent(model.getContent()); + record.setMetric(model.getMetric()); + record.setCreationDate(model.getCreationDate()); + record.setKeyId(model.getKeyId()); + record.setStartTime(model.getStartTime()); + record.setEndTime(model.getEndTime()); + record.setCategories(model.getCategories()); + return record; + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java new file mode 100644 index 0000000000..1a6aa9e973 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java @@ -0,0 +1,152 @@ +package com.dianping.cat.core.mybatis.repository.server.alarm.rule; + +import com.dianping.cat.alarm.ServerAlarmRule; +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao.ServerAlarmRuleMapper; +import com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao.data.ServerAlarmRuleDO; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class ServerAlarmRuleRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/ServerAlarmRuleMapper.xml"; + + @Override + protected Class getMapperClass() { + return ServerAlarmRuleMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public ServerAlarmRule createLocal() { + return new ServerAlarmRule(); + } + + public int deleteByPK(ServerAlarmRule proto) throws DalException { + try (SqlSession session = openSession()) { + ServerAlarmRuleMapper mapper = session.getMapper(ServerAlarmRuleMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for ServerAlarmRule.", e); + } + } + + public List findAll(Readset readset) throws DalException { + try (SqlSession session = openSession()) { + ServerAlarmRuleMapper mapper = session.getMapper(ServerAlarmRuleMapper.class); + ServerAlarmRuleDO record = new ServerAlarmRuleDO(); + return mapper.findAll(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findAll for ServerAlarmRule.", e); + } + } + + public ServerAlarmRule findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + ServerAlarmRuleMapper mapper = session.getMapper(ServerAlarmRuleMapper.class); + ServerAlarmRuleDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for ServerAlarmRule.", e); + } + } + + public int insert(ServerAlarmRule proto) throws DalException { + try (SqlSession session = openSession()) { + ServerAlarmRuleMapper mapper = session.getMapper(ServerAlarmRuleMapper.class); + ServerAlarmRuleDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for ServerAlarmRule.", e); + } + } + + public int updateByPK(ServerAlarmRule proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + ServerAlarmRuleMapper mapper = session.getMapper(ServerAlarmRuleMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for ServerAlarmRule.", e); + } + } + + private ServerAlarmRule requireFound(ServerAlarmRuleDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No ServerAlarmRule found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private ServerAlarmRule toModel(ServerAlarmRuleDO record) { + ServerAlarmRule model = new ServerAlarmRule(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getCategory() != null) { + model.setCategory(record.getCategory()); + } + if (record.getEndPoint() != null) { + model.setEndPoint(record.getEndPoint()); + } + if (record.getMeasurement() != null) { + model.setMeasurement(record.getMeasurement()); + } + if (record.getTags() != null) { + model.setTags(record.getTags()); + } + if (record.getContent() != null) { + model.setContent(record.getContent()); + } + if (record.getType() != null) { + model.setType(record.getType()); + } + if (record.getCreator() != null) { + model.setCreator(record.getCreator()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + if (record.getUpdatetime() != null) { + model.setUpdatetime(record.getUpdatetime()); + } + model.afterLoad(); + return model; + } + + private ServerAlarmRuleDO toRecord(ServerAlarmRule model) { + ServerAlarmRuleDO record = new ServerAlarmRuleDO(); + + record.setId(model.getId()); + record.setCategory(model.getCategory()); + record.setEndPoint(model.getEndPoint()); + record.setMeasurement(model.getMeasurement()); + record.setTags(model.getTags()); + record.setContent(model.getContent()); + record.setType(model.getType()); + record.setCreator(model.getCreator()); + record.setCreationDate(model.getCreationDate()); + record.setUpdatetime(model.getUpdatetime()); + record.setKeyId(model.getKeyId()); + return record; + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java new file mode 100644 index 0000000000..2f49107009 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java @@ -0,0 +1,130 @@ +package com.dianping.cat.core.mybatis.repository.user.define.rule; + +import com.dianping.cat.alarm.UserDefineRule; +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.user.define.rule.dao.UserDefineRuleMapper; +import com.dianping.cat.core.mybatis.generated.user.define.rule.dao.data.UserDefineRuleDO; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class UserDefineRuleRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/UserDefineRuleMapper.xml"; + + @Override + protected Class getMapperClass() { + return UserDefineRuleMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public UserDefineRule createLocal() { + return new UserDefineRule(); + } + + public int deleteByPK(UserDefineRule proto) throws DalException { + try (SqlSession session = openSession()) { + UserDefineRuleMapper mapper = session.getMapper(UserDefineRuleMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for UserDefineRule.", e); + } + } + + public UserDefineRule findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + UserDefineRuleMapper mapper = session.getMapper(UserDefineRuleMapper.class); + UserDefineRuleDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for UserDefineRule.", e); + } + } + + public UserDefineRule findMaxId(Readset readset) throws DalException { + try (SqlSession session = openSession()) { + UserDefineRuleMapper mapper = session.getMapper(UserDefineRuleMapper.class); + UserDefineRuleDO record = new UserDefineRuleDO(); + UserDefineRuleDO result = mapper.findMaxId(record).stream().findFirst().orElse(null); + return requireFound(result, "findMaxId", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findMaxId for UserDefineRule.", e); + } + } + + public int insert(UserDefineRule proto) throws DalException { + try (SqlSession session = openSession()) { + UserDefineRuleMapper mapper = session.getMapper(UserDefineRuleMapper.class); + UserDefineRuleDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for UserDefineRule.", e); + } + } + + public int updateByPK(UserDefineRule proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + UserDefineRuleMapper mapper = session.getMapper(UserDefineRuleMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for UserDefineRule.", e); + } + } + + private UserDefineRule requireFound(UserDefineRuleDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No UserDefineRule found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private UserDefineRule toModel(UserDefineRuleDO record) { + UserDefineRule model = new UserDefineRule(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getContent() != null) { + model.setContent(record.getContent()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + if (record.getMaxId() != null) { + model.setMaxId(record.getMaxId()); + } + model.afterLoad(); + return model; + } + + private UserDefineRuleDO toRecord(UserDefineRule model) { + UserDefineRuleDO record = new UserDefineRuleDO(); + + record.setId(model.getId()); + record.setContent(model.getContent()); + record.setCreationDate(model.getCreationDate()); + record.setKeyId(model.getKeyId()); + return record; + } +} diff --git a/cat-alarm/src/main/resources/META-INF/plexus/components.xml b/cat-alarm/src/main/resources/META-INF/plexus/components.xml index 01ef6f2e72..c5e90d0373 100644 --- a/cat-alarm/src/main/resources/META-INF/plexus/components.xml +++ b/cat-alarm/src/main/resources/META-INF/plexus/components.xml @@ -29,29 +29,29 @@ - com.dianping.cat.alarm.AlertDao - com.dianping.cat.alarm.AlertDao + com.dianping.cat.core.mybatis.repository.alert.AlertRepository + com.dianping.cat.core.mybatis.repository.alert.AlertRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.alarm.ServerAlarmRuleDao - com.dianping.cat.alarm.ServerAlarmRuleDao + com.dianping.cat.core.mybatis.repository.server.alarm.rule.ServerAlarmRuleRepository + com.dianping.cat.core.mybatis.repository.server.alarm.rule.ServerAlarmRuleRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.alarm.UserDefineRuleDao - com.dianping.cat.alarm.UserDefineRuleDao + com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository + com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager @@ -186,7 +186,7 @@ com.dianping.cat.alarm.service.AlertService - com.dianping.cat.alarm.AlertDao + com.dianping.cat.core.mybatis.repository.alert.AlertRepository diff --git a/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml b/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml new file mode 100644 index 0000000000..7fbb4d9dd1 --- /dev/null +++ b/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + id, + domain, + alert_time, + category, + type, + content, + metric, + creation_date + + + + INSERT INTO alert + (domain, alert_time, category, type, content, metric, creation_date) + VALUES + (#{domain}, #{alertTime}, #{category}, #{type}, #{content}, #{metric}, #{creationDate}) + + + + + + + + DELETE FROM alert + WHERE id = #{id} + + + + UPDATE alert + SET domain = #{domain}, + alert_time = #{alertTime}, + category = #{category}, + type = #{type}, + content = #{content}, + metric = #{metric}, + creation_date = #{creationDate} + WHERE id = #{id} + + + + + + + + + + diff --git a/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml b/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml new file mode 100644 index 0000000000..e7fde46b35 --- /dev/null +++ b/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + id, + category, + endPoint, + measurement, + tags, + content, + type, + creator, + creation_date, + updatetime + + + + INSERT INTO server_alarm_rule + (category, endPoint, measurement, tags, content, type, creator, creation_date, updatetime) + VALUES + (#{category}, #{endPoint}, #{measurement}, #{tags}, #{content}, #{type}, #{creator}, #{creationDate}, #{updatetime}) + + + + + + + + DELETE FROM server_alarm_rule + WHERE id = #{id} + + + + UPDATE server_alarm_rule + SET category = #{category}, + endPoint = #{endPoint}, + measurement = #{measurement}, + tags = #{tags}, + content = #{content}, + type = #{type}, + creator = #{creator}, + creation_date = #{creationDate}, + updatetime = #{updatetime} + WHERE id = #{id} + + + + diff --git a/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml b/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml new file mode 100644 index 0000000000..daa189fe9f --- /dev/null +++ b/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + id, + content, + creation_date + + + + INSERT INTO user_define_rule + (content, creation_date) + VALUES + (#{content}, #{creationDate}) + + + + + + + + DELETE FROM user_define_rule + WHERE id = #{id} + + + + UPDATE user_define_rule + SET content = #{content}, + creation_date = #{creationDate} + WHERE id = #{id} + + + + diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java index d85ccbaf98..0cbbe1c9ed 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java @@ -66,8 +66,8 @@ import com.dianping.cat.consumer.top.TopDelegate; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.consumer.transaction.TransactionDelegate; -import com.dianping.cat.core.dal.HourlyReportContentDao; -import com.dianping.cat.core.dal.HourlyReportDao; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; import com.dianping.cat.message.PathBuilder; import com.dianping.cat.message.storage.MessageBucketManager; import com.dianping.cat.report.DefaultReportManager; @@ -119,7 +119,7 @@ private Collection defineCrossComponents() { all.add(C(IpConvertManager.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // - .req(ReportBucketManager.class, HourlyReportDao.class, HourlyReportContentDao.class, DomainValidator.class) // + .req(ReportBucketManager.class, HourlyReportRepository.class, HourlyReportContentRepository.class, DomainValidator.class) // .config(E("name").value(ID))); return all; @@ -135,7 +135,7 @@ private Collection defineDependencyComponents() { all.add(C(DatabaseParser.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // - .req(ReportBucketManager.class, HourlyReportDao.class, HourlyReportContentDao.class, DomainValidator.class) // + .req(ReportBucketManager.class, HourlyReportRepository.class, HourlyReportContentRepository.class, DomainValidator.class) // .config(E("name").value(ID))); return all; @@ -160,7 +160,7 @@ private Collection defineEventComponents() { all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // - .req(ReportBucketManager.class, HourlyReportDao.class, HourlyReportContentDao.class, DomainValidator.class) // + .req(ReportBucketManager.class, HourlyReportRepository.class, HourlyReportContentRepository.class, DomainValidator.class) // .config(E("name").value(ID))); return all; @@ -175,7 +175,7 @@ private Collection defineHeartbeatComponents() { all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // - .req(ReportBucketManager.class, HourlyReportDao.class, HourlyReportContentDao.class, DomainValidator.class) // + .req(ReportBucketManager.class, HourlyReportRepository.class, HourlyReportContentRepository.class, DomainValidator.class) // .config(E("name").value(ID))); return all; @@ -190,7 +190,7 @@ private Collection defineMatrixComponents() { all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // - .req(ReportBucketManager.class, HourlyReportDao.class, HourlyReportContentDao.class, DomainValidator.class) // + .req(ReportBucketManager.class, HourlyReportRepository.class, HourlyReportContentRepository.class, DomainValidator.class) // .config(E("name").value(ID))); return all; @@ -205,7 +205,7 @@ private Collection defineBusinessComponents() { all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // - .req(ReportBucketManager.class, HourlyReportDao.class, HourlyReportContentDao.class, DomainValidator.class) // + .req(ReportBucketManager.class, HourlyReportRepository.class, HourlyReportContentRepository.class, DomainValidator.class) // .config(E("name").value(ID))); return all; } @@ -226,7 +226,7 @@ private Collection defineProblemComponents() { new String[] { DefaultProblemHandler.ID, LongExecutionProblemHandler.ID }, "m_handlers")); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // - .req(ReportBucketManager.class, HourlyReportDao.class, HourlyReportContentDao.class, DomainValidator.class) // + .req(ReportBucketManager.class, HourlyReportRepository.class, HourlyReportContentRepository.class, DomainValidator.class) // .config(E("name").value(ID))); all.add(A(ProblemDelegate.class)); @@ -244,7 +244,7 @@ private Collection defineStateComponents() { all.add(A(ProjectService.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // - .req(ReportBucketManager.class, HourlyReportDao.class, HourlyReportContentDao.class, DomainValidator.class) // + .req(ReportBucketManager.class, HourlyReportRepository.class, HourlyReportContentRepository.class, DomainValidator.class) // .config(E("name").value(ID))); return all; @@ -259,7 +259,7 @@ private Collection defineTopComponents() { all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // - .req(ReportBucketManager.class, HourlyReportDao.class, HourlyReportContentDao.class, DomainValidator.class) // + .req(ReportBucketManager.class, HourlyReportRepository.class, HourlyReportContentRepository.class, DomainValidator.class) // .config(E("name").value(ID))); return all; @@ -274,7 +274,7 @@ private Collection defineTransactionComponents() { all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // - .req(ReportBucketManager.class, HourlyReportDao.class, HourlyReportContentDao.class, DomainValidator.class) // + .req(ReportBucketManager.class, HourlyReportRepository.class, HourlyReportContentRepository.class, DomainValidator.class) // .config(E("name").value(ID))); return all; @@ -295,7 +295,7 @@ private Collection defineStorageComponents() { all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // - .req(ReportBucketManager.class, HourlyReportDao.class, HourlyReportContentDao.class, DomainValidator.class) // + .req(ReportBucketManager.class, HourlyReportRepository.class, HourlyReportContentRepository.class, DomainValidator.class) // .config(E("name").value(ID))); return all; diff --git a/cat-consumer/src/main/resources/META-INF/plexus/components.xml b/cat-consumer/src/main/resources/META-INF/plexus/components.xml index cf2981df31..c4325a741b 100644 --- a/cat-consumer/src/main/resources/META-INF/plexus/components.xml +++ b/cat-consumer/src/main/resources/META-INF/plexus/components.xml @@ -64,10 +64,10 @@ com.dianping.cat.report.ReportBucketManager - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.report.DomainValidator @@ -131,10 +131,10 @@ com.dianping.cat.report.ReportBucketManager - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.report.DomainValidator @@ -204,10 +204,10 @@ com.dianping.cat.report.ReportBucketManager - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.report.DomainValidator @@ -275,10 +275,10 @@ com.dianping.cat.report.ReportBucketManager - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.report.DomainValidator @@ -328,10 +328,10 @@ com.dianping.cat.report.ReportBucketManager - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.report.DomainValidator @@ -416,7 +416,7 @@ com.dianping.cat.service.ProjectService - com.dianping.cat.core.dal.ProjectDao + com.dianping.cat.core.mybatis.repository.project.ProjectRepository com.dianping.cat.config.server.ServerConfigManager @@ -440,10 +440,10 @@ com.dianping.cat.report.ReportBucketManager - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.report.DomainValidator @@ -502,10 +502,10 @@ com.dianping.cat.report.ReportBucketManager - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.report.DomainValidator @@ -557,10 +557,10 @@ com.dianping.cat.report.ReportBucketManager - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.report.DomainValidator @@ -619,10 +619,10 @@ com.dianping.cat.report.ReportBucketManager - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.report.DomainValidator @@ -711,10 +711,10 @@ com.dianping.cat.report.ReportBucketManager - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.report.DomainValidator @@ -766,10 +766,10 @@ com.dianping.cat.report.ReportBucketManager - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.report.DomainValidator diff --git a/cat-core/src/main/java/com/dianping/cat/build/CatCoreDatabaseConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/CatCoreDatabaseConfigurator.java index 285ecfbc56..287440f6fe 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/CatCoreDatabaseConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/CatCoreDatabaseConfigurator.java @@ -26,9 +26,27 @@ import org.unidal.lookup.configuration.Component; import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.repository.project.ProjectRepository; +import com.dianping.cat.core.mybatis.repository.task.TaskRepository; +import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; final class CatCoreDatabaseConfigurator extends AbstractJdbcResourceConfigurator { - private static final String CONFIG_DAO_ROLE = "com.dianping.cat.core.config.ConfigDao"; + private static final String[] REPLACED_DAO_ROLES = { "com.dianping.cat.core.config.ConfigDao", + "com.dianping.cat.core.config.BusinessConfigDao", "com.dianping.cat.core.dal.DailyReportDao", + "com.dianping.cat.core.dal.DailyReportContentDao", "com.dianping.cat.core.dal.HostinfoDao", + "com.dianping.cat.core.dal.HourlyReportDao", "com.dianping.cat.core.dal.HourlyReportContentDao", + "com.dianping.cat.core.dal.MonthlyReportDao", "com.dianping.cat.core.dal.MonthlyReportContentDao", + "com.dianping.cat.core.dal.ProjectDao", "com.dianping.cat.core.dal.TaskDao", + "com.dianping.cat.core.dal.WeeklyReportDao", "com.dianping.cat.core.dal.WeeklyReportContentDao" }; @Override public List defineComponents() { @@ -36,16 +54,42 @@ public List defineComponents() { defineSimpleTableProviderComponents(all, "cat", com.dianping.cat.core.config._INDEX.getEntityClasses()); defineDaoComponents(all, com.dianping.cat.core.config._INDEX.getDaoClasses()); - removeConfigDaoComponent(all); - all.add(C(ConfigRepository.class).req(DataSourceManager.class)); + removeReplacedDaoComponents(all); + addRepositoryComponents(all); defineSimpleTableProviderComponents(all, "cat", com.dianping.cat.core.dal._INDEX.getEntityClasses()); defineDaoComponents(all, com.dianping.cat.core.dal._INDEX.getDaoClasses()); + removeReplacedDaoComponents(all); return all; } - private void removeConfigDaoComponent(List components) { - components.removeIf(component -> CONFIG_DAO_ROLE.equals(component.getModel().getRole())); + private void addRepositoryComponents(List components) { + components.add(C(ConfigRepository.class).req(DataSourceManager.class)); + components.add(C(DailyReportRepository.class).req(DataSourceManager.class)); + components.add(C(BusinessConfigRepository.class).req(DataSourceManager.class)); + components.add(C(DailyReportContentRepository.class).req(DataSourceManager.class)); + components.add(C(HostinfoRepository.class).req(DataSourceManager.class)); + components.add(C(HourlyReportRepository.class).req(DataSourceManager.class)); + components.add(C(HourlyReportContentRepository.class).req(DataSourceManager.class)); + components.add(C(MonthlyReportRepository.class).req(DataSourceManager.class)); + components.add(C(MonthlyReportContentRepository.class).req(DataSourceManager.class)); + components.add(C(ProjectRepository.class).req(DataSourceManager.class)); + components.add(C(TaskRepository.class).req(DataSourceManager.class)); + components.add(C(WeeklyReportRepository.class).req(DataSourceManager.class)); + components.add(C(WeeklyReportContentRepository.class).req(DataSourceManager.class)); + } + + private boolean isReplacedDaoRole(String role) { + for (String replacedDaoRole : REPLACED_DAO_ROLES) { + if (replacedDaoRole.equals(role)) { + return true; + } + } + return false; + } + + private void removeReplacedDaoComponents(List components) { + components.removeIf(component -> isReplacedDaoRole(component.getModel().getRole())); } } diff --git a/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java index 621b2aface..3bf41822b7 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java @@ -26,9 +26,27 @@ import org.unidal.lookup.configuration.Component; import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.repository.project.ProjectRepository; +import com.dianping.cat.core.mybatis.repository.task.TaskRepository; +import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; public final class CatDatabaseConfigurator extends AbstractJdbcResourceConfigurator { - private static final String CONFIG_DAO_ROLE = "com.dianping.cat.core.config.ConfigDao"; + private static final String[] REPLACED_DAO_ROLES = { "com.dianping.cat.core.config.ConfigDao", + "com.dianping.cat.core.config.BusinessConfigDao", "com.dianping.cat.core.dal.DailyReportDao", + "com.dianping.cat.core.dal.DailyReportContentDao", "com.dianping.cat.core.dal.HostinfoDao", + "com.dianping.cat.core.dal.HourlyReportDao", "com.dianping.cat.core.dal.HourlyReportContentDao", + "com.dianping.cat.core.dal.MonthlyReportDao", "com.dianping.cat.core.dal.MonthlyReportContentDao", + "com.dianping.cat.core.dal.ProjectDao", "com.dianping.cat.core.dal.TaskDao", + "com.dianping.cat.core.dal.WeeklyReportDao", "com.dianping.cat.core.dal.WeeklyReportContentDao" }; @Override public List defineComponents() { @@ -41,13 +59,38 @@ public List defineComponents() { defineSimpleTableProviderComponents(all, "cat", com.dianping.cat.core.config._INDEX.getEntityClasses()); defineDaoComponents(all, com.dianping.cat.core.config._INDEX.getDaoClasses()); - removeConfigDaoComponent(all); - all.add(C(ConfigRepository.class).req(DataSourceManager.class)); + removeReplacedDaoComponents(all); + addRepositoryComponents(all); return all; } - private void removeConfigDaoComponent(List components) { - components.removeIf(component -> CONFIG_DAO_ROLE.equals(component.getModel().getRole())); + private void addRepositoryComponents(List components) { + components.add(C(ConfigRepository.class).req(DataSourceManager.class)); + components.add(C(DailyReportRepository.class).req(DataSourceManager.class)); + components.add(C(BusinessConfigRepository.class).req(DataSourceManager.class)); + components.add(C(DailyReportContentRepository.class).req(DataSourceManager.class)); + components.add(C(HostinfoRepository.class).req(DataSourceManager.class)); + components.add(C(HourlyReportRepository.class).req(DataSourceManager.class)); + components.add(C(HourlyReportContentRepository.class).req(DataSourceManager.class)); + components.add(C(MonthlyReportRepository.class).req(DataSourceManager.class)); + components.add(C(MonthlyReportContentRepository.class).req(DataSourceManager.class)); + components.add(C(ProjectRepository.class).req(DataSourceManager.class)); + components.add(C(TaskRepository.class).req(DataSourceManager.class)); + components.add(C(WeeklyReportRepository.class).req(DataSourceManager.class)); + components.add(C(WeeklyReportContentRepository.class).req(DataSourceManager.class)); + } + + private boolean isReplacedDaoRole(String role) { + for (String replacedDaoRole : REPLACED_DAO_ROLES) { + if (replacedDaoRole.equals(role)) { + return true; + } + } + return false; + } + + private void removeReplacedDaoComponents(List components) { + components.removeIf(component -> isReplacedDaoRole(component.getModel().getRole())); } } diff --git a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java index 173e9b2e29..774e44eded 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java @@ -39,7 +39,7 @@ import com.dianping.cat.configuration.business.entity.BusinessReportConfig; import com.dianping.cat.configuration.business.transform.DefaultSaxParser; import com.dianping.cat.core.config.BusinessConfig; -import com.dianping.cat.core.config.BusinessConfigDao; +import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; import com.dianping.cat.core.config.BusinessConfigEntity; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -50,7 +50,7 @@ public class BusinessConfigManager extends ContainerHolder implements Initializa public final static String BASE_CONFIG = "base"; @Inject - private BusinessConfigDao m_configDao; + private BusinessConfigRepository m_configDao; private Map> m_domains = new ConcurrentHashMap>(); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/MyBatisRepositorySupport.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/MyBatisRepositorySupport.java new file mode 100644 index 0000000000..d70208a25a --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/MyBatisRepositorySupport.java @@ -0,0 +1,128 @@ +package com.dianping.cat.core.mybatis; + +import java.io.IOException; +import java.io.Reader; +import java.sql.Connection; + +import javax.sql.DataSource; + +import org.apache.ibatis.builder.xml.XMLMapperBuilder; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.lookup.annotation.Inject; + +public abstract class MyBatisRepositorySupport { + private static final String DATA_SOURCE_NAME = "cat"; + + @Inject + private DataSourceManager m_dataSourceManager; + + private volatile SqlSessionFactory m_sqlSessionFactory; + + protected abstract Class getMapperClass(); + + protected abstract String getMapperResource(); + + protected SqlSession openSession() { + return getSqlSessionFactory().openSession(false); + } + + private SqlSessionFactory getSqlSessionFactory() { + SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + synchronized (this) { + sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + sqlSessionFactory = newSqlSessionFactory(); + m_sqlSessionFactory = sqlSessionFactory; + } + } + } + + return sqlSessionFactory; + } + + private void loadMapperXml(Configuration configuration) { + String mapperResource = getMapperResource(); + + try (Reader reader = Resources.getResourceAsReader(mapperResource)) { + XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, mapperResource, + configuration.getSqlFragments()); + + mapperParser.parse(); + } catch (IOException e) { + throw new IllegalStateException("Error when loading MyBatis mapper: " + mapperResource, e); + } + } + + private SqlSessionFactory newSqlSessionFactory() { + Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), + new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); + + configuration.addMapper(getMapperClass()); + loadMapperXml(configuration); + return new SqlSessionFactoryBuilder().build(configuration); + } + + private static final class UnidalDataSource implements DataSource { + private final DataSourceManager m_dataSourceManager; + + private final String m_dataSourceName; + + private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { + m_dataSourceManager = dataSourceManager; + m_dataSourceName = dataSourceName; + } + + @Override + public Connection getConnection() throws java.sql.SQLException { + return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); + } + + @Override + public Connection getConnection(String username, String password) throws java.sql.SQLException { + return getConnection(); + } + + @Override + public int getLoginTimeout() { + return 0; + } + + @Override + public java.io.PrintWriter getLogWriter() { + return null; + } + + @Override + public java.util.logging.Logger getParentLogger() { + return java.util.logging.Logger.getGlobal(); + } + + @Override + public boolean isWrapperFor(Class iface) { + return false; + } + + @Override + public void setLoginTimeout(int seconds) { + } + + @Override + public void setLogWriter(java.io.PrintWriter out) { + } + + @Override + public T unwrap(Class iface) throws java.sql.SQLException { + throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/business/config/dao/BusinessConfigMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/business/config/dao/BusinessConfigMapper.java new file mode 100644 index 0000000000..49748ea141 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/business/config/dao/BusinessConfigMapper.java @@ -0,0 +1,25 @@ +package com.dianping.cat.core.mybatis.generated.business.config.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.business.config.dao.data.BusinessConfigDO; + +public interface BusinessConfigMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + BusinessConfigDO findByPrimaryKey(@Param("id") Integer id); + + int insert(BusinessConfigDO record); + + List queryAll(); + + int updateByPrimaryKey(BusinessConfigDO record); + + List findByNameDomain(@Param("record") BusinessConfigDO record); + + List findByName(@Param("record") BusinessConfigDO record); + + int updateBaseConfigByDomain(@Param("record") BusinessConfigDO record); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/business/config/dao/data/BusinessConfigDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/business/config/dao/data/BusinessConfigDO.java new file mode 100644 index 0000000000..9671edd381 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/business/config/dao/data/BusinessConfigDO.java @@ -0,0 +1,20 @@ +package com.dianping.cat.core.mybatis.generated.business.config.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class BusinessConfigDO { + private Integer id; + + private String name; + + private String domain; + + private String content; + + private Date updatetime; + + private Integer keyId; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/businessreport/dao/BusinessReportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/businessreport/dao/BusinessReportMapper.java new file mode 100644 index 0000000000..0c9e205f2e --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/businessreport/dao/BusinessReportMapper.java @@ -0,0 +1,19 @@ +package com.dianping.cat.core.mybatis.generated.businessreport.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.businessreport.dao.data.BusinessReportDO; + +public interface BusinessReportMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + BusinessReportDO findByPrimaryKey(@Param("id") Integer id); + + int insert(BusinessReportDO record); + + List queryAll(); + + int updateByPrimaryKey(BusinessReportDO record); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/businessreport/dao/data/BusinessReportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/businessreport/dao/data/BusinessReportDO.java new file mode 100644 index 0000000000..f3b0d6d857 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/businessreport/dao/data/BusinessReportDO.java @@ -0,0 +1,24 @@ +package com.dianping.cat.core.mybatis.generated.businessreport.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class BusinessReportDO { + private Integer id; + + private Integer type; + + private String name; + + private String ip; + + private String productLine; + + private Date period; + + private byte[] content; + + private Date creationDate; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/daily/report/content/dao/DailyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/daily/report/content/dao/DailyReportContentMapper.java new file mode 100644 index 0000000000..940138fd32 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/daily/report/content/dao/DailyReportContentMapper.java @@ -0,0 +1,21 @@ +package com.dianping.cat.core.mybatis.generated.daily.report.content.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.daily.report.content.dao.data.DailyReportContentDO; + +public interface DailyReportContentMapper { + int deleteByPrimaryKey(@Param("reportId") Integer reportId); + + DailyReportContentDO findByPrimaryKey(@Param("reportId") Integer reportId); + + int insert(DailyReportContentDO record); + + List queryAll(); + + int updateByPrimaryKey(DailyReportContentDO record); + + List findOverloadReport(@Param("record") DailyReportContentDO record); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/daily/report/content/dao/data/DailyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/daily/report/content/dao/data/DailyReportContentDO.java new file mode 100644 index 0000000000..905dbbfb26 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/daily/report/content/dao/data/DailyReportContentDO.java @@ -0,0 +1,26 @@ +package com.dianping.cat.core.mybatis.generated.daily.report.content.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class DailyReportContentDO { + private Integer reportId; + + private byte[] content; + + private Date period; + + private Date creationDate; + + private Double contentLength; + + private Integer keyReportId; + + private Integer startId; + + private Integer endId; + + private Double capacity; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hostinfo/dao/HostinfoMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hostinfo/dao/HostinfoMapper.java new file mode 100644 index 0000000000..c4b2bcc352 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hostinfo/dao/HostinfoMapper.java @@ -0,0 +1,23 @@ +package com.dianping.cat.core.mybatis.generated.hostinfo.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.hostinfo.dao.data.HostinfoDO; + +public interface HostinfoMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + HostinfoDO findByPrimaryKey(@Param("id") Integer id); + + int insert(HostinfoDO record); + + List queryAll(); + + int updateByPrimaryKey(HostinfoDO record); + + List findByIp(@Param("record") HostinfoDO record); + + List findAllIp(@Param("record") HostinfoDO record); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hostinfo/dao/data/HostinfoDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hostinfo/dao/data/HostinfoDO.java new file mode 100644 index 0000000000..4d2dd492f6 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hostinfo/dao/data/HostinfoDO.java @@ -0,0 +1,22 @@ +package com.dianping.cat.core.mybatis.generated.hostinfo.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class HostinfoDO { + private Integer id; + + private String ip; + + private String domain; + + private String hostname; + + private Date creationDate; + + private Date lastModifiedDate; + + private Integer keyId; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourly/report/content/dao/HourlyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourly/report/content/dao/HourlyReportContentMapper.java new file mode 100644 index 0000000000..b36076652c --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourly/report/content/dao/HourlyReportContentMapper.java @@ -0,0 +1,21 @@ +package com.dianping.cat.core.mybatis.generated.hourly.report.content.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.data.HourlyReportContentDO; + +public interface HourlyReportContentMapper { + int deleteByPrimaryKey(@Param("reportId") Integer reportId); + + HourlyReportContentDO findByPrimaryKey(@Param("reportId") Integer reportId); + + int insert(HourlyReportContentDO record); + + List queryAll(); + + int updateByPrimaryKey(HourlyReportContentDO record); + + List findOverloadReport(@Param("record") HourlyReportContentDO record); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourly/report/content/dao/data/HourlyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourly/report/content/dao/data/HourlyReportContentDO.java new file mode 100644 index 0000000000..d9192f8d2d --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourly/report/content/dao/data/HourlyReportContentDO.java @@ -0,0 +1,24 @@ +package com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class HourlyReportContentDO { + private Integer reportId; + + private byte[] content; + + private Date period; + + private Date creationDate; + + private Double contentLength; + + private Integer keyReportId; + + private Integer startId; + + private Double capacity; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourlyreport/dao/HourlyreportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourlyreport/dao/HourlyreportMapper.java new file mode 100644 index 0000000000..8561d50098 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourlyreport/dao/HourlyreportMapper.java @@ -0,0 +1,23 @@ +package com.dianping.cat.core.mybatis.generated.hourlyreport.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.data.HourlyreportDO; + +public interface HourlyreportMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + HourlyreportDO findByPrimaryKey(@Param("id") Integer id); + + int insert(HourlyreportDO record); + + List queryAll(); + + int updateByPrimaryKey(HourlyreportDO record); + + List findAllByDomainNamePeriod(@Param("record") HourlyreportDO record); + + List findAllByPeriodName(@Param("record") HourlyreportDO record); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourlyreport/dao/data/HourlyreportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourlyreport/dao/data/HourlyreportDO.java new file mode 100644 index 0000000000..9a52c3c951 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourlyreport/dao/data/HourlyreportDO.java @@ -0,0 +1,24 @@ +package com.dianping.cat.core.mybatis.generated.hourlyreport.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class HourlyreportDO { + private Integer id; + + private Integer type; + + private String name; + + private String ip; + + private String domain; + + private Date period; + + private Date creationDate; + + private Integer keyId; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthly/report/content/dao/MonthlyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthly/report/content/dao/MonthlyReportContentMapper.java new file mode 100644 index 0000000000..a801bf3b1c --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthly/report/content/dao/MonthlyReportContentMapper.java @@ -0,0 +1,21 @@ +package com.dianping.cat.core.mybatis.generated.monthly.report.content.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.data.MonthlyReportContentDO; + +public interface MonthlyReportContentMapper { + int deleteByPrimaryKey(@Param("reportId") Integer reportId); + + MonthlyReportContentDO findByPrimaryKey(@Param("reportId") Integer reportId); + + int insert(MonthlyReportContentDO record); + + List queryAll(); + + int updateByPrimaryKey(MonthlyReportContentDO record); + + List findOverloadReport(@Param("record") MonthlyReportContentDO record); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthly/report/content/dao/data/MonthlyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthly/report/content/dao/data/MonthlyReportContentDO.java new file mode 100644 index 0000000000..ed3e179ff0 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthly/report/content/dao/data/MonthlyReportContentDO.java @@ -0,0 +1,24 @@ +package com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class MonthlyReportContentDO { + private Integer reportId; + + private byte[] content; + + private Date period; + + private Date creationDate; + + private Double contentLength; + + private Integer keyReportId; + + private Double capacity; + + private Integer startId; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthreport/dao/MonthreportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthreport/dao/MonthreportMapper.java new file mode 100644 index 0000000000..76bbd62b05 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthreport/dao/MonthreportMapper.java @@ -0,0 +1,23 @@ +package com.dianping.cat.core.mybatis.generated.monthreport.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.monthreport.dao.data.MonthreportDO; + +public interface MonthreportMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + MonthreportDO findByPrimaryKey(@Param("id") Integer id); + + int insert(MonthreportDO record); + + List queryAll(); + + int updateByPrimaryKey(MonthreportDO record); + + List findReportByDomainNamePeriod(@Param("record") MonthreportDO record); + + int deleteReportByDomainNamePeriod(@Param("record") MonthreportDO record); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthreport/dao/data/MonthreportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthreport/dao/data/MonthreportDO.java new file mode 100644 index 0000000000..5312aa0adb --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthreport/dao/data/MonthreportDO.java @@ -0,0 +1,24 @@ +package com.dianping.cat.core.mybatis.generated.monthreport.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class MonthreportDO { + private Integer id; + + private String name; + + private String ip; + + private String domain; + + private Date period; + + private Integer type; + + private Date creationDate; + + private Integer keyId; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/operation/dao/OperationMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/operation/dao/OperationMapper.java new file mode 100644 index 0000000000..4545ea5e39 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/operation/dao/OperationMapper.java @@ -0,0 +1,19 @@ +package com.dianping.cat.core.mybatis.generated.operation.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.operation.dao.data.OperationDO; + +public interface OperationMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + OperationDO findByPrimaryKey(@Param("id") Integer id); + + int insert(OperationDO record); + + List queryAll(); + + int updateByPrimaryKey(OperationDO record); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/operation/dao/data/OperationDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/operation/dao/data/OperationDO.java new file mode 100644 index 0000000000..cf78ee8f4a --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/operation/dao/data/OperationDO.java @@ -0,0 +1,22 @@ +package com.dianping.cat.core.mybatis.generated.operation.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class OperationDO { + private Integer id; + + private String user; + + private String module; + + private String operation; + + private Date time; + + private String content; + + private Date creationDate; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/project/dao/ProjectMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/project/dao/ProjectMapper.java new file mode 100644 index 0000000000..233a83a4aa --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/project/dao/ProjectMapper.java @@ -0,0 +1,25 @@ +package com.dianping.cat.core.mybatis.generated.project.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.project.dao.data.ProjectDO; + +public interface ProjectMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + ProjectDO findByPrimaryKey(@Param("id") Integer id); + + int insert(ProjectDO record); + + List queryAll(); + + int updateByPrimaryKey(ProjectDO record); + + List findAll(@Param("record") ProjectDO record); + + List findByDomain(@Param("record") ProjectDO record); + + List findByCmdbDomain(@Param("record") ProjectDO record); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/project/dao/data/ProjectDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/project/dao/data/ProjectDO.java new file mode 100644 index 0000000000..1edcdae4a2 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/project/dao/data/ProjectDO.java @@ -0,0 +1,32 @@ +package com.dianping.cat.core.mybatis.generated.project.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class ProjectDO { + private Integer id; + + private String domain; + + private String cmdbDomain; + + private Integer level; + + private String bu; + + private String cmdbProductline; + + private String owner; + + private String email; + + private String phone; + + private Date creationDate; + + private Date modifyDate; + + private Integer keyId; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/task/dao/TaskMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/task/dao/TaskMapper.java new file mode 100644 index 0000000000..16982d1be5 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/task/dao/TaskMapper.java @@ -0,0 +1,31 @@ +package com.dianping.cat.core.mybatis.generated.task.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.task.dao.data.TaskDO; + +public interface TaskMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + TaskDO findByPrimaryKey(@Param("id") Integer id); + + int insert(TaskDO record); + + List queryAll(); + + int updateByPrimaryKey(TaskDO record); + + List findByStatusConsumer(@Param("record") TaskDO record); + + int updateTodoToDoing(@Param("record") TaskDO record); + + int updateDoingToDone(@Param("record") TaskDO record); + + int updateFailureToDone(@Param("record") TaskDO record); + + int updateStatusToTodo(@Param("record") TaskDO record); + + int updateDoingToFail(@Param("record") TaskDO record); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/task/dao/data/TaskDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/task/dao/data/TaskDO.java new file mode 100644 index 0000000000..1e3b5a0fd1 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/task/dao/data/TaskDO.java @@ -0,0 +1,40 @@ +package com.dianping.cat.core.mybatis.generated.task.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class TaskDO { + private Integer id; + + private String producer; + + private String consumer; + + private Integer failureCount; + + private String reportName; + + private String reportDomain; + + private Date reportPeriod; + + private Integer status; + + private Integer taskType; + + private Date creationDate; + + private Date startDate; + + private Date endDate; + + private Integer count; + + private Integer keyId; + + private Integer startLimit; + + private Integer endLimit; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weekly/report/content/dao/WeeklyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weekly/report/content/dao/WeeklyReportContentMapper.java new file mode 100644 index 0000000000..2e30ac46b4 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weekly/report/content/dao/WeeklyReportContentMapper.java @@ -0,0 +1,21 @@ +package com.dianping.cat.core.mybatis.generated.weekly.report.content.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.data.WeeklyReportContentDO; + +public interface WeeklyReportContentMapper { + int deleteByPrimaryKey(@Param("reportId") Integer reportId); + + WeeklyReportContentDO findByPrimaryKey(@Param("reportId") Integer reportId); + + int insert(WeeklyReportContentDO record); + + List queryAll(); + + int updateByPrimaryKey(WeeklyReportContentDO record); + + List findOverloadReport(@Param("record") WeeklyReportContentDO record); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weekly/report/content/dao/data/WeeklyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weekly/report/content/dao/data/WeeklyReportContentDO.java new file mode 100644 index 0000000000..71cd49a357 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weekly/report/content/dao/data/WeeklyReportContentDO.java @@ -0,0 +1,24 @@ +package com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class WeeklyReportContentDO { + private Integer reportId; + + private byte[] content; + + private Date period; + + private Date creationDate; + + private Double contentLength; + + private Integer keyReportId; + + private Double capacity; + + private Integer startId; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weeklyreport/dao/WeeklyreportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weeklyreport/dao/WeeklyreportMapper.java new file mode 100644 index 0000000000..97a90cf3b0 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weeklyreport/dao/WeeklyreportMapper.java @@ -0,0 +1,23 @@ +package com.dianping.cat.core.mybatis.generated.weeklyreport.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.data.WeeklyreportDO; + +public interface WeeklyreportMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + WeeklyreportDO findByPrimaryKey(@Param("id") Integer id); + + int insert(WeeklyreportDO record); + + List queryAll(); + + int updateByPrimaryKey(WeeklyreportDO record); + + List findReportByDomainNamePeriod(@Param("record") WeeklyreportDO record); + + int deleteReportByDomainNamePeriod(@Param("record") WeeklyreportDO record); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weeklyreport/dao/data/WeeklyreportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weeklyreport/dao/data/WeeklyreportDO.java new file mode 100644 index 0000000000..c21a6a83d3 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weeklyreport/dao/data/WeeklyreportDO.java @@ -0,0 +1,24 @@ +package com.dianping.cat.core.mybatis.generated.weeklyreport.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class WeeklyreportDO { + private Integer id; + + private String name; + + private String ip; + + private String domain; + + private Date period; + + private Integer type; + + private Date creationDate; + + private Integer keyId; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java new file mode 100644 index 0000000000..4e6bc2dfc0 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java @@ -0,0 +1,159 @@ +package com.dianping.cat.core.mybatis.repository.business.config; + +import com.dianping.cat.core.config.BusinessConfig; +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.business.config.dao.BusinessConfigMapper; +import com.dianping.cat.core.mybatis.generated.business.config.dao.data.BusinessConfigDO; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class BusinessConfigRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/BusinessConfigMapper.xml"; + + @Override + protected Class getMapperClass() { + return BusinessConfigMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public BusinessConfig createLocal() { + return new BusinessConfig(); + } + + public int deleteByPK(BusinessConfig proto) throws DalException { + try (SqlSession session = openSession()) { + BusinessConfigMapper mapper = session.getMapper(BusinessConfigMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for BusinessConfig.", e); + } + } + + public List findByName(String name, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + BusinessConfigMapper mapper = session.getMapper(BusinessConfigMapper.class); + BusinessConfigDO record = new BusinessConfigDO(); + record.setName(name); + return mapper.findByName(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findByName for BusinessConfig.", e); + } + } + + public BusinessConfig findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + BusinessConfigMapper mapper = session.getMapper(BusinessConfigMapper.class); + BusinessConfigDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for BusinessConfig.", e); + } + } + + public BusinessConfig findByNameDomain(String name, String domain, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + BusinessConfigMapper mapper = session.getMapper(BusinessConfigMapper.class); + BusinessConfigDO record = new BusinessConfigDO(); + record.setName(name); + record.setDomain(domain); + BusinessConfigDO result = mapper.findByNameDomain(record).stream().findFirst().orElse(null); + return requireFound(result, "findByNameDomain", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByNameDomain for BusinessConfig.", e); + } + } + + public int insert(BusinessConfig proto) throws DalException { + try (SqlSession session = openSession()) { + BusinessConfigMapper mapper = session.getMapper(BusinessConfigMapper.class); + BusinessConfigDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for BusinessConfig.", e); + } + } + + public int updateByPK(BusinessConfig proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + BusinessConfigMapper mapper = session.getMapper(BusinessConfigMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for BusinessConfig.", e); + } + } + + public int updateBaseConfigByDomain(BusinessConfig proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + BusinessConfigMapper mapper = session.getMapper(BusinessConfigMapper.class); + int count = mapper.updateBaseConfigByDomain(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateBaseConfigByDomain for BusinessConfig.", e); + } + } + + private BusinessConfig requireFound(BusinessConfigDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No BusinessConfig found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private BusinessConfig toModel(BusinessConfigDO record) { + BusinessConfig model = new BusinessConfig(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getName() != null) { + model.setName(record.getName()); + } + if (record.getDomain() != null) { + model.setDomain(record.getDomain()); + } + if (record.getContent() != null) { + model.setContent(record.getContent()); + } + if (record.getUpdatetime() != null) { + model.setUpdatetime(record.getUpdatetime()); + } + model.afterLoad(); + return model; + } + + private BusinessConfigDO toRecord(BusinessConfig model) { + BusinessConfigDO record = new BusinessConfigDO(); + + record.setId(model.getId()); + record.setName(model.getName()); + record.setDomain(model.getDomain()); + record.setContent(model.getContent()); + record.setUpdatetime(model.getUpdatetime()); + record.setKeyId(model.getKeyId()); + return record; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java new file mode 100644 index 0000000000..e7dbccb23c --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java @@ -0,0 +1,129 @@ +package com.dianping.cat.core.mybatis.repository.daily.report.content; + +import com.dianping.cat.core.dal.DailyReportContent; +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.daily.report.content.dao.DailyReportContentMapper; +import com.dianping.cat.core.mybatis.generated.daily.report.content.dao.data.DailyReportContentDO; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class DailyReportContentRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/DailyReportContentMapper.xml"; + + @Override + protected Class getMapperClass() { + return DailyReportContentMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public DailyReportContent createLocal() { + return new DailyReportContent(); + } + + public int deleteByPK(DailyReportContent proto) throws DalException { + try (SqlSession session = openSession()) { + DailyReportContentMapper mapper = session.getMapper(DailyReportContentMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyReportId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for DailyReportContent.", e); + } + } + + public List findOverloadReport(int startId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + DailyReportContentMapper mapper = session.getMapper(DailyReportContentMapper.class); + DailyReportContentDO record = new DailyReportContentDO(); + record.setStartId(startId); + return mapper.findOverloadReport(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findOverloadReport for DailyReportContent.", e); + } + } + + public DailyReportContent findByPK(int keyReportId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + DailyReportContentMapper mapper = session.getMapper(DailyReportContentMapper.class); + DailyReportContentDO record = mapper.findByPrimaryKey(keyReportId); + return requireFound(record, "primary key", String.valueOf(keyReportId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for DailyReportContent.", e); + } + } + + public int insert(DailyReportContent proto) throws DalException { + try (SqlSession session = openSession()) { + DailyReportContentMapper mapper = session.getMapper(DailyReportContentMapper.class); + DailyReportContentDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for DailyReportContent.", e); + } + } + + public int updateByPK(DailyReportContent proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + DailyReportContentMapper mapper = session.getMapper(DailyReportContentMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for DailyReportContent.", e); + } + } + + private DailyReportContent requireFound(DailyReportContentDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No DailyReportContent found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private DailyReportContent toModel(DailyReportContentDO record) { + DailyReportContent model = new DailyReportContent(); + + if (record.getReportId() != null) { + model.setReportId(record.getReportId()); + } + if (record.getContent() != null) { + model.setContent(record.getContent()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + if (record.getContentLength() != null) { + model.setContentLength(record.getContentLength()); + } + model.afterLoad(); + return model; + } + + private DailyReportContentDO toRecord(DailyReportContent model) { + DailyReportContentDO record = new DailyReportContentDO(); + + record.setReportId(model.getReportId()); + record.setContent(model.getContent()); + record.setCreationDate(model.getCreationDate()); + record.setKeyReportId(model.getKeyReportId()); + record.setStartId(model.getStartId()); + record.setEndId(model.getEndId()); + record.setCapacity(model.getCapacity()); + return record; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java new file mode 100644 index 0000000000..603553d866 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java @@ -0,0 +1,150 @@ +package com.dianping.cat.core.mybatis.repository.hostinfo; + +import com.dianping.cat.core.dal.Hostinfo; +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.hostinfo.dao.HostinfoMapper; +import com.dianping.cat.core.mybatis.generated.hostinfo.dao.data.HostinfoDO; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class HostinfoRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/HostinfoMapper.xml"; + + @Override + protected Class getMapperClass() { + return HostinfoMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public Hostinfo createLocal() { + return new Hostinfo(); + } + + public int deleteByPK(Hostinfo proto) throws DalException { + try (SqlSession session = openSession()) { + HostinfoMapper mapper = session.getMapper(HostinfoMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for Hostinfo.", e); + } + } + + public List findAllIp(Readset readset) throws DalException { + try (SqlSession session = openSession()) { + HostinfoMapper mapper = session.getMapper(HostinfoMapper.class); + HostinfoDO record = new HostinfoDO(); + return mapper.findAllIp(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findAllIp for Hostinfo.", e); + } + } + + public Hostinfo findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + HostinfoMapper mapper = session.getMapper(HostinfoMapper.class); + HostinfoDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for Hostinfo.", e); + } + } + + public Hostinfo findByIp(String ip, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + HostinfoMapper mapper = session.getMapper(HostinfoMapper.class); + HostinfoDO record = new HostinfoDO(); + record.setIp(ip); + HostinfoDO result = mapper.findByIp(record).stream().findFirst().orElse(null); + return requireFound(result, "findByIp", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByIp for Hostinfo.", e); + } + } + + public int insert(Hostinfo proto) throws DalException { + try (SqlSession session = openSession()) { + HostinfoMapper mapper = session.getMapper(HostinfoMapper.class); + HostinfoDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for Hostinfo.", e); + } + } + + public int updateByPK(Hostinfo proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + HostinfoMapper mapper = session.getMapper(HostinfoMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for Hostinfo.", e); + } + } + + private Hostinfo requireFound(HostinfoDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No Hostinfo found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private Hostinfo toModel(HostinfoDO record) { + Hostinfo model = new Hostinfo(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getIp() != null) { + model.setIp(record.getIp()); + } + if (record.getDomain() != null) { + model.setDomain(record.getDomain()); + } + if (record.getHostname() != null) { + model.setHostname(record.getHostname()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + if (record.getLastModifiedDate() != null) { + model.setLastModifiedDate(record.getLastModifiedDate()); + } + model.afterLoad(); + return model; + } + + private HostinfoDO toRecord(Hostinfo model) { + HostinfoDO record = new HostinfoDO(); + + record.setId(model.getId()); + record.setIp(model.getIp()); + record.setDomain(model.getDomain()); + record.setHostname(model.getHostname()); + record.setCreationDate(model.getCreationDate()); + record.setLastModifiedDate(model.getLastModifiedDate()); + record.setKeyId(model.getKeyId()); + return record; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java new file mode 100644 index 0000000000..43af976a37 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java @@ -0,0 +1,132 @@ +package com.dianping.cat.core.mybatis.repository.hourly.report.content; + +import com.dianping.cat.core.dal.HourlyReportContent; +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.HourlyReportContentMapper; +import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.data.HourlyReportContentDO; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class HourlyReportContentRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/HourlyReportContentMapper.xml"; + + @Override + protected Class getMapperClass() { + return HourlyReportContentMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public HourlyReportContent createLocal() { + return new HourlyReportContent(); + } + + public int deleteByPK(HourlyReportContent proto) throws DalException { + try (SqlSession session = openSession()) { + HourlyReportContentMapper mapper = session.getMapper(HourlyReportContentMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyReportId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for HourlyReportContent.", e); + } + } + + public List findOverloadReport(int startId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + HourlyReportContentMapper mapper = session.getMapper(HourlyReportContentMapper.class); + HourlyReportContentDO record = new HourlyReportContentDO(); + record.setStartId(startId); + return mapper.findOverloadReport(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findOverloadReport for HourlyReportContent.", e); + } + } + + public HourlyReportContent findByPK(int keyReportId, java.util.Date period, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + HourlyReportContentMapper mapper = session.getMapper(HourlyReportContentMapper.class); + HourlyReportContentDO record = mapper.findByPrimaryKey(keyReportId); + return requireFound(record, "primary key", String.valueOf(keyReportId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for HourlyReportContent.", e); + } + } + + public int insert(HourlyReportContent proto) throws DalException { + try (SqlSession session = openSession()) { + HourlyReportContentMapper mapper = session.getMapper(HourlyReportContentMapper.class); + HourlyReportContentDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for HourlyReportContent.", e); + } + } + + public int updateByPK(HourlyReportContent proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + HourlyReportContentMapper mapper = session.getMapper(HourlyReportContentMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for HourlyReportContent.", e); + } + } + + private HourlyReportContent requireFound(HourlyReportContentDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No HourlyReportContent found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private HourlyReportContent toModel(HourlyReportContentDO record) { + HourlyReportContent model = new HourlyReportContent(); + + if (record.getReportId() != null) { + model.setReportId(record.getReportId()); + } + if (record.getContent() != null) { + model.setContent(record.getContent()); + } + if (record.getPeriod() != null) { + model.setPeriod(record.getPeriod()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + if (record.getContentLength() != null) { + model.setContentLength(record.getContentLength().longValue()); + } + model.afterLoad(); + return model; + } + + private HourlyReportContentDO toRecord(HourlyReportContent model) { + HourlyReportContentDO record = new HourlyReportContentDO(); + + record.setReportId(model.getReportId()); + record.setContent(model.getContent()); + record.setPeriod(model.getPeriod()); + record.setCreationDate(model.getCreationDate()); + record.setKeyReportId(model.getKeyReportId()); + record.setStartId(model.getStartId()); + record.setCapacity(model.getCapacity()); + return record; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java new file mode 100644 index 0000000000..e1f85e6766 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java @@ -0,0 +1,156 @@ +package com.dianping.cat.core.mybatis.repository.hourlyreport; + +import com.dianping.cat.core.dal.HourlyReport; +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.HourlyreportMapper; +import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.data.HourlyreportDO; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class HourlyReportRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/HourlyreportMapper.xml"; + + @Override + protected Class getMapperClass() { + return HourlyreportMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public HourlyReport createLocal() { + return new HourlyReport(); + } + + public int deleteByPK(HourlyReport proto) throws DalException { + try (SqlSession session = openSession()) { + HourlyreportMapper mapper = session.getMapper(HourlyreportMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for HourlyReport.", e); + } + } + + public List findAllByDomainNamePeriod(java.util.Date period, String domain, String name, + Readset readset) throws DalException { + try (SqlSession session = openSession()) { + HourlyreportMapper mapper = session.getMapper(HourlyreportMapper.class); + HourlyreportDO record = new HourlyreportDO(); + record.setPeriod(period); + record.setDomain(domain); + record.setName(name); + return mapper.findAllByDomainNamePeriod(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findAllByDomainNamePeriod for HourlyReport.", e); + } + } + + public List findAllByPeriodName(java.util.Date period, String name, Readset readset) + throws DalException { + try (SqlSession session = openSession()) { + HourlyreportMapper mapper = session.getMapper(HourlyreportMapper.class); + HourlyreportDO record = new HourlyreportDO(); + record.setPeriod(period); + record.setName(name); + return mapper.findAllByPeriodName(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findAllByPeriodName for HourlyReport.", e); + } + } + + public HourlyReport findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + HourlyreportMapper mapper = session.getMapper(HourlyreportMapper.class); + HourlyreportDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for HourlyReport.", e); + } + } + + public int insert(HourlyReport proto) throws DalException { + try (SqlSession session = openSession()) { + HourlyreportMapper mapper = session.getMapper(HourlyreportMapper.class); + HourlyreportDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for HourlyReport.", e); + } + } + + public int updateByPK(HourlyReport proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + HourlyreportMapper mapper = session.getMapper(HourlyreportMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for HourlyReport.", e); + } + } + + private HourlyReport requireFound(HourlyreportDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No HourlyReport found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private HourlyReport toModel(HourlyreportDO record) { + HourlyReport model = new HourlyReport(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getType() != null) { + model.setType(record.getType()); + } + if (record.getName() != null) { + model.setName(record.getName()); + } + if (record.getIp() != null) { + model.setIp(record.getIp()); + } + if (record.getDomain() != null) { + model.setDomain(record.getDomain()); + } + if (record.getPeriod() != null) { + model.setPeriod(record.getPeriod()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + model.afterLoad(); + return model; + } + + private HourlyreportDO toRecord(HourlyReport model) { + HourlyreportDO record = new HourlyreportDO(); + + record.setId(model.getId()); + record.setType(model.getType()); + record.setName(model.getName()); + record.setIp(model.getIp()); + record.setDomain(model.getDomain()); + record.setPeriod(model.getPeriod()); + record.setCreationDate(model.getCreationDate()); + record.setKeyId(model.getKeyId()); + return record; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java new file mode 100644 index 0000000000..de155bcbce --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java @@ -0,0 +1,128 @@ +package com.dianping.cat.core.mybatis.repository.monthly.report.content; + +import com.dianping.cat.core.dal.MonthlyReportContent; +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.MonthlyReportContentMapper; +import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.data.MonthlyReportContentDO; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class MonthlyReportContentRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/MonthlyReportContentMapper.xml"; + + @Override + protected Class getMapperClass() { + return MonthlyReportContentMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public MonthlyReportContent createLocal() { + return new MonthlyReportContent(); + } + + public int deleteByPK(MonthlyReportContent proto) throws DalException { + try (SqlSession session = openSession()) { + MonthlyReportContentMapper mapper = session.getMapper(MonthlyReportContentMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyReportId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for MonthlyReportContent.", e); + } + } + + public List findOverloadReport(int startId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + MonthlyReportContentMapper mapper = session.getMapper(MonthlyReportContentMapper.class); + MonthlyReportContentDO record = new MonthlyReportContentDO(); + record.setStartId(startId); + return mapper.findOverloadReport(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findOverloadReport for MonthlyReportContent.", e); + } + } + + public MonthlyReportContent findByPK(int keyReportId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + MonthlyReportContentMapper mapper = session.getMapper(MonthlyReportContentMapper.class); + MonthlyReportContentDO record = mapper.findByPrimaryKey(keyReportId); + return requireFound(record, "primary key", String.valueOf(keyReportId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for MonthlyReportContent.", e); + } + } + + public int insert(MonthlyReportContent proto) throws DalException { + try (SqlSession session = openSession()) { + MonthlyReportContentMapper mapper = session.getMapper(MonthlyReportContentMapper.class); + MonthlyReportContentDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for MonthlyReportContent.", e); + } + } + + public int updateByPK(MonthlyReportContent proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + MonthlyReportContentMapper mapper = session.getMapper(MonthlyReportContentMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for MonthlyReportContent.", e); + } + } + + private MonthlyReportContent requireFound(MonthlyReportContentDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No MonthlyReportContent found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private MonthlyReportContent toModel(MonthlyReportContentDO record) { + MonthlyReportContent model = new MonthlyReportContent(); + + if (record.getReportId() != null) { + model.setReportId(record.getReportId()); + } + if (record.getContent() != null) { + model.setContent(record.getContent()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + if (record.getContentLength() != null) { + model.setContentLength(record.getContentLength()); + } + model.afterLoad(); + return model; + } + + private MonthlyReportContentDO toRecord(MonthlyReportContent model) { + MonthlyReportContentDO record = new MonthlyReportContentDO(); + + record.setReportId(model.getReportId()); + record.setContent(model.getContent()); + record.setCreationDate(model.getCreationDate()); + record.setKeyReportId(model.getKeyReportId()); + record.setCapacity(model.getCapacity()); + record.setStartId(model.getStartId()); + return record; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java new file mode 100644 index 0000000000..ba69f51f5e --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java @@ -0,0 +1,157 @@ +package com.dianping.cat.core.mybatis.repository.monthreport; + +import com.dianping.cat.core.dal.MonthlyReport; +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.monthreport.dao.MonthreportMapper; +import com.dianping.cat.core.mybatis.generated.monthreport.dao.data.MonthreportDO; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class MonthlyReportRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/MonthreportMapper.xml"; + + @Override + protected Class getMapperClass() { + return MonthreportMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public MonthlyReport createLocal() { + return new MonthlyReport(); + } + + public int deleteByPK(MonthlyReport proto) throws DalException { + try (SqlSession session = openSession()) { + MonthreportMapper mapper = session.getMapper(MonthreportMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for MonthlyReport.", e); + } + } + + public int deleteReportByDomainNamePeriod(MonthlyReport proto) throws DalException { + try (SqlSession session = openSession()) { + MonthreportMapper mapper = session.getMapper(MonthreportMapper.class); + int count = mapper.deleteReportByDomainNamePeriod(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteReportByDomainNamePeriod for MonthlyReport.", e); + } + } + + public MonthlyReport findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + MonthreportMapper mapper = session.getMapper(MonthreportMapper.class); + MonthreportDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for MonthlyReport.", e); + } + } + + public MonthlyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + MonthreportMapper mapper = session.getMapper(MonthreportMapper.class); + MonthreportDO record = new MonthreportDO(); + record.setPeriod(period); + record.setDomain(domain); + record.setName(name); + MonthreportDO result = mapper.findReportByDomainNamePeriod(record).stream().findFirst().orElse(null); + return requireFound(result, "findReportByDomainNamePeriod", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findReportByDomainNamePeriod for MonthlyReport.", e); + } + } + + public int insert(MonthlyReport proto) throws DalException { + try (SqlSession session = openSession()) { + MonthreportMapper mapper = session.getMapper(MonthreportMapper.class); + MonthreportDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for MonthlyReport.", e); + } + } + + public int updateByPK(MonthlyReport proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + MonthreportMapper mapper = session.getMapper(MonthreportMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for MonthlyReport.", e); + } + } + + private MonthlyReport requireFound(MonthreportDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No MonthlyReport found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private MonthlyReport toModel(MonthreportDO record) { + MonthlyReport model = new MonthlyReport(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getName() != null) { + model.setName(record.getName()); + } + if (record.getIp() != null) { + model.setIp(record.getIp()); + } + if (record.getDomain() != null) { + model.setDomain(record.getDomain()); + } + if (record.getPeriod() != null) { + model.setPeriod(record.getPeriod()); + } + if (record.getType() != null) { + model.setType(record.getType()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + model.afterLoad(); + return model; + } + + private MonthreportDO toRecord(MonthlyReport model) { + MonthreportDO record = new MonthreportDO(); + + record.setId(model.getId()); + record.setName(model.getName()); + record.setIp(model.getIp()); + record.setDomain(model.getDomain()); + record.setPeriod(model.getPeriod()); + record.setType(model.getType()); + record.setCreationDate(model.getCreationDate()); + record.setKeyId(model.getKeyId()); + return record; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java new file mode 100644 index 0000000000..16a7a474c7 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java @@ -0,0 +1,184 @@ +package com.dianping.cat.core.mybatis.repository.project; + +import com.dianping.cat.core.dal.Project; +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.project.dao.ProjectMapper; +import com.dianping.cat.core.mybatis.generated.project.dao.data.ProjectDO; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class ProjectRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/ProjectMapper.xml"; + + @Override + protected Class getMapperClass() { + return ProjectMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public Project createLocal() { + return new Project(); + } + + public int deleteByPK(Project proto) throws DalException { + try (SqlSession session = openSession()) { + ProjectMapper mapper = session.getMapper(ProjectMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for Project.", e); + } + } + + public List findAll(Readset readset) throws DalException { + try (SqlSession session = openSession()) { + ProjectMapper mapper = session.getMapper(ProjectMapper.class); + ProjectDO record = new ProjectDO(); + return mapper.findAll(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findAll for Project.", e); + } + } + + public Project findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + ProjectMapper mapper = session.getMapper(ProjectMapper.class); + ProjectDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for Project.", e); + } + } + + public Project findByDomain(String domain, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + ProjectMapper mapper = session.getMapper(ProjectMapper.class); + ProjectDO record = new ProjectDO(); + record.setDomain(domain); + ProjectDO result = mapper.findByDomain(record).stream().findFirst().orElse(null); + return requireFound(result, "findByDomain", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByDomain for Project.", e); + } + } + + public Project findByCmdbDomain(String domain, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + ProjectMapper mapper = session.getMapper(ProjectMapper.class); + ProjectDO record = new ProjectDO(); + record.setDomain(domain); + ProjectDO result = mapper.findByCmdbDomain(record).stream().findFirst().orElse(null); + return requireFound(result, "findByCmdbDomain", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByCmdbDomain for Project.", e); + } + } + + public int insert(Project proto) throws DalException { + try (SqlSession session = openSession()) { + ProjectMapper mapper = session.getMapper(ProjectMapper.class); + ProjectDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for Project.", e); + } + } + + public int updateByPK(Project proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + ProjectMapper mapper = session.getMapper(ProjectMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for Project.", e); + } + } + + private Project requireFound(ProjectDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No Project found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private Project toModel(ProjectDO record) { + Project model = new Project(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getDomain() != null) { + model.setDomain(record.getDomain()); + } + if (record.getCmdbDomain() != null) { + model.setCmdbDomain(record.getCmdbDomain()); + } + if (record.getLevel() != null) { + model.setLevel(record.getLevel()); + } + if (record.getBu() != null) { + model.setBu(record.getBu()); + } + if (record.getCmdbProductline() != null) { + model.setCmdbProductline(record.getCmdbProductline()); + } + if (record.getOwner() != null) { + model.setOwner(record.getOwner()); + } + if (record.getEmail() != null) { + model.setEmail(record.getEmail()); + } + if (record.getPhone() != null) { + model.setPhone(record.getPhone()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + if (record.getModifyDate() != null) { + model.setModifyDate(record.getModifyDate()); + } + model.afterLoad(); + return model; + } + + private ProjectDO toRecord(Project model) { + ProjectDO record = new ProjectDO(); + + record.setId(model.getId()); + record.setDomain(model.getDomain()); + record.setCmdbDomain(model.getCmdbDomain()); + record.setLevel(model.getLevel()); + record.setBu(model.getBu()); + record.setCmdbProductline(model.getCmdbProductline()); + record.setOwner(model.getOwner()); + record.setEmail(model.getEmail()); + record.setPhone(model.getPhone()); + record.setCreationDate(model.getCreationDate()); + record.setModifyDate(model.getModifyDate()); + record.setKeyId(model.getKeyId()); + return record; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java new file mode 100644 index 0000000000..5d1e94697a --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java @@ -0,0 +1,225 @@ +package com.dianping.cat.core.mybatis.repository.task; + +import com.dianping.cat.core.dal.Task; +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.task.dao.TaskMapper; +import com.dianping.cat.core.mybatis.generated.task.dao.data.TaskDO; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class TaskRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/TaskMapper.xml"; + + @Override + protected Class getMapperClass() { + return TaskMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public Task createLocal() { + return new Task(); + } + + public int deleteByPK(Task proto) throws DalException { + try (SqlSession session = openSession()) { + TaskMapper mapper = session.getMapper(TaskMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for Task.", e); + } + } + + public Task findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + TaskMapper mapper = session.getMapper(TaskMapper.class); + TaskDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for Task.", e); + } + } + + public Task findByStatusConsumer(int status, String consumer, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + TaskMapper mapper = session.getMapper(TaskMapper.class); + TaskDO record = new TaskDO(); + record.setStatus(status); + record.setConsumer(consumer); + TaskDO result = mapper.findByStatusConsumer(record).stream().findFirst().orElse(null); + return requireFound(result, "findByStatusConsumer", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByStatusConsumer for Task.", e); + } + } + + public int insert(Task proto) throws DalException { + try (SqlSession session = openSession()) { + TaskMapper mapper = session.getMapper(TaskMapper.class); + TaskDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for Task.", e); + } + } + + public int updateByPK(Task proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + TaskMapper mapper = session.getMapper(TaskMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for Task.", e); + } + } + + public int updateTodoToDoing(Task proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + TaskMapper mapper = session.getMapper(TaskMapper.class); + int count = mapper.updateTodoToDoing(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateTodoToDoing for Task.", e); + } + } + + public int updateDoingToDone(Task proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + TaskMapper mapper = session.getMapper(TaskMapper.class); + int count = mapper.updateDoingToDone(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateDoingToDone for Task.", e); + } + } + + public int updateFailureToDone(Task proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + TaskMapper mapper = session.getMapper(TaskMapper.class); + int count = mapper.updateFailureToDone(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateFailureToDone for Task.", e); + } + } + + public int updateStatusToTodo(Task proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + TaskMapper mapper = session.getMapper(TaskMapper.class); + int count = mapper.updateStatusToTodo(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateStatusToTodo for Task.", e); + } + } + + public int updateDoingToFail(Task proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + TaskMapper mapper = session.getMapper(TaskMapper.class); + int count = mapper.updateDoingToFail(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateDoingToFail for Task.", e); + } + } + + private Task requireFound(TaskDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No Task found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private Task toModel(TaskDO record) { + Task model = new Task(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getProducer() != null) { + model.setProducer(record.getProducer()); + } + if (record.getConsumer() != null) { + model.setConsumer(record.getConsumer()); + } + if (record.getFailureCount() != null) { + model.setFailureCount(record.getFailureCount()); + } + if (record.getReportName() != null) { + model.setReportName(record.getReportName()); + } + if (record.getReportDomain() != null) { + model.setReportDomain(record.getReportDomain()); + } + if (record.getReportPeriod() != null) { + model.setReportPeriod(record.getReportPeriod()); + } + if (record.getStatus() != null) { + model.setStatus(record.getStatus()); + } + if (record.getTaskType() != null) { + model.setTaskType(record.getTaskType()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + if (record.getStartDate() != null) { + model.setStartDate(record.getStartDate()); + } + if (record.getEndDate() != null) { + model.setEndDate(record.getEndDate()); + } + if (record.getCount() != null) { + model.setCount(record.getCount()); + } + model.afterLoad(); + return model; + } + + private TaskDO toRecord(Task model) { + TaskDO record = new TaskDO(); + + record.setId(model.getId()); + record.setProducer(model.getProducer()); + record.setConsumer(model.getConsumer()); + record.setFailureCount(model.getFailureCount()); + record.setReportName(model.getReportName()); + record.setReportDomain(model.getReportDomain()); + record.setReportPeriod(model.getReportPeriod()); + record.setStatus(model.getStatus()); + record.setTaskType(model.getTaskType()); + record.setCreationDate(model.getCreationDate()); + record.setStartDate(model.getStartDate()); + record.setEndDate(model.getEndDate()); + record.setKeyId(model.getKeyId()); + record.setStartLimit(model.getStartLimit()); + record.setEndLimit(model.getEndLimit()); + return record; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java new file mode 100644 index 0000000000..e09b099957 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java @@ -0,0 +1,128 @@ +package com.dianping.cat.core.mybatis.repository.weekly.report.content; + +import com.dianping.cat.core.dal.WeeklyReportContent; +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.WeeklyReportContentMapper; +import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.data.WeeklyReportContentDO; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class WeeklyReportContentRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/WeeklyReportContentMapper.xml"; + + @Override + protected Class getMapperClass() { + return WeeklyReportContentMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public WeeklyReportContent createLocal() { + return new WeeklyReportContent(); + } + + public int deleteByPK(WeeklyReportContent proto) throws DalException { + try (SqlSession session = openSession()) { + WeeklyReportContentMapper mapper = session.getMapper(WeeklyReportContentMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyReportId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for WeeklyReportContent.", e); + } + } + + public List findOverloadReport(int startId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + WeeklyReportContentMapper mapper = session.getMapper(WeeklyReportContentMapper.class); + WeeklyReportContentDO record = new WeeklyReportContentDO(); + record.setStartId(startId); + return mapper.findOverloadReport(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findOverloadReport for WeeklyReportContent.", e); + } + } + + public WeeklyReportContent findByPK(int keyReportId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + WeeklyReportContentMapper mapper = session.getMapper(WeeklyReportContentMapper.class); + WeeklyReportContentDO record = mapper.findByPrimaryKey(keyReportId); + return requireFound(record, "primary key", String.valueOf(keyReportId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for WeeklyReportContent.", e); + } + } + + public int insert(WeeklyReportContent proto) throws DalException { + try (SqlSession session = openSession()) { + WeeklyReportContentMapper mapper = session.getMapper(WeeklyReportContentMapper.class); + WeeklyReportContentDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for WeeklyReportContent.", e); + } + } + + public int updateByPK(WeeklyReportContent proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + WeeklyReportContentMapper mapper = session.getMapper(WeeklyReportContentMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for WeeklyReportContent.", e); + } + } + + private WeeklyReportContent requireFound(WeeklyReportContentDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No WeeklyReportContent found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private WeeklyReportContent toModel(WeeklyReportContentDO record) { + WeeklyReportContent model = new WeeklyReportContent(); + + if (record.getReportId() != null) { + model.setReportId(record.getReportId()); + } + if (record.getContent() != null) { + model.setContent(record.getContent()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + if (record.getContentLength() != null) { + model.setContentLength(record.getContentLength()); + } + model.afterLoad(); + return model; + } + + private WeeklyReportContentDO toRecord(WeeklyReportContent model) { + WeeklyReportContentDO record = new WeeklyReportContentDO(); + + record.setReportId(model.getReportId()); + record.setContent(model.getContent()); + record.setCreationDate(model.getCreationDate()); + record.setKeyReportId(model.getKeyReportId()); + record.setCapacity(model.getCapacity()); + record.setStartId(model.getStartId()); + return record; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java new file mode 100644 index 0000000000..39b3b28733 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java @@ -0,0 +1,157 @@ +package com.dianping.cat.core.mybatis.repository.weeklyreport; + +import com.dianping.cat.core.dal.WeeklyReport; +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.WeeklyreportMapper; +import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.data.WeeklyreportDO; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class WeeklyReportRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/WeeklyreportMapper.xml"; + + @Override + protected Class getMapperClass() { + return WeeklyreportMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public WeeklyReport createLocal() { + return new WeeklyReport(); + } + + public int deleteByPK(WeeklyReport proto) throws DalException { + try (SqlSession session = openSession()) { + WeeklyreportMapper mapper = session.getMapper(WeeklyreportMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for WeeklyReport.", e); + } + } + + public int deleteReportByDomainNamePeriod(WeeklyReport proto) throws DalException { + try (SqlSession session = openSession()) { + WeeklyreportMapper mapper = session.getMapper(WeeklyreportMapper.class); + int count = mapper.deleteReportByDomainNamePeriod(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteReportByDomainNamePeriod for WeeklyReport.", e); + } + } + + public WeeklyReport findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + WeeklyreportMapper mapper = session.getMapper(WeeklyreportMapper.class); + WeeklyreportDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for WeeklyReport.", e); + } + } + + public WeeklyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + WeeklyreportMapper mapper = session.getMapper(WeeklyreportMapper.class); + WeeklyreportDO record = new WeeklyreportDO(); + record.setPeriod(period); + record.setDomain(domain); + record.setName(name); + WeeklyreportDO result = mapper.findReportByDomainNamePeriod(record).stream().findFirst().orElse(null); + return requireFound(result, "findReportByDomainNamePeriod", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findReportByDomainNamePeriod for WeeklyReport.", e); + } + } + + public int insert(WeeklyReport proto) throws DalException { + try (SqlSession session = openSession()) { + WeeklyreportMapper mapper = session.getMapper(WeeklyreportMapper.class); + WeeklyreportDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for WeeklyReport.", e); + } + } + + public int updateByPK(WeeklyReport proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + WeeklyreportMapper mapper = session.getMapper(WeeklyreportMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for WeeklyReport.", e); + } + } + + private WeeklyReport requireFound(WeeklyreportDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No WeeklyReport found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private WeeklyReport toModel(WeeklyreportDO record) { + WeeklyReport model = new WeeklyReport(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getName() != null) { + model.setName(record.getName()); + } + if (record.getIp() != null) { + model.setIp(record.getIp()); + } + if (record.getDomain() != null) { + model.setDomain(record.getDomain()); + } + if (record.getPeriod() != null) { + model.setPeriod(record.getPeriod()); + } + if (record.getType() != null) { + model.setType(record.getType()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + model.afterLoad(); + return model; + } + + private WeeklyreportDO toRecord(WeeklyReport model) { + WeeklyreportDO record = new WeeklyreportDO(); + + record.setId(model.getId()); + record.setName(model.getName()); + record.setIp(model.getIp()); + record.setDomain(model.getDomain()); + record.setPeriod(model.getPeriod()); + record.setType(model.getType()); + record.setCreationDate(model.getCreationDate()); + record.setKeyId(model.getKeyId()); + return record; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/DailyReportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/DailyReportMapper.java new file mode 100644 index 0000000000..d3ba52091f --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/DailyReportMapper.java @@ -0,0 +1,27 @@ +package com.dianping.cat.core.report.daily.dao; + +import java.util.Date; +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.report.daily.dao.data.DailyReportDO; + +public interface DailyReportMapper { + int deleteByDomainNamePeriod(@Param("domain") String domain, @Param("name") String name, + @Param("period") Date period); + + int deleteById(@Param("id") Integer id); + + DailyReportDO findByDomainNamePeriod(@Param("domain") String domain, @Param("name") String name, + @Param("period") Date period); + + DailyReportDO findById(@Param("id") Integer id); + + int insert(DailyReportDO report); + + List queryLatestReportsByDomainName(@Param("domain") String domain, @Param("name") String name, + @Param("limits") int limits); + + int updateById(DailyReportDO report); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/data/DailyReportDO.java b/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/data/DailyReportDO.java new file mode 100644 index 0000000000..e887233dec --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/data/DailyReportDO.java @@ -0,0 +1,22 @@ +package com.dianping.cat.core.report.daily.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class DailyReportDO { + private Integer id; + + private String name; + + private String ip; + + private String domain; + + private Date period; + + private Integer type; + + private Date creationDate; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java new file mode 100644 index 0000000000..9dc06b25b6 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java @@ -0,0 +1,261 @@ +package com.dianping.cat.core.report.daily.repository; + +import java.io.IOException; +import java.io.Reader; +import java.sql.Connection; +import java.util.List; +import java.util.stream.Collectors; + +import javax.sql.DataSource; + +import org.apache.ibatis.builder.xml.XMLMapperBuilder; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.core.dal.DailyReport; +import com.dianping.cat.core.report.daily.dao.DailyReportMapper; +import com.dianping.cat.core.report.daily.dao.data.DailyReportDO; + +public class DailyReportRepository { + private static final String DATA_SOURCE_NAME = "cat"; + + private static final String MAPPER_RESOURCE = "mybatis/mapper/DailyReportMapper.xml"; + + @Inject + private DataSourceManager m_dataSourceManager; + + private volatile SqlSessionFactory m_sqlSessionFactory; + + public DailyReport createLocal() { + return new DailyReport(); + } + + public int deleteByDomainNamePeriod(DailyReport proto) throws DalException { + try (SqlSession session = openSession()) { + int count = session.getMapper(DailyReportMapper.class).deleteByDomainNamePeriod(proto.getDomain(), + proto.getName(), proto.getPeriod()); + + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when deleting daily report by domain/name/period: " + proto, e); + } + } + + public int deleteByPK(DailyReport proto) throws DalException { + try (SqlSession session = openSession()) { + int count = session.getMapper(DailyReportMapper.class).deleteById(proto.getKeyId()); + + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when deleting daily report by primary key: " + proto, e); + } + } + + public DailyReport findByDomainNamePeriod(String domain, String name, java.util.Date period, + Readset readset) throws DalException { + try (SqlSession session = openSession()) { + DailyReportDO report = session.getMapper(DailyReportMapper.class).findByDomainNamePeriod(domain, name, + period); + + return requireFound(report, "domain/name/period", domain + "/" + name + "/" + period); + } catch (DalException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when finding daily report by domain/name/period: " + domain + "/" + name + + "/" + period, e); + } + } + + public DailyReport findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + DailyReportDO report = session.getMapper(DailyReportMapper.class).findById(keyId); + + return requireFound(report, "id", String.valueOf(keyId)); + } catch (DalException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when finding daily report by primary key: " + keyId, e); + } + } + + public int insert(DailyReport proto) throws DalException { + try (SqlSession session = openSession()) { + DailyReportDO report = toDailyReportDO(proto); + int count = session.getMapper(DailyReportMapper.class).insert(report); + + session.commit(); + proto.setId(report.getId()); + proto.setKeyId(report.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when inserting daily report: " + proto, e); + } + } + + public List queryLatestReportsByDomainName(String domain, String name, int limits, + Readset readset) throws DalException { + try (SqlSession session = openSession()) { + return session.getMapper(DailyReportMapper.class).queryLatestReportsByDomainName(domain, name, limits) + .stream() + .map(this::toDailyReport) + .collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when querying latest daily reports by domain/name: " + domain + "/" + name, + e); + } + } + + public int updateByPK(DailyReport proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + int count = session.getMapper(DailyReportMapper.class).updateById(toDailyReportDO(proto)); + + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when updating daily report by primary key: " + proto, e); + } + } + + private SqlSessionFactory getSqlSessionFactory() { + SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + synchronized (this) { + sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + sqlSessionFactory = newSqlSessionFactory(); + m_sqlSessionFactory = sqlSessionFactory; + } + } + } + + return sqlSessionFactory; + } + + private void loadMapperXml(Configuration configuration) { + try (Reader reader = Resources.getResourceAsReader(MAPPER_RESOURCE)) { + XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, MAPPER_RESOURCE, + configuration.getSqlFragments()); + + mapperParser.parse(); + } catch (IOException e) { + throw new IllegalStateException("Error when loading MyBatis mapper: " + MAPPER_RESOURCE, e); + } + } + + private SqlSessionFactory newSqlSessionFactory() { + Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), + new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); + + configuration.addMapper(DailyReportMapper.class); + loadMapperXml(configuration); + return new SqlSessionFactoryBuilder().build(configuration); + } + + private SqlSession openSession() { + return getSqlSessionFactory().openSession(false); + } + + private DailyReport requireFound(DailyReportDO report, String field, String value) throws DalNotFoundException { + if (report == null) { + throw new DalNotFoundException(String.format("No daily report found by %s(%s).", field, value)); + } + + return toDailyReport(report); + } + + private DailyReport toDailyReport(DailyReportDO reportDO) { + DailyReport report = new DailyReport(); + + report.setId(reportDO.getId()); + report.setName(reportDO.getName()); + report.setIp(reportDO.getIp()); + report.setDomain(reportDO.getDomain()); + report.setPeriod(reportDO.getPeriod()); + report.setType(reportDO.getType()); + report.setCreationDate(reportDO.getCreationDate()); + report.afterLoad(); + return report; + } + + private DailyReportDO toDailyReportDO(DailyReport report) { + DailyReportDO reportDO = new DailyReportDO(); + + reportDO.setId(report.getKeyId() > 0 ? report.getKeyId() : report.getId()); + reportDO.setName(report.getName()); + reportDO.setIp(report.getIp()); + reportDO.setDomain(report.getDomain()); + reportDO.setPeriod(report.getPeriod()); + reportDO.setType(report.getType()); + reportDO.setCreationDate(report.getCreationDate()); + return reportDO; + } + + private static final class UnidalDataSource implements DataSource { + private final DataSourceManager m_dataSourceManager; + + private final String m_dataSourceName; + + private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { + m_dataSourceManager = dataSourceManager; + m_dataSourceName = dataSourceName; + } + + @Override + public Connection getConnection() throws java.sql.SQLException { + return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); + } + + @Override + public Connection getConnection(String username, String password) throws java.sql.SQLException { + return getConnection(); + } + + @Override + public int getLoginTimeout() { + return 0; + } + + @Override + public java.io.PrintWriter getLogWriter() { + return null; + } + + @Override + public java.util.logging.Logger getParentLogger() { + return java.util.logging.Logger.getGlobal(); + } + + @Override + public boolean isWrapperFor(Class iface) { + return false; + } + + @Override + public void setLoginTimeout(int seconds) { + } + + @Override + public void setLogWriter(java.io.PrintWriter out) { + } + + @Override + public T unwrap(Class iface) throws java.sql.SQLException { + throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java index f1cc0fc53a..a761b419f6 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java +++ b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java @@ -38,8 +38,8 @@ import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentDao; -import com.dianping.cat.core.dal.HourlyReportDao; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; import com.dianping.cat.message.Message; import com.dianping.cat.message.Transaction; @@ -57,10 +57,10 @@ public class DefaultReportManager extends ContainerHolder implements ReportMa private ReportBucketManager m_bucketManager; @Inject - private HourlyReportDao m_reportDao; + private HourlyReportRepository m_reportDao; @Inject - private HourlyReportContentDao m_reportContentDao; + private HourlyReportContentRepository m_reportContentDao; @Inject private DomainValidator m_validator; @@ -238,11 +238,11 @@ public void setName(String name) { m_name = name; } - public void setReportContentDao(HourlyReportContentDao reportContentDao) { + public void setReportContentDao(HourlyReportContentRepository reportContentDao) { m_reportContentDao = reportContentDao; } - public void setReportDao(HourlyReportDao reportDao) { + public void setReportDao(HourlyReportRepository reportDao) { m_reportDao = reportDao; } diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java index 5dcf87f61c..cdec241c2c 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java @@ -37,23 +37,23 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentDao; -import com.dianping.cat.core.dal.DailyReportDao; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentDao; -import com.dianping.cat.core.dal.HourlyReportDao; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.dal.MonthlyReportContentDao; -import com.dianping.cat.core.dal.MonthlyReportDao; +import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.dal.WeeklyReportContentDao; -import com.dianping.cat.core.dal.WeeklyReportDao; +import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; import com.dianping.cat.core.dal.WeeklyReportEntity; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.message.Event; @@ -70,28 +70,28 @@ public abstract class AbstractReportService implements LogEnabled, ReportServ public static final int s_customer = 5; @Inject - protected HourlyReportDao m_hourlyReportDao; + protected HourlyReportRepository m_hourlyReportDao; @Inject - protected HourlyReportContentDao m_hourlyReportContentDao; + protected HourlyReportContentRepository m_hourlyReportContentDao; @Inject - protected DailyReportDao m_dailyReportDao; + protected DailyReportRepository m_dailyReportDao; @Inject - protected DailyReportContentDao m_dailyReportContentDao; + protected DailyReportContentRepository m_dailyReportContentDao; @Inject - protected WeeklyReportDao m_weeklyReportDao; + protected WeeklyReportRepository m_weeklyReportDao; @Inject - protected WeeklyReportContentDao m_weeklyReportContentDao; + protected WeeklyReportContentRepository m_weeklyReportContentDao; @Inject - protected MonthlyReportDao m_monthlyReportDao; + protected MonthlyReportRepository m_monthlyReportDao; @Inject - protected MonthlyReportContentDao m_monthlyReportContentDao; + protected MonthlyReportContentRepository m_monthlyReportContentDao; protected Logger m_logger; diff --git a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java index 21c6ac026b..2dece2b8cc 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java @@ -40,7 +40,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.dal.Hostinfo; -import com.dianping.cat.core.dal.HostinfoDao; +import com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository; import com.dianping.cat.core.dal.HostinfoEntity; import com.dianping.cat.helper.TimeHelper; @@ -52,7 +52,7 @@ public class HostinfoService implements Initializable, LogEnabled { protected Logger m_logger; @Inject - private HostinfoDao m_hostinfoDao; + private HostinfoRepository m_hostinfoDao; @Inject private ServerConfigManager m_manager; diff --git a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java index 018bbcb7da..302f67160e 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java @@ -21,7 +21,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.dal.Project; -import com.dianping.cat.core.dal.ProjectDao; +import com.dianping.cat.core.mybatis.repository.project.ProjectRepository; import com.dianping.cat.core.dal.ProjectEntity; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; @@ -39,7 +39,7 @@ public class ProjectService implements Initializable { public static final String DEFAULT = "Default"; @Inject - private ProjectDao m_projectDao; + private ProjectRepository m_projectDao; @Inject private ServerConfigManager m_manager; diff --git a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java index aa8f451d8c..fb01aaec83 100644 --- a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java +++ b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java @@ -21,7 +21,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.core.dal.Task; -import com.dianping.cat.core.dal.TaskDao; +import com.dianping.cat.core.mybatis.repository.task.TaskRepository; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -47,7 +47,7 @@ public class TaskManager { private static final int STATUS_TODO = 1; @Inject - private TaskDao m_taskDao; + private TaskRepository m_taskDao; public boolean createTask(Date period, String domain, String name, TaskCreationPolicy prolicy) { try { diff --git a/cat-core/src/main/resources/META-INF/plexus/components.xml b/cat-core/src/main/resources/META-INF/plexus/components.xml index afeacc8359..67d22aace3 100644 --- a/cat-core/src/main/resources/META-INF/plexus/components.xml +++ b/cat-core/src/main/resources/META-INF/plexus/components.xml @@ -30,7 +30,7 @@ com.dianping.cat.service.HostinfoService - com.dianping.cat.core.dal.HostinfoDao + com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository com.dianping.cat.config.server.ServerConfigManager @@ -50,7 +50,7 @@ com.dianping.cat.task.TaskManager - com.dianping.cat.core.dal.TaskDao + com.dianping.cat.core.mybatis.repository.task.TaskRepository @@ -127,7 +127,7 @@ com.dianping.cat.config.business.BusinessConfigManager - com.dianping.cat.core.config.BusinessConfigDao + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository @@ -247,17 +247,116 @@ - com.dianping.cat.core.config.BusinessConfigDao - com.dianping.cat.core.config.BusinessConfigDao + com.dianping.cat.core.config.repository.ConfigRepository + com.dianping.cat.core.config.repository.ConfigRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.core.config.repository.ConfigRepository - com.dianping.cat.core.config.repository.ConfigRepository + com.dianping.cat.core.report.daily.repository.DailyReportRepository + com.dianping.cat.core.report.daily.repository.DailyReportRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository + com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.project.ProjectRepository + com.dianping.cat.core.mybatis.repository.project.ProjectRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.task.TaskRepository + com.dianping.cat.core.mybatis.repository.task.TaskRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository org.unidal.dal.jdbc.datasource.DataSourceManager @@ -363,105 +462,6 @@ cat - - com.dianping.cat.core.dal.DailyReportContentDao - com.dianping.cat.core.dal.DailyReportContentDao - - - org.unidal.dal.jdbc.QueryEngine - - - - - com.dianping.cat.core.dal.DailyReportDao - com.dianping.cat.core.dal.DailyReportDao - - - org.unidal.dal.jdbc.QueryEngine - - - - - com.dianping.cat.core.dal.HostinfoDao - com.dianping.cat.core.dal.HostinfoDao - - - org.unidal.dal.jdbc.QueryEngine - - - - - com.dianping.cat.core.dal.MonthlyReportContentDao - com.dianping.cat.core.dal.MonthlyReportContentDao - - - org.unidal.dal.jdbc.QueryEngine - - - - - com.dianping.cat.core.dal.MonthlyReportDao - com.dianping.cat.core.dal.MonthlyReportDao - - - org.unidal.dal.jdbc.QueryEngine - - - - - com.dianping.cat.core.dal.ProjectDao - com.dianping.cat.core.dal.ProjectDao - - - org.unidal.dal.jdbc.QueryEngine - - - - - com.dianping.cat.core.dal.HourlyReportDao - com.dianping.cat.core.dal.HourlyReportDao - - - org.unidal.dal.jdbc.QueryEngine - - - - - com.dianping.cat.core.dal.HourlyReportContentDao - com.dianping.cat.core.dal.HourlyReportContentDao - - - org.unidal.dal.jdbc.QueryEngine - - - - - com.dianping.cat.core.dal.TaskDao - com.dianping.cat.core.dal.TaskDao - - - org.unidal.dal.jdbc.QueryEngine - - - - - com.dianping.cat.core.dal.WeeklyReportContentDao - com.dianping.cat.core.dal.WeeklyReportContentDao - - - org.unidal.dal.jdbc.QueryEngine - - - - - com.dianping.cat.core.dal.WeeklyReportDao - com.dianping.cat.core.dal.WeeklyReportDao - - - org.unidal.dal.jdbc.QueryEngine - - - org.unidal.dal.jdbc.mapping.TableProvider daily-report-content @@ -562,134 +562,134 @@ - com.dianping.cat.core.dal.DailyReportContentDao - com.dianping.cat.core.dal.DailyReportContentDao + org.unidal.dal.jdbc.mapping.TableProvider + business-config + org.unidal.dal.jdbc.mapping.SimpleTableProvider + + business_config + cat + + + + org.unidal.dal.jdbc.mapping.TableProvider + config + org.unidal.dal.jdbc.mapping.SimpleTableProvider + + config + cat + + + + com.dianping.cat.core.config.repository.ConfigRepository + com.dianping.cat.core.config.repository.ConfigRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.core.dal.DailyReportDao - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository + com.dianping.cat.core.report.daily.repository.DailyReportRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.core.dal.HostinfoDao - com.dianping.cat.core.dal.HostinfoDao + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.core.dal.MonthlyReportContentDao - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.core.dal.MonthlyReportDao - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository + com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.core.dal.ProjectDao - com.dianping.cat.core.dal.ProjectDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.core.dal.HourlyReportDao - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.core.dal.HourlyReportContentDao - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.core.dal.TaskDao - com.dianping.cat.core.dal.TaskDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.core.dal.WeeklyReportContentDao - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.project.ProjectRepository + com.dianping.cat.core.mybatis.repository.project.ProjectRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.core.dal.WeeklyReportDao - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.task.TaskRepository + com.dianping.cat.core.mybatis.repository.task.TaskRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - org.unidal.dal.jdbc.mapping.TableProvider - business-config - org.unidal.dal.jdbc.mapping.SimpleTableProvider - - business_config - cat - - - - org.unidal.dal.jdbc.mapping.TableProvider - config - org.unidal.dal.jdbc.mapping.SimpleTableProvider - - config - cat - - - - com.dianping.cat.core.config.BusinessConfigDao - com.dianping.cat.core.config.BusinessConfigDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.core.config.repository.ConfigRepository - com.dianping.cat.core.config.repository.ConfigRepository + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository org.unidal.dal.jdbc.datasource.DataSourceManager diff --git a/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml b/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml new file mode 100644 index 0000000000..a9dcebb215 --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + id, + name, + domain, + content, + updatetime + + + + INSERT INTO business_config + (name, domain, content, updatetime) + VALUES + (#{name}, #{domain}, #{content}, #{updatetime}) + + + + + + + + DELETE FROM business_config + WHERE id = #{id} + + + + UPDATE business_config + SET name = #{name}, + domain = #{domain}, + content = #{content}, + updatetime = #{updatetime} + WHERE id = #{id} + + + + + + + + UPDATE business_config SET content=#{record.content}, updatetime=NOW() WHERE domain = #{record.domain} AND name = #{record.name}; + + diff --git a/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml new file mode 100644 index 0000000000..8d81d7b374 --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + id, + type, + name, + ip, + productLine, + period, + content, + creation_date + + + + INSERT INTO businessReport + (type, name, ip, productLine, period, content, creation_date) + VALUES + (#{type}, #{name}, #{ip}, #{productLine}, #{period}, #{content}, #{creationDate}) + + + + + + + + DELETE FROM businessReport + WHERE id = #{id} + + + + UPDATE businessReport + SET type = #{type}, + name = #{name}, + ip = #{ip}, + productLine = #{productLine}, + period = #{period}, + content = #{content}, + creation_date = #{creationDate} + WHERE id = #{id} + + diff --git a/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml new file mode 100644 index 0000000000..f9b8272505 --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + report_id, + content, + period, + creation_date + + + + INSERT INTO daily_report_content + (report_id, content, period, creation_date) + VALUES + (#{reportId}, #{content}, #{period}, #{creationDate}) + + + + + + + + DELETE FROM daily_report_content + WHERE report_id = #{reportId} + + + + UPDATE daily_report_content + SET content = #{content}, + period = #{period}, + creation_date = #{creationDate} + WHERE report_id = #{reportId} + + + + diff --git a/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml new file mode 100644 index 0000000000..5ccd33e65f --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + id, + name, + ip, + domain, + period, + type, + creation_date + + + + INSERT INTO dailyreport + (name, ip, domain, period, type, creation_date) + VALUES + (#{name}, #{ip}, #{domain}, #{period}, #{type}, #{creationDate}) + + + + + + + + + + DELETE FROM dailyreport + WHERE id = #{id} + + + + DELETE FROM dailyreport + WHERE period = #{period} + AND domain = #{domain} + AND name = #{name} + AND BINARY(domain) = BINARY(#{domain}) + + + + UPDATE dailyreport + SET name = #{name}, + ip = #{ip}, + domain = #{domain}, + period = #{period}, + type = #{type}, + creation_date = #{creationDate} + WHERE id = #{id} + + + diff --git a/cat-core/src/main/resources/mybatis/mapper/HostinfoMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HostinfoMapper.xml new file mode 100644 index 0000000000..72ab789b22 --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/HostinfoMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + id, + ip, + domain, + hostname, + creation_date, + last_modified_date + + + + INSERT INTO hostinfo + (ip, domain, hostname, creation_date, last_modified_date) + VALUES + (#{ip}, #{domain}, #{hostname}, #{creationDate}, #{lastModifiedDate}) + + + + + + + + DELETE FROM hostinfo + WHERE id = #{id} + + + + UPDATE hostinfo + SET ip = #{ip}, + domain = #{domain}, + hostname = #{hostname}, + creation_date = #{creationDate}, + last_modified_date = #{lastModifiedDate} + WHERE id = #{id} + + + + + + diff --git a/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml new file mode 100644 index 0000000000..e141d8cd51 --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + report_id, + content, + period, + creation_date + + + + INSERT INTO hourly_report_content + (report_id, content, period, creation_date) + VALUES + (#{reportId}, #{content}, #{period}, #{creationDate}) + + + + + + + + DELETE FROM hourly_report_content + WHERE report_id = #{reportId} + + + + UPDATE hourly_report_content + SET content = #{content}, + period = #{period}, + creation_date = #{creationDate} + WHERE report_id = #{reportId} + + + + diff --git a/cat-core/src/main/resources/mybatis/mapper/HourlyreportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HourlyreportMapper.xml new file mode 100644 index 0000000000..efa5803177 --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/HourlyreportMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + id, + type, + name, + ip, + domain, + period, + creation_date + + + + INSERT INTO hourlyreport + (type, name, ip, domain, period, creation_date) + VALUES + (#{type}, #{name}, #{ip}, #{domain}, #{period}, #{creationDate}) + + + + + + + + DELETE FROM hourlyreport + WHERE id = #{id} + + + + UPDATE hourlyreport + SET type = #{type}, + name = #{name}, + ip = #{ip}, + domain = #{domain}, + period = #{period}, + creation_date = #{creationDate} + WHERE id = #{id} + + + + + + diff --git a/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml new file mode 100644 index 0000000000..fbec8d6384 --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + report_id, + content, + period, + creation_date + + + + INSERT INTO monthly_report_content + (report_id, content, period, creation_date) + VALUES + (#{reportId}, #{content}, #{period}, #{creationDate}) + + + + + + + + DELETE FROM monthly_report_content + WHERE report_id = #{reportId} + + + + UPDATE monthly_report_content + SET content = #{content}, + period = #{period}, + creation_date = #{creationDate} + WHERE report_id = #{reportId} + + + + diff --git a/cat-core/src/main/resources/mybatis/mapper/MonthreportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/MonthreportMapper.xml new file mode 100644 index 0000000000..0750e2e643 --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/MonthreportMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + id, + name, + ip, + domain, + period, + type, + creation_date + + + + INSERT INTO monthreport + (name, ip, domain, period, type, creation_date) + VALUES + (#{name}, #{ip}, #{domain}, #{period}, #{type}, #{creationDate}) + + + + + + + + DELETE FROM monthreport + WHERE id = #{id} + + + + UPDATE monthreport + SET name = #{name}, + ip = #{ip}, + domain = #{domain}, + period = #{period}, + type = #{type}, + creation_date = #{creationDate} + WHERE id = #{id} + + + + + + DELETE FROM monthreport WHERE period = #{record.period} AND domain = #{record.domain} AND name = #{record.name} + + diff --git a/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml b/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml new file mode 100644 index 0000000000..b0493f91d8 --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + id, + user, + module, + operation, + time, + content, + creation_date + + + + INSERT INTO operation + (user, module, operation, time, content, creation_date) + VALUES + (#{user}, #{module}, #{operation}, #{time}, #{content}, #{creationDate}) + + + + + + + + DELETE FROM operation + WHERE id = #{id} + + + + UPDATE operation + SET user = #{user}, + module = #{module}, + operation = #{operation}, + time = #{time}, + content = #{content}, + creation_date = #{creationDate} + WHERE id = #{id} + + diff --git a/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml b/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml new file mode 100644 index 0000000000..87343d687c --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + id, + domain, + cmdb_domain, + level, + bu, + cmdb_productline, + owner, + email, + phone, + creation_date, + modify_date + + + + INSERT INTO project + (domain, cmdb_domain, level, bu, cmdb_productline, owner, email, phone, creation_date, modify_date) + VALUES + (#{domain}, #{cmdbDomain}, #{level}, #{bu}, #{cmdbProductline}, #{owner}, #{email}, #{phone}, #{creationDate}, #{modifyDate}) + + + + + + + + DELETE FROM project + WHERE id = #{id} + + + + UPDATE project + SET domain = #{domain}, + cmdb_domain = #{cmdbDomain}, + level = #{level}, + bu = #{bu}, + cmdb_productline = #{cmdbProductline}, + owner = #{owner}, + email = #{email}, + phone = #{phone}, + creation_date = #{creationDate}, + modify_date = #{modifyDate} + WHERE id = #{id} + + + + + + + + diff --git a/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml b/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml new file mode 100644 index 0000000000..01d086d69f --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + id, + producer, + consumer, + failure_count, + report_name, + report_domain, + report_period, + status, + task_type, + creation_date, + start_date, + end_date + + + + INSERT INTO task + (producer, consumer, failure_count, report_name, report_domain, report_period, status, task_type, creation_date, start_date, end_date) + VALUES + (#{producer}, #{consumer}, #{failureCount}, #{reportName}, #{reportDomain}, #{reportPeriod}, #{status}, #{taskType}, #{creationDate}, #{startDate}, #{endDate}) + + + + + + + + DELETE FROM task + WHERE id = #{id} + + + + UPDATE task + SET producer = #{producer}, + consumer = #{consumer}, + failure_count = #{failureCount}, + report_name = #{reportName}, + report_domain = #{reportDomain}, + report_period = #{reportPeriod}, + status = #{status}, + task_type = #{taskType}, + creation_date = #{creationDate}, + start_date = #{startDate}, + end_date = #{endDate} + WHERE id = #{id} + + + + + + UPDATE task SET consumer=#{record.consumer}, status=2, start_date=#{record.startDate} WHERE status = 1 AND id = #{record.id}; + + + + UPDATE task SET status=3, end_date=#{record.endDate} WHERE status = 2 AND id = #{record.id}; + + + + UPDATE task SET status=3, end_date=#{record.endDate} WHERE status =4 AND id = #{record.id}; + + + + UPDATE task SET status=1, WHERE id = #{record.id}; + + + + UPDATE task SET status=4, end_date=#{record.endDate}, failure_count = failure_count + 1 WHERE status = 2 AND id = #{record.id}; + + diff --git a/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml new file mode 100644 index 0000000000..7d899c24c7 --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + report_id, + content, + period, + creation_date + + + + INSERT INTO weekly_report_content + (report_id, content, period, creation_date) + VALUES + (#{reportId}, #{content}, #{period}, #{creationDate}) + + + + + + + + DELETE FROM weekly_report_content + WHERE report_id = #{reportId} + + + + UPDATE weekly_report_content + SET content = #{content}, + period = #{period}, + creation_date = #{creationDate} + WHERE report_id = #{reportId} + + + + diff --git a/cat-core/src/main/resources/mybatis/mapper/WeeklyreportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/WeeklyreportMapper.xml new file mode 100644 index 0000000000..c0439f3ae2 --- /dev/null +++ b/cat-core/src/main/resources/mybatis/mapper/WeeklyreportMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + id, + name, + ip, + domain, + period, + type, + creation_date + + + + INSERT INTO weeklyreport + (name, ip, domain, period, type, creation_date) + VALUES + (#{name}, #{ip}, #{domain}, #{period}, #{type}, #{creationDate}) + + + + + + + + DELETE FROM weeklyreport + WHERE id = #{id} + + + + UPDATE weeklyreport + SET name = #{name}, + ip = #{ip}, + domain = #{domain}, + period = #{period}, + type = #{type}, + creation_date = #{creationDate} + WHERE id = #{id} + + + + + + DELETE FROM weeklyreport WHERE period = #{record.period} AND domain = #{record.domain} AND name = #{record.name} + + diff --git a/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java b/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java index 4066fefe39..de32bbd366 100644 --- a/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java +++ b/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java @@ -34,8 +34,8 @@ import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentDao; -import com.dianping.cat.core.dal.HourlyReportDao; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; import com.dianping.cat.report.DefaultReportManager; import com.dianping.cat.report.DefaultReportManager.StoragePolicy; import com.dianping.cat.report.DomainValidator; @@ -155,7 +155,7 @@ public void clearOldReports() { } - public class MockHourlyReportDao extends HourlyReportDao { + public class MockHourlyReportDao extends HourlyReportRepository { public int count; @@ -166,7 +166,7 @@ public int insert(HourlyReport proto) throws DalException { } - public class MockReportContentDao extends HourlyReportContentDao { + public class MockReportContentDao extends HourlyReportContentRepository { public int count; diff --git a/cat-home/pom.xml b/cat-home/pom.xml index 6f2a65ae17..82b39645f3 100755 --- a/cat-home/pom.xml +++ b/cat-home/pom.xml @@ -50,13 +50,21 @@ servlet-api provided - - org.unidal.framework - dal-jdbc - - - org.unidal.framework - foundation-service + + org.unidal.framework + dal-jdbc + + + org.mybatis + mybatis + + + org.projectlombok + lombok + + + org.unidal.framework + foundation-service javax.servlet diff --git a/cat-home/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java index a146c6d698..eb418637c1 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java @@ -22,9 +22,25 @@ import java.util.List; import org.unidal.dal.jdbc.configuration.AbstractJdbcResourceConfigurator; +import org.unidal.dal.jdbc.datasource.DataSourceManager; import org.unidal.lookup.configuration.Component; +import com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository; +import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; +import com.dianping.cat.core.mybatis.repository.baseline.BaselineRepository; +import com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository; +import com.dianping.cat.core.mybatis.repository.metric.graph.MetricGraphRepository; +import com.dianping.cat.core.mybatis.repository.metric.screen.MetricScreenRepository; +import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; +import com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository; + final class CatDatabaseConfigurator extends AbstractJdbcResourceConfigurator { + private static final String[] REPLACED_DAO_ROLES = { "com.dianping.cat.home.dal.report.AlertSummaryDao", + "com.dianping.cat.home.dal.report.AlterationDao", "com.dianping.cat.home.dal.report.BaselineDao", + "com.dianping.cat.home.dal.report.ConfigModificationDao", + "com.dianping.cat.home.dal.report.MetricGraphDao", "com.dianping.cat.home.dal.report.MetricScreenDao", + "com.dianping.cat.home.dal.report.OverloadDao", "com.dianping.cat.home.dal.report.TopologyGraphDao" }; + @Override public List defineComponents() { List all = new ArrayList(); @@ -33,7 +49,33 @@ public List defineComponents() { defineSimpleTableProviderComponents(all, "cat", com.dianping.cat.home.dal.report._INDEX.getEntityClasses()); defineDaoComponents(all, com.dianping.cat.home.dal.report._INDEX.getDaoClasses()); + removeReplacedDaoComponents(all); + addRepositoryComponents(all); return all; } + + private void addRepositoryComponents(List components) { + components.add(C(AlertSummaryRepository.class).req(DataSourceManager.class)); + components.add(C(AlterationRepository.class).req(DataSourceManager.class)); + components.add(C(BaselineRepository.class).req(DataSourceManager.class)); + components.add(C(ConfigModificationRepository.class).req(DataSourceManager.class)); + components.add(C(MetricGraphRepository.class).req(DataSourceManager.class)); + components.add(C(MetricScreenRepository.class).req(DataSourceManager.class)); + components.add(C(OverloadRepository.class).req(DataSourceManager.class)); + components.add(C(TopologyGraphRepository.class).req(DataSourceManager.class)); + } + + private boolean isReplacedDaoRole(String role) { + for (String replacedDaoRole : REPLACED_DAO_ROLES) { + if (replacedDaoRole.equals(role)) { + return true; + } + } + return false; + } + + private void removeReplacedDaoComponents(List components) { + components.removeIf(component -> isReplacedDaoRole(component.getModel().getRole())); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 9816cabefb..5ce849344a 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -35,11 +35,23 @@ import com.dianping.cat.build.report.MetricComponentConfigurator; import com.dianping.cat.build.report.OfflineComponentConfigurator; import com.dianping.cat.build.report.ProblemComponentConfigurator; -import com.dianping.cat.build.report.ReportComponentConfigurator; -import com.dianping.cat.build.report.StorageComponentConfigurator; -import com.dianping.cat.build.report.TransactionComponentConfigurator; -import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.helper.JsonBuilder; +import com.dianping.cat.build.report.ReportComponentConfigurator; +import com.dianping.cat.build.report.StorageComponentConfigurator; +import com.dianping.cat.build.report.TransactionComponentConfigurator; +import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.repository.project.ProjectRepository; +import com.dianping.cat.core.mybatis.repository.task.TaskRepository; +import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; +import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.mvc.PayloadNormalizer; import com.dianping.cat.report.HourlyReportContentTableProvider; import com.dianping.cat.report.HourlyReportTableProvider; @@ -66,8 +78,14 @@ import com.dianping.cat.system.page.permission.ResourceConfigManager; import com.dianping.cat.system.page.permission.UserConfigManager; -public class ComponentsConfigurator extends AbstractJdbcResourceConfigurator { - private static final String CONFIG_DAO_ROLE = "com.dianping.cat.core.config.ConfigDao"; +public class ComponentsConfigurator extends AbstractJdbcResourceConfigurator { + private static final String[] CORE_REPLACED_DAO_ROLES = { "com.dianping.cat.core.config.ConfigDao", + "com.dianping.cat.core.config.BusinessConfigDao", "com.dianping.cat.core.dal.DailyReportDao", + "com.dianping.cat.core.dal.DailyReportContentDao", "com.dianping.cat.core.dal.HostinfoDao", + "com.dianping.cat.core.dal.HourlyReportDao", "com.dianping.cat.core.dal.HourlyReportContentDao", + "com.dianping.cat.core.dal.MonthlyReportDao", "com.dianping.cat.core.dal.MonthlyReportContentDao", + "com.dianping.cat.core.dal.ProjectDao", "com.dianping.cat.core.dal.TaskDao", + "com.dianping.cat.core.dal.WeeklyReportDao", "com.dianping.cat.core.dal.WeeklyReportContentDao" }; public static void main(String[] args) { generatePlexusComponentsXmlFile(new ComponentsConfigurator()); @@ -144,14 +162,30 @@ public List defineComponents() { // for alarm module all.addAll(new HomeAlarmComponentConfigurator().defineComponents()); - // web, please keep it last - all.addAll(new WebComponentConfigurator().defineComponents()); - - removeConfigDaoComponent(all); - all.add(C(ConfigRepository.class).req(DataSourceManager.class)); - - return all; - } + // web, please keep it last + all.addAll(new WebComponentConfigurator().defineComponents()); + + removeReplacedDaoComponents(all); + addCoreRepositoryComponents(all); + + return all; + } + + private void addCoreRepositoryComponents(List components) { + components.add(C(ConfigRepository.class).req(DataSourceManager.class)); + components.add(C(DailyReportRepository.class).req(DataSourceManager.class)); + components.add(C(BusinessConfigRepository.class).req(DataSourceManager.class)); + components.add(C(DailyReportContentRepository.class).req(DataSourceManager.class)); + components.add(C(HostinfoRepository.class).req(DataSourceManager.class)); + components.add(C(HourlyReportRepository.class).req(DataSourceManager.class)); + components.add(C(HourlyReportContentRepository.class).req(DataSourceManager.class)); + components.add(C(MonthlyReportRepository.class).req(DataSourceManager.class)); + components.add(C(MonthlyReportContentRepository.class).req(DataSourceManager.class)); + components.add(C(ProjectRepository.class).req(DataSourceManager.class)); + components.add(C(TaskRepository.class).req(DataSourceManager.class)); + components.add(C(WeeklyReportRepository.class).req(DataSourceManager.class)); + components.add(C(WeeklyReportContentRepository.class).req(DataSourceManager.class)); + } private List defineConfigComponents() { List all = new ArrayList(); @@ -183,7 +217,16 @@ private List defineTableProviderComponents() { return all; } - private void removeConfigDaoComponent(List components) { - components.removeIf(component -> CONFIG_DAO_ROLE.equals(component.getModel().getRole())); - } -} + private void removeReplacedDaoComponents(List components) { + components.removeIf(component -> isCoreReplacedDaoRole(component.getModel().getRole())); + } + + private boolean isCoreReplacedDaoRole(String role) { + for (String replacedDaoRole : CORE_REPLACED_DAO_ROLES) { + if (replacedDaoRole.equals(role)) { + return true; + } + } + return false; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alert/summary/dao/AlertSummaryMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alert/summary/dao/AlertSummaryMapper.java new file mode 100644 index 0000000000..44f9430146 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alert/summary/dao/AlertSummaryMapper.java @@ -0,0 +1,19 @@ +package com.dianping.cat.core.mybatis.generated.alert.summary.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.alert.summary.dao.data.AlertSummaryDO; + +public interface AlertSummaryMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + AlertSummaryDO findByPrimaryKey(@Param("id") Integer id); + + int insert(AlertSummaryDO record); + + List queryAll(); + + int updateByPrimaryKey(AlertSummaryDO record); +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alert/summary/dao/data/AlertSummaryDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alert/summary/dao/data/AlertSummaryDO.java new file mode 100644 index 0000000000..b4ca0601ee --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alert/summary/dao/data/AlertSummaryDO.java @@ -0,0 +1,20 @@ +package com.dianping.cat.core.mybatis.generated.alert.summary.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class AlertSummaryDO { + private Integer id; + + private String domain; + + private Date alertTime; + + private String content; + + private Date creationDate; + + private Integer keyId; +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alteration/dao/AlterationMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alteration/dao/AlterationMapper.java new file mode 100644 index 0000000000..32f788c75a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alteration/dao/AlterationMapper.java @@ -0,0 +1,27 @@ +package com.dianping.cat.core.mybatis.generated.alteration.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.alteration.dao.data.AlterationDO; + +public interface AlterationMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + AlterationDO findByPrimaryKey(@Param("id") Integer id); + + int insert(AlterationDO record); + + List queryAll(); + + int updateByPrimaryKey(AlterationDO record); + + List findByTypeDruation(@Param("record") AlterationDO record); + + List findByDtdh(@Param("record") AlterationDO record); + + List findByDtdhTypes(@Param("record") AlterationDO record); + + List findByDomainAndTime(@Param("record") AlterationDO record); +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alteration/dao/data/AlterationDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alteration/dao/data/AlterationDO.java new file mode 100644 index 0000000000..a86880357f --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alteration/dao/data/AlterationDO.java @@ -0,0 +1,42 @@ +package com.dianping.cat.core.mybatis.generated.alteration.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class AlterationDO { + private Integer id; + + private String type; + + private String title; + + private String domain; + + private String hostname; + + private String ip; + + private Date date; + + private String user; + + private String altGroup; + + private String content; + + private String url; + + private Integer status; + + private Date creationDate; + + private Integer keyId; + + private Date startTime; + + private Date endTime; + + private String[] types; +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/baseline/dao/BaselineMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/baseline/dao/BaselineMapper.java new file mode 100644 index 0000000000..964d205fdd --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/baseline/dao/BaselineMapper.java @@ -0,0 +1,21 @@ +package com.dianping.cat.core.mybatis.generated.baseline.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.baseline.dao.data.BaselineDO; + +public interface BaselineMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + BaselineDO findByPrimaryKey(@Param("id") Integer id); + + int insert(BaselineDO record); + + List queryAll(); + + int updateByPrimaryKey(BaselineDO record); + + List findByReportNameKeyTime(@Param("record") BaselineDO record); +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/baseline/dao/data/BaselineDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/baseline/dao/data/BaselineDO.java new file mode 100644 index 0000000000..b0b2d00e88 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/baseline/dao/data/BaselineDO.java @@ -0,0 +1,24 @@ +package com.dianping.cat.core.mybatis.generated.baseline.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class BaselineDO { + private Integer id; + + private String reportName; + + private String indexKey; + + private Date reportPeriod; + + private byte[] data; + + private Date creationDate; + + private Integer keyId; + + private double[] dataInDoubleArray; +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/config/modification/dao/ConfigModificationMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/config/modification/dao/ConfigModificationMapper.java new file mode 100644 index 0000000000..19ae2f9937 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/config/modification/dao/ConfigModificationMapper.java @@ -0,0 +1,19 @@ +package com.dianping.cat.core.mybatis.generated.config.modification.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.config.modification.dao.data.ConfigModificationDO; + +public interface ConfigModificationMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + ConfigModificationDO findByPrimaryKey(@Param("id") Integer id); + + int insert(ConfigModificationDO record); + + List queryAll(); + + int updateByPrimaryKey(ConfigModificationDO record); +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/config/modification/dao/data/ConfigModificationDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/config/modification/dao/data/ConfigModificationDO.java new file mode 100644 index 0000000000..bcd5534fe4 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/config/modification/dao/data/ConfigModificationDO.java @@ -0,0 +1,24 @@ +package com.dianping.cat.core.mybatis.generated.config.modification.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class ConfigModificationDO { + private Integer id; + + private String userName; + + private String accountName; + + private String actionName; + + private String argument; + + private Date date; + + private Date creationDate; + + private Integer keyId; +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/graph/dao/MetricGraphMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/graph/dao/MetricGraphMapper.java new file mode 100644 index 0000000000..33c4aeafb9 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/graph/dao/MetricGraphMapper.java @@ -0,0 +1,25 @@ +package com.dianping.cat.core.mybatis.generated.metric.graph.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.metric.graph.dao.data.MetricGraphDO; + +public interface MetricGraphMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + MetricGraphDO findByPrimaryKey(@Param("id") Integer id); + + int insert(MetricGraphDO record); + + List queryAll(); + + int updateByPrimaryKey(MetricGraphDO record); + + List findByGrapId(@Param("record") MetricGraphDO record); + + List findLast(@Param("record") MetricGraphDO record); + + int deleteBeforeDate(@Param("record") MetricGraphDO record); +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/graph/dao/data/MetricGraphDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/graph/dao/data/MetricGraphDO.java new file mode 100644 index 0000000000..e43e3d728b --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/graph/dao/data/MetricGraphDO.java @@ -0,0 +1,24 @@ +package com.dianping.cat.core.mybatis.generated.metric.graph.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class MetricGraphDO { + private Integer id; + + private Long graphId; + + private String name; + + private String content; + + private Date creationDate; + + private Date updatetime; + + private Integer keyId; + + private Integer number; +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/screen/dao/MetricScreenMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/screen/dao/MetricScreenMapper.java new file mode 100644 index 0000000000..461a4529c3 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/screen/dao/MetricScreenMapper.java @@ -0,0 +1,31 @@ +package com.dianping.cat.core.mybatis.generated.metric.screen.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.metric.screen.dao.data.MetricScreenDO; + +public interface MetricScreenMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + MetricScreenDO findByPrimaryKey(@Param("id") Integer id); + + int insert(MetricScreenDO record); + + List queryAll(); + + int updateByPrimaryKey(MetricScreenDO record); + + List findAll(@Param("record") MetricScreenDO record); + + List findByNameGraph(@Param("record") MetricScreenDO record); + + List findByName(@Param("record") MetricScreenDO record); + + int insertOrUpdateByNameGraph(@Param("record") MetricScreenDO record); + + int deleteByName(@Param("record") MetricScreenDO record); + + int deleteByNameGraph(@Param("record") MetricScreenDO record); +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/screen/dao/data/MetricScreenDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/screen/dao/data/MetricScreenDO.java new file mode 100644 index 0000000000..a4c9e77038 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/screen/dao/data/MetricScreenDO.java @@ -0,0 +1,28 @@ +package com.dianping.cat.core.mybatis.generated.metric.screen.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class MetricScreenDO { + private Integer id; + + private String name; + + private String graphName; + + private String view; + + private String endPoints; + + private String measurements; + + private String content; + + private Date creationDate; + + private Date updatetime; + + private Integer keyId; +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/overload/dao/OverloadMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/overload/dao/OverloadMapper.java new file mode 100644 index 0000000000..c925b28bdc --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/overload/dao/OverloadMapper.java @@ -0,0 +1,25 @@ +package com.dianping.cat.core.mybatis.generated.overload.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.overload.dao.data.OverloadDO; + +public interface OverloadMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + OverloadDO findByPrimaryKey(@Param("id") Integer id); + + int insert(OverloadDO record); + + List queryAll(); + + int updateByPrimaryKey(OverloadDO record); + + List findMaxIdByType(@Param("record") OverloadDO record); + + List findCount(@Param("record") OverloadDO record); + + List findIdAndSizeByDuration(@Param("record") OverloadDO record); +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/overload/dao/data/OverloadDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/overload/dao/data/OverloadDO.java new file mode 100644 index 0000000000..a6e506f75d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/overload/dao/data/OverloadDO.java @@ -0,0 +1,32 @@ +package com.dianping.cat.core.mybatis.generated.overload.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class OverloadDO { + private Integer id; + + private Integer reportId; + + private Integer reportType; + + private Double reportSize; + + private Date period; + + private Date creationDate; + + private Integer maxId; + + private Integer count; + + private Integer keyId; + + private Date startTime; + + private Date endTime; + + private Integer type; +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/topologygraph/dao/TopologyGraphMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/topologygraph/dao/TopologyGraphMapper.java new file mode 100644 index 0000000000..7a9fd0f3fa --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/topologygraph/dao/TopologyGraphMapper.java @@ -0,0 +1,21 @@ +package com.dianping.cat.core.mybatis.generated.topologygraph.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.dianping.cat.core.mybatis.generated.topologygraph.dao.data.TopologyGraphDO; + +public interface TopologyGraphMapper { + int deleteByPrimaryKey(@Param("id") Integer id); + + TopologyGraphDO findByPrimaryKey(@Param("id") Integer id); + + int insert(TopologyGraphDO record); + + List queryAll(); + + int updateByPrimaryKey(TopologyGraphDO record); + + List findByPeriod(@Param("record") TopologyGraphDO record); +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/topologygraph/dao/data/TopologyGraphDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/topologygraph/dao/data/TopologyGraphDO.java new file mode 100644 index 0000000000..b8a73933a6 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/topologygraph/dao/data/TopologyGraphDO.java @@ -0,0 +1,22 @@ +package com.dianping.cat.core.mybatis.generated.topologygraph.dao.data; + +import java.util.Date; + +import lombok.Data; + +@Data +public class TopologyGraphDO { + private Integer id; + + private String ip; + + private Date period; + + private Integer type; + + private byte[] content; + + private Date creationDate; + + private Integer keyId; +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java new file mode 100644 index 0000000000..1c1d609da8 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java @@ -0,0 +1,122 @@ +package com.dianping.cat.core.mybatis.repository.alert.summary; + +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.alert.summary.dao.AlertSummaryMapper; +import com.dianping.cat.core.mybatis.generated.alert.summary.dao.data.AlertSummaryDO; +import com.dianping.cat.home.dal.report.AlertSummary; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class AlertSummaryRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/AlertSummaryMapper.xml"; + + @Override + protected Class getMapperClass() { + return AlertSummaryMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public AlertSummary createLocal() { + return new AlertSummary(); + } + + public int deleteByPK(AlertSummary proto) throws DalException { + try (SqlSession session = openSession()) { + AlertSummaryMapper mapper = session.getMapper(AlertSummaryMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for AlertSummary.", e); + } + } + + public AlertSummary findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + AlertSummaryMapper mapper = session.getMapper(AlertSummaryMapper.class); + AlertSummaryDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for AlertSummary.", e); + } + } + + public int insert(AlertSummary proto) throws DalException { + try (SqlSession session = openSession()) { + AlertSummaryMapper mapper = session.getMapper(AlertSummaryMapper.class); + AlertSummaryDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for AlertSummary.", e); + } + } + + public int updateByPK(AlertSummary proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + AlertSummaryMapper mapper = session.getMapper(AlertSummaryMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for AlertSummary.", e); + } + } + + private AlertSummary requireFound(AlertSummaryDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No AlertSummary found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private AlertSummary toModel(AlertSummaryDO record) { + AlertSummary model = new AlertSummary(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getDomain() != null) { + model.setDomain(record.getDomain()); + } + if (record.getAlertTime() != null) { + model.setAlertTime(record.getAlertTime()); + } + if (record.getContent() != null) { + model.setContent(record.getContent()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + model.afterLoad(); + return model; + } + + private AlertSummaryDO toRecord(AlertSummary model) { + AlertSummaryDO record = new AlertSummaryDO(); + + record.setId(model.getId()); + record.setDomain(model.getDomain()); + record.setAlertTime(model.getAlertTime()); + record.setContent(model.getContent()); + record.setCreationDate(model.getCreationDate()); + record.setKeyId(model.getKeyId()); + return record; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java new file mode 100644 index 0000000000..f5b2e4bb92 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java @@ -0,0 +1,214 @@ +package com.dianping.cat.core.mybatis.repository.alteration; + +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.alteration.dao.AlterationMapper; +import com.dianping.cat.core.mybatis.generated.alteration.dao.data.AlterationDO; +import com.dianping.cat.home.dal.report.Alteration; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class AlterationRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/AlterationMapper.xml"; + + @Override + protected Class getMapperClass() { + return AlterationMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public Alteration createLocal() { + return new Alteration(); + } + + public int deleteByPK(Alteration proto) throws DalException { + try (SqlSession session = openSession()) { + AlterationMapper mapper = session.getMapper(AlterationMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for Alteration.", e); + } + } + + public List findByTypeDruation(java.util.Date startTime, java.util.Date endTime, String type, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + AlterationMapper mapper = session.getMapper(AlterationMapper.class); + AlterationDO record = new AlterationDO(); + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setType(type); + return mapper.findByTypeDruation(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findByTypeDruation for Alteration.", e); + } + } + + public List findByDtdh(java.util.Date startTime, java.util.Date endTime, String type, String domain, String hostname, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + AlterationMapper mapper = session.getMapper(AlterationMapper.class); + AlterationDO record = new AlterationDO(); + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setType(type); + record.setDomain(domain); + record.setHostname(hostname); + return mapper.findByDtdh(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findByDtdh for Alteration.", e); + } + } + + public List findByDtdhTypes(java.util.Date startTime, java.util.Date endTime, String type, String domain, String hostname, String[] types, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + AlterationMapper mapper = session.getMapper(AlterationMapper.class); + AlterationDO record = new AlterationDO(); + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setType(type); + record.setDomain(domain); + record.setHostname(hostname); + record.setTypes(types); + return mapper.findByDtdhTypes(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findByDtdhTypes for Alteration.", e); + } + } + + public List findByDomainAndTime(java.util.Date startTime, java.util.Date endTime, String domain, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + AlterationMapper mapper = session.getMapper(AlterationMapper.class); + AlterationDO record = new AlterationDO(); + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setDomain(domain); + return mapper.findByDomainAndTime(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findByDomainAndTime for Alteration.", e); + } + } + + public Alteration findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + AlterationMapper mapper = session.getMapper(AlterationMapper.class); + AlterationDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for Alteration.", e); + } + } + + public int insert(Alteration proto) throws DalException { + try (SqlSession session = openSession()) { + AlterationMapper mapper = session.getMapper(AlterationMapper.class); + AlterationDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for Alteration.", e); + } + } + + public int updateByPK(Alteration proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + AlterationMapper mapper = session.getMapper(AlterationMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for Alteration.", e); + } + } + + private Alteration requireFound(AlterationDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No Alteration found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private Alteration toModel(AlterationDO record) { + Alteration model = new Alteration(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getType() != null) { + model.setType(record.getType()); + } + if (record.getTitle() != null) { + model.setTitle(record.getTitle()); + } + if (record.getDomain() != null) { + model.setDomain(record.getDomain()); + } + if (record.getHostname() != null) { + model.setHostname(record.getHostname()); + } + if (record.getIp() != null) { + model.setIp(record.getIp()); + } + if (record.getDate() != null) { + model.setDate(record.getDate()); + } + if (record.getUser() != null) { + model.setUser(record.getUser()); + } + if (record.getAltGroup() != null) { + model.setAltGroup(record.getAltGroup()); + } + if (record.getContent() != null) { + model.setContent(record.getContent()); + } + if (record.getUrl() != null) { + model.setUrl(record.getUrl()); + } + if (record.getStatus() != null) { + model.setStatus(record.getStatus()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + model.afterLoad(); + return model; + } + + private AlterationDO toRecord(Alteration model) { + AlterationDO record = new AlterationDO(); + + record.setId(model.getId()); + record.setType(model.getType()); + record.setTitle(model.getTitle()); + record.setDomain(model.getDomain()); + record.setHostname(model.getHostname()); + record.setIp(model.getIp()); + record.setDate(model.getDate()); + record.setUser(model.getUser()); + record.setAltGroup(model.getAltGroup()); + record.setContent(model.getContent()); + record.setUrl(model.getUrl()); + record.setStatus(model.getStatus()); + record.setCreationDate(model.getCreationDate()); + record.setKeyId(model.getKeyId()); + record.setStartTime(model.getStartTime()); + record.setEndTime(model.getEndTime()); + record.setTypes(model.getTypes()); + return record; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java new file mode 100644 index 0000000000..09af6f8218 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java @@ -0,0 +1,143 @@ +package com.dianping.cat.core.mybatis.repository.baseline; + +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.baseline.dao.BaselineMapper; +import com.dianping.cat.core.mybatis.generated.baseline.dao.data.BaselineDO; +import com.dianping.cat.home.dal.report.Baseline; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class BaselineRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/BaselineMapper.xml"; + + @Override + protected Class getMapperClass() { + return BaselineMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public Baseline createLocal() { + return new Baseline(); + } + + public int deleteByPK(Baseline proto) throws DalException { + try (SqlSession session = openSession()) { + BaselineMapper mapper = session.getMapper(BaselineMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for Baseline.", e); + } + } + + public Baseline findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + BaselineMapper mapper = session.getMapper(BaselineMapper.class); + BaselineDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for Baseline.", e); + } + } + + public Baseline findByReportNameKeyTime(java.util.Date reportPeriod, String reportName, String indexKey, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + BaselineMapper mapper = session.getMapper(BaselineMapper.class); + BaselineDO record = new BaselineDO(); + record.setReportPeriod(reportPeriod); + record.setReportName(reportName); + record.setIndexKey(indexKey); + BaselineDO result = mapper.findByReportNameKeyTime(record).stream().findFirst().orElse(null); + return requireFound(result, "findByReportNameKeyTime", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByReportNameKeyTime for Baseline.", e); + } + } + + public int insert(Baseline proto) throws DalException { + try (SqlSession session = openSession()) { + BaselineMapper mapper = session.getMapper(BaselineMapper.class); + BaselineDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for Baseline.", e); + } + } + + public int updateByPK(Baseline proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + BaselineMapper mapper = session.getMapper(BaselineMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for Baseline.", e); + } + } + + private Baseline requireFound(BaselineDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No Baseline found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private Baseline toModel(BaselineDO record) { + Baseline model = new Baseline(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getReportName() != null) { + model.setReportName(record.getReportName()); + } + if (record.getIndexKey() != null) { + model.setIndexKey(record.getIndexKey()); + } + if (record.getReportPeriod() != null) { + model.setReportPeriod(record.getReportPeriod()); + } + if (record.getData() != null) { + model.setData(record.getData()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + model.afterLoad(); + return model; + } + + private BaselineDO toRecord(Baseline model) { + BaselineDO record = new BaselineDO(); + + record.setId(model.getId()); + record.setReportName(model.getReportName()); + record.setIndexKey(model.getIndexKey()); + record.setReportPeriod(model.getReportPeriod()); + record.setData(model.getData()); + record.setCreationDate(model.getCreationDate()); + record.setKeyId(model.getKeyId()); + record.setDataInDoubleArray(model.getDataInDoubleArray()); + return record; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java new file mode 100644 index 0000000000..7d2b96b31d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java @@ -0,0 +1,130 @@ +package com.dianping.cat.core.mybatis.repository.config.modification; + +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.config.modification.dao.ConfigModificationMapper; +import com.dianping.cat.core.mybatis.generated.config.modification.dao.data.ConfigModificationDO; +import com.dianping.cat.home.dal.report.ConfigModification; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class ConfigModificationRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/ConfigModificationMapper.xml"; + + @Override + protected Class getMapperClass() { + return ConfigModificationMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public ConfigModification createLocal() { + return new ConfigModification(); + } + + public int deleteByPK(ConfigModification proto) throws DalException { + try (SqlSession session = openSession()) { + ConfigModificationMapper mapper = session.getMapper(ConfigModificationMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for ConfigModification.", e); + } + } + + public ConfigModification findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + ConfigModificationMapper mapper = session.getMapper(ConfigModificationMapper.class); + ConfigModificationDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for ConfigModification.", e); + } + } + + public int insert(ConfigModification proto) throws DalException { + try (SqlSession session = openSession()) { + ConfigModificationMapper mapper = session.getMapper(ConfigModificationMapper.class); + ConfigModificationDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for ConfigModification.", e); + } + } + + public int updateByPK(ConfigModification proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + ConfigModificationMapper mapper = session.getMapper(ConfigModificationMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for ConfigModification.", e); + } + } + + private ConfigModification requireFound(ConfigModificationDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No ConfigModification found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private ConfigModification toModel(ConfigModificationDO record) { + ConfigModification model = new ConfigModification(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getUserName() != null) { + model.setUserName(record.getUserName()); + } + if (record.getAccountName() != null) { + model.setAccountName(record.getAccountName()); + } + if (record.getActionName() != null) { + model.setActionName(record.getActionName()); + } + if (record.getArgument() != null) { + model.setArgument(record.getArgument()); + } + if (record.getDate() != null) { + model.setDate(record.getDate()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + model.afterLoad(); + return model; + } + + private ConfigModificationDO toRecord(ConfigModification model) { + ConfigModificationDO record = new ConfigModificationDO(); + + record.setId(model.getId()); + record.setUserName(model.getUserName()); + record.setAccountName(model.getAccountName()); + record.setActionName(model.getActionName()); + record.setArgument(model.getArgument()); + record.setDate(model.getDate()); + record.setCreationDate(model.getCreationDate()); + record.setKeyId(model.getKeyId()); + return record; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java new file mode 100644 index 0000000000..fabb933256 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java @@ -0,0 +1,162 @@ +package com.dianping.cat.core.mybatis.repository.metric.graph; + +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.metric.graph.dao.MetricGraphMapper; +import com.dianping.cat.core.mybatis.generated.metric.graph.dao.data.MetricGraphDO; +import com.dianping.cat.home.dal.report.MetricGraph; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class MetricGraphRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/MetricGraphMapper.xml"; + + @Override + protected Class getMapperClass() { + return MetricGraphMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public MetricGraph createLocal() { + return new MetricGraph(); + } + + public int deleteByPK(MetricGraph proto) throws DalException { + try (SqlSession session = openSession()) { + MetricGraphMapper mapper = session.getMapper(MetricGraphMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for MetricGraph.", e); + } + } + + public int deleteBeforeDate(MetricGraph proto) throws DalException { + try (SqlSession session = openSession()) { + MetricGraphMapper mapper = session.getMapper(MetricGraphMapper.class); + int count = mapper.deleteBeforeDate(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteBeforeDate for MetricGraph.", e); + } + } + + public MetricGraph findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + MetricGraphMapper mapper = session.getMapper(MetricGraphMapper.class); + MetricGraphDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for MetricGraph.", e); + } + } + + public MetricGraph findByGrapId(long graphId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + MetricGraphMapper mapper = session.getMapper(MetricGraphMapper.class); + MetricGraphDO record = new MetricGraphDO(); + record.setGraphId(graphId); + MetricGraphDO result = mapper.findByGrapId(record).stream().findFirst().orElse(null); + return requireFound(result, "findByGrapId", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByGrapId for MetricGraph.", e); + } + } + + public MetricGraph findLast(int number, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + MetricGraphMapper mapper = session.getMapper(MetricGraphMapper.class); + MetricGraphDO record = new MetricGraphDO(); + record.setNumber(number); + MetricGraphDO result = mapper.findLast(record).stream().findFirst().orElse(null); + return requireFound(result, "findLast", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findLast for MetricGraph.", e); + } + } + + public int insert(MetricGraph proto) throws DalException { + try (SqlSession session = openSession()) { + MetricGraphMapper mapper = session.getMapper(MetricGraphMapper.class); + MetricGraphDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for MetricGraph.", e); + } + } + + public int updateByPK(MetricGraph proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + MetricGraphMapper mapper = session.getMapper(MetricGraphMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for MetricGraph.", e); + } + } + + private MetricGraph requireFound(MetricGraphDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No MetricGraph found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private MetricGraph toModel(MetricGraphDO record) { + MetricGraph model = new MetricGraph(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getGraphId() != null) { + model.setGraphId(record.getGraphId()); + } + if (record.getContent() != null) { + model.setContent(record.getContent()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + if (record.getUpdatetime() != null) { + model.setUpdatetime(record.getUpdatetime()); + } + model.afterLoad(); + return model; + } + + private MetricGraphDO toRecord(MetricGraph model) { + MetricGraphDO record = new MetricGraphDO(); + + record.setId(model.getId()); + record.setGraphId(model.getGraphId()); + record.setContent(model.getContent()); + record.setCreationDate(model.getCreationDate()); + record.setUpdatetime(model.getUpdatetime()); + record.setKeyId(model.getKeyId()); + record.setNumber(model.getNumber()); + return record; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java new file mode 100644 index 0000000000..ac54898a3a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java @@ -0,0 +1,207 @@ +package com.dianping.cat.core.mybatis.repository.metric.screen; + +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.metric.screen.dao.MetricScreenMapper; +import com.dianping.cat.core.mybatis.generated.metric.screen.dao.data.MetricScreenDO; +import com.dianping.cat.home.dal.report.MetricScreen; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class MetricScreenRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/MetricScreenMapper.xml"; + + @Override + protected Class getMapperClass() { + return MetricScreenMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public MetricScreen createLocal() { + return new MetricScreen(); + } + + public int deleteByPK(MetricScreen proto) throws DalException { + try (SqlSession session = openSession()) { + MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for MetricScreen.", e); + } + } + + public int deleteByName(MetricScreen proto) throws DalException { + try (SqlSession session = openSession()) { + MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); + int count = mapper.deleteByName(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByName for MetricScreen.", e); + } + } + + public int deleteByNameGraph(MetricScreen proto) throws DalException { + try (SqlSession session = openSession()) { + MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); + int count = mapper.deleteByNameGraph(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByNameGraph for MetricScreen.", e); + } + } + + public List findAll(Readset readset) throws DalException { + try (SqlSession session = openSession()) { + MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); + MetricScreenDO record = new MetricScreenDO(); + return mapper.findAll(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findAll for MetricScreen.", e); + } + } + + public List findByName(String name, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); + MetricScreenDO record = new MetricScreenDO(); + record.setName(name); + return mapper.findByName(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findByName for MetricScreen.", e); + } + } + + public MetricScreen findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); + MetricScreenDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for MetricScreen.", e); + } + } + + public MetricScreen findByNameGraph(String name, String graphName, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); + MetricScreenDO record = new MetricScreenDO(); + record.setName(name); + record.setGraphName(graphName); + MetricScreenDO result = mapper.findByNameGraph(record).stream().findFirst().orElse(null); + return requireFound(result, "findByNameGraph", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByNameGraph for MetricScreen.", e); + } + } + + public int insert(MetricScreen proto) throws DalException { + try (SqlSession session = openSession()) { + MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); + MetricScreenDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for MetricScreen.", e); + } + } + + public int insertOrUpdateByNameGraph(MetricScreen proto) throws DalException { + try (SqlSession session = openSession()) { + MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); + int count = mapper.insertOrUpdateByNameGraph(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insertOrUpdateByNameGraph for MetricScreen.", e); + } + } + + public int updateByPK(MetricScreen proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for MetricScreen.", e); + } + } + + private MetricScreen requireFound(MetricScreenDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No MetricScreen found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private MetricScreen toModel(MetricScreenDO record) { + MetricScreen model = new MetricScreen(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getName() != null) { + model.setName(record.getName()); + } + if (record.getGraphName() != null) { + model.setGraphName(record.getGraphName()); + } + if (record.getView() != null) { + model.setView(record.getView()); + } + if (record.getEndPoints() != null) { + model.setEndPoints(record.getEndPoints()); + } + if (record.getMeasurements() != null) { + model.setMeasurements(record.getMeasurements()); + } + if (record.getContent() != null) { + model.setContent(record.getContent()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + if (record.getUpdatetime() != null) { + model.setUpdatetime(record.getUpdatetime()); + } + model.afterLoad(); + return model; + } + + private MetricScreenDO toRecord(MetricScreen model) { + MetricScreenDO record = new MetricScreenDO(); + + record.setId(model.getId()); + record.setName(model.getName()); + record.setGraphName(model.getGraphName()); + record.setView(model.getView()); + record.setEndPoints(model.getEndPoints()); + record.setMeasurements(model.getMeasurements()); + record.setContent(model.getContent()); + record.setCreationDate(model.getCreationDate()); + record.setUpdatetime(model.getUpdatetime()); + record.setKeyId(model.getKeyId()); + return record; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java new file mode 100644 index 0000000000..7bee981870 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java @@ -0,0 +1,174 @@ +package com.dianping.cat.core.mybatis.repository.overload; + +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.overload.dao.OverloadMapper; +import com.dianping.cat.core.mybatis.generated.overload.dao.data.OverloadDO; +import com.dianping.cat.home.dal.report.Overload; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class OverloadRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/OverloadMapper.xml"; + + @Override + protected Class getMapperClass() { + return OverloadMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public Overload createLocal() { + return new Overload(); + } + + public int deleteByPK(Overload proto) throws DalException { + try (SqlSession session = openSession()) { + OverloadMapper mapper = session.getMapper(OverloadMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for Overload.", e); + } + } + + public List findIdAndSizeByDuration(java.util.Date startTime, java.util.Date endTime, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + OverloadMapper mapper = session.getMapper(OverloadMapper.class); + OverloadDO record = new OverloadDO(); + record.setStartTime(startTime); + record.setEndTime(endTime); + return mapper.findIdAndSizeByDuration(record).stream().map(this::toModel).collect(Collectors.toList()); + } catch (Exception e) { + throw new DalException("Error when executing findIdAndSizeByDuration for Overload.", e); + } + } + + public Overload findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + OverloadMapper mapper = session.getMapper(OverloadMapper.class); + OverloadDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for Overload.", e); + } + } + + public Overload findMaxIdByType(int type, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + OverloadMapper mapper = session.getMapper(OverloadMapper.class); + OverloadDO record = new OverloadDO(); + record.setType(type); + OverloadDO result = mapper.findMaxIdByType(record).stream().findFirst().orElse(null); + return requireFound(result, "findMaxIdByType", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findMaxIdByType for Overload.", e); + } + } + + public Overload findCount(Readset readset) throws DalException { + try (SqlSession session = openSession()) { + OverloadMapper mapper = session.getMapper(OverloadMapper.class); + OverloadDO record = new OverloadDO(); + OverloadDO result = mapper.findCount(record).stream().findFirst().orElse(null); + return requireFound(result, "findCount", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findCount for Overload.", e); + } + } + + public int insert(Overload proto) throws DalException { + try (SqlSession session = openSession()) { + OverloadMapper mapper = session.getMapper(OverloadMapper.class); + OverloadDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for Overload.", e); + } + } + + public int updateByPK(Overload proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + OverloadMapper mapper = session.getMapper(OverloadMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for Overload.", e); + } + } + + private Overload requireFound(OverloadDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No Overload found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private Overload toModel(OverloadDO record) { + Overload model = new Overload(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getReportId() != null) { + model.setReportId(record.getReportId()); + } + if (record.getReportType() != null) { + model.setReportType(record.getReportType()); + } + if (record.getReportSize() != null) { + model.setReportSize(record.getReportSize()); + } + if (record.getPeriod() != null) { + model.setPeriod(record.getPeriod()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + if (record.getMaxId() != null) { + model.setMaxId(record.getMaxId()); + } + if (record.getCount() != null) { + model.setCount(record.getCount()); + } + model.afterLoad(); + return model; + } + + private OverloadDO toRecord(Overload model) { + OverloadDO record = new OverloadDO(); + + record.setId(model.getId()); + record.setReportId(model.getReportId()); + record.setReportType(model.getReportType()); + record.setReportSize(model.getReportSize()); + record.setPeriod(model.getPeriod()); + record.setCreationDate(model.getCreationDate()); + record.setKeyId(model.getKeyId()); + record.setStartTime(model.getStartTime()); + record.setEndTime(model.getEndTime()); + record.setType(model.getType()); + return record; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java new file mode 100644 index 0000000000..c60e2ff062 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java @@ -0,0 +1,140 @@ +package com.dianping.cat.core.mybatis.repository.topologygraph; + +import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.generated.topologygraph.dao.TopologyGraphMapper; +import com.dianping.cat.core.mybatis.generated.topologygraph.dao.data.TopologyGraphDO; +import com.dianping.cat.home.dal.report.TopologyGraph; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.ibatis.session.SqlSession; +import org.unidal.dal.jdbc.DalException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.dal.jdbc.Readset; +import org.unidal.dal.jdbc.Updateset; + +public class TopologyGraphRepository extends MyBatisRepositorySupport { + private static final String MAPPER_RESOURCE = "mybatis/mapper/TopologyGraphMapper.xml"; + + @Override + protected Class getMapperClass() { + return TopologyGraphMapper.class; + } + + @Override + protected String getMapperResource() { + return MAPPER_RESOURCE; + } + + public TopologyGraph createLocal() { + return new TopologyGraph(); + } + + public int deleteByPK(TopologyGraph proto) throws DalException { + try (SqlSession session = openSession()) { + TopologyGraphMapper mapper = session.getMapper(TopologyGraphMapper.class); + int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing deleteByPK for TopologyGraph.", e); + } + } + + public TopologyGraph findByPK(int keyId, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + TopologyGraphMapper mapper = session.getMapper(TopologyGraphMapper.class); + TopologyGraphDO record = mapper.findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPK for TopologyGraph.", e); + } + } + + public TopologyGraph findByPeriod(java.util.Date period, Readset readset) throws DalException { + try (SqlSession session = openSession()) { + TopologyGraphMapper mapper = session.getMapper(TopologyGraphMapper.class); + TopologyGraphDO record = new TopologyGraphDO(); + record.setPeriod(period); + TopologyGraphDO result = mapper.findByPeriod(record).stream().findFirst().orElse(null); + return requireFound(result, "findByPeriod", record.toString()); + } catch (DalNotFoundException e) { + throw e; + } catch (Exception e) { + throw new DalException("Error when executing findByPeriod for TopologyGraph.", e); + } + } + + public int insert(TopologyGraph proto) throws DalException { + try (SqlSession session = openSession()) { + TopologyGraphMapper mapper = session.getMapper(TopologyGraphMapper.class); + TopologyGraphDO record = toRecord(proto); + int count = mapper.insert(record); + session.commit(); + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } catch (Exception e) { + throw new DalException("Error when executing insert for TopologyGraph.", e); + } + } + + public int updateByPK(TopologyGraph proto, Updateset updateset) throws DalException { + try (SqlSession session = openSession()) { + TopologyGraphMapper mapper = session.getMapper(TopologyGraphMapper.class); + int count = mapper.updateByPrimaryKey(toRecord(proto)); + session.commit(); + return count; + } catch (Exception e) { + throw new DalException("Error when executing updateByPK for TopologyGraph.", e); + } + } + + private TopologyGraph requireFound(TopologyGraphDO record, String field, String value) throws DalNotFoundException { + if (record == null) { + throw new DalNotFoundException("No TopologyGraph found by " + field + "(" + value + ")."); + } + + return toModel(record); + } + + private TopologyGraph toModel(TopologyGraphDO record) { + TopologyGraph model = new TopologyGraph(); + + if (record.getId() != null) { + model.setId(record.getId()); + } + if (record.getIp() != null) { + model.setIp(record.getIp()); + } + if (record.getPeriod() != null) { + model.setPeriod(record.getPeriod()); + } + if (record.getType() != null) { + model.setType(record.getType()); + } + if (record.getContent() != null) { + model.setContent(record.getContent()); + } + if (record.getCreationDate() != null) { + model.setCreationDate(record.getCreationDate()); + } + model.afterLoad(); + return model; + } + + private TopologyGraphDO toRecord(TopologyGraph model) { + TopologyGraphDO record = new TopologyGraphDO(); + + record.setId(model.getId()); + record.setIp(model.getIp()); + record.setPeriod(model.getPeriod()); + record.setType(model.getType()); + record.setContent(model.getContent()); + record.setCreationDate(model.getCreationDate()); + record.setKeyId(model.getKeyId()); + return record; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java index cccab61ee7..d73b168020 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java @@ -41,7 +41,7 @@ import com.dianping.cat.alarm.rule.transform.DefaultSaxParser; import com.dianping.cat.configuration.business.entity.BusinessItemConfig; import com.dianping.cat.core.config.BusinessConfig; -import com.dianping.cat.core.config.BusinessConfigDao; +import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; import com.dianping.cat.core.config.BusinessConfigEntity; import com.dianping.cat.helper.MetricType; import com.dianping.cat.task.TimerSyncTask; @@ -59,7 +59,7 @@ public class BusinessRuleConfigManager implements Initializable { Map m_rules = new ConcurrentHashMap(); @Inject - private BusinessConfigDao m_configDao; + private BusinessConfigRepository m_configDao; private List buildDefaultConfigs() { List configs = new ArrayList(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java index aa505728a7..df750873a5 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java @@ -23,14 +23,14 @@ import org.unidal.lookup.annotation.Named; import com.dianping.cat.alarm.UserDefineRule; -import com.dianping.cat.alarm.UserDefineRuleDao; +import com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository; import com.dianping.cat.alarm.UserDefineRuleEntity; @Named public class UserDefinedRuleManager { @Inject - private UserDefineRuleDao m_dao; + private UserDefineRuleRepository m_dao; public String addUserDefineText(String userDefinedText) throws DalException { UserDefineRule item = m_dao.findMaxId(UserDefineRuleEntity.READSET_MAXID); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java index 437220099a..d17184b183 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java @@ -24,13 +24,13 @@ import com.dianping.cat.Cat; import com.dianping.cat.home.dal.report.AlertSummary; -import com.dianping.cat.home.dal.report.AlertSummaryDao; +import com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository; @Named public class AlertSummaryService { @Inject - private AlertSummaryDao m_alertSummaryDao; + private AlertSummaryRepository m_alertSummaryDao; public void insert(com.dianping.cat.home.alert.summary.entity.AlertSummary alertSummary) { AlertSummary summary = new AlertSummary(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java index 097a706ca9..fc07986d55 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java @@ -32,7 +32,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.alarm.Alert; -import com.dianping.cat.alarm.AlertDao; +import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; import com.dianping.cat.alarm.AlertEntity; import com.dianping.cat.alarm.spi.AlertType; import com.dianping.cat.home.alert.summary.entity.AlertSummary; @@ -50,7 +50,7 @@ public class AlertInfoBuilder { public static final String PREFIX = "dependency_"; @Inject - private AlertDao m_alertDao; + private AlertRepository m_alertDao; @Inject private TopologyGraphManager m_topologyManager; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java index 4bb64fa1fc..ab33d31b33 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java @@ -29,7 +29,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.home.dal.report.Alteration; -import com.dianping.cat.home.dal.report.AlterationDao; +import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; import com.dianping.cat.home.dal.report.AlterationEntity; import com.dianping.cat.report.alert.summary.AlertSummaryExecutor; @@ -39,7 +39,7 @@ public class AlterationSummaryBuilder extends SummaryBuilder { public static final String ID = "AlterationSummaryContentGenerator"; @Inject - private AlterationDao m_alterationDao; + private AlterationRepository m_alterationDao; @Override public Map generateModel(String domain, Date date) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java index 721382faf4..eb9e3ca898 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java @@ -42,7 +42,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.alarm.Alert; -import com.dianping.cat.alarm.AlertDao; +import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; import com.dianping.cat.alarm.AlertEntity; import com.dianping.cat.alarm.spi.AlertChannel; import com.dianping.cat.alarm.spi.sender.SendMessageEntity; @@ -57,7 +57,7 @@ public class Handler implements PageHandler { private SenderManager m_senderManager; @Inject - private AlertDao m_alertDao; + private AlertRepository m_alertDao; private Alert buildAlertEntity(Payload payload) { Alert alertEntity = new Alert(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java index 1e7189e774..ae731ac00b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java @@ -44,7 +44,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.consumer.storage.builder.StorageSQLBuilder; import com.dianping.cat.home.dal.report.Alteration; -import com.dianping.cat.home.dal.report.AlterationDao; +import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; import com.dianping.cat.home.dal.report.AlterationEntity; import com.dianping.cat.report.ReportPage; @@ -56,7 +56,7 @@ public class Handler implements PageHandler { private JspViewer m_jspViewer; @Inject - private AlterationDao m_alterationDao; + private AlterationRepository m_alterationDao; private SimpleDateFormat m_sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java index 7287a33475..81b3213531 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java @@ -43,7 +43,7 @@ import com.dianping.cat.consumer.dependency.DependencyAnalyzer; import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; import com.dianping.cat.helper.TimeHelper; -import com.dianping.cat.home.dal.report.TopologyGraphDao; +import com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository; import com.dianping.cat.home.dal.report.TopologyGraphEntity; import com.dianping.cat.home.dependency.format.entity.Domain; import com.dianping.cat.home.dependency.format.entity.ProductLine; @@ -81,7 +81,7 @@ public class TopologyGraphManager implements Initializable, LogEnabled { private ProjectService m_projectService; @Inject - private TopologyGraphDao m_topologyGraphDao; + private TopologyGraphRepository m_topologyGraphDao; private TopologyGraphBuilder m_currentBuilder; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java index 91f8dd2b33..9656936fb4 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java @@ -31,7 +31,7 @@ import com.dianping.cat.consumer.dependency.DependencyAnalyzer; import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; import com.dianping.cat.helper.TimeHelper; -import com.dianping.cat.home.dal.report.TopologyGraphDao; +import com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository; import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; import com.dianping.cat.home.dependency.graph.transform.DefaultNativeBuilder; import com.dianping.cat.report.page.dependency.graph.TopologyGraphBuilder; @@ -50,7 +50,7 @@ public class DependencyReportBuilder implements TaskBuilder { private TopologyGraphBuilder m_graphBuilder; @Inject - private TopologyGraphDao m_topologyGraphDao; + private TopologyGraphRepository m_topologyGraphDao; @Override public boolean buildDailyTask(String name, String reportDomain, Date reportPeriod) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java b/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java index 3f4d27bfc1..deb55e29ed 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java @@ -35,7 +35,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.dal.report.Baseline; -import com.dianping.cat.home.dal.report.BaselineDao; +import com.dianping.cat.core.mybatis.repository.baseline.BaselineRepository; import com.dianping.cat.home.dal.report.BaselineEntity; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.task.TaskHelper; @@ -44,7 +44,7 @@ public class DefaultBaselineService implements BaselineService { @Inject - private BaselineDao m_baselineDao; + private BaselineRepository m_baselineDao; private Map m_baselines = new LinkedHashMap() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java index de5c2a8b8c..1791102b79 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java @@ -28,7 +28,7 @@ import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; -import com.dianping.cat.home.dal.report.OverloadDao; +import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; import com.dianping.cat.home.dal.report.OverloadEntity; @Named @@ -40,7 +40,7 @@ public class CapacityUpdateStatusManager implements Initializable { private ConfigRepository m_configDao; @Inject - private OverloadDao m_overloadDao; + private OverloadRepository m_overloadDao; private int m_hourlyStatus; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java index 14e6d057a2..283b380341 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java @@ -28,12 +28,12 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentDao; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportDao; import com.dianping.cat.core.dal.DailyReportEntity; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.home.dal.report.Overload; -import com.dianping.cat.home.dal.report.OverloadDao; +import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; @Named(type = CapacityUpdater.class, value = DailyCapacityUpdater.ID) public class DailyCapacityUpdater implements CapacityUpdater { @@ -41,13 +41,13 @@ public class DailyCapacityUpdater implements CapacityUpdater { public static final String ID = "daily_capacity_updater"; @Inject - private DailyReportContentDao m_dailyReportContentDao; + private DailyReportContentRepository m_dailyReportContentDao; @Inject - private DailyReportDao m_dailyReportDao; + private DailyReportRepository m_dailyReportDao; @Inject - private OverloadDao m_overloadDao; + private OverloadRepository m_overloadDao; @Inject private CapacityUpdateStatusManager m_manager; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java index 016c2583e1..30fae24a58 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java @@ -28,12 +28,12 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentDao; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportDao; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.home.dal.report.Overload; -import com.dianping.cat.home.dal.report.OverloadDao; +import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; @Named(type = CapacityUpdater.class, value = HourlyCapacityUpdater.ID) public class HourlyCapacityUpdater implements CapacityUpdater { @@ -41,13 +41,13 @@ public class HourlyCapacityUpdater implements CapacityUpdater { public static final String ID = "hourly_capacity_updater"; @Inject - private HourlyReportContentDao m_hourlyReportContentDao; + private HourlyReportContentRepository m_hourlyReportContentDao; @Inject - private HourlyReportDao m_hourlyReportDao; + private HourlyReportRepository m_hourlyReportDao; @Inject - private OverloadDao m_overloadDao; + private OverloadRepository m_overloadDao; @Inject private CapacityUpdateStatusManager m_manager; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java index 5d310e0353..835a9f657d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java @@ -28,12 +28,12 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.dal.MonthlyReportContentDao; +import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; import com.dianping.cat.core.dal.MonthlyReportContentEntity; -import com.dianping.cat.core.dal.MonthlyReportDao; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.home.dal.report.Overload; -import com.dianping.cat.home.dal.report.OverloadDao; +import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; @Named(type = CapacityUpdater.class, value = MonthlyCapacityUpdater.ID) public class MonthlyCapacityUpdater implements CapacityUpdater { @@ -41,13 +41,13 @@ public class MonthlyCapacityUpdater implements CapacityUpdater { public static final String ID = "monthly_capacity_updater"; @Inject - private MonthlyReportDao m_monthlyReportDao; + private MonthlyReportRepository m_monthlyReportDao; @Inject - private MonthlyReportContentDao m_monthlyReportContentDao; + private MonthlyReportContentRepository m_monthlyReportContentDao; @Inject - private OverloadDao m_overloadDao; + private OverloadRepository m_overloadDao; @Inject private CapacityUpdateStatusManager m_manager; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java index 6ccf53b41b..ebeb92f74f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java @@ -30,38 +30,38 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; -import com.dianping.cat.core.dal.DailyReportDao; import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.dal.HourlyReport; -import com.dianping.cat.core.dal.HourlyReportDao; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.core.dal.MonthlyReport; -import com.dianping.cat.core.dal.MonthlyReportDao; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.core.dal.WeeklyReport; -import com.dianping.cat.core.dal.WeeklyReportDao; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; import com.dianping.cat.core.dal.WeeklyReportEntity; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.home.dal.report.Overload; -import com.dianping.cat.home.dal.report.OverloadDao; +import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; import com.dianping.cat.home.dal.report.OverloadEntity; @Named public class TableCapacityService extends ContainerHolder { @Inject - private OverloadDao m_overloadDao; + private OverloadRepository m_overloadDao; @Inject - private HourlyReportDao m_hourlyReportDao; + private HourlyReportRepository m_hourlyReportDao; @Inject - private DailyReportDao m_dailyReportDao; + private DailyReportRepository m_dailyReportDao; @Inject - private WeeklyReportDao m_weeklyReportDao; + private WeeklyReportRepository m_weeklyReportDao; @Inject - private MonthlyReportDao m_monthlyReportDao; + private MonthlyReportRepository m_monthlyReportDao; private OverloadReport generateOverloadReport(Object object, double reportSize, int reportType) { OverloadReport overloadReport = new OverloadReport(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java index 9c900073c4..6dd30539e8 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java @@ -28,12 +28,12 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.dal.WeeklyReportContentDao; +import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; import com.dianping.cat.core.dal.WeeklyReportContentEntity; -import com.dianping.cat.core.dal.WeeklyReportDao; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.home.dal.report.Overload; -import com.dianping.cat.home.dal.report.OverloadDao; +import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; @Named(type = CapacityUpdater.class, value = WeeklyCapacityUpdater.ID) public class WeeklyCapacityUpdater implements CapacityUpdater { @@ -41,13 +41,13 @@ public class WeeklyCapacityUpdater implements CapacityUpdater { public static final String ID = "weekly_capacity_updater"; @Inject - private WeeklyReportDao m_weeklyReportDao; + private WeeklyReportRepository m_weeklyReportDao; @Inject - private WeeklyReportContentDao m_weeklyReportContentDao; + private WeeklyReportContentRepository m_weeklyReportContentDao; @Inject - private OverloadDao m_overloadDao; + private OverloadRepository m_overloadDao; @Inject private CapacityUpdateStatusManager m_manager; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java index b6b8e213ff..7a2b514196 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java @@ -52,7 +52,7 @@ import com.dianping.cat.helper.SortHelper; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.dal.report.Alteration; -import com.dianping.cat.home.dal.report.AlterationDao; +import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; import com.dianping.cat.home.dal.report.AlterationEntity; import com.dianping.cat.home.storage.alert.entity.Storage; import com.dianping.cat.home.storage.alert.entity.StorageAlertInfo; @@ -95,7 +95,7 @@ public class Handler implements PageHandler { private JsonBuilder m_jsonBuilder; @Inject - private AlterationDao m_alterationDao; + private AlterationRepository m_alterationDao; @Inject private AlertService m_alertService; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java index 4e8cbf59b6..16de4ebd7b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java @@ -31,7 +31,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.core.dal.Task; -import com.dianping.cat.core.dal.TaskDao; +import com.dianping.cat.core.mybatis.repository.task.TaskRepository; import com.dianping.cat.core.dal.TaskEntity; import com.dianping.cat.message.Transaction; @@ -42,7 +42,7 @@ public class DefaultTaskConsumer extends TaskConsumer { private ReportFacade m_reportFacade; @Inject - private TaskDao m_taskDao; + private TaskRepository m_taskDao; @Override protected Task findDoingTask(String ip) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java index aaf62a34ac..bb269eadd1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java @@ -27,16 +27,16 @@ import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentDao; -import com.dianping.cat.core.dal.HourlyReportDao; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; public abstract class AbstractReportReloader implements ReportReloader { @Inject - protected HourlyReportDao m_hourlyReportDao; + protected HourlyReportRepository m_hourlyReportDao; @Inject - protected HourlyReportContentDao m_hourlyReportContentDao; + protected HourlyReportContentRepository m_hourlyReportContentDao; @Inject protected ServerConfigManager m_serverConfigManager; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java index 05e688289a..ea0f07dc5d 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java @@ -32,7 +32,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.Constants; import com.dianping.cat.core.config.BusinessConfig; -import com.dianping.cat.core.config.BusinessConfigDao; +import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; import com.dianping.cat.core.config.BusinessConfigEntity; import com.dianping.cat.home.business.entity.BusinessItem; import com.dianping.cat.home.business.entity.BusinessTagConfig; @@ -44,7 +44,7 @@ public class BusinessTagConfigManager implements Initializable { public final static String TAG_CONFIG = "tag"; @Inject - private BusinessConfigDao m_configDao; + private BusinessConfigRepository m_configDao; private int m_configId; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java index 9a38a62fd3..d931152785 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java @@ -34,7 +34,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.home.dal.report.ConfigModification; -import com.dianping.cat.home.dal.report.ConfigModificationDao; +import com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository; import com.dianping.cat.system.SystemPage; import com.dianping.cat.system.page.config.processor.AlertConfigProcessor; import com.dianping.cat.system.page.config.processor.DependencyConfigProcessor; @@ -74,7 +74,7 @@ public class Handler implements PageHandler { private StorageConfigProcessor m_storageConfigProcessor; @Inject - private ConfigModificationDao m_configModificationDao; + private ConfigModificationRepository m_configModificationDao; @Override @PreInboundActionMeta("login") diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java index bacf5db430..7721affa7c 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java @@ -38,8 +38,8 @@ import com.dianping.cat.consumer.state.model.entity.ProcessDomain; import com.dianping.cat.consumer.state.model.entity.StateReport; import com.dianping.cat.core.dal.DailyReport; -import com.dianping.cat.core.dal.DailyReportDao; import com.dianping.cat.core.dal.DailyReportEntity; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.helper.SortHelper; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.router.entity.DefaultServer; @@ -69,7 +69,7 @@ public class RouterConfigAdjustor { private ServerConfigManager m_serverConfigManager; @Inject - private DailyReportDao m_dailyReportDao; + private DailyReportRepository m_dailyReportDao; public void Adjust(Date period) { Date end = new Date(period.getTime() + TimeHelper.ONE_HOUR); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java index f36ffe55a6..8139b1d43d 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java @@ -36,7 +36,7 @@ import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.consumer.state.model.entity.StateReport; import com.dianping.cat.core.dal.DailyReport; -import com.dianping.cat.core.dal.DailyReportDao; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.router.entity.Domain; import com.dianping.cat.home.router.entity.Group; @@ -66,7 +66,7 @@ public class RouterConfigHandler implements LogEnabled { private RouterConfigService m_reportService; @Inject - private DailyReportDao m_dailyReportDao; + private DailyReportRepository m_dailyReportDao; private void addServerList(List servers, Server server) { for (Server s : servers) { diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java index 7a19f2d2b3..9d020f8513 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java @@ -25,6 +25,8 @@ import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.core.dal.*; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.router.entity.*; import com.dianping.cat.home.router.transform.DefaultNativeParser; @@ -63,10 +65,10 @@ public class RouterConfigManager implements Initializable, LogEnabled { private ContentFetcher m_fetcher; @Inject - private DailyReportDao m_dailyReportDao; + private DailyReportRepository m_dailyReportDao; @Inject - private DailyReportContentDao m_dailyReportContentDao; + private DailyReportContentRepository m_dailyReportContentDao; private int m_configId; diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 4e882b6152..b7525d3c41 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -68,7 +68,7 @@ com.dianping.cat.report.task.ReportFacade - com.dianping.cat.core.dal.TaskDao + com.dianping.cat.core.mybatis.repository.task.TaskRepository @@ -103,10 +103,10 @@ business - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.config.server.ServerConfigManager @@ -123,10 +123,10 @@ cross - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.config.server.ServerConfigManager @@ -143,10 +143,10 @@ dependency - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.config.server.ServerConfigManager @@ -163,10 +163,10 @@ event - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.config.server.ServerConfigManager @@ -183,10 +183,10 @@ heartbeat - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.config.server.ServerConfigManager @@ -203,10 +203,10 @@ matrix - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.config.server.ServerConfigManager @@ -223,10 +223,10 @@ problem - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.config.server.ServerConfigManager @@ -243,10 +243,10 @@ state - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.config.server.ServerConfigManager @@ -263,10 +263,10 @@ storage - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.config.server.ServerConfigManager @@ -283,10 +283,10 @@ top - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.config.server.ServerConfigManager @@ -303,10 +303,10 @@ transaction - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository com.dianping.cat.config.server.ServerConfigManager @@ -368,28 +368,28 @@ com.dianping.cat.report.page.transaction.service.TransactionReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -579,28 +579,28 @@ com.dianping.cat.report.page.event.service.EventReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -674,7 +674,7 @@ com.dianping.cat.report.alert.business.BusinessRuleConfigManager - com.dianping.cat.core.config.BusinessConfigDao + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository @@ -683,28 +683,28 @@ com.dianping.cat.report.page.business.service.BusinessReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -792,7 +792,7 @@ com.dianping.cat.report.page.metric.service.DefaultBaselineService - com.dianping.cat.home.dal.report.BaselineDao + com.dianping.cat.core.mybatis.repository.baseline.BaselineRepository @@ -912,28 +912,28 @@ com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -1059,28 +1059,28 @@ com.dianping.cat.report.page.problem.service.ProblemReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -1202,7 +1202,7 @@ com.dianping.cat.report.alert.summary.AlertSummaryService - com.dianping.cat.home.dal.report.AlertSummaryDao + com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository @@ -1236,7 +1236,7 @@ com.dianping.cat.report.alert.summary.build.AlterationSummaryBuilder - com.dianping.cat.home.dal.report.AlterationDao + com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository @@ -1269,7 +1269,7 @@ com.dianping.cat.report.alert.summary.build.AlertInfoBuilder - com.dianping.cat.alarm.AlertDao + com.dianping.cat.core.mybatis.repository.alert.AlertRepository com.dianping.cat.report.page.dependency.graph.TopologyGraphManager @@ -1355,28 +1355,28 @@ com.dianping.cat.report.page.storage.task.StorageReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -1431,7 +1431,7 @@ com.dianping.cat.service.ProjectService - com.dianping.cat.home.dal.report.TopologyGraphDao + com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository @@ -1464,28 +1464,28 @@ com.dianping.cat.report.page.dependency.service.DependencyReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -1550,7 +1550,7 @@ com.dianping.cat.report.page.dependency.graph.TopologyGraphBuilder - com.dianping.cat.home.dal.report.TopologyGraphDao + com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository @@ -1559,28 +1559,28 @@ com.dianping.cat.report.page.statistics.service.UtilizationReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -1614,28 +1614,28 @@ com.dianping.cat.report.page.statistics.service.ServiceReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -1660,28 +1660,28 @@ com.dianping.cat.report.page.statistics.service.HeavyReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -1712,10 +1712,10 @@ com.dianping.cat.config.content.ContentFetcher - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository @@ -1733,7 +1733,7 @@ com.dianping.cat.system.page.router.service.RouterConfigService - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository @@ -1745,28 +1745,28 @@ com.dianping.cat.system.page.router.config.RouterConfigManager - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -1796,7 +1796,7 @@ com.dianping.cat.config.server.ServerConfigManager - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository @@ -1824,28 +1824,28 @@ com.dianping.cat.report.page.statistics.service.JarReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -1870,28 +1870,28 @@ com.dianping.cat.report.page.statistics.service.ClientReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -1922,28 +1922,28 @@ com.dianping.cat.report.page.cross.service.CrossReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -2011,28 +2011,28 @@ com.dianping.cat.report.page.matrix.service.MatrixReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -2100,28 +2100,28 @@ com.dianping.cat.report.page.state.service.StateReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -2213,28 +2213,28 @@ com.dianping.cat.report.page.top.service.TopReportService - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository @@ -2356,7 +2356,7 @@ com.dianping.cat.core.config.repository.ConfigRepository - com.dianping.cat.home.dal.report.OverloadDao + com.dianping.cat.core.mybatis.repository.overload.OverloadRepository @@ -2366,13 +2366,13 @@ com.dianping.cat.report.page.overload.task.HourlyCapacityUpdater - com.dianping.cat.core.dal.HourlyReportContentDao + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.home.dal.report.OverloadDao + com.dianping.cat.core.mybatis.repository.overload.OverloadRepository com.dianping.cat.report.page.overload.task.CapacityUpdateStatusManager @@ -2385,13 +2385,13 @@ com.dianping.cat.report.page.overload.task.DailyCapacityUpdater - com.dianping.cat.core.dal.DailyReportContentDao + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.home.dal.report.OverloadDao + com.dianping.cat.core.mybatis.repository.overload.OverloadRepository com.dianping.cat.report.page.overload.task.CapacityUpdateStatusManager @@ -2404,13 +2404,13 @@ com.dianping.cat.report.page.overload.task.WeeklyCapacityUpdater - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.WeeklyReportContentDao + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.home.dal.report.OverloadDao + com.dianping.cat.core.mybatis.repository.overload.OverloadRepository com.dianping.cat.report.page.overload.task.CapacityUpdateStatusManager @@ -2423,13 +2423,13 @@ com.dianping.cat.report.page.overload.task.MonthlyCapacityUpdater - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.dal.MonthlyReportContentDao + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository - com.dianping.cat.home.dal.report.OverloadDao + com.dianping.cat.core.mybatis.repository.overload.OverloadRepository com.dianping.cat.report.page.overload.task.CapacityUpdateStatusManager @@ -2441,19 +2441,19 @@ com.dianping.cat.report.page.overload.task.TableCapacityService - com.dianping.cat.home.dal.report.OverloadDao + com.dianping.cat.core.mybatis.repository.overload.OverloadRepository - com.dianping.cat.core.dal.HourlyReportDao + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.dal.DailyReportDao + com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.dal.WeeklyReportDao + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.dal.MonthlyReportDao + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository @@ -2589,74 +2589,74 @@ - com.dianping.cat.home.dal.report.AlertSummaryDao - com.dianping.cat.home.dal.report.AlertSummaryDao + com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository + com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.home.dal.report.AlterationDao - com.dianping.cat.home.dal.report.AlterationDao + com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository + com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.home.dal.report.BaselineDao - com.dianping.cat.home.dal.report.BaselineDao + com.dianping.cat.core.mybatis.repository.baseline.BaselineRepository + com.dianping.cat.core.mybatis.repository.baseline.BaselineRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.home.dal.report.ConfigModificationDao - com.dianping.cat.home.dal.report.ConfigModificationDao + com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository + com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.home.dal.report.MetricGraphDao - com.dianping.cat.home.dal.report.MetricGraphDao + com.dianping.cat.core.mybatis.repository.metric.graph.MetricGraphRepository + com.dianping.cat.core.mybatis.repository.metric.graph.MetricGraphRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.home.dal.report.MetricScreenDao - com.dianping.cat.home.dal.report.MetricScreenDao + com.dianping.cat.core.mybatis.repository.metric.screen.MetricScreenRepository + com.dianping.cat.core.mybatis.repository.metric.screen.MetricScreenRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.home.dal.report.OverloadDao - com.dianping.cat.home.dal.report.OverloadDao + com.dianping.cat.core.mybatis.repository.overload.OverloadRepository + com.dianping.cat.core.mybatis.repository.overload.OverloadRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager - com.dianping.cat.home.dal.report.TopologyGraphDao - com.dianping.cat.home.dal.report.TopologyGraphDao + com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository + com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository - org.unidal.dal.jdbc.QueryEngine + org.unidal.dal.jdbc.datasource.DataSourceManager @@ -2685,7 +2685,7 @@ com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager - com.dianping.cat.alarm.UserDefineRuleDao + com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository @@ -3192,7 +3192,7 @@ com.dianping.cat.report.page.alteration.JspViewer - com.dianping.cat.home.dal.report.AlterationDao + com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository @@ -3206,8 +3206,13 @@ - com.dianping.cat.home.dal.report.AlterationDao - com.dianping.cat.home.dal.report.AlterationDao + com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository + com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + com.dianping.cat.report.page.monitor.Handler @@ -3229,7 +3234,7 @@ com.dianping.cat.alarm.spi.sender.SenderManager - com.dianping.cat.alarm.AlertDao + com.dianping.cat.core.mybatis.repository.alert.AlertRepository @@ -3243,8 +3248,13 @@ - com.dianping.cat.alarm.AlertDao - com.dianping.cat.alarm.AlertDao + com.dianping.cat.core.mybatis.repository.alert.AlertRepository + com.dianping.cat.core.mybatis.repository.alert.AlertRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + com.dianping.cat.report.page.overload.Handler @@ -3294,7 +3304,7 @@ com.dianping.cat.helper.JsonBuilder - com.dianping.cat.home.dal.report.AlterationDao + com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository com.dianping.cat.alarm.service.AlertService @@ -3467,13 +3477,18 @@ com.dianping.cat.system.page.business.config.BusinessTagConfigManager - com.dianping.cat.core.config.BusinessConfigDao + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository - com.dianping.cat.core.config.BusinessConfigDao - com.dianping.cat.core.config.BusinessConfigDao + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + com.dianping.cat.report.page.business.graph.CustomDataCalculator @@ -3578,7 +3593,7 @@ com.dianping.cat.system.page.config.processor.StorageConfigProcessor - com.dianping.cat.home.dal.report.ConfigModificationDao + com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository @@ -3735,8 +3750,13 @@ - com.dianping.cat.home.dal.report.ConfigModificationDao - com.dianping.cat.home.dal.report.ConfigModificationDao + com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository + com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + com.dianping.cat.system.page.plugin.Handler @@ -3874,5 +3894,113 @@ + + com.dianping.cat.core.report.daily.repository.DailyReportRepository + com.dianping.cat.core.report.daily.repository.DailyReportRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository + com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.project.ProjectRepository + com.dianping.cat.core.mybatis.repository.project.ProjectRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.task.TaskRepository + com.dianping.cat.core.mybatis.repository.task.TaskRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + diff --git a/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml b/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml new file mode 100644 index 0000000000..2798bab185 --- /dev/null +++ b/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + id, + domain, + alert_time, + content, + creation_date + + + + INSERT INTO alert_summary + (domain, alert_time, content, creation_date) + VALUES + (#{domain}, #{alertTime}, #{content}, #{creationDate}) + + + + + + + + DELETE FROM alert_summary + WHERE id = #{id} + + + + UPDATE alert_summary + SET domain = #{domain}, + alert_time = #{alertTime}, + content = #{content}, + creation_date = #{creationDate} + WHERE id = #{id} + + diff --git a/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml b/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml new file mode 100644 index 0000000000..29e9d9edda --- /dev/null +++ b/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + id, + type, + title, + domain, + hostname, + ip, + date, + user, + alt_group, + content, + url, + status, + creation_date + + + + INSERT INTO alteration + (type, title, domain, hostname, ip, date, user, alt_group, content, url, status, creation_date) + VALUES + (#{type}, #{title}, #{domain}, #{hostname}, #{ip}, #{date}, #{user}, #{altGroup}, #{content}, #{url}, #{status}, #{creationDate}) + + + + + + + + DELETE FROM alteration + WHERE id = #{id} + + + + UPDATE alteration + SET type = #{type}, + title = #{title}, + domain = #{domain}, + hostname = #{hostname}, + ip = #{ip}, + date = #{date}, + user = #{user}, + alt_group = #{altGroup}, + content = #{content}, + url = #{url}, + status = #{status}, + creation_date = #{creationDate} + WHERE id = #{id} + + + + + + + + + + diff --git a/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml b/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml new file mode 100644 index 0000000000..359508384c --- /dev/null +++ b/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + id, + report_name, + index_key, + report_period, + data, + creation_date + + + + INSERT INTO baseline + (report_name, index_key, report_period, data, creation_date) + VALUES + (#{reportName}, #{indexKey}, #{reportPeriod}, #{data}, #{creationDate}) + + + + + + + + DELETE FROM baseline + WHERE id = #{id} + + + + UPDATE baseline + SET report_name = #{reportName}, + index_key = #{indexKey}, + report_period = #{reportPeriod}, + data = #{data}, + creation_date = #{creationDate} + WHERE id = #{id} + + + + diff --git a/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml b/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml new file mode 100644 index 0000000000..a09a5edde8 --- /dev/null +++ b/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + id, + user_name, + account_name, + action_name, + argument, + date, + creation_date + + + + INSERT INTO config_modification + (user_name, account_name, action_name, argument, date, creation_date) + VALUES + (#{userName}, #{accountName}, #{actionName}, #{argument}, #{date}, #{creationDate}) + + + + + + + + DELETE FROM config_modification + WHERE id = #{id} + + + + UPDATE config_modification + SET user_name = #{userName}, + account_name = #{accountName}, + action_name = #{actionName}, + argument = #{argument}, + date = #{date}, + creation_date = #{creationDate} + WHERE id = #{id} + + diff --git a/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml b/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml new file mode 100644 index 0000000000..b968d52911 --- /dev/null +++ b/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + id, + graph_id, + name, + content, + creation_date, + updatetime + + + + INSERT INTO metric_graph + (graph_id, name, content, creation_date, updatetime) + VALUES + (#{graphId}, #{name}, #{content}, #{creationDate}, #{updatetime}) + + + + + + + + DELETE FROM metric_graph + WHERE id = #{id} + + + + UPDATE metric_graph + SET graph_id = #{graphId}, + name = #{name}, + content = #{content}, + creation_date = #{creationDate}, + updatetime = #{updatetime} + WHERE id = #{id} + + + + + + + + DELETE FROM metric_graph WHERE creation_date < #{record.creationDate} + + diff --git a/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml b/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml new file mode 100644 index 0000000000..ba1139286e --- /dev/null +++ b/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + id, + name, + graph_name, + view, + endPoints, + measurements, + content, + creation_date, + updatetime + + + + INSERT INTO metric_screen + (name, graph_name, view, endPoints, measurements, content, creation_date, updatetime) + VALUES + (#{name}, #{graphName}, #{view}, #{endPoints}, #{measurements}, #{content}, #{creationDate}, #{updatetime}) + + + + + + + + DELETE FROM metric_screen + WHERE id = #{id} + + + + UPDATE metric_screen + SET name = #{name}, + graph_name = #{graphName}, + view = #{view}, + endPoints = #{endPoints}, + measurements = #{measurements}, + content = #{content}, + creation_date = #{creationDate}, + updatetime = #{updatetime} + WHERE id = #{id} + + + + + + + + + + INSERT INTO metric_screen(id, name, graph_name, view, endPoints, measurements, content, creation_date, updatetime) VALUES() ON DUPLICATE KEY UPDATE view = #{record.view}, endPoints = #{record.endPoints}, measurements = #{record.measurements}, content = #{record.content} + + + + DELETE FROM metric_screen WHERE name = #{record.name} + + + + DELETE FROM metric_screen WHERE name = #{record.name} AND graph_name = #{record.graphName} + + diff --git a/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml b/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml new file mode 100644 index 0000000000..fc78724fb0 --- /dev/null +++ b/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + id, + report_id, + report_type, + report_size, + period, + creation_date + + + + INSERT INTO overload + (report_id, report_type, report_size, period, creation_date) + VALUES + (#{reportId}, #{reportType}, #{reportSize}, #{period}, #{creationDate}) + + + + + + + + DELETE FROM overload + WHERE id = #{id} + + + + UPDATE overload + SET report_id = #{reportId}, + report_type = #{reportType}, + report_size = #{reportSize}, + period = #{period}, + creation_date = #{creationDate} + WHERE id = #{id} + + + + + + + + diff --git a/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml b/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml new file mode 100644 index 0000000000..16a2b5278a --- /dev/null +++ b/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + id, + ip, + period, + type, + content, + creation_date + + + + INSERT INTO topologyGraph + (ip, period, type, content, creation_date) + VALUES + (#{ip}, #{period}, #{type}, #{content}, #{creationDate}) + + + + + + + + DELETE FROM topologyGraph + WHERE id = #{id} + + + + UPDATE topologyGraph + SET ip = #{ip}, + period = #{period}, + type = #{type}, + content = #{content}, + creation_date = #{creationDate} + WHERE id = #{id} + + + + diff --git a/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java b/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java index 746f7b02d4..3ae985b013 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java @@ -25,13 +25,13 @@ import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.core.dal.DailyReport; -import com.dianping.cat.core.dal.DailyReportDao; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportDao; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportDao; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportDao; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; public class ReportDaoTest extends ComponentTestCase { @@ -52,7 +52,7 @@ public void test() throws DalException { @Test public void testDaily() throws DalException { - DailyReportDao dao = lookup(DailyReportDao.class); + DailyReportRepository dao = lookup(DailyReportRepository.class); DailyReport proto = new DailyReport(); proto.setCreationDate(new Date()); From 1df6580b28e4d7346e9592f2675eb23b4113be69 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 7 Jun 2026 21:23:40 +0800 Subject: [PATCH 005/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=88=B0spring?= =?UTF-8?q?=E5=AE=B9=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...NG_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md | 647 +++++++++++ SPRING_CONTEXT_MIGRATION_PLAN.md | 1002 +++++++++++++++++ .../repository/alert/AlertRepository.java | 143 ++- .../alarm/rule/ServerAlarmRuleRepository.java | 75 +- .../define/rule/UserDefineRuleRepository.java | 79 +- .../resources/mybatis/mapper/AlertMapper.xml | 8 +- .../dianping/cat/boot/CatBootApplication.java | 4 + .../boot/config/CatSpringStartupVerifier.java | 25 + cat-core/pom.xml | 12 + .../DefaultMessageAnalyzerManager.java | 7 +- .../cat/analysis/TcpSocketReceiver.java | 4 +- .../config/AtomicMessageConfigManager.java | 8 + .../cat/config/ReportReloadConfigManager.java | 8 + .../business/BusinessConfigManager.java | 21 +- .../content/LocalResourceContentFetcher.java | 4 + .../config/sample/SampleConfigManager.java | 8 + .../config/server/ServerConfigManager.java | 8 + .../server/ServerFilterConfigManager.java | 8 + .../TpValueStatisticConfigManager.java | 12 + .../config/repository/ConfigRepository.java | 91 +- .../SpringBackedRepositorySupport.java | 63 ++ .../SupportingMyBatisRepository.java} | 64 +- .../config/BusinessConfigRepository.java | 184 ++- .../content/DailyReportContentRepository.java | 127 ++- .../hostinfo/HostinfoRepository.java | 258 ++++- .../HourlyReportContentRepository.java | 131 ++- .../hourlyreport/HourlyReportRepository.java | 242 +++- .../MonthlyReportContentRepository.java | 128 ++- .../monthreport/MonthlyReportRepository.java | 245 +++- .../repository/project/ProjectRepository.java | 275 ++++- .../repository/task/TaskRepository.java | 182 ++- .../WeeklyReportContentRepository.java | 128 ++- .../weeklyreport/WeeklyReportRepository.java | 245 +++- .../repository/DailyReportRepository.java | 79 ++ .../dianping/cat/mvc/AbstractReportModel.java | 11 +- .../dianping/cat/mvc/PayloadNormalizer.java | 6 + .../report/DefaultReportBucketManager.java | 12 + .../report/service/AbstractReportService.java | 47 + .../service/BaseCompositeModelService.java | 10 + .../service/BaseHistoricalModelService.java | 6 + .../cat/report/service/LocalModelService.java | 6 + .../dianping/cat/service/HostinfoService.java | 10 + .../dianping/cat/service/ProjectService.java | 8 + .../dianping/cat/spring/CatSpringContext.java | 40 + .../com/dianping/cat/task/TaskManager.java | 11 + cat-home/pom.xml | 16 + .../java/com/dianping/cat/CatHomeModule.java | 7 +- .../alert/summary/AlertSummaryRepository.java | 64 +- .../alteration/AlterationRepository.java | 148 ++- .../baseline/BaselineRepository.java | 84 +- .../ConfigModificationRepository.java | 64 +- .../metric/graph/MetricGraphRepository.java | 106 +- .../metric/screen/MetricScreenRepository.java | 136 ++- .../overload/OverloadRepository.java | 109 +- .../TopologyGraphRepository.java | 81 +- .../spring/CatHomeSpringConfiguration.java | 408 +++++++ .../spring/CatHomeSpringContextListener.java | 41 + .../CatHomeSpringDataSourceFactory.java | 106 ++ .../spring/CatHomeSpringStartupVerifier.java | 58 + .../report/alert/business/BusinessAlert.java | 19 + .../business/BusinessRuleConfigManager.java | 15 + .../exception/ExceptionRuleConfigManager.java | 17 + .../alert/heartbeat/HeartbeatAlert.java | 20 + .../spi/config/BaseRuleConfigManager.java | 23 + .../spi/config/UserDefinedRuleManager.java | 12 + .../alert/summary/AlertSummaryService.java | 10 + .../summary/build/RelatedSummaryBuilder.java | 10 + .../graph/metric/AbstractGraphCreator.java | 10 + .../report/page/DomainGroupConfigManager.java | 17 + .../cat/report/page/alert/Handler.java | 10 + .../cat/report/page/alteration/Handler.java | 10 + .../cat/report/page/business/Handler.java | 11 + .../business/graph/BusinessGraphCreator.java | 17 + .../task/BusinessBaselineReportBuilder.java | 15 + .../page/dependency/ExternalInfoBuilder.java | 15 +- .../config/TopoGraphFormatConfigManager.java | 17 + .../graph/TopologyGraphConfigManager.java | 17 + .../graph/TopologyGraphManager.java | 24 + .../task/DependencyReportBuilder.java | 10 + .../page/event/task/EventReportBuilder.java | 22 + .../config/HeartbeatDisplayPolicyManager.java | 17 + .../cat/report/page/logview/Handler.java | 13 + .../logview/service/RemoteLogViewService.java | 11 + .../service/DefaultBaselineService.java | 12 + .../task/CapacityUpdateStatusManager.java | 17 + .../overload/task/DailyCapacityUpdater.java | 20 + .../overload/task/HourlyCapacityUpdater.java | 20 + .../overload/task/MonthlyCapacityUpdater.java | 20 + .../overload/task/TableCapacityService.java | 27 + .../overload/task/WeeklyCapacityUpdater.java | 20 + .../cat/report/page/problem/Handler.java | 13 + .../cat/report/page/state/Handler.java | 14 + .../report/page/state/StateGraphBuilder.java | 14 + .../page/state/task/StateReportBuilder.java | 30 + .../cat/report/page/statistics/Handler.java | 33 +- .../task/heavy/HeavyReportBuilder.java | 21 + .../statistics/task/jar/JarReportBuilder.java | 11 + .../task/service/ClientReportBuilder.java | 17 + .../task/service/ServiceReportBuilder.java | 63 +- .../utilization/UtilizationReportBuilder.java | 71 +- .../config/StorageGroupConfigManager.java | 17 + .../task/TransactionReportBuilder.java | 22 + .../cat/report/task/DefaultTaskConsumer.java | 14 + .../report/task/cmdb/ProjectUpdateTask.java | 17 + .../task/current/CurrentReportBuilder.java | 15 + .../task/reload/AbstractReportReloader.java | 23 + .../report/task/reload/ReportReloadTask.java | 6 + .../cat/system/page/business/Handler.java | 15 + .../config/BusinessTagConfigManager.java | 13 + .../cat/system/page/config/Handler.java | 12 + .../processor/GlobalConfigProcessor.java | 28 + .../permission/ResourceConfigManager.java | 19 + .../page/permission/UserConfigManager.java | 19 + .../cat/system/page/project/Handler.java | 11 + .../cat/system/page/router/Handler.java | 17 +- .../router/config/RouterConfigAdjustor.java | 13 + .../router/config/RouterConfigManager.java | 30 + .../page/router/task/RouterConfigBuilder.java | 12 + .../mybatis/mapper/AlterationMapper.xml | 8 +- .../mybatis/mapper/MetricGraphMapper.xml | 2 +- .../mybatis/mapper/MetricScreenMapper.xml | 4 +- .../mybatis/mapper/OverloadMapper.xml | 2 +- cat-home/src/main/webapp/WEB-INF/web.xml | 3 + pom.xml | 22 + 124 files changed, 6459 insertions(+), 790 deletions(-) create mode 100644 SPRING_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md create mode 100644 SPRING_CONTEXT_MIGRATION_PLAN.md create mode 100644 cat-boot/src/main/java/com/dianping/cat/boot/config/CatSpringStartupVerifier.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{MyBatisRepositorySupport.java => repository/SupportingMyBatisRepository.java} (65%) create mode 100644 cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringDataSourceFactory.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java diff --git a/SPRING_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md b/SPRING_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md new file mode 100644 index 0000000000..f338bd472e --- /dev/null +++ b/SPRING_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md @@ -0,0 +1,647 @@ +# CAT Spring 上下文迁移交接文档(2026-06-07) + +## 1. 文档目的 + +这份文档用于下一次任务开始时快速恢复上下文。下一次继续迁移前,优先阅读本文,再结合当前 `git status --short` 和最近编译结果判断从哪一步继续。 + +当前项目路径: + +```text +D:\workspace\cat +``` + +当前总体目标: + +```text +逐步废弃 Plexus / Unidal Lookup / Unidal DAL 运行时依赖,让应用上下文、数据访问、Service、Manager、后台任务和 Web 层逐步迁移到 Spring 体系。 +``` + +当前迁移策略: + +1. 不一次性删除 Plexus。 +2. 先把 DAO / Repository / 配置 Manager / 基础 Service 接入 Spring。 +3. 旧 Unidal MVC Handler 暂时保留,由 Handler 通过桥接方式使用 Spring Bean。 +4. 每一步完成后都编译、打包、启动验证。 +5. 不确定运行结果时,停下来让用户在 IDEA 或本地环境验证。 + +## 2. 当前可运行状态 + +截至本交接文档编写时,用户已经多次确认项目可以正常启动和访问,最近一次用户反馈是: + +```text +已验证 ok / 没问题,继续。 +``` + +已知当前运行形态: + +1. JDK 已升级到 21。 +2. 项目通过 `cat-boot` 以可执行 JAR 启动。 +3. `cat-boot` 内嵌 Tomcat,部署 `cat-home.war` 到 `/cat`。 +4. 外置 Tomcat 已废弃。 +5. Logback 已替换旧日志实现。 +6. JSON 依赖已迁移到 fastjson2。 +7. Lombok 已引入。 +8. MyBatis 已覆盖 `CatApplication.sql` 中的表,并已有大量 Repository 迁移。 +9. Spring 上下文已建立,并能被旧 Plexus 对象通过 `CatSpringContext` 桥接访问。 + +常用启动参数: + +```text +-Dcat.home=C:\Users\Shang\.cat +-Dcat.log.path=C:\Users\Shang\.cat\logs +``` + +常用访问入口: + +```text +http://127.0.0.1:8080/cat +http://127.0.0.1:8080/cat/r +http://127.0.0.1:8080/cat/s/config +http://127.0.0.1:8080/cat/s/router?op=json&domain=cat&ip=127.0.0.1 +``` + +临时验证启动建议使用非默认端口,避免和用户 IDEA 启动实例冲突: + +```powershell +java -Dserver.port=18080 -Dcat.tcp.port=12280 -jar cat-boot\target\cat-boot-4.0-RC1.jar +``` + +自己启动的 Java 进程验证完成后必须停止。 + +## 3. 今天左右已经完成的主要改动 + +### 3.1 JDK 21 和 Spring Boot 启动外壳 + +已完成: + +1. 根 POM 和模块 POM 已适配 JDK 21。 +2. 新增 `cat-boot` 模块。 +3. `CatBootApplication` 已作为 Spring Boot 启动入口。 +4. `cat-boot` 打包时包含并部署 `cat-home.war`。 +5. 默认系统参数已补齐: + +```text +cat.home=C:\Users\Shang\.cat +cat.log.path=C:\Users\Shang\.cat\logs +``` + +相关重点文件: + +```text +cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java +cat-boot/src/main/java/com/dianping/cat/boot/config/ +``` + +### 3.2 日志迁移 + +已完成: + +1. 日志实现切换为 Logback。 +2. 引入新版 Logback。 +3. 增加 `logback.xml`。 +4. 参考 `D:\workspace\lawyer-system` 的风格补充了日志文件输出配置。 +5. 处理过错误日志没有落入 `error.log` 的问题。 + +日志目录期望位置: + +```text +C:\Users\Shang\.cat\logs +``` + +注意: + +1. 控制台仍可能出现 CAT 客户端连接自身服务端的 WARN。 +2. Logback scan 相关 “Missing watchable .xml” 警告可以暂时忽略。 +3. 是否进入 `error.log` 取决于 logger、appender 和 level 配置,后续继续改日志时要实际触发 ERROR 验证。 + +### 3.3 fastjson2 和 Lombok + +已完成: + +1. JSON 依赖迁移为 fastjson2。 +2. 项目中直接 `com.alibaba.fastjson.*` import 已检查并处理。 +3. Lombok 已引入依赖和编译配置。 + +### 3.4 MyBatis DAO / Repository 迁移 + +已完成: + +1. 基于 `CatApplication.sql` 为所有表生成 MyBatis DO / Mapper / XML。 +2. `config` 表迁移为独立 MyBatis DAO,不再继承旧 DAO。 +3. `dailyreport` 表迁移到 MyBatis。 +4. 后续已扩展到所有表。 +5. 新 DAO 包和命名已按用户要求调整,例如 `ConfigMapper`、`ConfigDO`。 +6. 目标是新 DAO 层不依赖旧框架。 + +当前重要结构: + +```text +cat-core/src/main/java/com/dianping/cat/core/mybatis/ +cat-core/src/main/resources/mybatis/mapper/ +cat-home/src/main/resources/mybatis/mapper/ +cat-alarm/src/main/resources/mybatis/mapper/ +``` + +已知语义: + +1. `hostinfo` 表为空是正常场景,不应被当作错误。 +2. 查询不到数据时要尽量保持旧语义,例如该抛 `DalNotFoundException` 的地方不能被统一包装成普通 `DalException`。 + +### 3.5 Spring 上下文基础设施 + +已完成: + +1. 新增 Spring 上下文桥接类: + +```text +cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java +``` + +2. 新增 Spring Home 配置: + +```text +cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +``` + +3. `CatSpringContext` 支持旧对象通过类型获取 Spring Bean: + +```java +CatSpringContext.getBeanIfAvailable(SomeClass.class) +``` + +4. `CatHomeSpringConfiguration` 已注册: + +```text +DataSource +SqlSessionFactory +SqlSessionTemplate +TransactionManager +TransactionTemplate +ConfigRepository +ProjectRepository +HostinfoRepository +各类 Report Repository +各类告警/配置相关 Repository +ProjectService +BusinessConfigManager +ServerConfigManager +SampleConfigManager +ServerFilterConfigManager +ReportReloadConfigManager +AtomicMessageConfigManager +TpValueStatisticConfigManager +AlertSummaryService +UserDefinedRuleManager +BaselineService +RemoteServersManager +DomainValidator +ServerStatisticManager +``` + +最近一次启动验证看到 Spring Home 侧 Bean 数量约为: + +```text +beanCount=76 +``` + +### 3.6 Repository 和 Service 桥接 + +已完成并验证的桥接点包括: + +```text +AbstractReportService +TaskManager +DefaultTaskConsumer +system/page/config/Handler 的 ConfigModificationRepository +AlertSummaryService +UserDefinedRuleManager +BaseRuleConfigManager +RelatedSummaryBuilder +BusinessBaselineReportBuilder +AbstractGraphCreator +``` + +已注册或桥接的 Repository / Service 包括: + +```text +AlertRepository +AlterationRepository +BaselineRepository +TopologyGraphRepository +TaskRepository +AlertSummaryRepository +ConfigModificationRepository +MetricGraphRepository +MetricScreenRepository +ServerAlarmRuleRepository +UserDefineRuleRepository +AlertSummaryService +UserDefinedRuleManager +BaselineService(DefaultBaselineService) +``` + +这些改动的核心思路: + +```text +旧对象仍由 Plexus 创建,但运行前优先从 Spring 上下文刷新已迁移 Bean。 +``` + +这样可以避免一次性让 Spring 接管所有旧组件造成双容器初始化或字段注入为空。 + +## 4. 最近已经验证过的命令 + +常用编译验证: + +```powershell +mvn -pl cat-home -am compile -DskipTests +``` + +常用打包验证: + +```powershell +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +``` + +常用临时启动验证: + +```powershell +java -Dserver.port=18080 -Dcat.tcp.port=12280 -jar cat-boot\target\cat-boot-4.0-RC1.jar +``` + +常用 HTTP 验证: + +```text +http://127.0.0.1:18080/cat +http://127.0.0.1:18080/cat/r +http://127.0.0.1:18080/cat/s/config +http://127.0.0.1:18080/cat/s/router?op=json&domain=cat&ip=127.0.0.1 +``` + +可暂时忽略的日志: + +```text +Unable to connect to CAT server /127.0.0.1:2280 +请求 http://127.0.0.1:8080/cat/s/router?... 失败 +Logback Missing watchable .xml... +``` + +端口注意: + +1. 默认 TCP 接收端口是 `2280`。 +2. 如果出现 `Address already in use: bind`,优先确认是否已有 CAT 实例或其他进程占用。 +3. 临时验证用 `-Dcat.tcp.port=12280` 可以绕开默认端口冲突。 + +## 5. 当前正在推进但尚未完成的工作 + +当前最近一轮准备推进的是: + +```text +配置页 Processor Spring 化。 +``` + +目标不是马上删除 Plexus 注册,而是让配置页 Processor 在执行前刷新 Spring 已迁移依赖。 + +涉及文件: + +```text +cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/BaseProcesser.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/AlertConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/DependencyConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/HeartbeatConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/ExceptionConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/TransactionConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/EventConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/StorageConfigProcessor.java +``` + +已经确认的现状: + +1. `Handler` 已有 `refreshSpringBeans()`,当前主要刷新 `ConfigModificationRepository`。 +2. `GlobalConfigProcessor` 已有 `refreshSpringBeans()`,当前刷新了: + +```text +ProjectService +SampleConfigManager +ServerConfigManager +ServerFilterConfigManager +ReportReloadConfigManager +``` + +3. `GlobalConfigProcessor` 还可以继续刷新但尚未补齐的依赖: + +```text +RouterConfigManager +DomainGroupConfigManager +StorageGroupConfigManager +``` + +这些 Manager 自身已具备 `refreshSpringBeans()` 能力,后续可考虑注册为 Spring Bean 或继续通过旧对象内部刷新。 + +4. `AlertConfigProcessor` 依赖: + +```text +AlertConfigManager +AlertPolicyManager +ConfigHtmlParser +``` + +这几个暂时不建议直接让 Spring 新建 Processor 后替换旧 Processor,除非先把所有字段依赖补齐。 + +5. `DependencyConfigProcessor` 依赖: + +```text +GlobalConfigProcessor +TopologyGraphConfigManager +TopoGraphFormatConfigManager +ConfigHtmlParser +``` + +`TopologyGraphConfigManager` 和 `TopoGraphFormatConfigManager` 已经有内部 Spring 刷新 `ConfigRepository` / `ContentFetcher` 的逻辑。 + +6. `HeartbeatConfigProcessor` 依赖: + +```text +HeartbeatRuleConfigManager +HeartbeatDisplayPolicyManager +ConfigHtmlParser +``` + +`HeartbeatDisplayPolicyManager` 已经有内部 Spring 刷新逻辑;`HeartbeatRuleConfigManager` 继承 `BaseRuleConfigManager`,已能刷新 `ConfigRepository`、`ContentFetcher`、`UserDefinedRuleManager`。 + +7. `ExceptionConfigProcessor` 依赖: + +```text +GlobalConfigProcessor +ExceptionRuleConfigManager +``` + +`ExceptionRuleConfigManager` 已有内部 Spring 刷新逻辑。 + +8. `TransactionConfigProcessor` 和 `EventConfigProcessor` 依赖: + +```text +TransactionRuleConfigManager +EventRuleConfigManager +RuleFTLDecorator(来自 BaseProcesser) +``` + +这两个 RuleConfigManager 继承 `BaseRuleConfigManager`,已能刷新部分 Spring 依赖。`RuleFTLDecorator` 暂时不建议急着 Spring 化,因为涉及模板装饰器和旧 components 配置。 + +9. `StorageConfigProcessor` 当前基本是空操作,风险较低。 + +## 6. 配置 Processor 迁移的推荐下一步 + +下一次建议按下面顺序执行。 + +### 6.1 不直接切换为 Spring 新建 Processor + +不要马上在 `CatHomeSpringConfiguration` 中注册 8 个 Processor 并让 Handler 使用 Spring Bean。 + +原因: + +1. 当前 Processor 仍依赖大量 `@Inject` 字段。 +2. 如果 Spring `new Processor()`,这些 Plexus 字段不会自动注入。 +3. 直接替换会导致运行时 NPE,尤其是 `ConfigHtmlParser`、`RuleFTLDecorator`、各类 ConfigManager。 + +推荐策略: + +```text +Processor 仍由 Plexus 创建;Processor 执行前主动刷新 Spring 已迁移依赖。 +``` + +### 6.2 先补 `ConfigHtmlParser` Spring Bean + +`ConfigHtmlParser` 是无状态工具类,可以低风险注册到 Spring。 + +建议在: + +```text +cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +``` + +增加: + +```java +@Bean +public ConfigHtmlParser configHtmlParser() { + return new ConfigHtmlParser(); +} +``` + +### 6.3 给 Processor 增加 `refreshSpringBeans()` + +建议补充: + +1. `BaseProcesser.refreshSpringBeans()`: + +```text +可先不刷新 RuleFTLDecorator,避免模板相关风险。 +``` + +2. `GlobalConfigProcessor.refreshSpringBeans()` 继续补: + +```text +RouterConfigManager +DomainGroupConfigManager +StorageGroupConfigManager +ConfigHtmlParser +``` + +3. `AlertConfigProcessor.refreshSpringBeans()`: + +```text +ConfigHtmlParser +如果 AlertConfigManager / AlertPolicyManager 已注册 Spring,再刷新;否则保留 Plexus 注入。 +``` + +4. `DependencyConfigProcessor.refreshSpringBeans()`: + +```text +GlobalConfigProcessor +TopologyGraphConfigManager +TopoGraphFormatConfigManager +ConfigHtmlParser +``` + +这里要谨慎:如果 `GlobalConfigProcessor` 没有作为 Spring Bean 注册,就不要替换它;保留 Plexus 字段即可。 + +5. `HeartbeatConfigProcessor.refreshSpringBeans()`: + +```text +HeartbeatDisplayPolicyManager +ConfigHtmlParser +HeartbeatRuleConfigManager 如果已注册 Spring 再替换 +``` + +6. `ExceptionConfigProcessor.refreshSpringBeans()`: + +```text +ExceptionRuleConfigManager 如果已注册 Spring 再替换 +GlobalConfigProcessor 如果已注册 Spring 再替换 +``` + +7. `TransactionConfigProcessor` / `EventConfigProcessor`: + +```text +先只在 process() 开头调用 BaseProcesser.refreshSpringBeans() +是否替换 RuleConfigManager 等确认 Spring Bean 注册后再做 +``` + +### 6.4 Handler 只做刷新,不强切 Processor + +`Handler.refreshSpringBeans()` 下一步可以扩展成: + +```text +刷新 ConfigModificationRepository +必要时调用各 Processor 的 refreshSpringBeans() +``` + +但不建议直接: + +```java +m_globalConfigProcessor = CatSpringContext.getBeanIfAvailable(GlobalConfigProcessor.class); +``` + +除非该 Processor 的所有依赖都已经由 Spring 明确注入或手动 setter 完成。 + +## 7. 配置 Processor 迁移后的验证清单 + +完成上述小步后,至少执行: + +```powershell +mvn -pl cat-home -am compile -DskipTests +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +``` + +如果编译和打包通过,临时启动: + +```powershell +java -Dserver.port=18080 -Dcat.tcp.port=12280 -jar cat-boot\target\cat-boot-4.0-RC1.jar +``` + +访问配置页: + +```text +http://127.0.0.1:18080/cat/s/config +http://127.0.0.1:18080/cat/s/config?op=serverConfigUpdate +http://127.0.0.1:18080/cat/s/config?op=sampleConfigUpdate +http://127.0.0.1:18080/cat/s/config?op=reportReloadConfigUpdate +http://127.0.0.1:18080/cat/s/config?op=alertPolicy +http://127.0.0.1:18080/cat/s/config?op=transactionRule +http://127.0.0.1:18080/cat/s/config?op=eventRule +http://127.0.0.1:18080/cat/s/config?op=heartbeatRuleConfigList +``` + +重点检查: + +1. 无 Processor 字段 NPE。 +2. 无 Mapper 未注册。 +3. 无 Spring Bean 循环依赖。 +4. 无重复初始化导致的任务重复启动。 +5. 配置页至少能返回页面或旧系统可接受的业务错误。 + +验证结束后停止自己启动的 Java 进程。 + +## 8. 后续总体计划 + +### 8.1 短期计划:继续扩大 Spring 桥接面 + +优先级从高到低: + +1. 配置 Processor 内部依赖刷新。 +2. 配置相关 Manager 注册或桥接到 Spring。 +3. 报表 Builder / Reloader / Task 继续桥接 Spring Repository 和 Service。 +4. 旧 Handler 逐步只保留请求分发和 JSP 渲染职责,业务依赖尽量来自 Spring。 + +### 8.2 中期计划:迁移后台任务 + +目标: + +```text +用 Spring 生命周期和调度机制替代 Plexus 初始化阶段启动任务。 +``` + +候选对象: + +```text +TimerSyncTask +ReportReloadTask +DefaultTaskConsumer +ProjectUpdateTask +CurrentReportBuilder +各类 ReportBuilder +各类 ReportReloader +CapacityUpdateStatusManager +DailyCapacityUpdater +HourlyCapacityUpdater +WeeklyCapacityUpdater +MonthlyCapacityUpdater +``` + +建议: + +1. 先加 Spring 调度基础设施。 +2. 每次只迁移一个任务族。 +3. 每个任务迁移后确认没有被 Plexus 和 Spring 重复启动。 +4. 任务迁移时一定要增加启动日志和停止逻辑。 + +### 8.3 长期计划:迁移 Web 层 + +最后再处理 Web 层,因为风险最大。 + +当前旧链路: + +```text +Unidal Web MVC -> Page Handler -> Payload -> Model -> JspViewer -> JSP +``` + +目标链路: + +```text +Spring MVC Controller -> Service -> ModelAndView / JSP +``` + +建议顺序: + +1. 先迁移低风险页面。 +2. 保持原 URL 尽量不变。 +3. 每迁移一个页面就验证一个页面。 +4. 等 DAO / Service / Manager / Task 基本 Spring 化之后,再删除 Unidal MVC。 + +## 9. 不要做的事 + +下一次继续时注意: + +1. 不要直接删除 `components.xml` 或 Plexus 注册。 +2. 不要一次性把 `com.dianping.cat` 全量加入 Spring 扫描。 +3. 不要让 Spring 和 Plexus 同时创建同一个会启动线程或注册定时任务的组件。 +4. 不要直接用 Spring 新建 Processor 替换旧 Processor,除非确认字段依赖全部补齐。 +5. 不要回滚用户已有改动。 +6. 不要长期保留自己启动的 Java 进程。 +7. 不要把空表、查无数据这类旧系统允许的场景误判成迁移失败。 + +## 10. 下一次任务开始建议执行的命令 + +先看工作树: + +```powershell +git status --short +``` + +查看旧容器依赖剩余面: + +```powershell +rg -n "ContainerLoader|getDefaultContainer|lookup\(" cat-core/src/main/java cat-home/src/main/java cat-alarm/src/main/java cat-consumer/src/main/java +rg -n "org\.unidal\.lookup\.annotation|@Named|Initializable|LogEnabled|ContainerHolder" cat-core/src/main/java cat-home/src/main/java cat-alarm/src/main/java cat-consumer/src/main/java +rg -n "DataSourceManager|MyBatisRepositorySupport" cat-core/src/main/java cat-home/src/main/java cat-alarm/src/main/java cat-consumer/src/main/java +``` + +查看配置 Processor 当前状态: + +```powershell +rg -n "refreshSpringBeans|class .*ConfigProcessor|class BaseProcesser" cat-home/src/main/java/com/dianping/cat/system/page/config/processor cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java +``` + +然后继续执行第 6 节的配置 Processor Spring 桥接计划。 diff --git a/SPRING_CONTEXT_MIGRATION_PLAN.md b/SPRING_CONTEXT_MIGRATION_PLAN.md new file mode 100644 index 0000000000..80a4000dc8 --- /dev/null +++ b/SPRING_CONTEXT_MIGRATION_PLAN.md @@ -0,0 +1,1002 @@ +# Spring 上下文迁移详细执行计划 + +## 1. 目标 + +将 CAT 当前由 Plexus/Unidal Lookup 管理的应用上下文,逐步迁移到 Spring 管理。最终状态是: + +1. 应用启动入口由 Spring Boot 管理。 +2. 基础设施 Bean、数据源、MyBatis、事务由 Spring 管理。 +3. DAO、Repository、Service、Manager、后台任务、Web Controller 由 Spring 创建和装配。 +4. 新代码不再依赖 Plexus、Unidal Lookup、Unidal DAL 生成运行时。 +5. 最终移除 `plexus-maven-plugin`、`META-INF/plexus/components.xml` 生成链路、旧 Lookup 容器和旧 DAL 依赖。 + +本计划采用分阶段迁移,不做一次性大替换。原因是当前 Plexus/Unidal 不只是 IoC 容器,还承担了组件生命周期、MVC 请求链路、DAL 代码生成、后台任务启动、日志注入等职责。一次性替换会把数据访问、页面渲染、JSP、Filter、定时任务和组件初始化问题混在一起,风险过高。 + +推荐路线是:先让 Spring 接管边界清晰的基础设施和 DAO,再迁移 Service/Manager,随后迁移后台任务,最后处理 Web MVC 和旧容器清理。 + +## 2. 当前状态 + +已经完成的前置工作: + +1. 项目已升级到 JDK 21。 +2. 已新增 `cat-boot`,可以通过 Spring Boot 外壳启动内嵌 Tomcat。 +3. 日志组件已迁移到 Logback。 +4. JSON 组件已迁移到 fastjson2。 +5. 已引入 Lombok。 +6. `CatApplication.sql` 中的表已生成 MyBatis `DO`、`Mapper`、XML。 +7. 主要业务 DAO 已逐步切换到新的 MyBatis Repository 兼容层。 +8. 当前项目可以正常启动运行。 + +当前仍然依赖旧框架的关键点: + +1. `cat-core`、`cat-home`、`cat-alarm`、`cat-consumer` 中仍大量使用 `org.unidal.lookup.annotation.Named` 和 `org.unidal.lookup.annotation.Inject`。 +2. 当前扫描结果显示,主代码中旧 Lookup 注解相关命中约 1145 处。 +3. `ContainerLoader`、`getDefaultContainer()`、`lookup(...)` 运行时查找命中约 33 处。 +4. `DataSourceManager` 命中约 67 处。 +5. `Initializable`、`LogEnabled`、`ContainerHolder` 生命周期相关命中约 224 处。 +6. 新 MyBatis Repository 当前约 50 个,但多数仍继承 `MyBatisRepositorySupport`。 +7. `MyBatisRepositorySupport` 当前仍通过 Unidal `DataSourceManager` 创建 MyBatis `SqlSessionFactory`。 +8. Web 请求仍主要经过 Unidal Web MVC、旧 Handler、Payload、Model、JSP Viewer 链路。 + +这说明项目已经具备 Spring 化的基础,但旧容器仍然是主上下文。下一步应优先切断 DAO 基础设施对 Unidal 的依赖。 + +## 3. 总体原则 + +1. 每个阶段完成后都必须保持可编译、可打包、可启动。 +2. 每个阶段只迁移一个明确边界,避免 DAO、Service、Web、任务调度同时大改。 +3. 新增代码使用 Spring 标准方式:`@Configuration`、`@Bean`、`@Component`、`@Service`、`@Repository`、构造器注入、`@Transactional`。 +4. 新增 DAO/Repository 不再继承旧 DAO,也不依赖 Unidal DAL。 +5. 过渡期允许保留旧业务方法签名,例如 `DalException`、`DalNotFoundException`,用于降低调用方改动成本。 +6. `DalNotFoundException` 语义必须保持兼容。查询不到数据时不能被包装成普通 `DalException`,否则旧业务上层会误判为系统错误。 +7. Spring 和 Plexus 共存阶段必须明确组件归属。同一个组件不能同时由两个容器创建。 +8. 每迁移一类组件,就删除或停用对应的 Plexus role 注册,避免双容器重复初始化。 +9. 任何阶段发现运行时风险,都应回滚当前阶段,而不是跨阶段修补。 + +## 4. 目标架构 + +迁移完成后的目标链路: + +```text +Spring Boot + -> Spring ApplicationContext + -> DataSource / TransactionManager + -> MyBatis SqlSessionFactory / Mapper + -> Repository + -> Service / Manager + -> Scheduler / Background Task + -> Spring MVC Controller / Filter +``` + +旧链路逐步退场: + +```text +Plexus components.xml + -> Unidal Lookup + -> Unidal DAL DataSourceManager + -> Generated Dao + -> Unidal MVC Handler +``` + +## 5. 阶段 0:建立基线和保护网 + +### 目标 + +在正式迁移 Spring 上下文前,固定当前可运行状态,确保后续每一步都有可比较的基线。 + +### 执行步骤 + +1. 记录当前 Git 状态: + +```bash +git status --short +``` + +2. 执行基础编译: + +```bash +mvn -pl cat-core -am compile -DskipTests +mvn -pl cat-alarm,cat-home -am compile -DskipTests +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +``` + +3. 启动应用: + +```bash +java -jar cat-boot\target\cat-boot-4.0-RC1.jar +``` + +4. 验证默认启动参数是否生效: + +```text +cat.home = C:\Users\Shang\.cat +cat.log.path = C:\Users\Shang\.cat\logs +``` + +5. 访问关键页面: + +```text +http://localhost:8080/cat +http://localhost:8080/cat/r +``` + +6. 记录启动日志中的关键错误和警告,作为后续对比基线。 + +### 验收标准 + +1. 项目可以编译。 +2. `cat-boot` 可以打包。 +3. 应用可以启动。 +4. 页面可以访问。 +5. 日志可以输出到控制台和文件。 + +### 回滚点 + +此阶段不改代码,只建立基线。 + +## 6. 阶段 1:建立 Spring 基础设施边界 + +### 目标 + +让 Spring 先管理基础设施 Bean,为后续替换 Plexus 提供入口。此阶段不替换 Unidal MVC,不改变页面请求链路。 + +### 涉及模块 + +1. `cat-boot` +2. `cat-core` + +### 执行步骤 + +1. 在 `cat-boot` 中建立 Spring 配置包: + +```text +com.dianping.cat.boot.config +com.dianping.cat.boot.mybatis +com.dianping.cat.boot.bridge +``` + +2. 明确 Spring 扫描范围: + +```java +@SpringBootApplication(scanBasePackages = { + "com.dianping.cat.boot" +}) +``` + +暂时不要全量扫描 `com.dianping.cat`,否则大量旧 `@Named` 组件可能被 Spring 误创建。 + +3. 新增 Spring 上下文桥接类: + +```text +SpringContextHolder +``` + +该类只用于过渡期。新增业务代码禁止通过静态 holder 获取 Bean。 + +4. 新增启动健康检查 Bean: + +```text +CatSpringStartupVerifier +``` + +检查内容: + +1. Spring `ApplicationContext` 已启动。 +2. 必要配置已加载。 +3. `cat.home` 和 `cat.log.path` 已初始化。 + +5. 保持 `EmbeddedCatServer` 仍按现有方式部署 `cat-home.war` 到 `/cat`。 + +### 验证方式 + +```bash +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +java -jar cat-boot\target\cat-boot-4.0-RC1.jar +``` + +### 验收标准 + +1. Spring Boot 正常启动。 +2. 内嵌 Tomcat 正常启动。 +3. `/cat` 应用正常部署。 +4. 没有重复 Bean、循环依赖、全量扫描导致的初始化异常。 + +### 回滚点 + +删除新增 Spring 配置和桥接类即可,不影响现有 Plexus 链路。 + +## 7. 阶段 2:让 MyBatis 和数据源交给 Spring 管理 + +### 目标 + +切断新 MyBatis Repository 对 Unidal `DataSourceManager` 的依赖,让 `DataSource`、`SqlSessionFactory`、`SqlSessionTemplate`、事务全部由 Spring 管理。 + +这是最推荐优先执行的阶段,边界清晰、收益最大。 + +### 涉及模块 + +1. `cat-boot` +2. `cat-core` +3. `cat-home` +4. `cat-alarm` + +### 执行步骤 + +1. 新增 Spring 数据源配置: + +```text +com.dianping.cat.boot.mybatis.CatDataSourceConfiguration +``` + +短期策略: + +1. 优先复用当前 `datasources.xml` 或等价连接参数,降低配置变化。 +2. 用 Spring Bean 包装出标准 `javax.sql.DataSource`。 +3. 保持数据源名称 `cat` 的兼容语义。 + +中期策略: + +1. 将数据库配置迁移到 `application.yml` 或外部配置文件。 +2. 使用 Spring Boot 标准 `spring.datasource.*`。 +3. 使用 HikariCP 或 Spring Boot 默认连接池。 + +2. 新增 MyBatis 配置: + +```text +com.dianping.cat.boot.mybatis.CatMyBatisConfiguration +``` + +配置内容: + +1. `SqlSessionFactoryBean` +2. `SqlSessionTemplate` +3. `DataSourceTransactionManager` +4. `@MapperScan` +5. Mapper XML 路径加载 + +Mapper 扫描范围建议先限定在新包: + +```text +com.dianping.cat.core.mybatis.mapper +com.dianping.cat.home.mybatis.mapper +com.dianping.cat.alarm.mybatis.mapper +``` + +3. 改造 `MyBatisRepositorySupport`。 + +当前问题: + +1. 持有 Unidal `DataSourceManager`。 +2. 手工构造 `SqlSessionFactory`。 +3. Repository 自己管理 `SqlSession`。 + +目标状态: + +1. 不再引用 `DataSourceManager`。 +2. 不再手工构造 `SqlSessionFactory`。 +3. Repository 通过构造器注入 Mapper。 +4. 写操作交给 Spring 事务。 + +4. 先选择 3 个低风险 Repository 做试点: + +```text +ConfigRepository +DailyReportRepository +HostinfoRepository +``` + +试点原因: + +1. `config` 是系统启动时高频读取表,能尽早暴露问题。 +2. `dailyreport` 已经迁移过,适合验证报表类查询。 +3. `hostinfo` 当前数据可能为空,适合验证空数据语义。 + +5. 保持兼容方法签名。 + +短期保留: + +```text +DalException +DalNotFoundException +Readset +Updateset +``` + +但方法内部不再依赖 Unidal DAL 查询引擎。 + +6. 写操作增加事务边界: + +```java +@Transactional +``` + +7. 删除已迁移 Repository 的 Plexus 注册。 + +检查位置: + +```text +cat-core/src/main/java/com/dianping/cat/build/*DatabaseConfigurator.java +cat-home/src/main/java/com/dianping/cat/build/*DatabaseConfigurator.java +cat-alarm/src/main/java/com/dianping/cat/build/*DatabaseConfigurator.java +``` + +### 验证方式 + +编译验证: + +```bash +mvn -pl cat-core -am compile -DskipTests +mvn -pl cat-alarm,cat-home -am compile -DskipTests +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +``` + +运行验证: + +1. 启动应用。 +2. 访问配置页。 +3. 访问报表页。 +4. 检查启动阶段 `server-config` 查询。 +5. 检查 `hostinfo` 空表时是否符合旧行为。 + +重点日志: + +1. 不能出现 Mapper 未注册。 +2. 不能出现事务管理器缺失。 +3. 不能出现 `DataSourceManager` 初始化失败。 +4. 查询不到数据时不能误报 ERROR。 + +### 验收标准 + +1. 试点 Repository 不再依赖 `DataSourceManager`。 +2. 试点 Repository 由 Spring 管理。 +3. Mapper 由 Spring 创建。 +4. 查询不到数据仍按旧行为抛 `DalNotFoundException`。 +5. 页面访问和启动配置加载正常。 + +### 回滚点 + +保留旧 `MyBatisRepositorySupport` 实现作为回滚参考。若 Spring MyBatis 配置异常,只回滚试点 Repository 和 Spring MyBatis 配置,不影响其他旧 DAO。 + +## 8. 阶段 3:批量迁移全部 MyBatis Repository + +### 目标 + +将当前约 50 个 MyBatis Repository 全部交给 Spring 管理,移除 Repository 层对 Unidal `DataSourceManager` 和 Plexus 注册的依赖。 + +### 执行分组 + +建议按模块分组迁移。 + +第一组:`cat-core` 基础表。 + +```text +config +dailyreport +hourlyreport +weeklyreport +monthreport +hostinfo +project +task +business_config +``` + +第二组:`cat-home` 页面和配置表。 + +```text +alert_summary +alteration +baseline +config_modification +metric_graph +metric_screen +overload +topology_graph +``` + +第三组:`cat-alarm` 告警表。 + +```text +alert +server_alarm_rule +user_define_rule +``` + +第四组:报表内容表。 + +```text +daily_report_content +hourly_report_content +monthly_report_content +weekly_report_content +``` + +### 执行步骤 + +1. 每次迁移一个模块或一组表,不跨模块混改。 +2. Repository 增加 Spring stereotype: + +```java +@Repository +``` + +3. 使用构造器注入 Mapper。 +4. 删除 `extends MyBatisRepositorySupport`。 +5. 删除 `openSession()` 手动 session 管理。 +6. 删除对应 Plexus role 注册。 +7. 保持外部调用方法签名。 +8. 保持异常语义兼容。 + +### 验证方式 + +每迁移一组执行: + +```bash +mvn -pl cat-core -am compile -DskipTests +mvn -pl cat-home -am compile -DskipTests +mvn -pl cat-alarm -am compile -DskipTests +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +``` + +检查旧依赖残留: + +```bash +rg -n "extends MyBatisRepositorySupport|DataSourceManager" cat-core/src/main/java cat-home/src/main/java cat-alarm/src/main/java +rg -n "C\\(.*Repository\\.class\\).*DataSourceManager" cat-core/src/main/java cat-home/src/main/java cat-alarm/src/main/java +``` + +### 验收标准 + +1. 所有新 MyBatis Repository 不再继承 `MyBatisRepositorySupport`。 +2. Repository 层不再引用 `DataSourceManager`。 +3. Repository 层不再需要 Plexus 注册。 +4. 所有 Mapper 能由 Spring 注入。 +5. 常用页面和后台任务读写正常。 + +### 回滚点 + +按分组回滚。不要在一个提交中混合迁移全部 Repository。 + +## 9. 阶段 4:迁移配置类 Manager 和基础 Service + +### 目标 + +将配置管理类和基础业务服务从 Plexus 组件迁移为 Spring Bean。 + +### 优先迁移对象 + +第一批配置管理类: + +```text +ServerConfigManager +AlertConfigManager +SenderConfigManager +BusinessConfigManager +AtomicMessageConfigManager +TpValueStatisticConfigManager +``` + +第二批基础服务: + +```text +HostinfoService +ProjectService +TaskManager +ServerStatisticManager +``` + +### 执行步骤 + +1. 将 `@Named` 替换为 Spring 注解: + +```java +@Component +@Service +``` + +2. 将 `org.unidal.lookup.annotation.Inject` 替换为构造器注入。 +3. 将 `Initializable.initialize()` 替换为: + +```java +@PostConstruct +``` + +或在需要明确启动顺序时使用: + +```java +SmartLifecycle +ApplicationRunner +``` + +4. 将 `LogEnabled` 替换为 SLF4J: + +```java +private static final Logger LOGGER = LoggerFactory.getLogger(CurrentClass.class); +``` + +5. 删除对应 Plexus role 注册。 +6. 对仍由 Plexus 创建、但需要访问 Spring Bean 的旧组件,短期使用桥接适配器。 +7. 避免新代码继续调用 `ContainerLoader.getDefaultContainer()`。 + +### 验证方式 + +```bash +mvn -pl cat-core -am compile -DskipTests +mvn -pl cat-alarm,cat-home -am compile -DskipTests +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +``` + +运行验证: + +1. 启动应用。 +2. 检查 `server-config` 加载。 +3. 修改配置后确认保存和读取正常。 +4. 检查配置刷新任务是否正常。 +5. 检查日志中没有重复初始化。 + +### 验收标准 + +1. 已迁移 Manager/Service 不再使用 Unidal `@Named`。 +2. 已迁移 Manager/Service 不再使用 Unidal `@Inject`。 +3. 已迁移 Manager/Service 不再依赖 `Initializable` 和 `LogEnabled`。 +4. 对应 Plexus role 已删除。 +5. 启动和配置读取行为保持兼容。 + +### 回滚点 + +按类回滚。配置管理类不要一次性全量迁移。 + +## 10. 阶段 5:迁移报表 Service 和业务 Manager + +### 目标 + +将报表查询、报表聚合、页面服务类从 Plexus 迁移到 Spring。 + +### 迁移对象 + +优先迁移服务类,而不是页面 Handler: + +```text +LocalTransactionService +HistoricalTransactionService +TransactionReportService +LocalEventService +HistoricalEventService +EventReportService +LocalProblemService +HistoricalProblemService +ProblemReportService +LocalHeartbeatService +HistoricalHeartbeatService +HeartbeatReportService +``` + +随后迁移: + +```text +DefaultReportManager +AbstractReportService 子类 +BusinessReportService +DependencyReportService +StateReportService +StorageReportService +MatrixReportService +TopReportService +``` + +### 执行步骤 + +1. 每次选择一个报表域迁移,例如 transaction 或 event。 +2. 将该报表域 Service 改为 Spring Bean。 +3. 保持 Handler 暂时仍由旧 MVC 创建。 +4. 通过桥接方式让旧 Handler 获取 Spring Service。 +5. 验证页面结果后,再迁移下一个报表域。 + +### 验证页面 + +至少覆盖: + +```text +/cat/r/t +/cat/r/e +/cat/r/p +/cat/r/h +/cat/r/state +/cat/r/top +``` + +具体 URL 以当前路由为准。 + +### 验收标准 + +1. 已迁移报表 Service 由 Spring 创建。 +2. 旧 Handler 仍可正常调用这些 Service。 +3. 报表页面正常渲染。 +4. 查询历史报表和实时报表均正常。 + +### 回滚点 + +按报表域回滚。某个报表域失败,不影响其他报表域。 + +## 11. 阶段 6:迁移后台任务和调度 + +### 目标 + +用 Spring 生命周期和 Spring 调度机制管理后台任务,替代 Plexus 初始化期间启动任务的方式。 + +### 迁移对象 + +```text +TimerSyncTask +ReportReloadTask +DefaultTaskConsumer +ProjectUpdateTask +CurrentReportBuilder +各类 ReportBuilder +各类 ReportReloader +CapacityUpdateTask +``` + +### 执行步骤 + +1. 新增 Spring 调度配置: + +```java +@EnableScheduling +``` + +2. 配置统一线程池: + +```text +ThreadPoolTaskScheduler +``` + +3. 将手动启动线程替换为: + +```java +@Scheduled +SmartLifecycle +ApplicationRunner +``` + +4. 每个任务增加开关配置,支持临时关闭。 +5. 任务启动日志必须包含任务名称和调度周期。 +6. 应用关闭时任务必须优雅停止。 +7. 防止同一任务被 Plexus 和 Spring 重复启动。 + +### 验证方式 + +1. 启动应用,观察任务启动日志。 +2. 检查同一任务是否只启动一次。 +3. 触发报表 reload。 +4. 触发项目更新任务。 +5. 关闭应用,确认线程池正常退出。 + +### 验收标准 + +1. 已迁移任务由 Spring 生命周期管理。 +2. 任务不会重复启动。 +3. 应用关闭无挂起线程。 +4. 任务异常有统一日志。 + +### 回滚点 + +按任务回滚。先迁移低风险任务,再迁移核心报表生成任务。 + +## 12. 阶段 7:迁移 Web 层到 Spring MVC + +### 目标 + +用 Spring MVC 替换 Unidal Web MVC 请求生命周期。 + +这是风险最高、改动最大的阶段,应在 DAO、Service、Manager、任务基本迁移完成后再执行。 + +### 当前旧链路 + +```text +org.unidal.web.MVC +DefaultRequestLifecycle +Page Handler +Payload +Model +BaseJspViewer +JSP +``` + +### 迁移策略 + +优先采用页面级渐进迁移: + +1. 第一阶段:Spring Controller 包装旧 Handler。 +2. 第二阶段:逐个页面替换为 Spring MVC Controller。 +3. 第三阶段:替换 Payload/Model 绑定方式。 +4. 第四阶段:替换 JSP Viewer。 +5. 第五阶段:删除 Unidal MVC。 + +### 优先页面 + +先迁移低风险页面: + +```text +home +config +state +logview +``` + +再迁移核心报表页面: + +```text +transaction +event +problem +heartbeat +business +dependency +matrix +top +``` + +最后迁移告警和复杂配置页面: + +```text +alert +router config +overload +storage +statistics +``` + +### 执行步骤 + +1. 新增 Spring MVC 配置。 +2. 配置 JSP ViewResolver。 +3. 保持静态资源路径兼容。 +4. 迁移 Filter: + +```text +PermissionFilter +DomainFilter +CatFilter +``` + +5. 增加统一异常处理: + +```java +@ControllerAdvice +``` + +6. 逐个页面迁移 Controller。 +7. 保持原 URL 尽量不变。 +8. 每迁移一个页面就删除对应旧路由注册。 + +### 验证页面 + +至少覆盖: + +```text +http://localhost:8080/cat +http://localhost:8080/cat/r +http://localhost:8080/cat/r/t +http://localhost:8080/cat/r/e +http://localhost:8080/cat/r/p +配置页面 +告警页面 +报表历史查询页面 +``` + +### 验收标准 + +1. 页面可以访问。 +2. JSP 正常渲染。 +3. 静态资源正常加载。 +4. 权限、domain、跳转逻辑正常。 +5. 原有 URL 尽量兼容。 +6. 已迁移页面不再经过 Unidal MVC。 + +### 回滚点 + +按页面回滚。不要一次性替换全部 MVC。 + +## 13. 阶段 8:移除 Plexus/Unidal Lookup + +### 目标 + +彻底移除旧容器。 + +### 前置条件 + +必须同时满足: + +1. DAO 已全部由 Spring 管理。 +2. Repository 不再依赖 `DataSourceManager`。 +3. Service/Manager 已由 Spring 管理。 +4. 后台任务已由 Spring 管理。 +5. Web 层已迁移到 Spring MVC,或不再依赖 Unidal MVC 生命周期。 +6. 运行时代码不再调用 `ContainerLoader.getDefaultContainer()`。 +7. 构建不再需要生成 `components.xml`。 + +### 执行步骤 + +1. 删除 `plexus-maven-plugin`。 +2. 删除 `META-INF/plexus/components.xml` 生成流程。 +3. 删除旧组件注册类。 +4. 删除 `org.unidal.lookup` 运行时依赖。 +5. 删除 `ContainerHolder`、`ContainerLoader` 使用。 +6. 删除旧 DAL 生成流程: + +```text +codegen-maven-plugin dal-jdbc +Readset +Updateset +旧 *Dao +``` + +7. 清理 POM 依赖: + +```text +org.unidal.framework:dal-jdbc +org.unidal.framework:foundation-service +org.unidal.framework:web-framework +org.unidal.framework:test-framework +``` + +注意:只有当没有代码引用时才能删除。 + +### 验证方式 + +```bash +mvn clean package -DskipTests +mvn test +``` + +运行验证: + +1. 应用启动。 +2. 页面访问。 +3. 数据库读写。 +4. 客户端上报。 +5. 报表生成。 +6. 告警链路。 +7. 应用关闭。 + +### 验收标准 + +1. 依赖树中不再需要 Plexus/Unidal Lookup。 +2. 构建不再生成 `components.xml`。 +3. 运行时没有 Plexus 容器初始化日志。 +4. 核心功能仍可用。 + +### 回滚点 + +此阶段风险最高,只能在前面阶段全部完成并稳定后执行。建议单独提交,单独验证。 + +## 14. 每阶段通用检查清单 + +每完成一个阶段或一组类迁移,都执行以下检查。 + +### 编译和打包 + +```bash +mvn -pl cat-core -am compile -DskipTests +mvn -pl cat-alarm,cat-home -am compile -DskipTests +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +``` + +### 旧 DAO import 检查 + +```bash +rg -n "import com\.dianping\.cat\.(core\.dal|core\.config|home\.dal\.report|alarm)\.[A-Za-z0-9]+Dao;" cat-core/src/main/java cat-home/src/main/java cat-alarm/src/main/java cat-consumer/src/main/java +``` + +### 旧容器查找检查 + +```bash +rg -n "ContainerLoader|getDefaultContainer|lookup\(" cat-core/src/main/java cat-home/src/main/java cat-alarm/src/main/java cat-consumer/src/main/java +``` + +### Plexus 注解和生命周期检查 + +```bash +rg -n "org\.unidal\.lookup\.annotation|@Named|Initializable|LogEnabled|ContainerHolder" cat-core/src/main/java cat-home/src/main/java cat-alarm/src/main/java cat-consumer/src/main/java +``` + +### 数据源旧依赖检查 + +```bash +rg -n "DataSourceManager|MyBatisRepositorySupport" cat-core/src/main/java cat-home/src/main/java cat-alarm/src/main/java cat-consumer/src/main/java +``` + +### 运行验证 + +1. 启动应用。 +2. 访问首页。 +3. 访问报表页。 +4. 访问配置页。 +5. 修改并保存一项配置。 +6. 检查日志文件。 +7. 检查控制台 ERROR。 +8. 正常停止应用。 + +## 15. 风险和应对 + +### 风险 1:双容器重复创建组件 + +表现: + +1. 初始化执行两次。 +2. 后台任务重复启动。 +3. 配置重复加载。 + +应对: + +1. Spring 扫描范围保持收敛。 +2. 每迁移一个组件就删除对应 Plexus role。 +3. 后台任务迁移时增加启动日志和唯一性检查。 + +### 风险 2:异常语义不兼容 + +表现: + +1. 查询不到数据被记录为 ERROR。 +2. 旧业务上层逻辑进入异常分支。 + +应对: + +1. `DalNotFoundException` 必须原样透传。 +2. Repository 不要统一包装所有异常。 +3. 为核心查询补充单元测试。 + +### 风险 3:事务边界变化 + +表现: + +1. 写操作未提交。 +2. 多表更新部分成功。 +3. 连接泄漏。 + +应对: + +1. 写操作统一加 `@Transactional`。 +2. Repository 不再手动管理 session。 +3. 用 Spring `DataSourceTransactionManager` 管理事务。 + +### 风险 4:启动顺序变化 + +表现: + +1. 配置还未加载,任务已启动。 +2. Web 页面访问时 Service 未初始化。 + +应对: + +1. 对关键 Bean 使用明确生命周期。 +2. 后台任务使用 `SmartLifecycle` 或 `ApplicationReadyEvent`。 +3. 不依赖字段注入的隐式顺序。 + +### 风险 5:Web 层迁移破坏 URL 和 JSP + +表现: + +1. 原 URL 404。 +2. JSP tag 或静态资源缺失。 +3. 权限过滤逻辑失效。 + +应对: + +1. Web 层最后迁移。 +2. 按页面迁移。 +3. 保留原 URL。 +4. 每个页面迁移后单独验收。 + +## 16. 推荐下一步 + +建议下一步从阶段 2 开始,先做一个最小可验证闭环: + +1. 新增 Spring `DataSource`、`SqlSessionFactory`、`SqlSessionTemplate`、`TransactionManager` 配置。 +2. 只迁移 `ConfigRepository`、`DailyReportRepository`、`HostinfoRepository` 三个 Repository。 +3. 保持旧方法签名和异常语义。 +4. 删除这三个 Repository 对 `DataSourceManager` 的依赖。 +5. 启动应用验证 `server-config`、报表查询、空 `hostinfo` 表行为。 +6. 通过后再批量迁移其他 Repository。 + +这个顺序收益最大,因为它先把 DAO 基础设施从 Unidal 中解耦出来,同时不会立即触碰最高风险的 Web MVC 链路。 diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java index 539bf443f3..e5aebecb49 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java @@ -1,29 +1,27 @@ package com.dianping.cat.core.mybatis.repository.alert; import com.dianping.cat.alarm.Alert; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; import com.dianping.cat.core.mybatis.generated.alert.dao.AlertMapper; import com.dianping.cat.core.mybatis.generated.alert.dao.data.AlertDO; -import java.util.Date; +import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import java.util.List; import java.util.stream.Collectors; import org.apache.ibatis.session.SqlSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -public class AlertRepository extends MyBatisRepositorySupport { - private static final String MAPPER_RESOURCE = "mybatis/mapper/AlertMapper.xml"; +public class AlertRepository extends SpringBackedRepositorySupport { + private static final Logger LOGGER = LoggerFactory.getLogger(AlertRepository.class); - @Override - protected Class getMapperClass() { - return AlertMapper.class; - } + private static final String MAPPER_RESOURCE = "mybatis/mapper/AlertMapper.xml"; - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; + public AlertRepository() { + super(AlertMapper.class, MAPPER_RESOURCE, "AlertRepository is using Spring managed AlertMapper."); } public Alert createLocal() { @@ -31,9 +29,14 @@ public Alert createLocal() { } public int deleteByPK(Alert proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - AlertMapper mapper = session.getMapper(AlertMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(AlertMapper.class).deleteByPrimaryKey(proto.getKeyId()); session.commit(); return count; } catch (Exception e) { @@ -42,63 +45,98 @@ public int deleteByPK(Alert proto) throws DalException { } public List queryAlertsByTimeDomain(java.util.Date startTime, java.util.Date endTime, String domain, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - AlertMapper mapper = session.getMapper(AlertMapper.class); - AlertDO record = new AlertDO(); - record.setStartTime(startTime); - record.setEndTime(endTime); - record.setDomain(domain); + AlertMapper mapper = springMapper(LOGGER); + AlertDO record = new AlertDO(); + + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setDomain(domain); + if (mapper != null) { return mapper.queryAlertsByTimeDomain(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(AlertMapper.class).queryAlertsByTimeDomain(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing queryAlertsByTimeDomain for Alert.", e); } } public List queryAlertsByTimeDomainCategories(java.util.Date startTime, java.util.Date endTime, String domain, String[] categories, Readset readset) throws DalException { + AlertMapper mapper = springMapper(LOGGER); + AlertDO record = new AlertDO(); + + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setDomain(domain); + record.setCategories(categories); + if (mapper != null) { + return mapper.queryAlertsByTimeDomainCategories(record).stream().map(this::toModel) + .collect(Collectors.toList()); + } + try (SqlSession session = openSession()) { - AlertMapper mapper = session.getMapper(AlertMapper.class); - AlertDO record = new AlertDO(); - record.setStartTime(startTime); - record.setEndTime(endTime); - record.setDomain(domain); - record.setCategories(categories); - return mapper.queryAlertsByTimeDomainCategories(record).stream().map(this::toModel).collect(Collectors.toList()); + return session.getMapper(AlertMapper.class).queryAlertsByTimeDomainCategories(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing queryAlertsByTimeDomainCategories for Alert.", e); } } public List queryAlertsByTimeCategoryDomain(java.util.Date startTime, java.util.Date endTime, String category, String domain, Readset readset) throws DalException { + AlertMapper mapper = springMapper(LOGGER); + AlertDO record = new AlertDO(); + + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setCategory(category); + record.setDomain(domain); + if (mapper != null) { + return mapper.queryAlertsByTimeCategoryDomain(record).stream().map(this::toModel) + .collect(Collectors.toList()); + } + try (SqlSession session = openSession()) { - AlertMapper mapper = session.getMapper(AlertMapper.class); - AlertDO record = new AlertDO(); - record.setStartTime(startTime); - record.setEndTime(endTime); - record.setCategory(category); - record.setDomain(domain); - return mapper.queryAlertsByTimeCategoryDomain(record).stream().map(this::toModel).collect(Collectors.toList()); + return session.getMapper(AlertMapper.class).queryAlertsByTimeCategoryDomain(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing queryAlertsByTimeCategoryDomain for Alert.", e); } } public List queryAlertsByTimeCategory(java.util.Date startTime, java.util.Date endTime, String category, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - AlertMapper mapper = session.getMapper(AlertMapper.class); - AlertDO record = new AlertDO(); - record.setStartTime(startTime); - record.setEndTime(endTime); - record.setCategory(category); + AlertMapper mapper = springMapper(LOGGER); + AlertDO record = new AlertDO(); + + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setCategory(category); + if (mapper != null) { return mapper.queryAlertsByTimeCategory(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(AlertMapper.class).queryAlertsByTimeCategory(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing queryAlertsByTimeCategory for Alert.", e); } } public Alert findByPK(int keyId, Readset readset) throws DalException { + AlertMapper mapper = springMapper(LOGGER); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - AlertMapper mapper = session.getMapper(AlertMapper.class); - AlertDO record = mapper.findByPrimaryKey(keyId); + AlertDO record = session.getMapper(AlertMapper.class).findByPrimaryKey(keyId); return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -108,10 +146,20 @@ public Alert findByPK(int keyId, Readset readset) throws DalException { } public int insert(Alert proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + AlertDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - AlertMapper mapper = session.getMapper(AlertMapper.class); AlertDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(AlertMapper.class).insert(record); session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -122,9 +170,14 @@ public int insert(Alert proto) throws DalException { } public int updateByPK(Alert proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - AlertMapper mapper = session.getMapper(AlertMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(AlertMapper.class).updateByPrimaryKey(toRecord(proto)); session.commit(); return count; } catch (Exception e) { diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java index 1a6aa9e973..a1d0a10822 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java @@ -1,29 +1,28 @@ package com.dianping.cat.core.mybatis.repository.server.alarm.rule; import com.dianping.cat.alarm.ServerAlarmRule; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; import com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao.ServerAlarmRuleMapper; import com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao.data.ServerAlarmRuleDO; -import java.util.Date; +import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import java.util.List; import java.util.stream.Collectors; import org.apache.ibatis.session.SqlSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -public class ServerAlarmRuleRepository extends MyBatisRepositorySupport { - private static final String MAPPER_RESOURCE = "mybatis/mapper/ServerAlarmRuleMapper.xml"; +public class ServerAlarmRuleRepository extends SpringBackedRepositorySupport { + private static final Logger LOGGER = LoggerFactory.getLogger(ServerAlarmRuleRepository.class); - @Override - protected Class getMapperClass() { - return ServerAlarmRuleMapper.class; - } + private static final String MAPPER_RESOURCE = "mybatis/mapper/ServerAlarmRuleMapper.xml"; - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; + public ServerAlarmRuleRepository() { + super(ServerAlarmRuleMapper.class, MAPPER_RESOURCE, + "ServerAlarmRuleRepository is using Spring managed ServerAlarmRuleMapper."); } public ServerAlarmRule createLocal() { @@ -31,9 +30,14 @@ public ServerAlarmRule createLocal() { } public int deleteByPK(ServerAlarmRule proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - ServerAlarmRuleMapper mapper = session.getMapper(ServerAlarmRuleMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(ServerAlarmRuleMapper.class).deleteByPrimaryKey(proto.getKeyId()); session.commit(); return count; } catch (Exception e) { @@ -42,19 +46,31 @@ public int deleteByPK(ServerAlarmRule proto) throws DalException { } public List findAll(Readset readset) throws DalException { - try (SqlSession session = openSession()) { - ServerAlarmRuleMapper mapper = session.getMapper(ServerAlarmRuleMapper.class); - ServerAlarmRuleDO record = new ServerAlarmRuleDO(); + ServerAlarmRuleMapper mapper = springMapper(LOGGER); + ServerAlarmRuleDO record = new ServerAlarmRuleDO(); + + if (mapper != null) { return mapper.findAll(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(ServerAlarmRuleMapper.class).findAll(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findAll for ServerAlarmRule.", e); } } public ServerAlarmRule findByPK(int keyId, Readset readset) throws DalException { + ServerAlarmRuleMapper mapper = springMapper(LOGGER); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - ServerAlarmRuleMapper mapper = session.getMapper(ServerAlarmRuleMapper.class); - ServerAlarmRuleDO record = mapper.findByPrimaryKey(keyId); + ServerAlarmRuleDO record = session.getMapper(ServerAlarmRuleMapper.class).findByPrimaryKey(keyId); return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -64,10 +80,20 @@ public ServerAlarmRule findByPK(int keyId, Readset readset) thr } public int insert(ServerAlarmRule proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + ServerAlarmRuleDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - ServerAlarmRuleMapper mapper = session.getMapper(ServerAlarmRuleMapper.class); ServerAlarmRuleDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(ServerAlarmRuleMapper.class).insert(record); session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -78,9 +104,14 @@ public int insert(ServerAlarmRule proto) throws DalException { } public int updateByPK(ServerAlarmRule proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - ServerAlarmRuleMapper mapper = session.getMapper(ServerAlarmRuleMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(ServerAlarmRuleMapper.class).updateByPrimaryKey(toRecord(proto)); session.commit(); return count; } catch (Exception e) { diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java index 2f49107009..2e3fed4dea 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java @@ -1,29 +1,26 @@ package com.dianping.cat.core.mybatis.repository.user.define.rule; import com.dianping.cat.alarm.UserDefineRule; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; import com.dianping.cat.core.mybatis.generated.user.define.rule.dao.UserDefineRuleMapper; import com.dianping.cat.core.mybatis.generated.user.define.rule.dao.data.UserDefineRuleDO; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; +import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import org.apache.ibatis.session.SqlSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -public class UserDefineRuleRepository extends MyBatisRepositorySupport { - private static final String MAPPER_RESOURCE = "mybatis/mapper/UserDefineRuleMapper.xml"; +public class UserDefineRuleRepository extends SpringBackedRepositorySupport { + private static final Logger LOGGER = LoggerFactory.getLogger(UserDefineRuleRepository.class); - @Override - protected Class getMapperClass() { - return UserDefineRuleMapper.class; - } + private static final String MAPPER_RESOURCE = "mybatis/mapper/UserDefineRuleMapper.xml"; - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; + public UserDefineRuleRepository() { + super(UserDefineRuleMapper.class, MAPPER_RESOURCE, + "UserDefineRuleRepository is using Spring managed UserDefineRuleMapper."); } public UserDefineRule createLocal() { @@ -31,9 +28,14 @@ public UserDefineRule createLocal() { } public int deleteByPK(UserDefineRule proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - UserDefineRuleMapper mapper = session.getMapper(UserDefineRuleMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(UserDefineRuleMapper.class).deleteByPrimaryKey(proto.getKeyId()); session.commit(); return count; } catch (Exception e) { @@ -42,9 +44,14 @@ public int deleteByPK(UserDefineRule proto) throws DalException { } public UserDefineRule findByPK(int keyId, Readset readset) throws DalException { + UserDefineRuleMapper mapper = springMapper(LOGGER); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - UserDefineRuleMapper mapper = session.getMapper(UserDefineRuleMapper.class); - UserDefineRuleDO record = mapper.findByPrimaryKey(keyId); + UserDefineRuleDO record = session.getMapper(UserDefineRuleMapper.class).findByPrimaryKey(keyId); return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -54,10 +61,19 @@ public UserDefineRule findByPK(int keyId, Readset readset) throw } public UserDefineRule findMaxId(Readset readset) throws DalException { - try (SqlSession session = openSession()) { - UserDefineRuleMapper mapper = session.getMapper(UserDefineRuleMapper.class); - UserDefineRuleDO record = new UserDefineRuleDO(); + UserDefineRuleMapper mapper = springMapper(LOGGER); + UserDefineRuleDO record = new UserDefineRuleDO(); + + if (mapper != null) { UserDefineRuleDO result = mapper.findMaxId(record).stream().findFirst().orElse(null); + + return requireFound(result, "findMaxId", record.toString()); + } + + try (SqlSession session = openSession()) { + UserDefineRuleDO result = session.getMapper(UserDefineRuleMapper.class).findMaxId(record).stream() + .findFirst() + .orElse(null); return requireFound(result, "findMaxId", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -67,10 +83,20 @@ public UserDefineRule findMaxId(Readset readset) throws DalExcep } public int insert(UserDefineRule proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + UserDefineRuleDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - UserDefineRuleMapper mapper = session.getMapper(UserDefineRuleMapper.class); UserDefineRuleDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(UserDefineRuleMapper.class).insert(record); session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -81,9 +107,14 @@ public int insert(UserDefineRule proto) throws DalException { } public int updateByPK(UserDefineRule proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - UserDefineRuleMapper mapper = session.getMapper(UserDefineRuleMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(UserDefineRuleMapper.class).updateByPrimaryKey(toRecord(proto)); session.commit(); return count; } catch (Exception e) { diff --git a/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml b/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml index 7fbb4d9dd1..06de1f4a5a 100644 --- a/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml +++ b/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml @@ -62,18 +62,18 @@ diff --git a/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java b/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java index eca14762b1..d3ab1e5daa 100644 --- a/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java +++ b/cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java @@ -6,7 +6,11 @@ import org.slf4j.bridge.SLF4JBridgeHandler; import org.springframework.boot.SpringApplication; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.context.annotation.ComponentScan; +@SpringBootConfiguration +@ComponentScan(basePackages = "com.dianping.cat.boot") public class CatBootApplication { public static void main(String[] args) throws Exception { diff --git a/cat-boot/src/main/java/com/dianping/cat/boot/config/CatSpringStartupVerifier.java b/cat-boot/src/main/java/com/dianping/cat/boot/config/CatSpringStartupVerifier.java new file mode 100644 index 0000000000..fb088091cd --- /dev/null +++ b/cat-boot/src/main/java/com/dianping/cat/boot/config/CatSpringStartupVerifier.java @@ -0,0 +1,25 @@ +package com.dianping.cat.boot.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.ApplicationRunner; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +@Component +public class CatSpringStartupVerifier implements ApplicationRunner { + private static final Logger LOGGER = LoggerFactory.getLogger(CatSpringStartupVerifier.class); + + private final ApplicationContext m_applicationContext; + + public CatSpringStartupVerifier(ApplicationContext applicationContext) { + m_applicationContext = applicationContext; + } + + @Override + public void run(org.springframework.boot.ApplicationArguments args) { + LOGGER.info("Spring context initialized, id={}, cat.home={}, cat.log.path={}, server.port={}", + m_applicationContext.getId(), System.getProperty("cat.home"), System.getProperty("cat.log.path"), + System.getProperty("server.port", "8080")); + } +} diff --git a/cat-core/pom.xml b/cat-core/pom.xml index 4499830529..67b6858af4 100644 --- a/cat-core/pom.xml +++ b/cat-core/pom.xml @@ -35,6 +35,18 @@ org.mybatis mybatis + + org.springframework + spring-context + + + org.mybatis + mybatis-spring + + + org.springframework + spring-tx + org.projectlombok lombok diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java b/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java index b20706c3e3..f94785905f 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java @@ -34,6 +34,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.spring.CatSpringContext; @Named(type = MessageAnalyzerManager.class) public class DefaultMessageAnalyzerManager extends ContainerHolder @@ -147,7 +148,11 @@ public int compare(String str1, String str2) { } }); - ServerConfigManager manager = lookup(ServerConfigManager.class); + ServerConfigManager manager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + + if (manager == null) { + manager = lookup(ServerConfigManager.class); + } List disables = new ArrayList(); for (String name : m_analyzerNames) { diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/TcpSocketReceiver.java b/cat-core/src/main/java/com/dianping/cat/analysis/TcpSocketReceiver.java index d3bc7715e3..fe8bfc6785 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/TcpSocketReceiver.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/TcpSocketReceiver.java @@ -68,7 +68,7 @@ public final class TcpSocketReceiver implements LogEnabled { private Logger m_logger; - private final int m_port = 2280; // default port number from phone, C:2, A:2, T:8 + private final int m_port = Integer.getInteger("cat.tcp.port", 2280); // default port number from phone, C:2, A:2, T:8 public synchronized void destory() { try { @@ -185,4 +185,4 @@ protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List ou } } -} \ No newline at end of file +} diff --git a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java index 2de330a931..c447692ab9 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java @@ -158,6 +158,14 @@ public String queryMaxMetricTagValues(String domain) { return "10000"; } + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + public int getPropertyValue(String domain, String propertyName, int defaultValue) { int result = defaultValue; Domain d = m_config.findDomain(domain); diff --git a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java index 52c562eadd..024f6ba6d9 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java @@ -145,6 +145,14 @@ public List queryByReportType(String type) { return results; } + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + private void refreshConfig() throws Exception { Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); long modifyTime = config.getModifyDate().getTime(); diff --git a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java index 774e44eded..23cf8d40d7 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java @@ -41,6 +41,7 @@ import com.dianping.cat.core.config.BusinessConfig; import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; import com.dianping.cat.core.config.BusinessConfigEntity; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -52,6 +53,8 @@ public class BusinessConfigManager extends ContainerHolder implements Initializa @Inject private BusinessConfigRepository m_configDao; + private ServerConfigManager m_serverConfigManager; + private Map> m_domains = new ConcurrentHashMap>(); private Map m_configs = new ConcurrentHashMap(); @@ -112,7 +115,15 @@ public boolean deleteCustomItem(String domain, String key) { @Override public void initialize() throws InitializationException { - ServerConfigManager serverConfigManager = lookup(ServerConfigManager.class); + ServerConfigManager serverConfigManager = m_serverConfigManager; + + if (serverConfigManager == null) { + serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + } + if (serverConfigManager == null) { + serverConfigManager = lookup(ServerConfigManager.class); + } + m_alertMachine = serverConfigManager.isAlertMachine(); loadData(); @@ -131,6 +142,14 @@ public String getName() { }); } + public void setConfigDao(BusinessConfigRepository configDao) { + m_configDao = configDao; + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + m_serverConfigManager = serverConfigManager; + } + private void loadData() { try { List configs = m_configDao.findByName(BASE_CONFIG, BusinessConfigEntity.READSET_FULL); diff --git a/cat-core/src/main/java/com/dianping/cat/config/content/LocalResourceContentFetcher.java b/cat-core/src/main/java/com/dianping/cat/config/content/LocalResourceContentFetcher.java index 2f5350a4ff..ca703f9ed0 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/content/LocalResourceContentFetcher.java +++ b/cat-core/src/main/java/com/dianping/cat/config/content/LocalResourceContentFetcher.java @@ -49,4 +49,8 @@ public String getConfigContent(String configName) { public void enableLogging(Logger logger) { m_logger = logger; } + + public void setLogger(Logger logger) { + m_logger = logger; + } } diff --git a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java index cfdaf9fa7b..d75990bc39 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java @@ -98,6 +98,14 @@ public String getName() { }); } + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + public boolean insert(String xml) { try { m_config = DefaultSaxParser.parse(xml); diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java index 9678e83719..ca918dc845 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java @@ -112,6 +112,14 @@ public void enableLogging(Logger logger) { m_logger = logger; } + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + public ServerConfig getConfig() { return m_config; } diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java index ae05a88516..1dbfef98b3 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java @@ -141,6 +141,14 @@ public String getName() { }); } + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + public boolean insert(String xml) { try { m_config = DefaultSaxParser.parse(xml); diff --git a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java index b4b411e709..97faa0f1d7 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java @@ -119,6 +119,18 @@ public boolean insert(String xml) { } } + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + m_serverConfigManager = serverConfigManager; + } + private void refreshConfig() throws Exception { Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); long modifyTime = config.getModifyDate().getTime(); diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java index f8c4dc05c6..46f1264483 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java @@ -4,18 +4,23 @@ import java.io.Reader; import java.sql.Connection; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import javax.sql.DataSource; +import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.builder.xml.XMLMapperBuilder; import org.apache.ibatis.io.Resources; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.session.Configuration; -import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.mybatis.spring.SqlSessionTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; @@ -26,15 +31,24 @@ import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.dao.ConfigMapper; import com.dianping.cat.core.config.dao.data.ConfigDO; +import com.dianping.cat.spring.CatSpringContext; public class ConfigRepository { + private static final Logger LOGGER = LoggerFactory.getLogger(ConfigRepository.class); + private static final String DATA_SOURCE_NAME = "cat"; private static final String MAPPER_RESOURCE = "mybatis/mapper/ConfigMapper.xml"; + private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); + @Inject private DataSourceManager m_dataSourceManager; + private SqlSessionTemplate m_sqlSessionTemplate; + + private TransactionTemplate m_transactionTemplate; + private volatile SqlSessionFactory m_sqlSessionFactory; public Config createLocal() { @@ -42,6 +56,12 @@ public Config createLocal() { } public int deleteByPK(Config proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteById(proto.getKeyId())); + } + try (SqlSession session = openSession()) { int count = session.getMapper(ConfigMapper.class).deleteById(proto.getKeyId()); @@ -53,6 +73,12 @@ public int deleteByPK(Config proto) throws DalException { } public List findAllConfig(Readset readset) throws DalException { + ConfigMapper mapper = springMapper(); + + if (mapper != null) { + return mapper.queryAll().stream().map(this::toConfig).collect(Collectors.toList()); + } + try (SqlSession session = openSession()) { return session.getMapper(ConfigMapper.class).queryAll().stream() .map(this::toConfig) @@ -63,6 +89,12 @@ public List findAllConfig(Readset readset) throws DalException { } public Config findByName(String name, Readset readset) throws DalException { + ConfigMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findByName(name), "name", name); + } + try (SqlSession session = openSession()) { ConfigDO config = session.getMapper(ConfigMapper.class).findByName(name); @@ -75,6 +107,12 @@ public Config findByName(String name, Readset readset) throws DalExcepti } public Config findByPK(int keyId, Readset readset) throws DalException { + ConfigMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findById(keyId), "id", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { ConfigDO config = session.getMapper(ConfigMapper.class).findById(keyId); @@ -87,6 +125,17 @@ public Config findByPK(int keyId, Readset readset) throws DalException { } public int insert(Config proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + ConfigDO config = toConfigDO(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(config)); + + proto.setId(config.getId()); + proto.setKeyId(config.getId()); + return count; + } + try (SqlSession session = openSession()) { ConfigDO config = toConfigDO(proto); int count = session.getMapper(ConfigMapper.class).insert(config); @@ -101,6 +150,12 @@ public int insert(Config proto) throws DalException { } public int updateByPK(Config proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateById(toConfigDO(proto))); + } + try (SqlSession session = openSession()) { int count = session.getMapper(ConfigMapper.class).updateById(toConfigDO(proto)); @@ -132,6 +187,40 @@ private SqlSession openSession() { return getSqlSessionFactory().openSession(false); } + private ConfigMapper springMapper() { + SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; + + if (sqlSessionTemplate == null) { + sqlSessionTemplate = CatSpringContext.getBean(SqlSessionTemplate.class); + } + + if (sqlSessionTemplate == null) { + return null; + } + + if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { + LOGGER.info("ConfigRepository is using Spring managed ConfigMapper."); + } + + return sqlSessionTemplate.getMapper(ConfigMapper.class); + } + + private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate != null) { + return m_transactionTemplate; + } + + return CatSpringContext.getBean(TransactionTemplate.class); + } + + public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { + m_sqlSessionTemplate = sqlSessionTemplate; + } + + public void setTransactionTemplate(TransactionTemplate transactionTemplate) { + m_transactionTemplate = transactionTemplate; + } + private Config requireFound(ConfigDO config, String field, String value) throws DalNotFoundException { if (config == null) { throw new DalNotFoundException(String.format("No config found by %s(%s).", field, value)); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java new file mode 100644 index 0000000000..0e1d3439d8 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java @@ -0,0 +1,63 @@ +package com.dianping.cat.core.mybatis.repository; + +import java.util.concurrent.atomic.AtomicBoolean; + +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.slf4j.Logger; +import org.springframework.transaction.support.TransactionTemplate; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.lookup.annotation.Inject; + +public abstract class SpringBackedRepositorySupport { + @Inject + private DataSourceManager m_dataSourceManager; + + private final Class m_mapperClass; + + private final String m_mapperResource; + + private final String m_springMapperMessage; + + private final AtomicBoolean m_springMapperLogged = new AtomicBoolean(); + + private volatile SqlSessionFactory m_sqlSessionFactory; + + protected SpringBackedRepositorySupport(Class mapperClass, String mapperResource, + String springMapperMessage) { + m_mapperClass = mapperClass; + m_mapperResource = mapperResource; + m_springMapperMessage = springMapperMessage; + } + + protected SqlSession openSession() { + return getSqlSessionFactory().openSession(false); + } + + protected T springMapper(Logger logger) { + return SupportingMyBatisRepository.springMapper(m_mapperClass, logger, m_springMapperLogged, + m_springMapperMessage); + } + + protected TransactionTemplate springTransactionTemplate() { + return SupportingMyBatisRepository.springTransactionTemplate(); + } + + private SqlSessionFactory getSqlSessionFactory() { + SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + synchronized (this) { + sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + sqlSessionFactory = SupportingMyBatisRepository.newSqlSessionFactory(m_dataSourceManager, + m_mapperClass, m_mapperResource); + m_sqlSessionFactory = sqlSessionFactory; + } + } + } + + return sqlSessionFactory; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/MyBatisRepositorySupport.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SupportingMyBatisRepository.java similarity index 65% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/MyBatisRepositorySupport.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SupportingMyBatisRepository.java index d70208a25a..cb3726c69a 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/MyBatisRepositorySupport.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SupportingMyBatisRepository.java @@ -1,8 +1,9 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.core.mybatis.repository; import java.io.IOException; import java.io.Reader; import java.sql.Connection; +import java.util.concurrent.atomic.AtomicBoolean; import javax.sql.DataSource; @@ -10,49 +11,51 @@ import org.apache.ibatis.io.Resources; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.session.Configuration; -import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.mybatis.spring.SqlSessionTemplate; +import org.slf4j.Logger; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; -public abstract class MyBatisRepositorySupport { - private static final String DATA_SOURCE_NAME = "cat"; - - @Inject - private DataSourceManager m_dataSourceManager; +import com.dianping.cat.spring.CatSpringContext; - private volatile SqlSessionFactory m_sqlSessionFactory; +public final class SupportingMyBatisRepository { + private static final String DATA_SOURCE_NAME = "cat"; - protected abstract Class getMapperClass(); + private SupportingMyBatisRepository() { + } - protected abstract String getMapperResource(); + public static SqlSessionFactory newSqlSessionFactory(DataSourceManager dataSourceManager, Class mapperClass, + String mapperResource) { + Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), + new UnidalDataSource(dataSourceManager, DATA_SOURCE_NAME))); - protected SqlSession openSession() { - return getSqlSessionFactory().openSession(false); + configuration.addMapper(mapperClass); + loadMapperXml(configuration, mapperResource); + return new SqlSessionFactoryBuilder().build(configuration); } - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; + public static T springMapper(Class mapperClass, Logger logger, AtomicBoolean logged, String message) { + SqlSessionTemplate sqlSessionTemplate = CatSpringContext.getBean(SqlSessionTemplate.class); - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; + if (sqlSessionTemplate == null) { + return null; + } - if (sqlSessionFactory == null) { - sqlSessionFactory = newSqlSessionFactory(); - m_sqlSessionFactory = sqlSessionFactory; - } - } + if (logged.compareAndSet(false, true)) { + logger.info(message); } - return sqlSessionFactory; + return sqlSessionTemplate.getMapper(mapperClass); } - private void loadMapperXml(Configuration configuration) { - String mapperResource = getMapperResource(); + public static TransactionTemplate springTransactionTemplate() { + return CatSpringContext.getBean(TransactionTemplate.class); + } + private static void loadMapperXml(Configuration configuration, String mapperResource) { try (Reader reader = Resources.getResourceAsReader(mapperResource)) { XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, mapperResource, configuration.getSqlFragments()); @@ -63,15 +66,6 @@ private void loadMapperXml(Configuration configuration) { } } - private SqlSessionFactory newSqlSessionFactory() { - Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), - new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); - - configuration.addMapper(getMapperClass()); - loadMapperXml(configuration); - return new SqlSessionFactoryBuilder().build(configuration); - } - private static final class UnidalDataSource implements DataSource { private final DataSourceManager m_dataSourceManager; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java index 4e6bc2dfc0..a8ebd0dc6f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java @@ -1,39 +1,57 @@ package com.dianping.cat.core.mybatis.repository.business.config; -import com.dianping.cat.core.config.BusinessConfig; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; -import com.dianping.cat.core.mybatis.generated.business.config.dao.BusinessConfigMapper; -import com.dianping.cat.core.mybatis.generated.business.config.dao.data.BusinessConfigDO; -import java.util.Date; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; + import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.core.config.BusinessConfig; +import com.dianping.cat.core.mybatis.generated.business.config.dao.BusinessConfigMapper; +import com.dianping.cat.core.mybatis.generated.business.config.dao.data.BusinessConfigDO; +import com.dianping.cat.core.mybatis.repository.SupportingMyBatisRepository; + +public class BusinessConfigRepository { + private static final Logger LOGGER = LoggerFactory.getLogger(BusinessConfigRepository.class); -public class BusinessConfigRepository extends MyBatisRepositorySupport { private static final String MAPPER_RESOURCE = "mybatis/mapper/BusinessConfigMapper.xml"; - @Override - protected Class getMapperClass() { - return BusinessConfigMapper.class; - } + private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; - } + @Inject + private DataSourceManager m_dataSourceManager; + + private SqlSessionTemplate m_sqlSessionTemplate; + + private TransactionTemplate m_transactionTemplate; + + private volatile SqlSessionFactory m_sqlSessionFactory; public BusinessConfig createLocal() { return new BusinessConfig(); } public int deleteByPK(BusinessConfig proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - BusinessConfigMapper mapper = session.getMapper(BusinessConfigMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(BusinessConfigMapper.class).deleteByPrimaryKey(proto.getKeyId()); + session.commit(); return count; } catch (Exception e) { @@ -42,20 +60,33 @@ public int deleteByPK(BusinessConfig proto) throws DalException { } public List findByName(String name, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - BusinessConfigMapper mapper = session.getMapper(BusinessConfigMapper.class); - BusinessConfigDO record = new BusinessConfigDO(); - record.setName(name); + BusinessConfigMapper mapper = springMapper(); + BusinessConfigDO record = new BusinessConfigDO(); + + record.setName(name); + if (mapper != null) { return mapper.findByName(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(BusinessConfigMapper.class).findByName(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findByName for BusinessConfig.", e); } } public BusinessConfig findByPK(int keyId, Readset readset) throws DalException { + BusinessConfigMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - BusinessConfigMapper mapper = session.getMapper(BusinessConfigMapper.class); - BusinessConfigDO record = mapper.findByPrimaryKey(keyId); + BusinessConfigDO record = session.getMapper(BusinessConfigMapper.class).findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -64,13 +95,24 @@ public BusinessConfig findByPK(int keyId, Readset readset) throw } } - public BusinessConfig findByNameDomain(String name, String domain, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - BusinessConfigMapper mapper = session.getMapper(BusinessConfigMapper.class); - BusinessConfigDO record = new BusinessConfigDO(); - record.setName(name); - record.setDomain(domain); + public BusinessConfig findByNameDomain(String name, String domain, Readset readset) + throws DalException { + BusinessConfigMapper mapper = springMapper(); + BusinessConfigDO record = new BusinessConfigDO(); + + record.setName(name); + record.setDomain(domain); + if (mapper != null) { BusinessConfigDO result = mapper.findByNameDomain(record).stream().findFirst().orElse(null); + + return requireFound(result, "findByNameDomain", record.toString()); + } + + try (SqlSession session = openSession()) { + BusinessConfigDO result = session.getMapper(BusinessConfigMapper.class).findByNameDomain(record).stream() + .findFirst() + .orElse(null); + return requireFound(result, "findByNameDomain", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -80,10 +122,21 @@ public BusinessConfig findByNameDomain(String name, String domain, Readset springMapper().insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - BusinessConfigMapper mapper = session.getMapper(BusinessConfigMapper.class); BusinessConfigDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(BusinessConfigMapper.class).insert(record); + session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -94,9 +147,15 @@ public int insert(BusinessConfig proto) throws DalException { } public int updateByPK(BusinessConfig proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - BusinessConfigMapper mapper = session.getMapper(BusinessConfigMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(BusinessConfigMapper.class).updateByPrimaryKey(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -105,9 +164,15 @@ public int updateByPK(BusinessConfig proto, Updateset updateset) } public int updateBaseConfigByDomain(BusinessConfig proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateBaseConfigByDomain(toRecord(proto))); + } + try (SqlSession session = openSession()) { - BusinessConfigMapper mapper = session.getMapper(BusinessConfigMapper.class); - int count = mapper.updateBaseConfigByDomain(toRecord(proto)); + int count = session.getMapper(BusinessConfigMapper.class).updateBaseConfigByDomain(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -115,6 +180,57 @@ public int updateBaseConfigByDomain(BusinessConfig proto, Updateset getMapperClass() { - return DailyReportContentMapper.class; - } + private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; - } + @Inject + private DataSourceManager m_dataSourceManager; + + private volatile SqlSessionFactory m_sqlSessionFactory; public DailyReportContent createLocal() { return new DailyReportContent(); } public int deleteByPK(DailyReportContent proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyReportId())); + } + try (SqlSession session = openSession()) { - DailyReportContentMapper mapper = session.getMapper(DailyReportContentMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyReportId()); + int count = session.getMapper(DailyReportContentMapper.class).deleteByPrimaryKey(proto.getKeyReportId()); + session.commit(); return count; } catch (Exception e) { @@ -41,21 +54,35 @@ public int deleteByPK(DailyReportContent proto) throws DalException { } } - public List findOverloadReport(int startId, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - DailyReportContentMapper mapper = session.getMapper(DailyReportContentMapper.class); - DailyReportContentDO record = new DailyReportContentDO(); - record.setStartId(startId); + public List findOverloadReport(int startId, Readset readset) + throws DalException { + DailyReportContentMapper mapper = springMapper(); + DailyReportContentDO record = new DailyReportContentDO(); + + record.setStartId(startId); + if (mapper != null) { return mapper.findOverloadReport(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(DailyReportContentMapper.class).findOverloadReport(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findOverloadReport for DailyReportContent.", e); } } public DailyReportContent findByPK(int keyReportId, Readset readset) throws DalException { + DailyReportContentMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyReportId), "primary key", String.valueOf(keyReportId)); + } + try (SqlSession session = openSession()) { - DailyReportContentMapper mapper = session.getMapper(DailyReportContentMapper.class); - DailyReportContentDO record = mapper.findByPrimaryKey(keyReportId); + DailyReportContentDO record = session.getMapper(DailyReportContentMapper.class).findByPrimaryKey(keyReportId); + return requireFound(record, "primary key", String.valueOf(keyReportId)); } catch (DalNotFoundException e) { throw e; @@ -65,10 +92,16 @@ public DailyReportContent findByPK(int keyReportId, Readset } public int insert(DailyReportContent proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().insert(toRecord(proto))); + } + try (SqlSession session = openSession()) { - DailyReportContentMapper mapper = session.getMapper(DailyReportContentMapper.class); DailyReportContentDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(DailyReportContentMapper.class).insert(record); + session.commit(); return count; } catch (Exception e) { @@ -77,9 +110,15 @@ public int insert(DailyReportContent proto) throws DalException { } public int updateByPK(DailyReportContent proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - DailyReportContentMapper mapper = session.getMapper(DailyReportContentMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(DailyReportContentMapper.class).updateByPrimaryKey(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -87,7 +126,39 @@ public int updateByPK(DailyReportContent proto, Updateset up } } - private DailyReportContent requireFound(DailyReportContentDO record, String field, String value) throws DalNotFoundException { + private SqlSessionFactory getSqlSessionFactory() { + SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + synchronized (this) { + sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + sqlSessionFactory = SupportingMyBatisRepository.newSqlSessionFactory(m_dataSourceManager, + DailyReportContentMapper.class, MAPPER_RESOURCE); + m_sqlSessionFactory = sqlSessionFactory; + } + } + } + + return sqlSessionFactory; + } + + private SqlSession openSession() { + return getSqlSessionFactory().openSession(false); + } + + private DailyReportContentMapper springMapper() { + return SupportingMyBatisRepository.springMapper(DailyReportContentMapper.class, LOGGER, SPRING_MAPPER_LOGGED, + "DailyReportContentRepository is using Spring managed DailyReportContentMapper."); + } + + private TransactionTemplate springTransactionTemplate() { + return SupportingMyBatisRepository.springTransactionTemplate(); + } + + private DailyReportContent requireFound(DailyReportContentDO record, String field, String value) + throws DalNotFoundException { if (record == null) { throw new DalNotFoundException("No DailyReportContent found by " + field + "(" + value + ")."); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java index 603553d866..b31bb4b5e2 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java @@ -1,39 +1,70 @@ package com.dianping.cat.core.mybatis.repository.hostinfo; -import com.dianping.cat.core.dal.Hostinfo; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; -import com.dianping.cat.core.mybatis.generated.hostinfo.dao.HostinfoMapper; -import com.dianping.cat.core.mybatis.generated.hostinfo.dao.data.HostinfoDO; -import java.util.Date; +import java.io.IOException; +import java.io.Reader; +import java.sql.Connection; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; + +import javax.sql.DataSource; + +import org.apache.ibatis.builder.xml.XMLMapperBuilder; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.mybatis.spring.SqlSessionTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.core.dal.Hostinfo; +import com.dianping.cat.core.mybatis.generated.hostinfo.dao.HostinfoMapper; +import com.dianping.cat.core.mybatis.generated.hostinfo.dao.data.HostinfoDO; +import com.dianping.cat.spring.CatSpringContext; + +public class HostinfoRepository { + private static final Logger LOGGER = LoggerFactory.getLogger(HostinfoRepository.class); + + private static final String DATA_SOURCE_NAME = "cat"; -public class HostinfoRepository extends MyBatisRepositorySupport { private static final String MAPPER_RESOURCE = "mybatis/mapper/HostinfoMapper.xml"; - @Override - protected Class getMapperClass() { - return HostinfoMapper.class; - } + private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; - } + @Inject + private DataSourceManager m_dataSourceManager; + + private SqlSessionTemplate m_sqlSessionTemplate; + + private TransactionTemplate m_transactionTemplate; + + private volatile SqlSessionFactory m_sqlSessionFactory; public Hostinfo createLocal() { return new Hostinfo(); } public int deleteByPK(Hostinfo proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - HostinfoMapper mapper = session.getMapper(HostinfoMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(HostinfoMapper.class).deleteByPrimaryKey(proto.getKeyId()); + session.commit(); return count; } catch (Exception e) { @@ -42,19 +73,35 @@ public int deleteByPK(Hostinfo proto) throws DalException { } public List findAllIp(Readset readset) throws DalException { - try (SqlSession session = openSession()) { - HostinfoMapper mapper = session.getMapper(HostinfoMapper.class); + HostinfoMapper mapper = springMapper(); + + if (mapper != null) { HostinfoDO record = new HostinfoDO(); + return mapper.findAllIp(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + HostinfoDO record = new HostinfoDO(); + + return session.getMapper(HostinfoMapper.class).findAllIp(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findAllIp for Hostinfo.", e); } } public Hostinfo findByPK(int keyId, Readset readset) throws DalException { + HostinfoMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - HostinfoMapper mapper = session.getMapper(HostinfoMapper.class); - HostinfoDO record = mapper.findByPrimaryKey(keyId); + HostinfoDO record = session.getMapper(HostinfoMapper.class).findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -64,11 +111,20 @@ public Hostinfo findByPK(int keyId, Readset readset) throws DalExcepti } public Hostinfo findByIp(String ip, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - HostinfoMapper mapper = session.getMapper(HostinfoMapper.class); - HostinfoDO record = new HostinfoDO(); - record.setIp(ip); + HostinfoMapper mapper = springMapper(); + HostinfoDO record = new HostinfoDO(); + + record.setIp(ip); + if (mapper != null) { HostinfoDO result = mapper.findByIp(record).stream().findFirst().orElse(null); + + return requireFound(result, "findByIp", record.toString()); + } + + try (SqlSession session = openSession()) { + HostinfoDO result = session.getMapper(HostinfoMapper.class).findByIp(record).stream().findFirst() + .orElse(null); + return requireFound(result, "findByIp", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -78,10 +134,21 @@ public Hostinfo findByIp(String ip, Readset readset) throws DalExcepti } public int insert(Hostinfo proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + HostinfoDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - HostinfoMapper mapper = session.getMapper(HostinfoMapper.class); HostinfoDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(HostinfoMapper.class).insert(record); + session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -92,9 +159,15 @@ public int insert(Hostinfo proto) throws DalException { } public int updateByPK(Hostinfo proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - HostinfoMapper mapper = session.getMapper(HostinfoMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(HostinfoMapper.class).updateByPrimaryKey(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -102,6 +175,81 @@ public int updateByPK(Hostinfo proto, Updateset updateset) throws DalE } } + private SqlSessionFactory getSqlSessionFactory() { + SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + synchronized (this) { + sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + sqlSessionFactory = newSqlSessionFactory(); + m_sqlSessionFactory = sqlSessionFactory; + } + } + } + + return sqlSessionFactory; + } + + private void loadMapperXml(Configuration configuration) { + try (Reader reader = Resources.getResourceAsReader(MAPPER_RESOURCE)) { + XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, MAPPER_RESOURCE, + configuration.getSqlFragments()); + + mapperParser.parse(); + } catch (IOException e) { + throw new IllegalStateException("Error when loading MyBatis mapper: " + MAPPER_RESOURCE, e); + } + } + + private SqlSessionFactory newSqlSessionFactory() { + Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), + new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); + + configuration.addMapper(HostinfoMapper.class); + loadMapperXml(configuration); + return new SqlSessionFactoryBuilder().build(configuration); + } + + private SqlSession openSession() { + return getSqlSessionFactory().openSession(false); + } + + private HostinfoMapper springMapper() { + SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; + + if (sqlSessionTemplate == null) { + sqlSessionTemplate = CatSpringContext.getBean(SqlSessionTemplate.class); + } + + if (sqlSessionTemplate == null) { + return null; + } + + if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { + LOGGER.info("HostinfoRepository is using Spring managed HostinfoMapper."); + } + + return sqlSessionTemplate.getMapper(HostinfoMapper.class); + } + + private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate != null) { + return m_transactionTemplate; + } + + return CatSpringContext.getBean(TransactionTemplate.class); + } + + public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { + m_sqlSessionTemplate = sqlSessionTemplate; + } + + public void setTransactionTemplate(TransactionTemplate transactionTemplate) { + m_transactionTemplate = transactionTemplate; + } + private Hostinfo requireFound(HostinfoDO record, String field, String value) throws DalNotFoundException { if (record == null) { throw new DalNotFoundException("No Hostinfo found by " + field + "(" + value + ")."); @@ -147,4 +295,58 @@ private HostinfoDO toRecord(Hostinfo model) { record.setKeyId(model.getKeyId()); return record; } + + private static final class UnidalDataSource implements DataSource { + private final DataSourceManager m_dataSourceManager; + + private final String m_dataSourceName; + + private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { + m_dataSourceManager = dataSourceManager; + m_dataSourceName = dataSourceName; + } + + @Override + public Connection getConnection() throws java.sql.SQLException { + return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); + } + + @Override + public Connection getConnection(String username, String password) throws java.sql.SQLException { + return getConnection(); + } + + @Override + public int getLoginTimeout() { + return 0; + } + + @Override + public java.io.PrintWriter getLogWriter() { + return null; + } + + @Override + public java.util.logging.Logger getParentLogger() { + return java.util.logging.Logger.getGlobal(); + } + + @Override + public boolean isWrapperFor(Class iface) { + return false; + } + + @Override + public void setLoginTimeout(int seconds) { + } + + @Override + public void setLogWriter(java.io.PrintWriter out) { + } + + @Override + public T unwrap(Class iface) throws java.sql.SQLException { + throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); + } + } } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java index 43af976a37..487dc2b75a 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java @@ -1,39 +1,52 @@ package com.dianping.cat.core.mybatis.repository.hourly.report.content; -import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; -import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.HourlyReportContentMapper; -import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.data.HourlyReportContentDO; -import java.util.Date; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; + import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.core.dal.HourlyReportContent; +import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.HourlyReportContentMapper; +import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.data.HourlyReportContentDO; +import com.dianping.cat.core.mybatis.repository.SupportingMyBatisRepository; + +public class HourlyReportContentRepository { + private static final Logger LOGGER = LoggerFactory.getLogger(HourlyReportContentRepository.class); -public class HourlyReportContentRepository extends MyBatisRepositorySupport { private static final String MAPPER_RESOURCE = "mybatis/mapper/HourlyReportContentMapper.xml"; - @Override - protected Class getMapperClass() { - return HourlyReportContentMapper.class; - } + private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; - } + @Inject + private DataSourceManager m_dataSourceManager; + + private volatile SqlSessionFactory m_sqlSessionFactory; public HourlyReportContent createLocal() { return new HourlyReportContent(); } public int deleteByPK(HourlyReportContent proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyReportId())); + } + try (SqlSession session = openSession()) { - HourlyReportContentMapper mapper = session.getMapper(HourlyReportContentMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyReportId()); + int count = session.getMapper(HourlyReportContentMapper.class).deleteByPrimaryKey(proto.getKeyReportId()); + session.commit(); return count; } catch (Exception e) { @@ -41,21 +54,37 @@ public int deleteByPK(HourlyReportContent proto) throws DalException { } } - public List findOverloadReport(int startId, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - HourlyReportContentMapper mapper = session.getMapper(HourlyReportContentMapper.class); - HourlyReportContentDO record = new HourlyReportContentDO(); - record.setStartId(startId); + public List findOverloadReport(int startId, Readset readset) + throws DalException { + HourlyReportContentMapper mapper = springMapper(); + HourlyReportContentDO record = new HourlyReportContentDO(); + + record.setStartId(startId); + if (mapper != null) { return mapper.findOverloadReport(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(HourlyReportContentMapper.class).findOverloadReport(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findOverloadReport for HourlyReportContent.", e); } } - public HourlyReportContent findByPK(int keyReportId, java.util.Date period, Readset readset) throws DalException { + public HourlyReportContent findByPK(int keyReportId, java.util.Date period, Readset readset) + throws DalException { + HourlyReportContentMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyReportId), "primary key", String.valueOf(keyReportId)); + } + try (SqlSession session = openSession()) { - HourlyReportContentMapper mapper = session.getMapper(HourlyReportContentMapper.class); - HourlyReportContentDO record = mapper.findByPrimaryKey(keyReportId); + HourlyReportContentDO record = session.getMapper(HourlyReportContentMapper.class) + .findByPrimaryKey(keyReportId); + return requireFound(record, "primary key", String.valueOf(keyReportId)); } catch (DalNotFoundException e) { throw e; @@ -65,10 +94,16 @@ public HourlyReportContent findByPK(int keyReportId, java.util.Date period, Read } public int insert(HourlyReportContent proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().insert(toRecord(proto))); + } + try (SqlSession session = openSession()) { - HourlyReportContentMapper mapper = session.getMapper(HourlyReportContentMapper.class); HourlyReportContentDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(HourlyReportContentMapper.class).insert(record); + session.commit(); return count; } catch (Exception e) { @@ -77,9 +112,15 @@ public int insert(HourlyReportContent proto) throws DalException { } public int updateByPK(HourlyReportContent proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - HourlyReportContentMapper mapper = session.getMapper(HourlyReportContentMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(HourlyReportContentMapper.class).updateByPrimaryKey(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -87,7 +128,39 @@ public int updateByPK(HourlyReportContent proto, Updateset } } - private HourlyReportContent requireFound(HourlyReportContentDO record, String field, String value) throws DalNotFoundException { + private SqlSessionFactory getSqlSessionFactory() { + SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + synchronized (this) { + sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + sqlSessionFactory = SupportingMyBatisRepository.newSqlSessionFactory(m_dataSourceManager, + HourlyReportContentMapper.class, MAPPER_RESOURCE); + m_sqlSessionFactory = sqlSessionFactory; + } + } + } + + return sqlSessionFactory; + } + + private SqlSession openSession() { + return getSqlSessionFactory().openSession(false); + } + + private HourlyReportContentMapper springMapper() { + return SupportingMyBatisRepository.springMapper(HourlyReportContentMapper.class, LOGGER, SPRING_MAPPER_LOGGED, + "HourlyReportContentRepository is using Spring managed HourlyReportContentMapper."); + } + + private TransactionTemplate springTransactionTemplate() { + return SupportingMyBatisRepository.springTransactionTemplate(); + } + + private HourlyReportContent requireFound(HourlyReportContentDO record, String field, String value) + throws DalNotFoundException { if (record == null) { throw new DalNotFoundException("No HourlyReportContent found by " + field + "(" + value + ")."); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java index e1f85e6766..67b35b2b44 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java @@ -1,38 +1,66 @@ package com.dianping.cat.core.mybatis.repository.hourlyreport; -import com.dianping.cat.core.dal.HourlyReport; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; -import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.HourlyreportMapper; -import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.data.HourlyreportDO; +import java.io.IOException; +import java.io.Reader; +import java.sql.Connection; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; + +import javax.sql.DataSource; + +import org.apache.ibatis.builder.xml.XMLMapperBuilder; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.mybatis.spring.SqlSessionTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.core.dal.HourlyReport; +import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.HourlyreportMapper; +import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.data.HourlyreportDO; +import com.dianping.cat.spring.CatSpringContext; + +public class HourlyReportRepository { + private static final Logger LOGGER = LoggerFactory.getLogger(HourlyReportRepository.class); + + private static final String DATA_SOURCE_NAME = "cat"; -public class HourlyReportRepository extends MyBatisRepositorySupport { private static final String MAPPER_RESOURCE = "mybatis/mapper/HourlyreportMapper.xml"; - @Override - protected Class getMapperClass() { - return HourlyreportMapper.class; - } + private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; - } + @Inject + private DataSourceManager m_dataSourceManager; + + private volatile SqlSessionFactory m_sqlSessionFactory; public HourlyReport createLocal() { return new HourlyReport(); } public int deleteByPK(HourlyReport proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - HourlyreportMapper mapper = session.getMapper(HourlyreportMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(HourlyreportMapper.class).deleteByPrimaryKey(proto.getKeyId()); + session.commit(); return count; } catch (Exception e) { @@ -42,13 +70,20 @@ public int deleteByPK(HourlyReport proto) throws DalException { public List findAllByDomainNamePeriod(java.util.Date period, String domain, String name, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - HourlyreportMapper mapper = session.getMapper(HourlyreportMapper.class); - HourlyreportDO record = new HourlyreportDO(); - record.setPeriod(period); - record.setDomain(domain); - record.setName(name); + HourlyreportDO record = new HourlyreportDO(); + HourlyreportMapper mapper = springMapper(); + + record.setPeriod(period); + record.setDomain(domain); + record.setName(name); + if (mapper != null) { return mapper.findAllByDomainNamePeriod(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(HourlyreportMapper.class).findAllByDomainNamePeriod(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findAllByDomainNamePeriod for HourlyReport.", e); } @@ -56,21 +91,34 @@ public List findAllByDomainNamePeriod(java.util.Date period, Strin public List findAllByPeriodName(java.util.Date period, String name, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - HourlyreportMapper mapper = session.getMapper(HourlyreportMapper.class); - HourlyreportDO record = new HourlyreportDO(); - record.setPeriod(period); - record.setName(name); + HourlyreportDO record = new HourlyreportDO(); + HourlyreportMapper mapper = springMapper(); + + record.setPeriod(period); + record.setName(name); + if (mapper != null) { return mapper.findAllByPeriodName(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(HourlyreportMapper.class).findAllByPeriodName(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findAllByPeriodName for HourlyReport.", e); } } public HourlyReport findByPK(int keyId, Readset readset) throws DalException { + HourlyreportMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - HourlyreportMapper mapper = session.getMapper(HourlyreportMapper.class); - HourlyreportDO record = mapper.findByPrimaryKey(keyId); + HourlyreportDO record = session.getMapper(HourlyreportMapper.class).findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -80,10 +128,21 @@ public HourlyReport findByPK(int keyId, Readset readset) throws Da } public int insert(HourlyReport proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + HourlyreportDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - HourlyreportMapper mapper = session.getMapper(HourlyreportMapper.class); HourlyreportDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(HourlyreportMapper.class).insert(record); + session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -94,9 +153,15 @@ public int insert(HourlyReport proto) throws DalException { } public int updateByPK(HourlyReport proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - HourlyreportMapper mapper = session.getMapper(HourlyreportMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(HourlyreportMapper.class).updateByPrimaryKey(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -104,6 +169,65 @@ public int updateByPK(HourlyReport proto, Updateset updateset) thr } } + private SqlSessionFactory getSqlSessionFactory() { + SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + synchronized (this) { + sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + sqlSessionFactory = newSqlSessionFactory(); + m_sqlSessionFactory = sqlSessionFactory; + } + } + } + + return sqlSessionFactory; + } + + private void loadMapperXml(Configuration configuration) { + try (Reader reader = Resources.getResourceAsReader(MAPPER_RESOURCE)) { + XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, MAPPER_RESOURCE, + configuration.getSqlFragments()); + + mapperParser.parse(); + } catch (IOException e) { + throw new IllegalStateException("Error when loading MyBatis mapper: " + MAPPER_RESOURCE, e); + } + } + + private SqlSessionFactory newSqlSessionFactory() { + Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), + new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); + + configuration.addMapper(HourlyreportMapper.class); + loadMapperXml(configuration); + return new SqlSessionFactoryBuilder().build(configuration); + } + + private SqlSession openSession() { + return getSqlSessionFactory().openSession(false); + } + + private HourlyreportMapper springMapper() { + SqlSessionTemplate sqlSessionTemplate = CatSpringContext.getBean(SqlSessionTemplate.class); + + if (sqlSessionTemplate == null) { + return null; + } + + if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { + LOGGER.info("HourlyReportRepository is using Spring managed HourlyreportMapper."); + } + + return sqlSessionTemplate.getMapper(HourlyreportMapper.class); + } + + private TransactionTemplate springTransactionTemplate() { + return CatSpringContext.getBean(TransactionTemplate.class); + } + private HourlyReport requireFound(HourlyreportDO record, String field, String value) throws DalNotFoundException { if (record == null) { throw new DalNotFoundException("No HourlyReport found by " + field + "(" + value + ")."); @@ -153,4 +277,58 @@ private HourlyreportDO toRecord(HourlyReport model) { record.setKeyId(model.getKeyId()); return record; } + + private static final class UnidalDataSource implements DataSource { + private final DataSourceManager m_dataSourceManager; + + private final String m_dataSourceName; + + private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { + m_dataSourceManager = dataSourceManager; + m_dataSourceName = dataSourceName; + } + + @Override + public Connection getConnection() throws java.sql.SQLException { + return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); + } + + @Override + public Connection getConnection(String username, String password) throws java.sql.SQLException { + return getConnection(); + } + + @Override + public int getLoginTimeout() { + return 0; + } + + @Override + public java.io.PrintWriter getLogWriter() { + return null; + } + + @Override + public java.util.logging.Logger getParentLogger() { + return java.util.logging.Logger.getGlobal(); + } + + @Override + public boolean isWrapperFor(Class iface) { + return false; + } + + @Override + public void setLoginTimeout(int seconds) { + } + + @Override + public void setLogWriter(java.io.PrintWriter out) { + } + + @Override + public T unwrap(Class iface) throws java.sql.SQLException { + throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); + } + } } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java index de155bcbce..ada3385d11 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java @@ -1,39 +1,52 @@ package com.dianping.cat.core.mybatis.repository.monthly.report.content; -import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; -import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.MonthlyReportContentMapper; -import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.data.MonthlyReportContentDO; -import java.util.Date; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; + import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.core.dal.MonthlyReportContent; +import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.MonthlyReportContentMapper; +import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.data.MonthlyReportContentDO; +import com.dianping.cat.core.mybatis.repository.SupportingMyBatisRepository; + +public class MonthlyReportContentRepository { + private static final Logger LOGGER = LoggerFactory.getLogger(MonthlyReportContentRepository.class); -public class MonthlyReportContentRepository extends MyBatisRepositorySupport { private static final String MAPPER_RESOURCE = "mybatis/mapper/MonthlyReportContentMapper.xml"; - @Override - protected Class getMapperClass() { - return MonthlyReportContentMapper.class; - } + private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; - } + @Inject + private DataSourceManager m_dataSourceManager; + + private volatile SqlSessionFactory m_sqlSessionFactory; public MonthlyReportContent createLocal() { return new MonthlyReportContent(); } public int deleteByPK(MonthlyReportContent proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyReportId())); + } + try (SqlSession session = openSession()) { - MonthlyReportContentMapper mapper = session.getMapper(MonthlyReportContentMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyReportId()); + int count = session.getMapper(MonthlyReportContentMapper.class).deleteByPrimaryKey(proto.getKeyReportId()); + session.commit(); return count; } catch (Exception e) { @@ -41,21 +54,36 @@ public int deleteByPK(MonthlyReportContent proto) throws DalException { } } - public List findOverloadReport(int startId, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - MonthlyReportContentMapper mapper = session.getMapper(MonthlyReportContentMapper.class); - MonthlyReportContentDO record = new MonthlyReportContentDO(); - record.setStartId(startId); + public List findOverloadReport(int startId, Readset readset) + throws DalException { + MonthlyReportContentMapper mapper = springMapper(); + MonthlyReportContentDO record = new MonthlyReportContentDO(); + + record.setStartId(startId); + if (mapper != null) { return mapper.findOverloadReport(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(MonthlyReportContentMapper.class).findOverloadReport(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findOverloadReport for MonthlyReportContent.", e); } } public MonthlyReportContent findByPK(int keyReportId, Readset readset) throws DalException { + MonthlyReportContentMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyReportId), "primary key", String.valueOf(keyReportId)); + } + try (SqlSession session = openSession()) { - MonthlyReportContentMapper mapper = session.getMapper(MonthlyReportContentMapper.class); - MonthlyReportContentDO record = mapper.findByPrimaryKey(keyReportId); + MonthlyReportContentDO record = session.getMapper(MonthlyReportContentMapper.class) + .findByPrimaryKey(keyReportId); + return requireFound(record, "primary key", String.valueOf(keyReportId)); } catch (DalNotFoundException e) { throw e; @@ -65,10 +93,16 @@ public MonthlyReportContent findByPK(int keyReportId, Readset springMapper().insert(toRecord(proto))); + } + try (SqlSession session = openSession()) { - MonthlyReportContentMapper mapper = session.getMapper(MonthlyReportContentMapper.class); MonthlyReportContentDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(MonthlyReportContentMapper.class).insert(record); + session.commit(); return count; } catch (Exception e) { @@ -77,9 +111,15 @@ public int insert(MonthlyReportContent proto) throws DalException { } public int updateByPK(MonthlyReportContent proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - MonthlyReportContentMapper mapper = session.getMapper(MonthlyReportContentMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(MonthlyReportContentMapper.class).updateByPrimaryKey(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -87,7 +127,39 @@ public int updateByPK(MonthlyReportContent proto, Updateset getMapperClass() { - return MonthreportMapper.class; - } + private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; - } + @Inject + private DataSourceManager m_dataSourceManager; + + private volatile SqlSessionFactory m_sqlSessionFactory; public MonthlyReport createLocal() { return new MonthlyReport(); } public int deleteByPK(MonthlyReport proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - MonthreportMapper mapper = session.getMapper(MonthreportMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(MonthreportMapper.class).deleteByPrimaryKey(proto.getKeyId()); + session.commit(); return count; } catch (Exception e) { @@ -42,9 +67,15 @@ public int deleteByPK(MonthlyReport proto) throws DalException { } public int deleteReportByDomainNamePeriod(MonthlyReport proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteReportByDomainNamePeriod(toRecord(proto))); + } + try (SqlSession session = openSession()) { - MonthreportMapper mapper = session.getMapper(MonthreportMapper.class); - int count = mapper.deleteReportByDomainNamePeriod(toRecord(proto)); + int count = session.getMapper(MonthreportMapper.class).deleteReportByDomainNamePeriod(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -53,9 +84,15 @@ public int deleteReportByDomainNamePeriod(MonthlyReport proto) throws DalExcepti } public MonthlyReport findByPK(int keyId, Readset readset) throws DalException { + MonthreportMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - MonthreportMapper mapper = session.getMapper(MonthreportMapper.class); - MonthreportDO record = mapper.findByPrimaryKey(keyId); + MonthreportDO record = session.getMapper(MonthreportMapper.class).findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -64,14 +101,26 @@ public MonthlyReport findByPK(int keyId, Readset readset) throws } } - public MonthlyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - MonthreportMapper mapper = session.getMapper(MonthreportMapper.class); - MonthreportDO record = new MonthreportDO(); - record.setPeriod(period); - record.setDomain(domain); - record.setName(name); + public MonthlyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name, + Readset readset) throws DalException { + MonthreportDO record = new MonthreportDO(); + MonthreportMapper mapper = springMapper(); + + record.setPeriod(period); + record.setDomain(domain); + record.setName(name); + if (mapper != null) { MonthreportDO result = mapper.findReportByDomainNamePeriod(record).stream().findFirst().orElse(null); + + return requireFound(result, "findReportByDomainNamePeriod", record.toString()); + } + + try (SqlSession session = openSession()) { + MonthreportDO result = session.getMapper(MonthreportMapper.class).findReportByDomainNamePeriod(record) + .stream() + .findFirst() + .orElse(null); + return requireFound(result, "findReportByDomainNamePeriod", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -81,10 +130,21 @@ public MonthlyReport findReportByDomainNamePeriod(java.util.Date period, String } public int insert(MonthlyReport proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + MonthreportDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - MonthreportMapper mapper = session.getMapper(MonthreportMapper.class); MonthreportDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(MonthreportMapper.class).insert(record); + session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -95,9 +155,15 @@ public int insert(MonthlyReport proto) throws DalException { } public int updateByPK(MonthlyReport proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - MonthreportMapper mapper = session.getMapper(MonthreportMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(MonthreportMapper.class).updateByPrimaryKey(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -105,6 +171,65 @@ public int updateByPK(MonthlyReport proto, Updateset updateset) t } } + private SqlSessionFactory getSqlSessionFactory() { + SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + synchronized (this) { + sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + sqlSessionFactory = newSqlSessionFactory(); + m_sqlSessionFactory = sqlSessionFactory; + } + } + } + + return sqlSessionFactory; + } + + private void loadMapperXml(Configuration configuration) { + try (Reader reader = Resources.getResourceAsReader(MAPPER_RESOURCE)) { + XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, MAPPER_RESOURCE, + configuration.getSqlFragments()); + + mapperParser.parse(); + } catch (IOException e) { + throw new IllegalStateException("Error when loading MyBatis mapper: " + MAPPER_RESOURCE, e); + } + } + + private SqlSessionFactory newSqlSessionFactory() { + Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), + new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); + + configuration.addMapper(MonthreportMapper.class); + loadMapperXml(configuration); + return new SqlSessionFactoryBuilder().build(configuration); + } + + private SqlSession openSession() { + return getSqlSessionFactory().openSession(false); + } + + private MonthreportMapper springMapper() { + SqlSessionTemplate sqlSessionTemplate = CatSpringContext.getBean(SqlSessionTemplate.class); + + if (sqlSessionTemplate == null) { + return null; + } + + if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { + LOGGER.info("MonthlyReportRepository is using Spring managed MonthreportMapper."); + } + + return sqlSessionTemplate.getMapper(MonthreportMapper.class); + } + + private TransactionTemplate springTransactionTemplate() { + return CatSpringContext.getBean(TransactionTemplate.class); + } + private MonthlyReport requireFound(MonthreportDO record, String field, String value) throws DalNotFoundException { if (record == null) { throw new DalNotFoundException("No MonthlyReport found by " + field + "(" + value + ")."); @@ -154,4 +279,58 @@ private MonthreportDO toRecord(MonthlyReport model) { record.setKeyId(model.getKeyId()); return record; } + + private static final class UnidalDataSource implements DataSource { + private final DataSourceManager m_dataSourceManager; + + private final String m_dataSourceName; + + private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { + m_dataSourceManager = dataSourceManager; + m_dataSourceName = dataSourceName; + } + + @Override + public Connection getConnection() throws java.sql.SQLException { + return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); + } + + @Override + public Connection getConnection(String username, String password) throws java.sql.SQLException { + return getConnection(); + } + + @Override + public int getLoginTimeout() { + return 0; + } + + @Override + public java.io.PrintWriter getLogWriter() { + return null; + } + + @Override + public java.util.logging.Logger getParentLogger() { + return java.util.logging.Logger.getGlobal(); + } + + @Override + public boolean isWrapperFor(Class iface) { + return false; + } + + @Override + public void setLoginTimeout(int seconds) { + } + + @Override + public void setLogWriter(java.io.PrintWriter out) { + } + + @Override + public T unwrap(Class iface) throws java.sql.SQLException { + throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); + } + } } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java index 16a7a474c7..203e9d0820 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java @@ -1,39 +1,70 @@ package com.dianping.cat.core.mybatis.repository.project; -import com.dianping.cat.core.dal.Project; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; -import com.dianping.cat.core.mybatis.generated.project.dao.ProjectMapper; -import com.dianping.cat.core.mybatis.generated.project.dao.data.ProjectDO; -import java.util.Date; +import java.io.IOException; +import java.io.Reader; +import java.sql.Connection; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; + +import javax.sql.DataSource; + +import org.apache.ibatis.builder.xml.XMLMapperBuilder; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.mybatis.spring.SqlSessionTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.core.dal.Project; +import com.dianping.cat.core.mybatis.generated.project.dao.ProjectMapper; +import com.dianping.cat.core.mybatis.generated.project.dao.data.ProjectDO; +import com.dianping.cat.spring.CatSpringContext; + +public class ProjectRepository { + private static final Logger LOGGER = LoggerFactory.getLogger(ProjectRepository.class); + + private static final String DATA_SOURCE_NAME = "cat"; -public class ProjectRepository extends MyBatisRepositorySupport { private static final String MAPPER_RESOURCE = "mybatis/mapper/ProjectMapper.xml"; - @Override - protected Class getMapperClass() { - return ProjectMapper.class; - } + private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; - } + @Inject + private DataSourceManager m_dataSourceManager; + + private SqlSessionTemplate m_sqlSessionTemplate; + + private TransactionTemplate m_transactionTemplate; + + private volatile SqlSessionFactory m_sqlSessionFactory; public Project createLocal() { return new Project(); } public int deleteByPK(Project proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - ProjectMapper mapper = session.getMapper(ProjectMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(ProjectMapper.class).deleteByPrimaryKey(proto.getKeyId()); + session.commit(); return count; } catch (Exception e) { @@ -42,19 +73,35 @@ public int deleteByPK(Project proto) throws DalException { } public List findAll(Readset readset) throws DalException { - try (SqlSession session = openSession()) { - ProjectMapper mapper = session.getMapper(ProjectMapper.class); + ProjectMapper mapper = springMapper(); + + if (mapper != null) { ProjectDO record = new ProjectDO(); + return mapper.findAll(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + ProjectDO record = new ProjectDO(); + + return session.getMapper(ProjectMapper.class).findAll(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findAll for Project.", e); } } public Project findByPK(int keyId, Readset readset) throws DalException { + ProjectMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - ProjectMapper mapper = session.getMapper(ProjectMapper.class); - ProjectDO record = mapper.findByPrimaryKey(keyId); + ProjectDO record = session.getMapper(ProjectMapper.class).findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -64,11 +111,20 @@ public Project findByPK(int keyId, Readset readset) throws DalException } public Project findByDomain(String domain, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - ProjectMapper mapper = session.getMapper(ProjectMapper.class); - ProjectDO record = new ProjectDO(); - record.setDomain(domain); + ProjectDO record = new ProjectDO(); + ProjectMapper mapper = springMapper(); + + record.setDomain(domain); + if (mapper != null) { ProjectDO result = mapper.findByDomain(record).stream().findFirst().orElse(null); + + return requireFound(result, "findByDomain", record.toString()); + } + + try (SqlSession session = openSession()) { + ProjectDO result = session.getMapper(ProjectMapper.class).findByDomain(record).stream().findFirst() + .orElse(null); + return requireFound(result, "findByDomain", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -78,11 +134,20 @@ public Project findByDomain(String domain, Readset readset) throws DalE } public Project findByCmdbDomain(String domain, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - ProjectMapper mapper = session.getMapper(ProjectMapper.class); - ProjectDO record = new ProjectDO(); - record.setDomain(domain); + ProjectDO record = new ProjectDO(); + ProjectMapper mapper = springMapper(); + + record.setDomain(domain); + if (mapper != null) { ProjectDO result = mapper.findByCmdbDomain(record).stream().findFirst().orElse(null); + + return requireFound(result, "findByCmdbDomain", record.toString()); + } + + try (SqlSession session = openSession()) { + ProjectDO result = session.getMapper(ProjectMapper.class).findByCmdbDomain(record).stream().findFirst() + .orElse(null); + return requireFound(result, "findByCmdbDomain", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -92,10 +157,21 @@ public Project findByCmdbDomain(String domain, Readset readset) throws } public int insert(Project proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + ProjectDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - ProjectMapper mapper = session.getMapper(ProjectMapper.class); ProjectDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(ProjectMapper.class).insert(record); + session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -106,9 +182,15 @@ public int insert(Project proto) throws DalException { } public int updateByPK(Project proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - ProjectMapper mapper = session.getMapper(ProjectMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(ProjectMapper.class).updateByPrimaryKey(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -116,6 +198,81 @@ public int updateByPK(Project proto, Updateset updateset) throws DalExc } } + private SqlSessionFactory getSqlSessionFactory() { + SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + synchronized (this) { + sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + sqlSessionFactory = newSqlSessionFactory(); + m_sqlSessionFactory = sqlSessionFactory; + } + } + } + + return sqlSessionFactory; + } + + private void loadMapperXml(Configuration configuration) { + try (Reader reader = Resources.getResourceAsReader(MAPPER_RESOURCE)) { + XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, MAPPER_RESOURCE, + configuration.getSqlFragments()); + + mapperParser.parse(); + } catch (IOException e) { + throw new IllegalStateException("Error when loading MyBatis mapper: " + MAPPER_RESOURCE, e); + } + } + + private SqlSessionFactory newSqlSessionFactory() { + Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), + new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); + + configuration.addMapper(ProjectMapper.class); + loadMapperXml(configuration); + return new SqlSessionFactoryBuilder().build(configuration); + } + + private SqlSession openSession() { + return getSqlSessionFactory().openSession(false); + } + + private ProjectMapper springMapper() { + SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; + + if (sqlSessionTemplate == null) { + sqlSessionTemplate = CatSpringContext.getBean(SqlSessionTemplate.class); + } + + if (sqlSessionTemplate == null) { + return null; + } + + if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { + LOGGER.info("ProjectRepository is using Spring managed ProjectMapper."); + } + + return sqlSessionTemplate.getMapper(ProjectMapper.class); + } + + private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate != null) { + return m_transactionTemplate; + } + + return CatSpringContext.getBean(TransactionTemplate.class); + } + + public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { + m_sqlSessionTemplate = sqlSessionTemplate; + } + + public void setTransactionTemplate(TransactionTemplate transactionTemplate) { + m_transactionTemplate = transactionTemplate; + } + private Project requireFound(ProjectDO record, String field, String value) throws DalNotFoundException { if (record == null) { throw new DalNotFoundException("No Project found by " + field + "(" + value + ")."); @@ -181,4 +338,58 @@ private ProjectDO toRecord(Project model) { record.setKeyId(model.getKeyId()); return record; } + + private static final class UnidalDataSource implements DataSource { + private final DataSourceManager m_dataSourceManager; + + private final String m_dataSourceName; + + private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { + m_dataSourceManager = dataSourceManager; + m_dataSourceName = dataSourceName; + } + + @Override + public Connection getConnection() throws java.sql.SQLException { + return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); + } + + @Override + public Connection getConnection(String username, String password) throws java.sql.SQLException { + return getConnection(); + } + + @Override + public int getLoginTimeout() { + return 0; + } + + @Override + public java.io.PrintWriter getLogWriter() { + return null; + } + + @Override + public java.util.logging.Logger getParentLogger() { + return java.util.logging.Logger.getGlobal(); + } + + @Override + public boolean isWrapperFor(Class iface) { + return false; + } + + @Override + public void setLoginTimeout(int seconds) { + } + + @Override + public void setLogWriter(java.io.PrintWriter out) { + } + + @Override + public T unwrap(Class iface) throws java.sql.SQLException { + throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); + } + } } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java index 5d1e94697a..5abaf553af 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java @@ -1,39 +1,50 @@ package com.dianping.cat.core.mybatis.repository.task; -import com.dianping.cat.core.dal.Task; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; -import com.dianping.cat.core.mybatis.generated.task.dao.TaskMapper; -import com.dianping.cat.core.mybatis.generated.task.dao.data.TaskDO; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; +import java.util.concurrent.atomic.AtomicBoolean; + import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.core.dal.Task; +import com.dianping.cat.core.mybatis.generated.task.dao.TaskMapper; +import com.dianping.cat.core.mybatis.generated.task.dao.data.TaskDO; +import com.dianping.cat.core.mybatis.repository.SupportingMyBatisRepository; + +public class TaskRepository { + private static final Logger LOGGER = LoggerFactory.getLogger(TaskRepository.class); -public class TaskRepository extends MyBatisRepositorySupport { private static final String MAPPER_RESOURCE = "mybatis/mapper/TaskMapper.xml"; - @Override - protected Class getMapperClass() { - return TaskMapper.class; - } + private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; - } + @Inject + private DataSourceManager m_dataSourceManager; + + private volatile SqlSessionFactory m_sqlSessionFactory; public Task createLocal() { return new Task(); } public int deleteByPK(Task proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - TaskMapper mapper = session.getMapper(TaskMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(TaskMapper.class).deleteByPrimaryKey(proto.getKeyId()); + session.commit(); return count; } catch (Exception e) { @@ -42,9 +53,15 @@ public int deleteByPK(Task proto) throws DalException { } public Task findByPK(int keyId, Readset readset) throws DalException { + TaskMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - TaskMapper mapper = session.getMapper(TaskMapper.class); - TaskDO record = mapper.findByPrimaryKey(keyId); + TaskDO record = session.getMapper(TaskMapper.class).findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -54,12 +71,21 @@ public Task findByPK(int keyId, Readset readset) throws DalException { } public Task findByStatusConsumer(int status, String consumer, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - TaskMapper mapper = session.getMapper(TaskMapper.class); - TaskDO record = new TaskDO(); - record.setStatus(status); - record.setConsumer(consumer); + TaskMapper mapper = springMapper(); + TaskDO record = new TaskDO(); + + record.setStatus(status); + record.setConsumer(consumer); + if (mapper != null) { TaskDO result = mapper.findByStatusConsumer(record).stream().findFirst().orElse(null); + + return requireFound(result, "findByStatusConsumer", record.toString()); + } + + try (SqlSession session = openSession()) { + TaskDO result = session.getMapper(TaskMapper.class).findByStatusConsumer(record).stream().findFirst() + .orElse(null); + return requireFound(result, "findByStatusConsumer", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -69,10 +95,21 @@ public Task findByStatusConsumer(int status, String consumer, Readset read } public int insert(Task proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + TaskDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - TaskMapper mapper = session.getMapper(TaskMapper.class); TaskDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(TaskMapper.class).insert(record); + session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -83,9 +120,15 @@ public int insert(Task proto) throws DalException { } public int updateByPK(Task proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - TaskMapper mapper = session.getMapper(TaskMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(TaskMapper.class).updateByPrimaryKey(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -94,9 +137,15 @@ public int updateByPK(Task proto, Updateset updateset) throws DalException } public int updateTodoToDoing(Task proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateTodoToDoing(toRecord(proto))); + } + try (SqlSession session = openSession()) { - TaskMapper mapper = session.getMapper(TaskMapper.class); - int count = mapper.updateTodoToDoing(toRecord(proto)); + int count = session.getMapper(TaskMapper.class).updateTodoToDoing(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -105,9 +154,15 @@ public int updateTodoToDoing(Task proto, Updateset updateset) throws DalEx } public int updateDoingToDone(Task proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateDoingToDone(toRecord(proto))); + } + try (SqlSession session = openSession()) { - TaskMapper mapper = session.getMapper(TaskMapper.class); - int count = mapper.updateDoingToDone(toRecord(proto)); + int count = session.getMapper(TaskMapper.class).updateDoingToDone(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -116,9 +171,15 @@ public int updateDoingToDone(Task proto, Updateset updateset) throws DalEx } public int updateFailureToDone(Task proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateFailureToDone(toRecord(proto))); + } + try (SqlSession session = openSession()) { - TaskMapper mapper = session.getMapper(TaskMapper.class); - int count = mapper.updateFailureToDone(toRecord(proto)); + int count = session.getMapper(TaskMapper.class).updateFailureToDone(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -127,9 +188,15 @@ public int updateFailureToDone(Task proto, Updateset updateset) throws Dal } public int updateStatusToTodo(Task proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateStatusToTodo(toRecord(proto))); + } + try (SqlSession session = openSession()) { - TaskMapper mapper = session.getMapper(TaskMapper.class); - int count = mapper.updateStatusToTodo(toRecord(proto)); + int count = session.getMapper(TaskMapper.class).updateStatusToTodo(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -138,9 +205,15 @@ public int updateStatusToTodo(Task proto, Updateset updateset) throws DalE } public int updateDoingToFail(Task proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateDoingToFail(toRecord(proto))); + } + try (SqlSession session = openSession()) { - TaskMapper mapper = session.getMapper(TaskMapper.class); - int count = mapper.updateDoingToFail(toRecord(proto)); + int count = session.getMapper(TaskMapper.class).updateDoingToFail(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -148,6 +221,37 @@ public int updateDoingToFail(Task proto, Updateset updateset) throws DalEx } } + private SqlSessionFactory getSqlSessionFactory() { + SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + synchronized (this) { + sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + sqlSessionFactory = SupportingMyBatisRepository.newSqlSessionFactory(m_dataSourceManager, + TaskMapper.class, MAPPER_RESOURCE); + m_sqlSessionFactory = sqlSessionFactory; + } + } + } + + return sqlSessionFactory; + } + + private SqlSession openSession() { + return getSqlSessionFactory().openSession(false); + } + + private TaskMapper springMapper() { + return SupportingMyBatisRepository.springMapper(TaskMapper.class, LOGGER, SPRING_MAPPER_LOGGED, + "TaskRepository is using Spring managed TaskMapper."); + } + + private TransactionTemplate springTransactionTemplate() { + return SupportingMyBatisRepository.springTransactionTemplate(); + } + private Task requireFound(TaskDO record, String field, String value) throws DalNotFoundException { if (record == null) { throw new DalNotFoundException("No Task found by " + field + "(" + value + ")."); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java index e09b099957..62a80b43b9 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java @@ -1,39 +1,52 @@ package com.dianping.cat.core.mybatis.repository.weekly.report.content; -import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; -import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.WeeklyReportContentMapper; -import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.data.WeeklyReportContentDO; -import java.util.Date; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; + import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.core.dal.WeeklyReportContent; +import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.WeeklyReportContentMapper; +import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.data.WeeklyReportContentDO; +import com.dianping.cat.core.mybatis.repository.SupportingMyBatisRepository; + +public class WeeklyReportContentRepository { + private static final Logger LOGGER = LoggerFactory.getLogger(WeeklyReportContentRepository.class); -public class WeeklyReportContentRepository extends MyBatisRepositorySupport { private static final String MAPPER_RESOURCE = "mybatis/mapper/WeeklyReportContentMapper.xml"; - @Override - protected Class getMapperClass() { - return WeeklyReportContentMapper.class; - } + private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; - } + @Inject + private DataSourceManager m_dataSourceManager; + + private volatile SqlSessionFactory m_sqlSessionFactory; public WeeklyReportContent createLocal() { return new WeeklyReportContent(); } public int deleteByPK(WeeklyReportContent proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyReportId())); + } + try (SqlSession session = openSession()) { - WeeklyReportContentMapper mapper = session.getMapper(WeeklyReportContentMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyReportId()); + int count = session.getMapper(WeeklyReportContentMapper.class).deleteByPrimaryKey(proto.getKeyReportId()); + session.commit(); return count; } catch (Exception e) { @@ -41,21 +54,36 @@ public int deleteByPK(WeeklyReportContent proto) throws DalException { } } - public List findOverloadReport(int startId, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - WeeklyReportContentMapper mapper = session.getMapper(WeeklyReportContentMapper.class); - WeeklyReportContentDO record = new WeeklyReportContentDO(); - record.setStartId(startId); + public List findOverloadReport(int startId, Readset readset) + throws DalException { + WeeklyReportContentMapper mapper = springMapper(); + WeeklyReportContentDO record = new WeeklyReportContentDO(); + + record.setStartId(startId); + if (mapper != null) { return mapper.findOverloadReport(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(WeeklyReportContentMapper.class).findOverloadReport(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findOverloadReport for WeeklyReportContent.", e); } } public WeeklyReportContent findByPK(int keyReportId, Readset readset) throws DalException { + WeeklyReportContentMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyReportId), "primary key", String.valueOf(keyReportId)); + } + try (SqlSession session = openSession()) { - WeeklyReportContentMapper mapper = session.getMapper(WeeklyReportContentMapper.class); - WeeklyReportContentDO record = mapper.findByPrimaryKey(keyReportId); + WeeklyReportContentDO record = session.getMapper(WeeklyReportContentMapper.class) + .findByPrimaryKey(keyReportId); + return requireFound(record, "primary key", String.valueOf(keyReportId)); } catch (DalNotFoundException e) { throw e; @@ -65,10 +93,16 @@ public WeeklyReportContent findByPK(int keyReportId, Readset springMapper().insert(toRecord(proto))); + } + try (SqlSession session = openSession()) { - WeeklyReportContentMapper mapper = session.getMapper(WeeklyReportContentMapper.class); WeeklyReportContentDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(WeeklyReportContentMapper.class).insert(record); + session.commit(); return count; } catch (Exception e) { @@ -77,9 +111,15 @@ public int insert(WeeklyReportContent proto) throws DalException { } public int updateByPK(WeeklyReportContent proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - WeeklyReportContentMapper mapper = session.getMapper(WeeklyReportContentMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(WeeklyReportContentMapper.class).updateByPrimaryKey(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -87,7 +127,39 @@ public int updateByPK(WeeklyReportContent proto, Updateset } } - private WeeklyReportContent requireFound(WeeklyReportContentDO record, String field, String value) throws DalNotFoundException { + private SqlSessionFactory getSqlSessionFactory() { + SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + synchronized (this) { + sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + sqlSessionFactory = SupportingMyBatisRepository.newSqlSessionFactory(m_dataSourceManager, + WeeklyReportContentMapper.class, MAPPER_RESOURCE); + m_sqlSessionFactory = sqlSessionFactory; + } + } + } + + return sqlSessionFactory; + } + + private SqlSession openSession() { + return getSqlSessionFactory().openSession(false); + } + + private WeeklyReportContentMapper springMapper() { + return SupportingMyBatisRepository.springMapper(WeeklyReportContentMapper.class, LOGGER, SPRING_MAPPER_LOGGED, + "WeeklyReportContentRepository is using Spring managed WeeklyReportContentMapper."); + } + + private TransactionTemplate springTransactionTemplate() { + return SupportingMyBatisRepository.springTransactionTemplate(); + } + + private WeeklyReportContent requireFound(WeeklyReportContentDO record, String field, String value) + throws DalNotFoundException { if (record == null) { throw new DalNotFoundException("No WeeklyReportContent found by " + field + "(" + value + ")."); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java index 39b3b28733..00f155cb42 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java @@ -1,39 +1,64 @@ package com.dianping.cat.core.mybatis.repository.weeklyreport; -import com.dianping.cat.core.dal.WeeklyReport; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; -import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.WeeklyreportMapper; -import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.data.WeeklyreportDO; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; +import java.io.IOException; +import java.io.Reader; +import java.sql.Connection; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.sql.DataSource; + +import org.apache.ibatis.builder.xml.XMLMapperBuilder; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.mybatis.spring.SqlSessionTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.core.dal.WeeklyReport; +import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.WeeklyreportMapper; +import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.data.WeeklyreportDO; +import com.dianping.cat.spring.CatSpringContext; + +public class WeeklyReportRepository { + private static final Logger LOGGER = LoggerFactory.getLogger(WeeklyReportRepository.class); + + private static final String DATA_SOURCE_NAME = "cat"; -public class WeeklyReportRepository extends MyBatisRepositorySupport { private static final String MAPPER_RESOURCE = "mybatis/mapper/WeeklyreportMapper.xml"; - @Override - protected Class getMapperClass() { - return WeeklyreportMapper.class; - } + private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; - } + @Inject + private DataSourceManager m_dataSourceManager; + + private volatile SqlSessionFactory m_sqlSessionFactory; public WeeklyReport createLocal() { return new WeeklyReport(); } public int deleteByPK(WeeklyReport proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - WeeklyreportMapper mapper = session.getMapper(WeeklyreportMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(WeeklyreportMapper.class).deleteByPrimaryKey(proto.getKeyId()); + session.commit(); return count; } catch (Exception e) { @@ -42,9 +67,15 @@ public int deleteByPK(WeeklyReport proto) throws DalException { } public int deleteReportByDomainNamePeriod(WeeklyReport proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteReportByDomainNamePeriod(toRecord(proto))); + } + try (SqlSession session = openSession()) { - WeeklyreportMapper mapper = session.getMapper(WeeklyreportMapper.class); - int count = mapper.deleteReportByDomainNamePeriod(toRecord(proto)); + int count = session.getMapper(WeeklyreportMapper.class).deleteReportByDomainNamePeriod(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -53,9 +84,15 @@ public int deleteReportByDomainNamePeriod(WeeklyReport proto) throws DalExceptio } public WeeklyReport findByPK(int keyId, Readset readset) throws DalException { + WeeklyreportMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - WeeklyreportMapper mapper = session.getMapper(WeeklyreportMapper.class); - WeeklyreportDO record = mapper.findByPrimaryKey(keyId); + WeeklyreportDO record = session.getMapper(WeeklyreportMapper.class).findByPrimaryKey(keyId); + return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -64,14 +101,26 @@ public WeeklyReport findByPK(int keyId, Readset readset) throws Da } } - public WeeklyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - WeeklyreportMapper mapper = session.getMapper(WeeklyreportMapper.class); - WeeklyreportDO record = new WeeklyreportDO(); - record.setPeriod(period); - record.setDomain(domain); - record.setName(name); + public WeeklyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name, + Readset readset) throws DalException { + WeeklyreportDO record = new WeeklyreportDO(); + WeeklyreportMapper mapper = springMapper(); + + record.setPeriod(period); + record.setDomain(domain); + record.setName(name); + if (mapper != null) { WeeklyreportDO result = mapper.findReportByDomainNamePeriod(record).stream().findFirst().orElse(null); + + return requireFound(result, "findReportByDomainNamePeriod", record.toString()); + } + + try (SqlSession session = openSession()) { + WeeklyreportDO result = session.getMapper(WeeklyreportMapper.class).findReportByDomainNamePeriod(record) + .stream() + .findFirst() + .orElse(null); + return requireFound(result, "findReportByDomainNamePeriod", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -81,10 +130,21 @@ public WeeklyReport findReportByDomainNamePeriod(java.util.Date period, String d } public int insert(WeeklyReport proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + WeeklyreportDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - WeeklyreportMapper mapper = session.getMapper(WeeklyreportMapper.class); WeeklyreportDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(WeeklyreportMapper.class).insert(record); + session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -95,9 +155,15 @@ public int insert(WeeklyReport proto) throws DalException { } public int updateByPK(WeeklyReport proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - WeeklyreportMapper mapper = session.getMapper(WeeklyreportMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(WeeklyreportMapper.class).updateByPrimaryKey(toRecord(proto)); + session.commit(); return count; } catch (Exception e) { @@ -105,6 +171,65 @@ public int updateByPK(WeeklyReport proto, Updateset updateset) thr } } + private SqlSessionFactory getSqlSessionFactory() { + SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + synchronized (this) { + sqlSessionFactory = m_sqlSessionFactory; + + if (sqlSessionFactory == null) { + sqlSessionFactory = newSqlSessionFactory(); + m_sqlSessionFactory = sqlSessionFactory; + } + } + } + + return sqlSessionFactory; + } + + private void loadMapperXml(Configuration configuration) { + try (Reader reader = Resources.getResourceAsReader(MAPPER_RESOURCE)) { + XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, MAPPER_RESOURCE, + configuration.getSqlFragments()); + + mapperParser.parse(); + } catch (IOException e) { + throw new IllegalStateException("Error when loading MyBatis mapper: " + MAPPER_RESOURCE, e); + } + } + + private SqlSessionFactory newSqlSessionFactory() { + Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), + new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); + + configuration.addMapper(WeeklyreportMapper.class); + loadMapperXml(configuration); + return new SqlSessionFactoryBuilder().build(configuration); + } + + private SqlSession openSession() { + return getSqlSessionFactory().openSession(false); + } + + private WeeklyreportMapper springMapper() { + SqlSessionTemplate sqlSessionTemplate = CatSpringContext.getBean(SqlSessionTemplate.class); + + if (sqlSessionTemplate == null) { + return null; + } + + if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { + LOGGER.info("WeeklyReportRepository is using Spring managed WeeklyreportMapper."); + } + + return sqlSessionTemplate.getMapper(WeeklyreportMapper.class); + } + + private TransactionTemplate springTransactionTemplate() { + return CatSpringContext.getBean(TransactionTemplate.class); + } + private WeeklyReport requireFound(WeeklyreportDO record, String field, String value) throws DalNotFoundException { if (record == null) { throw new DalNotFoundException("No WeeklyReport found by " + field + "(" + value + ")."); @@ -154,4 +279,58 @@ private WeeklyreportDO toRecord(WeeklyReport model) { record.setKeyId(model.getKeyId()); return record; } + + private static final class UnidalDataSource implements DataSource { + private final DataSourceManager m_dataSourceManager; + + private final String m_dataSourceName; + + private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { + m_dataSourceManager = dataSourceManager; + m_dataSourceName = dataSourceName; + } + + @Override + public Connection getConnection() throws java.sql.SQLException { + return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); + } + + @Override + public Connection getConnection(String username, String password) throws java.sql.SQLException { + return getConnection(); + } + + @Override + public int getLoginTimeout() { + return 0; + } + + @Override + public java.io.PrintWriter getLogWriter() { + return null; + } + + @Override + public java.util.logging.Logger getParentLogger() { + return java.util.logging.Logger.getGlobal(); + } + + @Override + public boolean isWrapperFor(Class iface) { + return false; + } + + @Override + public void setLoginTimeout(int seconds) { + } + + @Override + public void setLogWriter(java.io.PrintWriter out) { + } + + @Override + public T unwrap(Class iface) throws java.sql.SQLException { + throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); + } + } } diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java index 9dc06b25b6..1f60a6b1d5 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java @@ -4,6 +4,7 @@ import java.io.Reader; import java.sql.Connection; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import javax.sql.DataSource; @@ -16,6 +17,10 @@ import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.mybatis.spring.SqlSessionTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; @@ -26,12 +31,17 @@ import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.report.daily.dao.DailyReportMapper; import com.dianping.cat.core.report.daily.dao.data.DailyReportDO; +import com.dianping.cat.spring.CatSpringContext; public class DailyReportRepository { + private static final Logger LOGGER = LoggerFactory.getLogger(DailyReportRepository.class); + private static final String DATA_SOURCE_NAME = "cat"; private static final String MAPPER_RESOURCE = "mybatis/mapper/DailyReportMapper.xml"; + private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); + @Inject private DataSourceManager m_dataSourceManager; @@ -42,6 +52,13 @@ public DailyReport createLocal() { } public int deleteByDomainNamePeriod(DailyReport proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteByDomainNamePeriod(proto.getDomain(), + proto.getName(), proto.getPeriod())); + } + try (SqlSession session = openSession()) { int count = session.getMapper(DailyReportMapper.class).deleteByDomainNamePeriod(proto.getDomain(), proto.getName(), proto.getPeriod()); @@ -54,6 +71,12 @@ public int deleteByDomainNamePeriod(DailyReport proto) throws DalException { } public int deleteByPK(DailyReport proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().deleteById(proto.getKeyId())); + } + try (SqlSession session = openSession()) { int count = session.getMapper(DailyReportMapper.class).deleteById(proto.getKeyId()); @@ -66,6 +89,13 @@ public int deleteByPK(DailyReport proto) throws DalException { public DailyReport findByDomainNamePeriod(String domain, String name, java.util.Date period, Readset readset) throws DalException { + DailyReportMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findByDomainNamePeriod(domain, name, period), "domain/name/period", + domain + "/" + name + "/" + period); + } + try (SqlSession session = openSession()) { DailyReportDO report = session.getMapper(DailyReportMapper.class).findByDomainNamePeriod(domain, name, period); @@ -80,6 +110,12 @@ public DailyReport findByDomainNamePeriod(String domain, String name, java.util. } public DailyReport findByPK(int keyId, Readset readset) throws DalException { + DailyReportMapper mapper = springMapper(); + + if (mapper != null) { + return requireFound(mapper.findById(keyId), "id", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { DailyReportDO report = session.getMapper(DailyReportMapper.class).findById(keyId); @@ -92,6 +128,17 @@ public DailyReport findByPK(int keyId, Readset readset) throws DalE } public int insert(DailyReport proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + DailyReportDO report = toDailyReportDO(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(report)); + + proto.setId(report.getId()); + proto.setKeyId(report.getId()); + return count; + } + try (SqlSession session = openSession()) { DailyReportDO report = toDailyReportDO(proto); int count = session.getMapper(DailyReportMapper.class).insert(report); @@ -107,6 +154,14 @@ public int insert(DailyReport proto) throws DalException { public List queryLatestReportsByDomainName(String domain, String name, int limits, Readset readset) throws DalException { + DailyReportMapper mapper = springMapper(); + + if (mapper != null) { + return mapper.queryLatestReportsByDomainName(domain, name, limits).stream() + .map(this::toDailyReport) + .collect(Collectors.toList()); + } + try (SqlSession session = openSession()) { return session.getMapper(DailyReportMapper.class).queryLatestReportsByDomainName(domain, name, limits) .stream() @@ -119,6 +174,12 @@ public List queryLatestReportsByDomainName(String domain, String na } public int updateByPK(DailyReport proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper().updateById(toDailyReportDO(proto))); + } + try (SqlSession session = openSession()) { int count = session.getMapper(DailyReportMapper.class).updateById(toDailyReportDO(proto)); @@ -170,6 +231,24 @@ private SqlSession openSession() { return getSqlSessionFactory().openSession(false); } + private DailyReportMapper springMapper() { + SqlSessionTemplate sqlSessionTemplate = CatSpringContext.getBean(SqlSessionTemplate.class); + + if (sqlSessionTemplate == null) { + return null; + } + + if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { + LOGGER.info("DailyReportRepository is using Spring managed DailyReportMapper."); + } + + return sqlSessionTemplate.getMapper(DailyReportMapper.class); + } + + private TransactionTemplate springTransactionTemplate() { + return CatSpringContext.getBean(TransactionTemplate.class); + } + private DailyReport requireFound(DailyReportDO report, String field, String value) throws DalNotFoundException { if (report == null) { throw new DalNotFoundException(String.format("No daily report found by %s(%s).", field, value)); diff --git a/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportModel.java b/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportModel.java index 69bed7f085..c81837162f 100755 --- a/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportModel.java +++ b/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportModel.java @@ -40,6 +40,7 @@ import com.dianping.cat.service.HostinfoService; import com.dianping.cat.service.ProjectService; import com.dianping.cat.service.ProjectService.Department; +import com.dianping.cat.spring.CatSpringContext; public abstract class AbstractReportModel> extends ViewModel { @@ -71,9 +72,15 @@ public abstract class AbstractReportModel toRemovePaths = new ArrayList(); @@ -112,6 +115,7 @@ public ReportBucket getReportBucket(long timestamp, String name, int index) thro @Override public void initialize() throws InitializationException { + refreshSpringBeans(); m_reportBaseDir = new File(Cat.getCatHome(), "bucket/report"); } @@ -154,4 +158,12 @@ public Direction matches(File base, String path) { } } + private void refreshSpringBeans() { + ServerConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + + if (configManager != null) { + m_configManager = configManager; + } + } + } diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java index cdec241c2c..fe4ae868a0 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java @@ -56,6 +56,7 @@ import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.message.Event; +import com.dianping.cat.spring.CatSpringContext; public abstract class AbstractReportService implements LogEnabled, ReportService { @@ -136,6 +137,7 @@ public void enableLogging(Logger logger) { @Override public boolean insertDailyReport(DailyReport report, byte[] content) { + refreshSpringRepositories(); try { m_dailyReportDao.insert(report); @@ -154,6 +156,7 @@ public boolean insertDailyReport(DailyReport report, byte[] content) { @Override public boolean insertHourlyReport(HourlyReport report, byte[] content) { + refreshSpringRepositories(); try { m_hourlyReportDao.insert(report); @@ -173,6 +176,7 @@ public boolean insertHourlyReport(HourlyReport report, byte[] content) { @Override public boolean insertMonthlyReport(MonthlyReport report, byte[] content) { + refreshSpringRepositories(); try { MonthlyReport monthReport = m_monthlyReportDao .findReportByDomainNamePeriod(report.getPeriod(), report.getDomain(), report.getName(), @@ -210,6 +214,7 @@ public boolean insertMonthlyReport(MonthlyReport report, byte[] content) { @Override public boolean insertWeeklyReport(WeeklyReport report, byte[] content) { + refreshSpringRepositories(); try { WeeklyReport weeklyReport = m_weeklyReportDao .findReportByDomainNamePeriod(report.getPeriod(), report.getDomain(), report.getName(), @@ -247,6 +252,7 @@ public boolean insertWeeklyReport(WeeklyReport report, byte[] content) { public abstract T makeReport(String domain, Date start, Date end); public Set queryAllDomainNames(Date start, Date end, String name) { + refreshSpringRepositories(); Set domains = new HashSet(); long startTime = start.getTime(); long endTime = end.getTime(); @@ -291,6 +297,7 @@ private Set queryAllDomains(Date date, String name) { public abstract T queryMonthlyReport(String domain, Date start); public T queryReport(String domain, Date start, Date end) { + refreshSpringRepositories(); int type = computeQueryType(start, end); T report = null; @@ -314,4 +321,44 @@ public T queryReport(String domain, Date start, Date end) { @Override public abstract T queryWeeklyReport(String domain, Date start); + protected void refreshSpringRepositories() { + HourlyReportRepository hourlyReportRepository = CatSpringContext.getBeanIfAvailable(HourlyReportRepository.class); + HourlyReportContentRepository hourlyReportContentRepository = CatSpringContext + .getBeanIfAvailable(HourlyReportContentRepository.class); + DailyReportRepository dailyReportRepository = CatSpringContext.getBeanIfAvailable(DailyReportRepository.class); + DailyReportContentRepository dailyReportContentRepository = CatSpringContext + .getBeanIfAvailable(DailyReportContentRepository.class); + WeeklyReportRepository weeklyReportRepository = CatSpringContext.getBeanIfAvailable(WeeklyReportRepository.class); + WeeklyReportContentRepository weeklyReportContentRepository = CatSpringContext + .getBeanIfAvailable(WeeklyReportContentRepository.class); + MonthlyReportRepository monthlyReportRepository = CatSpringContext.getBeanIfAvailable(MonthlyReportRepository.class); + MonthlyReportContentRepository monthlyReportContentRepository = CatSpringContext + .getBeanIfAvailable(MonthlyReportContentRepository.class); + + if (hourlyReportRepository != null) { + m_hourlyReportDao = hourlyReportRepository; + } + if (hourlyReportContentRepository != null) { + m_hourlyReportContentDao = hourlyReportContentRepository; + } + if (dailyReportRepository != null) { + m_dailyReportDao = dailyReportRepository; + } + if (dailyReportContentRepository != null) { + m_dailyReportContentDao = dailyReportContentRepository; + } + if (weeklyReportRepository != null) { + m_weeklyReportDao = weeklyReportRepository; + } + if (weeklyReportContentRepository != null) { + m_weeklyReportContentDao = weeklyReportContentRepository; + } + if (monthlyReportRepository != null) { + m_monthlyReportDao = monthlyReportRepository; + } + if (monthlyReportContentRepository != null) { + m_monthlyReportContentDao = monthlyReportContentRepository; + } + } + } diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java b/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java index 8154926b8d..3c5987c0b8 100755 --- a/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java @@ -36,6 +36,7 @@ import com.dianping.cat.message.Message; import com.dianping.cat.message.Transaction; import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.spring.CatSpringContext; public abstract class BaseCompositeModelService extends ModelServiceWithCalSupport implements ModelService, Initializable { @@ -66,6 +67,15 @@ public String getName() { @Override public void initialize() throws InitializationException { + ServerConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + RemoteServersManager serverManager = CatSpringContext.getBeanIfAvailable(RemoteServersManager.class); + + if (configManager != null) { + m_configManager = configManager; + } + if (serverManager != null) { + m_serverManager = serverManager; + } m_allServices.addAll(m_services); String remoteServers = m_configManager.getConsoleRemoteServers(); diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/BaseHistoricalModelService.java b/cat-core/src/main/java/com/dianping/cat/report/service/BaseHistoricalModelService.java index 229412e10a..bdc28edc4f 100755 --- a/cat-core/src/main/java/com/dianping/cat/report/service/BaseHistoricalModelService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/BaseHistoricalModelService.java @@ -25,6 +25,7 @@ import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.message.Message; import com.dianping.cat.message.Transaction; +import com.dianping.cat.spring.CatSpringContext; public abstract class BaseHistoricalModelService extends ModelServiceWithCalSupport implements ModelService, Initializable { @@ -49,6 +50,11 @@ public String getName() { @Override public void initialize() throws InitializationException { + ServerConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + + if (configManager != null) { + m_configManager = configManager; + } m_localMode = m_configManager.isLocalMode(); } diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/LocalModelService.java b/cat-core/src/main/java/com/dianping/cat/report/service/LocalModelService.java index c294ea99c0..ef978c31fc 100755 --- a/cat-core/src/main/java/com/dianping/cat/report/service/LocalModelService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/LocalModelService.java @@ -32,6 +32,7 @@ import com.dianping.cat.analysis.MessageConsumer; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.mvc.ApiPayload; +import com.dianping.cat.spring.CatSpringContext; public abstract class LocalModelService implements Initializable { @@ -100,6 +101,11 @@ public String getReport(ModelRequest request, ModelPeriod period, String domain, @Override public void initialize() throws InitializationException { + ServerConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + + if (configManager != null) { + m_configManager = configManager; + } m_defaultDomain = m_configManager.getConsoleDefaultDomain(); m_analyzerCount = m_configManager.getThreadsOfRealtimeAnalyzer(m_name); } diff --git a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java index 2dece2b8cc..cd5644fe00 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java @@ -43,6 +43,7 @@ import com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository; import com.dianping.cat.core.dal.HostinfoEntity; import com.dianping.cat.helper.TimeHelper; +import com.dianping.cat.spring.CatSpringContext; @Named(type = HostinfoService.class) public class HostinfoService implements Initializable, LogEnabled { @@ -99,6 +100,15 @@ public Hostinfo findByIp(String ip) { @Override public void initialize() throws InitializationException { + HostinfoRepository hostinfoDao = CatSpringContext.getBeanIfAvailable(HostinfoRepository.class); + ServerConfigManager manager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + + if (hostinfoDao != null) { + m_hostinfoDao = hostinfoDao; + } + if (manager != null) { + m_manager = manager; + } Threads.forGroup("Cat").start(new RefreshHost()); } diff --git a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java index 302f67160e..6c212626c7 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java @@ -162,6 +162,14 @@ public void initialize() throws InitializationException { } } + public void setProjectDao(ProjectRepository projectDao) { + m_projectDao = projectDao; + } + + public void setServerConfigManager(ServerConfigManager manager) { + m_manager = manager; + } + public boolean insert(Project project) { m_domainToProjects.put(project.getDomain(), project); diff --git a/cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java b/cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java new file mode 100644 index 0000000000..f1ec51360b --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java @@ -0,0 +1,40 @@ +package com.dianping.cat.spring; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; + +public final class CatSpringContext { + private static volatile ApplicationContext s_context; + + private CatSpringContext() { + } + + public static T getBean(Class type) { + ApplicationContext context = s_context; + + return context == null ? null : context.getBean(type); + } + + public static T getBeanIfAvailable(Class type) { + ApplicationContext context = s_context; + + if (context == null) { + return null; + } + try { + return context.getBean(type); + } catch (BeansException e) { + return null; + } + } + + public static void setContext(ApplicationContext context) { + s_context = context; + } + + public static void clear(ApplicationContext context) { + if (s_context == context) { + s_context = null; + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java index fb01aaec83..4498e0d97a 100644 --- a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java +++ b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java @@ -22,6 +22,7 @@ import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.core.dal.Task; import com.dianping.cat.core.mybatis.repository.task.TaskRepository; +import com.dianping.cat.spring.CatSpringContext; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -50,6 +51,7 @@ public class TaskManager { private TaskRepository m_taskDao; public boolean createTask(Date period, String domain, String name, TaskCreationPolicy prolicy) { + refreshSpringBeans(); try { if (prolicy.shouldCreateHourlyTask()) { insertToDatabase(period, domain, name, REPORT_HOUR); @@ -88,6 +90,7 @@ public boolean createTask(Date period, String domain, String name, TaskCreationP } protected void insertToDatabase(Date period, String domain, String name, int reportType) throws DalException { + refreshSpringBeans(); Task task = m_taskDao.createLocal(); task.setCreationDate(new Date()); @@ -100,6 +103,14 @@ protected void insertToDatabase(Date period, String domain, String name, int rep m_taskDao.insert(task); } + private void refreshSpringBeans() { + TaskRepository taskDao = CatSpringContext.getBeanIfAvailable(TaskRepository.class); + + if (taskDao != null) { + m_taskDao = taskDao; + } + } + public enum TaskProlicy implements TaskCreationPolicy { ALL { diff --git a/cat-home/pom.xml b/cat-home/pom.xml index 82b39645f3..ec00f493c0 100755 --- a/cat-home/pom.xml +++ b/cat-home/pom.xml @@ -58,6 +58,22 @@ org.mybatis mybatis + + org.mybatis + mybatis-spring + + + org.springframework + spring-context + + + org.springframework + spring-jdbc + + + org.springframework + spring-tx + org.projectlombok lombok diff --git a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java index 3e72b7f000..95bee9f043 100644 --- a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java +++ b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java @@ -32,6 +32,7 @@ import com.dianping.cat.report.alert.AlarmManager; import com.dianping.cat.report.task.DefaultTaskConsumer; import com.dianping.cat.report.task.reload.ReportReloadTask; +import com.dianping.cat.spring.CatSpringContext; @Named(type = Module.class, value = CatHomeModule.ID) public class CatHomeModule extends AbstractModule { @@ -39,7 +40,11 @@ public class CatHomeModule extends AbstractModule { @Override protected void execute(ModuleContext ctx) throws Exception { - ServerConfigManager serverConfigManager = ctx.lookup(ServerConfigManager.class); + ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + + if (serverConfigManager == null) { + serverConfigManager = ctx.lookup(ServerConfigManager.class); + } ReportReloadTask reportReloadTask = ctx.lookup(ReportReloadTask.class); Threads.forGroup("Cat").start(reportReloadTask); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java index 1c1d609da8..47d1e7bdee 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java @@ -1,29 +1,26 @@ package com.dianping.cat.core.mybatis.repository.alert.summary; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.generated.alert.summary.dao.AlertSummaryMapper; import com.dianping.cat.core.mybatis.generated.alert.summary.dao.data.AlertSummaryDO; import com.dianping.cat.home.dal.report.AlertSummary; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; import org.apache.ibatis.session.SqlSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -public class AlertSummaryRepository extends MyBatisRepositorySupport { - private static final String MAPPER_RESOURCE = "mybatis/mapper/AlertSummaryMapper.xml"; +public class AlertSummaryRepository extends SpringBackedRepositorySupport { + private static final Logger LOGGER = LoggerFactory.getLogger(AlertSummaryRepository.class); - @Override - protected Class getMapperClass() { - return AlertSummaryMapper.class; - } + private static final String MAPPER_RESOURCE = "mybatis/mapper/AlertSummaryMapper.xml"; - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; + public AlertSummaryRepository() { + super(AlertSummaryMapper.class, MAPPER_RESOURCE, + "AlertSummaryRepository is using Spring managed AlertSummaryMapper."); } public AlertSummary createLocal() { @@ -31,9 +28,14 @@ public AlertSummary createLocal() { } public int deleteByPK(AlertSummary proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - AlertSummaryMapper mapper = session.getMapper(AlertSummaryMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(AlertSummaryMapper.class).deleteByPrimaryKey(proto.getKeyId()); session.commit(); return count; } catch (Exception e) { @@ -42,9 +44,14 @@ public int deleteByPK(AlertSummary proto) throws DalException { } public AlertSummary findByPK(int keyId, Readset readset) throws DalException { + AlertSummaryMapper mapper = springMapper(LOGGER); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - AlertSummaryMapper mapper = session.getMapper(AlertSummaryMapper.class); - AlertSummaryDO record = mapper.findByPrimaryKey(keyId); + AlertSummaryDO record = session.getMapper(AlertSummaryMapper.class).findByPrimaryKey(keyId); return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -54,10 +61,20 @@ public AlertSummary findByPK(int keyId, Readset readset) throws Da } public int insert(AlertSummary proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + AlertSummaryDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - AlertSummaryMapper mapper = session.getMapper(AlertSummaryMapper.class); AlertSummaryDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(AlertSummaryMapper.class).insert(record); session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -68,9 +85,14 @@ public int insert(AlertSummary proto) throws DalException { } public int updateByPK(AlertSummary proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - AlertSummaryMapper mapper = session.getMapper(AlertSummaryMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(AlertSummaryMapper.class).updateByPrimaryKey(toRecord(proto)); session.commit(); return count; } catch (Exception e) { diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java index f5b2e4bb92..de7c0040db 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java @@ -1,29 +1,28 @@ package com.dianping.cat.core.mybatis.repository.alteration; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.generated.alteration.dao.AlterationMapper; import com.dianping.cat.core.mybatis.generated.alteration.dao.data.AlterationDO; import com.dianping.cat.home.dal.report.Alteration; -import java.util.Date; import java.util.List; import java.util.stream.Collectors; import org.apache.ibatis.session.SqlSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -public class AlterationRepository extends MyBatisRepositorySupport { - private static final String MAPPER_RESOURCE = "mybatis/mapper/AlterationMapper.xml"; +public class AlterationRepository extends SpringBackedRepositorySupport { + private static final Logger LOGGER = LoggerFactory.getLogger(AlterationRepository.class); - @Override - protected Class getMapperClass() { - return AlterationMapper.class; - } + private static final String MAPPER_RESOURCE = "mybatis/mapper/AlterationMapper.xml"; - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; + public AlterationRepository() { + super(AlterationMapper.class, MAPPER_RESOURCE, + "AlterationRepository is using Spring managed AlterationMapper."); } public Alteration createLocal() { @@ -31,9 +30,14 @@ public Alteration createLocal() { } public int deleteByPK(Alteration proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - AlterationMapper mapper = session.getMapper(AlterationMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(AlterationMapper.class).deleteByPrimaryKey(proto.getKeyId()); session.commit(); return count; } catch (Exception e) { @@ -42,66 +46,99 @@ public int deleteByPK(Alteration proto) throws DalException { } public List findByTypeDruation(java.util.Date startTime, java.util.Date endTime, String type, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - AlterationMapper mapper = session.getMapper(AlterationMapper.class); - AlterationDO record = new AlterationDO(); - record.setStartTime(startTime); - record.setEndTime(endTime); - record.setType(type); + AlterationMapper mapper = springMapper(LOGGER); + AlterationDO record = new AlterationDO(); + + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setType(type); + if (mapper != null) { return mapper.findByTypeDruation(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(AlterationMapper.class).findByTypeDruation(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findByTypeDruation for Alteration.", e); } } public List findByDtdh(java.util.Date startTime, java.util.Date endTime, String type, String domain, String hostname, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - AlterationMapper mapper = session.getMapper(AlterationMapper.class); - AlterationDO record = new AlterationDO(); - record.setStartTime(startTime); - record.setEndTime(endTime); - record.setType(type); - record.setDomain(domain); - record.setHostname(hostname); + AlterationMapper mapper = springMapper(LOGGER); + AlterationDO record = new AlterationDO(); + + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setType(type); + record.setDomain(domain); + record.setHostname(hostname); + if (mapper != null) { return mapper.findByDtdh(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(AlterationMapper.class).findByDtdh(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findByDtdh for Alteration.", e); } } public List findByDtdhTypes(java.util.Date startTime, java.util.Date endTime, String type, String domain, String hostname, String[] types, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - AlterationMapper mapper = session.getMapper(AlterationMapper.class); - AlterationDO record = new AlterationDO(); - record.setStartTime(startTime); - record.setEndTime(endTime); - record.setType(type); - record.setDomain(domain); - record.setHostname(hostname); - record.setTypes(types); + AlterationMapper mapper = springMapper(LOGGER); + AlterationDO record = new AlterationDO(); + + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setType(type); + record.setDomain(domain); + record.setHostname(hostname); + record.setTypes(types); + if (mapper != null) { return mapper.findByDtdhTypes(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(AlterationMapper.class).findByDtdhTypes(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findByDtdhTypes for Alteration.", e); } } public List findByDomainAndTime(java.util.Date startTime, java.util.Date endTime, String domain, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - AlterationMapper mapper = session.getMapper(AlterationMapper.class); - AlterationDO record = new AlterationDO(); - record.setStartTime(startTime); - record.setEndTime(endTime); - record.setDomain(domain); + AlterationMapper mapper = springMapper(LOGGER); + AlterationDO record = new AlterationDO(); + + record.setStartTime(startTime); + record.setEndTime(endTime); + record.setDomain(domain); + if (mapper != null) { return mapper.findByDomainAndTime(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(AlterationMapper.class).findByDomainAndTime(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findByDomainAndTime for Alteration.", e); } } public Alteration findByPK(int keyId, Readset readset) throws DalException { + AlterationMapper mapper = springMapper(LOGGER); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - AlterationMapper mapper = session.getMapper(AlterationMapper.class); - AlterationDO record = mapper.findByPrimaryKey(keyId); + AlterationDO record = session.getMapper(AlterationMapper.class).findByPrimaryKey(keyId); return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -111,10 +148,20 @@ public Alteration findByPK(int keyId, Readset readset) throws DalExc } public int insert(Alteration proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + AlterationDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - AlterationMapper mapper = session.getMapper(AlterationMapper.class); AlterationDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(AlterationMapper.class).insert(record); session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -125,9 +172,14 @@ public int insert(Alteration proto) throws DalException { } public int updateByPK(Alteration proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - AlterationMapper mapper = session.getMapper(AlterationMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(AlterationMapper.class).updateByPrimaryKey(toRecord(proto)); session.commit(); return count; } catch (Exception e) { diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java index 09af6f8218..80f83d1fa0 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java @@ -1,29 +1,25 @@ package com.dianping.cat.core.mybatis.repository.baseline; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.generated.baseline.dao.BaselineMapper; import com.dianping.cat.core.mybatis.generated.baseline.dao.data.BaselineDO; import com.dianping.cat.home.dal.report.Baseline; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; import org.apache.ibatis.session.SqlSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -public class BaselineRepository extends MyBatisRepositorySupport { - private static final String MAPPER_RESOURCE = "mybatis/mapper/BaselineMapper.xml"; +public class BaselineRepository extends SpringBackedRepositorySupport { + private static final Logger LOGGER = LoggerFactory.getLogger(BaselineRepository.class); - @Override - protected Class getMapperClass() { - return BaselineMapper.class; - } + private static final String MAPPER_RESOURCE = "mybatis/mapper/BaselineMapper.xml"; - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; + public BaselineRepository() { + super(BaselineMapper.class, MAPPER_RESOURCE, "BaselineRepository is using Spring managed BaselineMapper."); } public Baseline createLocal() { @@ -31,9 +27,14 @@ public Baseline createLocal() { } public int deleteByPK(Baseline proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - BaselineMapper mapper = session.getMapper(BaselineMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(BaselineMapper.class).deleteByPrimaryKey(proto.getKeyId()); session.commit(); return count; } catch (Exception e) { @@ -42,9 +43,14 @@ public int deleteByPK(Baseline proto) throws DalException { } public Baseline findByPK(int keyId, Readset readset) throws DalException { + BaselineMapper mapper = springMapper(LOGGER); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - BaselineMapper mapper = session.getMapper(BaselineMapper.class); - BaselineDO record = mapper.findByPrimaryKey(keyId); + BaselineDO record = session.getMapper(BaselineMapper.class).findByPrimaryKey(keyId); return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -54,13 +60,22 @@ public Baseline findByPK(int keyId, Readset readset) throws DalExcepti } public Baseline findByReportNameKeyTime(java.util.Date reportPeriod, String reportName, String indexKey, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - BaselineMapper mapper = session.getMapper(BaselineMapper.class); - BaselineDO record = new BaselineDO(); - record.setReportPeriod(reportPeriod); - record.setReportName(reportName); - record.setIndexKey(indexKey); + BaselineMapper mapper = springMapper(LOGGER); + BaselineDO record = new BaselineDO(); + + record.setReportPeriod(reportPeriod); + record.setReportName(reportName); + record.setIndexKey(indexKey); + if (mapper != null) { BaselineDO result = mapper.findByReportNameKeyTime(record).stream().findFirst().orElse(null); + + return requireFound(result, "findByReportNameKeyTime", record.toString()); + } + + try (SqlSession session = openSession()) { + BaselineDO result = session.getMapper(BaselineMapper.class).findByReportNameKeyTime(record).stream() + .findFirst() + .orElse(null); return requireFound(result, "findByReportNameKeyTime", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -70,10 +85,20 @@ public Baseline findByReportNameKeyTime(java.util.Date reportPeriod, String repo } public int insert(Baseline proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + BaselineDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - BaselineMapper mapper = session.getMapper(BaselineMapper.class); BaselineDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(BaselineMapper.class).insert(record); session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -84,9 +109,14 @@ public int insert(Baseline proto) throws DalException { } public int updateByPK(Baseline proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - BaselineMapper mapper = session.getMapper(BaselineMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(BaselineMapper.class).updateByPrimaryKey(toRecord(proto)); session.commit(); return count; } catch (Exception e) { diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java index 7d2b96b31d..ffa2d07ae7 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java @@ -1,29 +1,26 @@ package com.dianping.cat.core.mybatis.repository.config.modification; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.generated.config.modification.dao.ConfigModificationMapper; import com.dianping.cat.core.mybatis.generated.config.modification.dao.data.ConfigModificationDO; import com.dianping.cat.home.dal.report.ConfigModification; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; import org.apache.ibatis.session.SqlSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -public class ConfigModificationRepository extends MyBatisRepositorySupport { - private static final String MAPPER_RESOURCE = "mybatis/mapper/ConfigModificationMapper.xml"; +public class ConfigModificationRepository extends SpringBackedRepositorySupport { + private static final Logger LOGGER = LoggerFactory.getLogger(ConfigModificationRepository.class); - @Override - protected Class getMapperClass() { - return ConfigModificationMapper.class; - } + private static final String MAPPER_RESOURCE = "mybatis/mapper/ConfigModificationMapper.xml"; - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; + public ConfigModificationRepository() { + super(ConfigModificationMapper.class, MAPPER_RESOURCE, + "ConfigModificationRepository is using Spring managed ConfigModificationMapper."); } public ConfigModification createLocal() { @@ -31,9 +28,14 @@ public ConfigModification createLocal() { } public int deleteByPK(ConfigModification proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - ConfigModificationMapper mapper = session.getMapper(ConfigModificationMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(ConfigModificationMapper.class).deleteByPrimaryKey(proto.getKeyId()); session.commit(); return count; } catch (Exception e) { @@ -42,9 +44,14 @@ public int deleteByPK(ConfigModification proto) throws DalException { } public ConfigModification findByPK(int keyId, Readset readset) throws DalException { + ConfigModificationMapper mapper = springMapper(LOGGER); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - ConfigModificationMapper mapper = session.getMapper(ConfigModificationMapper.class); - ConfigModificationDO record = mapper.findByPrimaryKey(keyId); + ConfigModificationDO record = session.getMapper(ConfigModificationMapper.class).findByPrimaryKey(keyId); return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -54,10 +61,20 @@ public ConfigModification findByPK(int keyId, Readset readse } public int insert(ConfigModification proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + ConfigModificationDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - ConfigModificationMapper mapper = session.getMapper(ConfigModificationMapper.class); ConfigModificationDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(ConfigModificationMapper.class).insert(record); session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -68,9 +85,14 @@ public int insert(ConfigModification proto) throws DalException { } public int updateByPK(ConfigModification proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - ConfigModificationMapper mapper = session.getMapper(ConfigModificationMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(ConfigModificationMapper.class).updateByPrimaryKey(toRecord(proto)); session.commit(); return count; } catch (Exception e) { diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java index fabb933256..0ccaac9b35 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java @@ -1,29 +1,26 @@ package com.dianping.cat.core.mybatis.repository.metric.graph; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.generated.metric.graph.dao.MetricGraphMapper; import com.dianping.cat.core.mybatis.generated.metric.graph.dao.data.MetricGraphDO; import com.dianping.cat.home.dal.report.MetricGraph; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; import org.apache.ibatis.session.SqlSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -public class MetricGraphRepository extends MyBatisRepositorySupport { - private static final String MAPPER_RESOURCE = "mybatis/mapper/MetricGraphMapper.xml"; +public class MetricGraphRepository extends SpringBackedRepositorySupport { + private static final Logger LOGGER = LoggerFactory.getLogger(MetricGraphRepository.class); - @Override - protected Class getMapperClass() { - return MetricGraphMapper.class; - } + private static final String MAPPER_RESOURCE = "mybatis/mapper/MetricGraphMapper.xml"; - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; + public MetricGraphRepository() { + super(MetricGraphMapper.class, MAPPER_RESOURCE, + "MetricGraphRepository is using Spring managed MetricGraphMapper."); } public MetricGraph createLocal() { @@ -31,9 +28,14 @@ public MetricGraph createLocal() { } public int deleteByPK(MetricGraph proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - MetricGraphMapper mapper = session.getMapper(MetricGraphMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(MetricGraphMapper.class).deleteByPrimaryKey(proto.getKeyId()); session.commit(); return count; } catch (Exception e) { @@ -42,9 +44,14 @@ public int deleteByPK(MetricGraph proto) throws DalException { } public int deleteBeforeDate(MetricGraph proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteBeforeDate(toRecord(proto))); + } + try (SqlSession session = openSession()) { - MetricGraphMapper mapper = session.getMapper(MetricGraphMapper.class); - int count = mapper.deleteBeforeDate(toRecord(proto)); + int count = session.getMapper(MetricGraphMapper.class).deleteBeforeDate(toRecord(proto)); session.commit(); return count; } catch (Exception e) { @@ -53,9 +60,14 @@ public int deleteBeforeDate(MetricGraph proto) throws DalException { } public MetricGraph findByPK(int keyId, Readset readset) throws DalException { + MetricGraphMapper mapper = springMapper(LOGGER); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - MetricGraphMapper mapper = session.getMapper(MetricGraphMapper.class); - MetricGraphDO record = mapper.findByPrimaryKey(keyId); + MetricGraphDO record = session.getMapper(MetricGraphMapper.class).findByPrimaryKey(keyId); return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -65,11 +77,20 @@ public MetricGraph findByPK(int keyId, Readset readset) throws DalE } public MetricGraph findByGrapId(long graphId, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - MetricGraphMapper mapper = session.getMapper(MetricGraphMapper.class); - MetricGraphDO record = new MetricGraphDO(); - record.setGraphId(graphId); + MetricGraphMapper mapper = springMapper(LOGGER); + MetricGraphDO record = new MetricGraphDO(); + + record.setGraphId(graphId); + if (mapper != null) { MetricGraphDO result = mapper.findByGrapId(record).stream().findFirst().orElse(null); + + return requireFound(result, "findByGrapId", record.toString()); + } + + try (SqlSession session = openSession()) { + MetricGraphDO result = session.getMapper(MetricGraphMapper.class).findByGrapId(record).stream() + .findFirst() + .orElse(null); return requireFound(result, "findByGrapId", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -79,11 +100,19 @@ public MetricGraph findByGrapId(long graphId, Readset readset) thro } public MetricGraph findLast(int number, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - MetricGraphMapper mapper = session.getMapper(MetricGraphMapper.class); - MetricGraphDO record = new MetricGraphDO(); - record.setNumber(number); + MetricGraphMapper mapper = springMapper(LOGGER); + MetricGraphDO record = new MetricGraphDO(); + + record.setNumber(number); + if (mapper != null) { MetricGraphDO result = mapper.findLast(record).stream().findFirst().orElse(null); + + return requireFound(result, "findLast", record.toString()); + } + + try (SqlSession session = openSession()) { + MetricGraphDO result = session.getMapper(MetricGraphMapper.class).findLast(record).stream().findFirst() + .orElse(null); return requireFound(result, "findLast", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -93,10 +122,20 @@ public MetricGraph findLast(int number, Readset readset) throws Dal } public int insert(MetricGraph proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + MetricGraphDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - MetricGraphMapper mapper = session.getMapper(MetricGraphMapper.class); MetricGraphDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(MetricGraphMapper.class).insert(record); session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -107,9 +146,14 @@ public int insert(MetricGraph proto) throws DalException { } public int updateByPK(MetricGraph proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - MetricGraphMapper mapper = session.getMapper(MetricGraphMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(MetricGraphMapper.class).updateByPrimaryKey(toRecord(proto)); session.commit(); return count; } catch (Exception e) { diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java index ac54898a3a..97c953f237 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java @@ -1,29 +1,28 @@ package com.dianping.cat.core.mybatis.repository.metric.screen; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.generated.metric.screen.dao.MetricScreenMapper; import com.dianping.cat.core.mybatis.generated.metric.screen.dao.data.MetricScreenDO; import com.dianping.cat.home.dal.report.MetricScreen; -import java.util.Date; import java.util.List; import java.util.stream.Collectors; import org.apache.ibatis.session.SqlSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -public class MetricScreenRepository extends MyBatisRepositorySupport { - private static final String MAPPER_RESOURCE = "mybatis/mapper/MetricScreenMapper.xml"; +public class MetricScreenRepository extends SpringBackedRepositorySupport { + private static final Logger LOGGER = LoggerFactory.getLogger(MetricScreenRepository.class); - @Override - protected Class getMapperClass() { - return MetricScreenMapper.class; - } + private static final String MAPPER_RESOURCE = "mybatis/mapper/MetricScreenMapper.xml"; - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; + public MetricScreenRepository() { + super(MetricScreenMapper.class, MAPPER_RESOURCE, + "MetricScreenRepository is using Spring managed MetricScreenMapper."); } public MetricScreen createLocal() { @@ -31,9 +30,14 @@ public MetricScreen createLocal() { } public int deleteByPK(MetricScreen proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(MetricScreenMapper.class).deleteByPrimaryKey(proto.getKeyId()); session.commit(); return count; } catch (Exception e) { @@ -42,9 +46,14 @@ public int deleteByPK(MetricScreen proto) throws DalException { } public int deleteByName(MetricScreen proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByName(toRecord(proto))); + } + try (SqlSession session = openSession()) { - MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); - int count = mapper.deleteByName(toRecord(proto)); + int count = session.getMapper(MetricScreenMapper.class).deleteByName(toRecord(proto)); session.commit(); return count; } catch (Exception e) { @@ -53,9 +62,14 @@ public int deleteByName(MetricScreen proto) throws DalException { } public int deleteByNameGraph(MetricScreen proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByNameGraph(toRecord(proto))); + } + try (SqlSession session = openSession()) { - MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); - int count = mapper.deleteByNameGraph(toRecord(proto)); + int count = session.getMapper(MetricScreenMapper.class).deleteByNameGraph(toRecord(proto)); session.commit(); return count; } catch (Exception e) { @@ -64,30 +78,49 @@ public int deleteByNameGraph(MetricScreen proto) throws DalException { } public List findAll(Readset readset) throws DalException { - try (SqlSession session = openSession()) { - MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); - MetricScreenDO record = new MetricScreenDO(); + MetricScreenMapper mapper = springMapper(LOGGER); + MetricScreenDO record = new MetricScreenDO(); + + if (mapper != null) { return mapper.findAll(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(MetricScreenMapper.class).findAll(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findAll for MetricScreen.", e); } } public List findByName(String name, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); - MetricScreenDO record = new MetricScreenDO(); - record.setName(name); + MetricScreenMapper mapper = springMapper(LOGGER); + MetricScreenDO record = new MetricScreenDO(); + + record.setName(name); + if (mapper != null) { return mapper.findByName(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(MetricScreenMapper.class).findByName(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findByName for MetricScreen.", e); } } public MetricScreen findByPK(int keyId, Readset readset) throws DalException { + MetricScreenMapper mapper = springMapper(LOGGER); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); - MetricScreenDO record = mapper.findByPrimaryKey(keyId); + MetricScreenDO record = session.getMapper(MetricScreenMapper.class).findByPrimaryKey(keyId); return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -97,12 +130,21 @@ public MetricScreen findByPK(int keyId, Readset readset) throws Da } public MetricScreen findByNameGraph(String name, String graphName, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); - MetricScreenDO record = new MetricScreenDO(); - record.setName(name); - record.setGraphName(graphName); + MetricScreenMapper mapper = springMapper(LOGGER); + MetricScreenDO record = new MetricScreenDO(); + + record.setName(name); + record.setGraphName(graphName); + if (mapper != null) { MetricScreenDO result = mapper.findByNameGraph(record).stream().findFirst().orElse(null); + + return requireFound(result, "findByNameGraph", record.toString()); + } + + try (SqlSession session = openSession()) { + MetricScreenDO result = session.getMapper(MetricScreenMapper.class).findByNameGraph(record).stream() + .findFirst() + .orElse(null); return requireFound(result, "findByNameGraph", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -112,10 +154,20 @@ public MetricScreen findByNameGraph(String name, String graphName, Readset springMapper(LOGGER).insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); MetricScreenDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(MetricScreenMapper.class).insert(record); session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -126,9 +178,14 @@ public int insert(MetricScreen proto) throws DalException { } public int insertOrUpdateByNameGraph(MetricScreen proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).insertOrUpdateByNameGraph(toRecord(proto))); + } + try (SqlSession session = openSession()) { - MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); - int count = mapper.insertOrUpdateByNameGraph(toRecord(proto)); + int count = session.getMapper(MetricScreenMapper.class).insertOrUpdateByNameGraph(toRecord(proto)); session.commit(); return count; } catch (Exception e) { @@ -137,9 +194,14 @@ public int insertOrUpdateByNameGraph(MetricScreen proto) throws DalException { } public int updateByPK(MetricScreen proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - MetricScreenMapper mapper = session.getMapper(MetricScreenMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(MetricScreenMapper.class).updateByPrimaryKey(toRecord(proto)); session.commit(); return count; } catch (Exception e) { diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java index 7bee981870..c2a613126f 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java @@ -1,29 +1,27 @@ package com.dianping.cat.core.mybatis.repository.overload; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.generated.overload.dao.OverloadMapper; import com.dianping.cat.core.mybatis.generated.overload.dao.data.OverloadDO; import com.dianping.cat.home.dal.report.Overload; -import java.util.Date; import java.util.List; import java.util.stream.Collectors; import org.apache.ibatis.session.SqlSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -public class OverloadRepository extends MyBatisRepositorySupport { - private static final String MAPPER_RESOURCE = "mybatis/mapper/OverloadMapper.xml"; +public class OverloadRepository extends SpringBackedRepositorySupport { + private static final Logger LOGGER = LoggerFactory.getLogger(OverloadRepository.class); - @Override - protected Class getMapperClass() { - return OverloadMapper.class; - } + private static final String MAPPER_RESOURCE = "mybatis/mapper/OverloadMapper.xml"; - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; + public OverloadRepository() { + super(OverloadMapper.class, MAPPER_RESOURCE, "OverloadRepository is using Spring managed OverloadMapper."); } public Overload createLocal() { @@ -31,9 +29,14 @@ public Overload createLocal() { } public int deleteByPK(Overload proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - OverloadMapper mapper = session.getMapper(OverloadMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(OverloadMapper.class).deleteByPrimaryKey(proto.getKeyId()); session.commit(); return count; } catch (Exception e) { @@ -42,21 +45,33 @@ public int deleteByPK(Overload proto) throws DalException { } public List findIdAndSizeByDuration(java.util.Date startTime, java.util.Date endTime, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - OverloadMapper mapper = session.getMapper(OverloadMapper.class); - OverloadDO record = new OverloadDO(); - record.setStartTime(startTime); - record.setEndTime(endTime); + OverloadMapper mapper = springMapper(LOGGER); + OverloadDO record = new OverloadDO(); + + record.setStartTime(startTime); + record.setEndTime(endTime); + if (mapper != null) { return mapper.findIdAndSizeByDuration(record).stream().map(this::toModel).collect(Collectors.toList()); + } + + try (SqlSession session = openSession()) { + return session.getMapper(OverloadMapper.class).findIdAndSizeByDuration(record).stream() + .map(this::toModel) + .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findIdAndSizeByDuration for Overload.", e); } } public Overload findByPK(int keyId, Readset readset) throws DalException { + OverloadMapper mapper = springMapper(LOGGER); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - OverloadMapper mapper = session.getMapper(OverloadMapper.class); - OverloadDO record = mapper.findByPrimaryKey(keyId); + OverloadDO record = session.getMapper(OverloadMapper.class).findByPrimaryKey(keyId); return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -66,11 +81,20 @@ public Overload findByPK(int keyId, Readset readset) throws DalExcepti } public Overload findMaxIdByType(int type, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - OverloadMapper mapper = session.getMapper(OverloadMapper.class); - OverloadDO record = new OverloadDO(); - record.setType(type); + OverloadMapper mapper = springMapper(LOGGER); + OverloadDO record = new OverloadDO(); + + record.setType(type); + if (mapper != null) { OverloadDO result = mapper.findMaxIdByType(record).stream().findFirst().orElse(null); + + return requireFound(result, "findMaxIdByType", record.toString()); + } + + try (SqlSession session = openSession()) { + OverloadDO result = session.getMapper(OverloadMapper.class).findMaxIdByType(record).stream() + .findFirst() + .orElse(null); return requireFound(result, "findMaxIdByType", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -80,10 +104,18 @@ public Overload findMaxIdByType(int type, Readset readset) throws DalE } public Overload findCount(Readset readset) throws DalException { - try (SqlSession session = openSession()) { - OverloadMapper mapper = session.getMapper(OverloadMapper.class); - OverloadDO record = new OverloadDO(); + OverloadMapper mapper = springMapper(LOGGER); + OverloadDO record = new OverloadDO(); + + if (mapper != null) { OverloadDO result = mapper.findCount(record).stream().findFirst().orElse(null); + + return requireFound(result, "findCount", record.toString()); + } + + try (SqlSession session = openSession()) { + OverloadDO result = session.getMapper(OverloadMapper.class).findCount(record).stream().findFirst() + .orElse(null); return requireFound(result, "findCount", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -93,10 +125,20 @@ public Overload findCount(Readset readset) throws DalException { } public int insert(Overload proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + OverloadDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - OverloadMapper mapper = session.getMapper(OverloadMapper.class); OverloadDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(OverloadMapper.class).insert(record); session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -107,9 +149,14 @@ public int insert(Overload proto) throws DalException { } public int updateByPK(Overload proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - OverloadMapper mapper = session.getMapper(OverloadMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(OverloadMapper.class).updateByPrimaryKey(toRecord(proto)); session.commit(); return count; } catch (Exception e) { diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java index c60e2ff062..44cb073bd7 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java @@ -1,29 +1,26 @@ package com.dianping.cat.core.mybatis.repository.topologygraph; -import com.dianping.cat.core.mybatis.MyBatisRepositorySupport; +import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.generated.topologygraph.dao.TopologyGraphMapper; import com.dianping.cat.core.mybatis.generated.topologygraph.dao.data.TopologyGraphDO; import com.dianping.cat.home.dal.report.TopologyGraph; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; import org.apache.ibatis.session.SqlSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -public class TopologyGraphRepository extends MyBatisRepositorySupport { - private static final String MAPPER_RESOURCE = "mybatis/mapper/TopologyGraphMapper.xml"; +public class TopologyGraphRepository extends SpringBackedRepositorySupport { + private static final Logger LOGGER = LoggerFactory.getLogger(TopologyGraphRepository.class); - @Override - protected Class getMapperClass() { - return TopologyGraphMapper.class; - } + private static final String MAPPER_RESOURCE = "mybatis/mapper/TopologyGraphMapper.xml"; - @Override - protected String getMapperResource() { - return MAPPER_RESOURCE; + public TopologyGraphRepository() { + super(TopologyGraphMapper.class, MAPPER_RESOURCE, + "TopologyGraphRepository is using Spring managed TopologyGraphMapper."); } public TopologyGraph createLocal() { @@ -31,9 +28,14 @@ public TopologyGraph createLocal() { } public int deleteByPK(TopologyGraph proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); + } + try (SqlSession session = openSession()) { - TopologyGraphMapper mapper = session.getMapper(TopologyGraphMapper.class); - int count = mapper.deleteByPrimaryKey(proto.getKeyId()); + int count = session.getMapper(TopologyGraphMapper.class).deleteByPrimaryKey(proto.getKeyId()); session.commit(); return count; } catch (Exception e) { @@ -42,9 +44,14 @@ public int deleteByPK(TopologyGraph proto) throws DalException { } public TopologyGraph findByPK(int keyId, Readset readset) throws DalException { + TopologyGraphMapper mapper = springMapper(LOGGER); + + if (mapper != null) { + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); + } + try (SqlSession session = openSession()) { - TopologyGraphMapper mapper = session.getMapper(TopologyGraphMapper.class); - TopologyGraphDO record = mapper.findByPrimaryKey(keyId); + TopologyGraphDO record = session.getMapper(TopologyGraphMapper.class).findByPrimaryKey(keyId); return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; @@ -54,11 +61,20 @@ public TopologyGraph findByPK(int keyId, Readset readset) throws } public TopologyGraph findByPeriod(java.util.Date period, Readset readset) throws DalException { - try (SqlSession session = openSession()) { - TopologyGraphMapper mapper = session.getMapper(TopologyGraphMapper.class); - TopologyGraphDO record = new TopologyGraphDO(); - record.setPeriod(period); + TopologyGraphMapper mapper = springMapper(LOGGER); + TopologyGraphDO record = new TopologyGraphDO(); + + record.setPeriod(period); + if (mapper != null) { TopologyGraphDO result = mapper.findByPeriod(record).stream().findFirst().orElse(null); + + return requireFound(result, "findByPeriod", record.toString()); + } + + try (SqlSession session = openSession()) { + TopologyGraphDO result = session.getMapper(TopologyGraphMapper.class).findByPeriod(record).stream() + .findFirst() + .orElse(null); return requireFound(result, "findByPeriod", record.toString()); } catch (DalNotFoundException e) { throw e; @@ -68,10 +84,20 @@ public TopologyGraph findByPeriod(java.util.Date period, Readset } public int insert(TopologyGraph proto) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + TopologyGraphDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); + + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; + } + try (SqlSession session = openSession()) { - TopologyGraphMapper mapper = session.getMapper(TopologyGraphMapper.class); TopologyGraphDO record = toRecord(proto); - int count = mapper.insert(record); + int count = session.getMapper(TopologyGraphMapper.class).insert(record); session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -82,9 +108,14 @@ public int insert(TopologyGraph proto) throws DalException { } public int updateByPK(TopologyGraph proto, Updateset updateset) throws DalException { + TransactionTemplate transactionTemplate = springTransactionTemplate(); + + if (transactionTemplate != null) { + return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); + } + try (SqlSession session = openSession()) { - TopologyGraphMapper mapper = session.getMapper(TopologyGraphMapper.class); - int count = mapper.updateByPrimaryKey(toRecord(proto)); + int count = session.getMapper(TopologyGraphMapper.class).updateByPrimaryKey(toRecord(proto)); session.commit(); return count; } catch (Exception e) { diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java new file mode 100644 index 0000000000..bc37d9dfba --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -0,0 +1,408 @@ +package com.dianping.cat.home.spring; + +import javax.sql.DataSource; + +import org.apache.ibatis.session.SqlSessionFactory; +import org.codehaus.plexus.logging.Logger; +import org.codehaus.plexus.logging.console.ConsoleLogger; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +import com.dianping.cat.config.AtomicMessageConfigManager; +import com.dianping.cat.config.ReportReloadConfigManager; +import com.dianping.cat.config.business.BusinessConfigManager; +import com.dianping.cat.config.content.ContentFetcher; +import com.dianping.cat.config.content.LocalResourceContentFetcher; +import com.dianping.cat.config.sample.SampleConfigManager; +import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.config.server.ServerFilterConfigManager; +import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; +import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; +import com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository; +import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; +import com.dianping.cat.core.mybatis.repository.baseline.BaselineRepository; +import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; +import com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.repository.metric.graph.MetricGraphRepository; +import com.dianping.cat.core.mybatis.repository.metric.screen.MetricScreenRepository; +import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; +import com.dianping.cat.core.mybatis.repository.project.ProjectRepository; +import com.dianping.cat.core.mybatis.repository.server.alarm.rule.ServerAlarmRuleRepository; +import com.dianping.cat.core.mybatis.repository.task.TaskRepository; +import com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository; +import com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository; +import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; +import com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager; +import com.dianping.cat.report.alert.summary.AlertSummaryService; +import com.dianping.cat.report.DomainValidator; +import com.dianping.cat.report.page.metric.service.BaselineService; +import com.dianping.cat.report.page.metric.service.DefaultBaselineService; +import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.service.ProjectService; +import com.dianping.cat.statistic.ServerStatisticManager; + +@Configuration +@MapperScan(basePackages = { + "com.dianping.cat.core.config.dao", + "com.dianping.cat.core.report.daily.dao", + "com.dianping.cat.core.mybatis.generated.hostinfo.dao", + "com.dianping.cat.core.mybatis.generated.hourlyreport.dao", + "com.dianping.cat.core.mybatis.generated.weeklyreport.dao", + "com.dianping.cat.core.mybatis.generated.monthreport.dao", + "com.dianping.cat.core.mybatis.generated.project.dao", + "com.dianping.cat.core.mybatis.generated.daily.report.content.dao", + "com.dianping.cat.core.mybatis.generated.hourly.report.content.dao", + "com.dianping.cat.core.mybatis.generated.weekly.report.content.dao", + "com.dianping.cat.core.mybatis.generated.monthly.report.content.dao", + "com.dianping.cat.core.mybatis.generated.business.config.dao", + "com.dianping.cat.core.mybatis.generated.task.dao", + "com.dianping.cat.core.mybatis.generated.alert.summary.dao", + "com.dianping.cat.core.mybatis.generated.config.modification.dao", + "com.dianping.cat.core.mybatis.generated.baseline.dao", + "com.dianping.cat.core.mybatis.generated.overload.dao", + "com.dianping.cat.core.mybatis.generated.topologygraph.dao", + "com.dianping.cat.core.mybatis.generated.metric.graph.dao", + "com.dianping.cat.core.mybatis.generated.metric.screen.dao", + "com.dianping.cat.core.mybatis.generated.alteration.dao", + "com.dianping.cat.core.mybatis.generated.alert.dao", + "com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao", + "com.dianping.cat.core.mybatis.generated.user.define.rule.dao" +}) +public class CatHomeSpringConfiguration { + @Bean + public Logger plexusConsoleLogger() { + return new ConsoleLogger(Logger.LEVEL_INFO, "spring-managed"); + } + + @Bean + public ContentFetcher contentFetcher(Logger plexusConsoleLogger) { + LocalResourceContentFetcher fetcher = new LocalResourceContentFetcher(); + + fetcher.setLogger(plexusConsoleLogger.getChildLogger(LocalResourceContentFetcher.class.getName())); + return fetcher; + } + + @Bean + public ConfigRepository configRepository(SqlSessionTemplate sqlSessionTemplate, TransactionTemplate transactionTemplate) { + ConfigRepository repository = new ConfigRepository(); + + repository.setSqlSessionTemplate(sqlSessionTemplate); + repository.setTransactionTemplate(transactionTemplate); + return repository; + } + + @Bean(initMethod = "initialize") + public ServerConfigManager serverConfigManager(ConfigRepository configRepository, ContentFetcher contentFetcher, + Logger plexusConsoleLogger) { + ServerConfigManager manager = new ServerConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + manager.enableLogging(plexusConsoleLogger.getChildLogger(ServerConfigManager.class.getName())); + return manager; + } + + @Bean(initMethod = "initialize") + public ServerFilterConfigManager serverFilterConfigManager(ConfigRepository configRepository, + ContentFetcher contentFetcher) { + ServerFilterConfigManager manager = new ServerFilterConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean(initMethod = "initialize") + public SampleConfigManager sampleConfigManager(ConfigRepository configRepository, ContentFetcher contentFetcher) { + SampleConfigManager manager = new SampleConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean(initMethod = "initialize") + public ReportReloadConfigManager reportReloadConfigManager(ConfigRepository configRepository, + ContentFetcher contentFetcher) { + ReportReloadConfigManager manager = new ReportReloadConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean(initMethod = "initialize") + public AtomicMessageConfigManager atomicMessageConfigManager(ConfigRepository configRepository, + ContentFetcher contentFetcher) { + AtomicMessageConfigManager manager = new AtomicMessageConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean(initMethod = "initialize") + public TpValueStatisticConfigManager tpValueStatisticConfigManager(ConfigRepository configRepository, + ContentFetcher contentFetcher, ServerConfigManager serverConfigManager) { + TpValueStatisticConfigManager manager = new TpValueStatisticConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + manager.setServerConfigManager(serverConfigManager); + return manager; + } + + @Bean + public BusinessConfigRepository businessConfigRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + BusinessConfigRepository repository = new BusinessConfigRepository(); + + repository.setSqlSessionTemplate(sqlSessionTemplate); + repository.setTransactionTemplate(transactionTemplate); + return repository; + } + + @Bean + public ProjectRepository projectRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + ProjectRepository repository = new ProjectRepository(); + + repository.setSqlSessionTemplate(sqlSessionTemplate); + repository.setTransactionTemplate(transactionTemplate); + return repository; + } + + @Bean + public HostinfoRepository hostinfoRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + HostinfoRepository repository = new HostinfoRepository(); + + repository.setSqlSessionTemplate(sqlSessionTemplate); + repository.setTransactionTemplate(transactionTemplate); + return repository; + } + + @Bean + public DailyReportRepository dailyReportRepository() { + return new DailyReportRepository(); + } + + @Bean + public DailyReportContentRepository dailyReportContentRepository() { + return new DailyReportContentRepository(); + } + + @Bean + public HourlyReportRepository hourlyReportRepository() { + return new HourlyReportRepository(); + } + + @Bean + public HourlyReportContentRepository hourlyReportContentRepository() { + return new HourlyReportContentRepository(); + } + + @Bean + public WeeklyReportRepository weeklyReportRepository() { + return new WeeklyReportRepository(); + } + + @Bean + public WeeklyReportContentRepository weeklyReportContentRepository() { + return new WeeklyReportContentRepository(); + } + + @Bean + public MonthlyReportRepository monthlyReportRepository() { + return new MonthlyReportRepository(); + } + + @Bean + public MonthlyReportContentRepository monthlyReportContentRepository() { + return new MonthlyReportContentRepository(); + } + + @Bean + public OverloadRepository overloadRepository() { + return new OverloadRepository(); + } + + @Bean + public AlertRepository alertRepository() { + return new AlertRepository(); + } + + @Bean + public AlterationRepository alterationRepository() { + return new AlterationRepository(); + } + + @Bean + public BaselineRepository baselineRepository() { + return new BaselineRepository(); + } + + @Bean + public TopologyGraphRepository topologyGraphRepository() { + return new TopologyGraphRepository(); + } + + @Bean + public TaskRepository taskRepository() { + return new TaskRepository(); + } + + @Bean + public AlertSummaryRepository alertSummaryRepository() { + return new AlertSummaryRepository(); + } + + @Bean + public ConfigModificationRepository configModificationRepository() { + return new ConfigModificationRepository(); + } + + @Bean + public MetricGraphRepository metricGraphRepository() { + return new MetricGraphRepository(); + } + + @Bean + public MetricScreenRepository metricScreenRepository() { + return new MetricScreenRepository(); + } + + @Bean + public ServerAlarmRuleRepository serverAlarmRuleRepository() { + return new ServerAlarmRuleRepository(); + } + + @Bean + public UserDefineRuleRepository userDefineRuleRepository() { + return new UserDefineRuleRepository(); + } + + @Bean + public AlertSummaryService alertSummaryService() { + return new AlertSummaryService(); + } + + @Bean + public UserDefinedRuleManager userDefinedRuleManager() { + return new UserDefinedRuleManager(); + } + + @Bean + public BaselineService baselineService() { + return new DefaultBaselineService(); + } + + @Bean + public RemoteServersManager remoteServersManager() { + return new RemoteServersManager(); + } + + @Bean + public DomainValidator domainValidator() { + return new DomainValidator(); + } + + @Bean + public ServerStatisticManager serverStatisticManager() { + return new ServerStatisticManager(); + } + + @Bean(initMethod = "initialize") + public ProjectService projectService(ProjectRepository projectRepository, ServerConfigManager serverConfigManager) { + ProjectService service = new ProjectService(); + + service.setProjectDao(projectRepository); + service.setServerConfigManager(serverConfigManager); + return service; + } + + @Bean(initMethod = "initialize") + public BusinessConfigManager businessConfigManager(BusinessConfigRepository businessConfigRepository, + ServerConfigManager serverConfigManager) { + BusinessConfigManager manager = new BusinessConfigManager(); + + manager.setConfigDao(businessConfigRepository); + manager.setServerConfigManager(serverConfigManager); + return manager; + } + + @Bean + public DataSource catDataSource() { + return CatHomeSpringDataSourceFactory.createCatDataSource(); + } + + @Bean + public SqlSessionFactory sqlSessionFactory(DataSource catDataSource) throws Exception { + SqlSessionFactoryBean factory = new SqlSessionFactoryBean(); + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + + factory.setDataSource(catDataSource); + factory.setMapperLocations( + resolver.getResource("classpath:mybatis/mapper/ConfigMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/DailyReportMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/HostinfoMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/HourlyreportMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/WeeklyreportMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/MonthreportMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/ProjectMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/DailyReportContentMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/HourlyReportContentMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/WeeklyReportContentMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/MonthlyReportContentMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/BusinessConfigMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/TaskMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/AlertSummaryMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/ConfigModificationMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/BaselineMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/OverloadMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/TopologyGraphMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/MetricGraphMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/MetricScreenMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/AlterationMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/AlertMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/ServerAlarmRuleMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/UserDefineRuleMapper.xml")); + return factory.getObject(); + } + + @Bean + public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { + return new SqlSessionTemplate(sqlSessionFactory); + } + + @Bean(initMethod = "verify") + public CatHomeSpringStartupVerifier catHomeSpringStartupVerifier(SqlSessionTemplate sqlSessionTemplate) { + return new CatHomeSpringStartupVerifier(sqlSessionTemplate); + } + + @Bean + public PlatformTransactionManager transactionManager(DataSource catDataSource) { + return new DataSourceTransactionManager(catDataSource); + } + + @Bean + public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) { + return new TransactionTemplate(transactionManager); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java new file mode 100644 index 0000000000..724c3c7d10 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java @@ -0,0 +1,41 @@ +package com.dianping.cat.home.spring; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import com.dianping.cat.spring.CatSpringContext; + +public class CatHomeSpringContextListener implements ServletContextListener { + public static final String ATTRIBUTE_NAME = CatHomeSpringContextListener.class.getName() + ".context"; + + private static final Logger LOGGER = LoggerFactory.getLogger(CatHomeSpringContextListener.class); + + private AnnotationConfigApplicationContext m_context; + + @Override + public void contextInitialized(ServletContextEvent event) { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + + context.register(CatHomeSpringConfiguration.class); + context.refresh(); + event.getServletContext().setAttribute(ATTRIBUTE_NAME, context); + CatSpringContext.setContext(context); + m_context = context; + LOGGER.info("CAT home Spring context initialized, beanCount={}.", context.getBeanDefinitionCount()); + } + + @Override + public void contextDestroyed(ServletContextEvent event) { + event.getServletContext().removeAttribute(ATTRIBUTE_NAME); + + if (m_context != null) { + CatSpringContext.clear(m_context); + m_context.close(); + LOGGER.info("CAT home Spring context closed."); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringDataSourceFactory.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringDataSourceFactory.java new file mode 100644 index 0000000000..40f4bc4395 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringDataSourceFactory.java @@ -0,0 +1,106 @@ +package com.dianping.cat.home.spring; + +import java.io.IOException; +import java.io.StringReader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Properties; + +import javax.xml.parsers.DocumentBuilderFactory; + +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +final class CatHomeSpringDataSourceFactory { + private static final String CAT_DATA_SOURCE_ID = "cat"; + + private CatHomeSpringDataSourceFactory() { + } + + static DriverManagerDataSource createCatDataSource() { + Element dataSource = findCatDataSource(loadDataSourcesXml()); + Properties connectionProperties = new Properties(); + String rawConnectionProperties = childText(properties(dataSource), "connectionProperties"); + + if (!rawConnectionProperties.isBlank()) { + for (String item : rawConnectionProperties.split("&")) { + int index = item.indexOf('='); + + if (index > 0) { + connectionProperties.setProperty(item.substring(0, index), item.substring(index + 1)); + } + } + } + + DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource(); + + driverManagerDataSource.setDriverClassName(childText(properties(dataSource), "driver")); + driverManagerDataSource.setUrl(childText(properties(dataSource), "url")); + driverManagerDataSource.setUsername(childText(properties(dataSource), "user")); + driverManagerDataSource.setPassword(childText(properties(dataSource), "password")); + driverManagerDataSource.setConnectionProperties(connectionProperties); + return driverManagerDataSource; + } + + private static Element findCatDataSource(Document document) { + NodeList dataSources = document.getElementsByTagName("data-source"); + + for (int i = 0; i < dataSources.getLength(); i++) { + Element dataSource = (Element) dataSources.item(i); + + if (CAT_DATA_SOURCE_ID.equals(dataSource.getAttribute("id"))) { + return dataSource; + } + } + + throw new IllegalStateException("Missing data-source id=" + CAT_DATA_SOURCE_ID + " in " + dataSourcesPath()); + } + + private static Document loadDataSourcesXml() { + Path path = dataSourcesPath(); + + try { + String xml = Files.readString(path); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + + factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + return factory.newDocumentBuilder().parse(new InputSource(new StringReader(xml))); + } catch (IOException e) { + throw new IllegalStateException("Unable to read Spring datasource config: " + path, e); + } catch (Exception e) { + throw new IllegalStateException("Unable to parse Spring datasource config: " + path, e); + } + } + + private static Path dataSourcesPath() { + String catHome = System.getProperty("cat.home", Paths.get(System.getProperty("user.home"), ".cat").toString()); + + return Paths.get(catHome, "datasources.xml"); + } + + private static Element properties(Element dataSource) { + NodeList nodes = dataSource.getElementsByTagName("properties"); + + if (nodes.getLength() == 0) { + throw new IllegalStateException("Missing properties in data-source id=" + CAT_DATA_SOURCE_ID); + } + + return (Element) nodes.item(0); + } + + private static String childText(Element element, String tagName) { + NodeList nodes = element.getElementsByTagName(tagName); + + if (nodes.getLength() == 0) { + return ""; + } + + String text = nodes.item(0).getTextContent(); + + return text == null ? "" : text.trim(); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java new file mode 100644 index 0000000000..c6736c7409 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java @@ -0,0 +1,58 @@ +package com.dianping.cat.home.spring; + +import java.util.List; + +import org.mybatis.spring.SqlSessionTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.dianping.cat.core.config.dao.ConfigMapper; +import com.dianping.cat.core.mybatis.generated.alert.dao.AlertMapper; +import com.dianping.cat.core.mybatis.generated.alert.summary.dao.AlertSummaryMapper; +import com.dianping.cat.core.mybatis.generated.alteration.dao.AlterationMapper; +import com.dianping.cat.core.mybatis.generated.baseline.dao.BaselineMapper; +import com.dianping.cat.core.mybatis.generated.business.config.dao.BusinessConfigMapper; +import com.dianping.cat.core.mybatis.generated.config.modification.dao.ConfigModificationMapper; +import com.dianping.cat.core.mybatis.generated.daily.report.content.dao.DailyReportContentMapper; +import com.dianping.cat.core.mybatis.generated.hostinfo.dao.HostinfoMapper; +import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.HourlyReportContentMapper; +import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.HourlyreportMapper; +import com.dianping.cat.core.mybatis.generated.metric.graph.dao.MetricGraphMapper; +import com.dianping.cat.core.mybatis.generated.metric.screen.dao.MetricScreenMapper; +import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.MonthlyReportContentMapper; +import com.dianping.cat.core.mybatis.generated.monthreport.dao.MonthreportMapper; +import com.dianping.cat.core.mybatis.generated.overload.dao.OverloadMapper; +import com.dianping.cat.core.mybatis.generated.project.dao.ProjectMapper; +import com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao.ServerAlarmRuleMapper; +import com.dianping.cat.core.mybatis.generated.task.dao.TaskMapper; +import com.dianping.cat.core.mybatis.generated.topologygraph.dao.TopologyGraphMapper; +import com.dianping.cat.core.mybatis.generated.user.define.rule.dao.UserDefineRuleMapper; +import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.WeeklyReportContentMapper; +import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.WeeklyreportMapper; +import com.dianping.cat.core.report.daily.dao.DailyReportMapper; + +public class CatHomeSpringStartupVerifier { + private static final Logger LOGGER = LoggerFactory.getLogger(CatHomeSpringStartupVerifier.class); + + private static final List> REQUIRED_MAPPERS = List.of(ConfigMapper.class, DailyReportMapper.class, + HostinfoMapper.class, HourlyreportMapper.class, WeeklyreportMapper.class, MonthreportMapper.class, + ProjectMapper.class, DailyReportContentMapper.class, HourlyReportContentMapper.class, + WeeklyReportContentMapper.class, MonthlyReportContentMapper.class, BusinessConfigMapper.class, + TaskMapper.class, AlertSummaryMapper.class, ConfigModificationMapper.class, BaselineMapper.class, + OverloadMapper.class, TopologyGraphMapper.class, MetricGraphMapper.class, MetricScreenMapper.class, + AlterationMapper.class, AlertMapper.class, ServerAlarmRuleMapper.class, UserDefineRuleMapper.class); + + private final SqlSessionTemplate m_sqlSessionTemplate; + + public CatHomeSpringStartupVerifier(SqlSessionTemplate sqlSessionTemplate) { + m_sqlSessionTemplate = sqlSessionTemplate; + } + + public void verify() { + for (Class mapperClass : REQUIRED_MAPPERS) { + m_sqlSessionTemplate.getMapper(mapperClass); + } + + LOGGER.info("Verified {} Spring managed MyBatis mappers.", REQUIRED_MAPPERS.size()); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java index c29649f421..4044e4aa10 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java @@ -54,6 +54,7 @@ import com.dianping.cat.report.page.business.task.BusinessKeyHelper; import com.dianping.cat.report.page.metric.service.BaselineService; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; @Named @@ -245,6 +246,8 @@ private List processCustomItem(BusinessReportGroup currentRepor } private void processDomain(String domain) { + refreshSpringBeans(); + BusinessReportConfig businessReportConfig = m_configManager.queryConfigByDomain(domain); AlarmRule monitorConfigs = buildMonitorConfigs(domain, businessReportConfig); int minute = calAlreadyMinute(); @@ -301,9 +304,13 @@ private List processMetricType(int minute, List configs @Override public void run() { + refreshSpringBeans(); + boolean active = TimeHelper.sleepToNextMinute(); while (active) { + refreshSpringBeans(); + Transaction t = Cat.newTransaction("AlertBusiness", TimeHelper.getMinuteStr()); long current = System.currentTimeMillis(); @@ -353,4 +360,16 @@ private void sendBusinessAlerts(String domain, String metricName, List> getDefaultRulesForCustomItem() { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + loadData(); TimerSyncTask.getInstance().register(new SyncHandler() { @@ -131,6 +134,8 @@ public void handle() throws Exception { } private void loadData() { + refreshSpringBeans(); + try { List configs = m_configDao.findByName(ALERT_CONFIG, BusinessConfigEntity.READSET_FULL); Map rules = new ConcurrentHashMap(); @@ -178,6 +183,8 @@ public Rule queryRule(String domain, String key, String type) { public void updateRule(String domain, String key, String configsStr, String type) { try { + refreshSpringBeans(); + Rule rule = new Rule(generateRuleId(key, type)); List configs = DefaultJsonParser.parseArray(Config.class, configsStr); @@ -214,4 +221,12 @@ public void updateRule(String domain, String key, String configsStr, String type } } + + private void refreshSpringBeans() { + BusinessConfigRepository configDao = CatSpringContext.getBeanIfAvailable(BusinessConfigRepository.class); + + if (configDao != null) { + m_configDao = configDao; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java index 78cf067ca9..64fe7aa321 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java @@ -36,6 +36,7 @@ import com.dianping.cat.home.exception.entity.ExceptionLimit; import com.dianping.cat.home.exception.entity.ExceptionRuleConfig; import com.dianping.cat.home.exception.transform.DefaultSaxParser; +import com.dianping.cat.spring.CatSpringContext; @Named public class ExceptionRuleConfigManager implements Initializable { @@ -70,6 +71,8 @@ public boolean deleteExceptionLimit(String domain, String exceptionName) { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + try { Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); String content = config.getContent(); @@ -149,6 +152,8 @@ public ExceptionLimit queryExceptionLimit(String domain, String exceptionName) { private boolean storeConfig() { synchronized (this) { + refreshSpringBeans(); + try { Config config = m_configDao.createLocal(); @@ -169,4 +174,16 @@ public ExceptionLimit queryTotalLimitByDomain(String domain) { return queryExceptionLimit(domain, TOTAL_STRING); } + private void refreshSpringBeans() { + ConfigRepository configDao = CatSpringContext.getBeanIfAvailable(ConfigRepository.class); + ContentFetcher fetcher = CatSpringContext.getBeanIfAvailable(ContentFetcher.class); + + if (configDao != null) { + m_configDao = configDao; + } + if (fetcher != null) { + m_fetcher = fetcher; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java index 89aac5032c..ccbc462023 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java @@ -55,6 +55,7 @@ import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.spring.CatSpringContext; @Named public class HeartbeatAlert implements Task { @@ -248,6 +249,8 @@ protected BaseRuleConfigManager getRuleConfigManager() { } private void processDomain(String domain) { + refreshSpringBeans(); + int minute = calAlreadyMinute(); Map> configsMap = m_ruleConfigManager.queryConfigsByDomain(domain); if (null == configsMap) { @@ -366,9 +369,13 @@ private void processMeitrc(String domain, String ip, String metric, List metricItems = DefaultJsonParser.parseArray(MetricItem.class, metricsStr); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java index df750873a5..b75e0de208 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java @@ -25,6 +25,7 @@ import com.dianping.cat.alarm.UserDefineRule; import com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository; import com.dianping.cat.alarm.UserDefineRuleEntity; +import com.dianping.cat.spring.CatSpringContext; @Named public class UserDefinedRuleManager { @@ -33,6 +34,7 @@ public class UserDefinedRuleManager { private UserDefineRuleRepository m_dao; public String addUserDefineText(String userDefinedText) throws DalException { + refreshSpringBeans(); UserDefineRule item = m_dao.findMaxId(UserDefineRuleEntity.READSET_MAXID); int id = 1; if (item != null) { @@ -48,6 +50,7 @@ public String addUserDefineText(String userDefinedText) throws DalException { } public String getUserDefineText(String idStr) throws DalException { + refreshSpringBeans(); int id = Integer.parseInt(idStr); UserDefineRule item = m_dao.findByPK(id, UserDefineRuleEntity.READSET_FULL); @@ -55,10 +58,19 @@ public String getUserDefineText(String idStr) throws DalException { } public void removeById(String id) throws DalException { + refreshSpringBeans(); UserDefineRule item = m_dao.createLocal(); item.setId(Integer.parseInt(id)); m_dao.deleteByPK(item); } + private void refreshSpringBeans() { + UserDefineRuleRepository dao = CatSpringContext.getBeanIfAvailable(UserDefineRuleRepository.class); + + if (dao != null) { + m_dao = dao; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java index d17184b183..d5ab62099c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java @@ -25,6 +25,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.home.dal.report.AlertSummary; import com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository; +import com.dianping.cat.spring.CatSpringContext; @Named public class AlertSummaryService { @@ -33,6 +34,7 @@ public class AlertSummaryService { private AlertSummaryRepository m_alertSummaryDao; public void insert(com.dianping.cat.home.alert.summary.entity.AlertSummary alertSummary) { + refreshSpringBeans(); AlertSummary summary = new AlertSummary(); String content = alertSummary.toString(); @@ -47,4 +49,12 @@ public void insert(com.dianping.cat.home.alert.summary.entity.AlertSummary alert } } + private void refreshSpringBeans() { + AlertSummaryRepository alertSummaryDao = CatSpringContext.getBeanIfAvailable(AlertSummaryRepository.class); + + if (alertSummaryDao != null) { + m_alertSummaryDao = alertSummaryDao; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java index 3acb1b102e..f863751546 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java @@ -29,6 +29,7 @@ import com.dianping.cat.home.alert.summary.entity.AlertSummary; import com.dianping.cat.report.alert.summary.AlertSummaryService; +import com.dianping.cat.spring.CatSpringContext; @Named(type = SummaryBuilder.class, value = RelatedSummaryBuilder.ID) public class RelatedSummaryBuilder extends SummaryBuilder { @@ -71,6 +72,7 @@ private Map gatherDomainsForDependBusiness(Map m @Override public Map generateModel(String domain, Date date) { + refreshSpringBeans(); AlertSummary alertSummary = m_alertSummaryManager.generateAlertSummary(domain, date); AlertSummaryVisitor visitor = new AlertSummaryVisitor(alertSummary.getDomain()); @@ -89,4 +91,12 @@ protected String getTemplateAddress() { return "summary.ftl"; } + private void refreshSpringBeans() { + AlertSummaryService alertSummaryService = CatSpringContext.getBeanIfAvailable(AlertSummaryService.class); + + if (alertSummaryService != null) { + m_alertSummaryService = alertSummaryService; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/graph/metric/AbstractGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/graph/metric/AbstractGraphCreator.java index 56276d8f65..a1a088e504 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/graph/metric/AbstractGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/graph/metric/AbstractGraphCreator.java @@ -34,6 +34,7 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.graph.LineChart; import com.dianping.cat.report.page.metric.service.BaselineService; +import com.dianping.cat.spring.CatSpringContext; public abstract class AbstractGraphCreator implements LogEnabled { @Inject @@ -204,6 +205,7 @@ protected void putKey(Map datas, Map values, } protected double[] queryBaseline(String name, String key, Date start, Date end) { + refreshSpringBeans(); int size = (int) ((end.getTime() - start.getTime()) / TimeHelper.ONE_MINUTE); double[] result = new double[size]; int index = 0; @@ -223,6 +225,14 @@ protected double[] queryBaseline(String name, String key, Date start, Date end) return result; } + private void refreshSpringBeans() { + BaselineService baselineService = CatSpringContext.getBeanIfAvailable(BaselineService.class); + + if (baselineService != null) { + m_baselineService = baselineService; + } + } + public Map removeFutureData(Date endDate, final Map allCurrentValues) { if (isCurrentMode(endDate)) { // remove the minute of future diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java index 3386794d8e..3686ae07ea 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java @@ -37,6 +37,7 @@ import com.dianping.cat.home.group.entity.DomainGroup; import com.dianping.cat.home.group.entity.Group; import com.dianping.cat.home.group.transform.DefaultSaxParser; +import com.dianping.cat.spring.CatSpringContext; @Named public class DomainGroupConfigManager implements Initializable { @@ -59,6 +60,8 @@ public DomainGroup getDomainGroup() { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + try { Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); String content = config.getContent(); @@ -157,6 +160,8 @@ public List queryIpByDomainAndGroup(String domain, String group) { private boolean storeConfig() { synchronized (this) { + refreshSpringBeans(); + try { Config config = m_configDao.createLocal(); @@ -172,4 +177,16 @@ private boolean storeConfig() { } return true; } + + private void refreshSpringBeans() { + ConfigRepository configDao = CatSpringContext.getBeanIfAvailable(ConfigRepository.class); + ContentFetcher fetcher = CatSpringContext.getBeanIfAvailable(ContentFetcher.class); + + if (configDao != null) { + m_configDao = configDao; + } + if (fetcher != null) { + m_fetcher = fetcher; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java index eb9e3ca898..9538e08a6e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java @@ -48,6 +48,7 @@ import com.dianping.cat.alarm.spi.sender.SendMessageEntity; import com.dianping.cat.alarm.spi.sender.SenderManager; import com.dianping.cat.report.ReportPage; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { @Inject @@ -100,6 +101,7 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = "alert") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); Model model = new Model(ctx); Payload payload = ctx.getPayload(); Action action = payload.getAction(); @@ -197,6 +199,14 @@ private void setAlertResult(Model model, int status) { } } + private void refreshSpringBeans() { + AlertRepository alertDao = CatSpringContext.getBeanIfAvailable(AlertRepository.class); + + if (alertDao != null) { + m_alertDao = alertDao; + } + } + public class AlertDomain { private String m_name; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java index ae731ac00b..d7438774a7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java @@ -47,6 +47,7 @@ import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; import com.dianping.cat.home.dal.report.AlterationEntity; import com.dianping.cat.report.ReportPage; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { @@ -125,6 +126,7 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = "alteration") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); Model model = new Model(ctx); Payload payload = ctx.getPayload(); Action action = payload.getAction(); @@ -271,6 +273,14 @@ public void setInsertResult(Model model, int status) { } } + private void refreshSpringBeans() { + AlterationRepository alterationDao = CatSpringContext.getBeanIfAvailable(AlterationRepository.class); + + if (alterationDao != null) { + m_alterationDao = alterationDao; + } + } + public static class AlterationDomain { private String m_name; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/Handler.java index 8207b993ff..dbc1c47579 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/Handler.java @@ -35,6 +35,7 @@ import com.dianping.cat.report.graph.LineChart; import com.dianping.cat.report.page.business.graph.BusinessGraphCreator; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; public class Handler implements PageHandler { @@ -63,6 +64,8 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = "business") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + Model model = new Model(ctx); Payload payload = ctx.getPayload(); Action action = payload.getAction(); @@ -93,6 +96,14 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { } } + private void refreshSpringBeans() { + ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + + if (projectService != null) { + m_projectService = projectService; + } + } + private Map buildLineCharts(Type type, String name, Date start, Date end) { Map allCharts = null; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java index c5db5dd122..684da8616f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java @@ -53,6 +53,7 @@ import com.dianping.cat.report.page.business.service.CachedBusinessReportService; import com.dianping.cat.report.page.business.task.BusinessKeyHelper; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; public class BusinessGraphCreator extends AbstractGraphCreator { @@ -162,6 +163,8 @@ protected String buildContactInfo(String domainName) { } public Map buildGraphByDomain(Date start, Date end, String domain) { + refreshSpringBeans(); + BusinessReportConfig config = m_configManager.queryConfigByDomain(domain); HashMap result = new LinkedHashMap(); @@ -184,6 +187,8 @@ public Map buildGraphByDomain(Date start, Date end, String do } public Map buildGraphByTag(Date start, Date end, String tag) { + refreshSpringBeans(); + Tag tagConfig = m_tagManager.findTag(tag); if (tagConfig != null) { @@ -424,4 +429,16 @@ private Map prepareCustomDatas(Date start, Date end, String cu } return customDatas; } + + private void refreshSpringBeans() { + BusinessConfigManager configManager = CatSpringContext.getBeanIfAvailable(BusinessConfigManager.class); + ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + + if (configManager != null) { + m_configManager = configManager; + } + if (projectService != null) { + m_projectService = projectService; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java index 68701d27e8..7711806198 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java @@ -42,6 +42,7 @@ import com.dianping.cat.report.page.metric.task.BaselineConfigManager; import com.dianping.cat.report.page.metric.task.BaselineCreator; import com.dianping.cat.report.task.TaskBuilder; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = BusinessBaselineReportBuilder.ID) public class BusinessBaselineReportBuilder implements TaskBuilder { @@ -73,6 +74,8 @@ public class BusinessBaselineReportBuilder implements TaskBuilder { @Override public boolean buildDailyTask(String name, String domain, Date period) { + refreshSpringBeans(); + Map reports = new HashMap(); BusinessReportConfig config = m_configManager.queryConfigByDomain(domain); @@ -162,4 +165,16 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { throw new RuntimeException("Business base line report don't support weekly report!"); } + private void refreshSpringBeans() { + BusinessConfigManager configManager = CatSpringContext.getBeanIfAvailable(BusinessConfigManager.class); + BaselineService baselineService = CatSpringContext.getBeanIfAvailable(BaselineService.class); + + if (configManager != null) { + m_configManager = configManager; + } + if (baselineService != null) { + m_baselineService = baselineService; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/ExternalInfoBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/ExternalInfoBuilder.java index 022abf2dc5..b2f559d91b 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/ExternalInfoBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/ExternalInfoBuilder.java @@ -33,6 +33,7 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.spring.CatSpringContext; public class ExternalInfoBuilder { @@ -48,6 +49,8 @@ public class ExternalInfoBuilder { private SimpleDateFormat m_dateFormat = new SimpleDateFormat("yyyyMMddHH"); public void buildExceptionInfoOnGraph(Payload payload, Model model, TopologyGraph graph) { + refreshSpringBeans(); + if (graph.getStatus() != GraphConstrant.OK) { String problemInfo = buildProblemInfo(graph.getId(), payload); @@ -67,6 +70,8 @@ public void buildExceptionInfoOnGraph(Payload payload, Model model, TopologyGrap } public void buildNodeExceptionInfo(TopologyNode node, Model model, Payload payload) { + refreshSpringBeans(); + String domain = node.getId(); if (node.getStatus() != GraphConstrant.OK) { String exceptionInfo = buildProblemInfo(domain, payload); @@ -101,4 +106,12 @@ private ProblemReport queryProblemReport(Payload payload, String domain) { } } -} \ No newline at end of file + private void refreshSpringBeans() { + ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + + if (serverConfigManager != null) { + m_serverConfigManager = serverConfigManager; + } + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java index cfe8a26165..ebe3aad7ed 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java @@ -37,6 +37,7 @@ import com.dianping.cat.home.dependency.format.entity.ProductLine; import com.dianping.cat.home.dependency.format.entity.TopoGraphFormatConfig; import com.dianping.cat.home.dependency.format.transform.DefaultSaxParser; +import com.dianping.cat.spring.CatSpringContext; @Named public class TopoGraphFormatConfigManager implements Initializable { @@ -71,6 +72,8 @@ public TopoGraphFormatConfig getConfig() { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + try { Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); String content = config.getContent(); @@ -115,6 +118,8 @@ public List queryProduct() { private boolean storeConfig() { synchronized (this) { + refreshSpringBeans(); + try { Config config = m_configDao.createLocal(); @@ -130,4 +135,16 @@ private boolean storeConfig() { } return true; } + + private void refreshSpringBeans() { + ConfigRepository configDao = CatSpringContext.getBeanIfAvailable(ConfigRepository.class); + ContentFetcher fetcher = CatSpringContext.getBeanIfAvailable(ContentFetcher.class); + + if (configDao != null) { + m_configDao = configDao; + } + if (fetcher != null) { + m_fetcher = fetcher; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java index 35410374ef..0c042a88ac 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java @@ -46,6 +46,7 @@ import com.dianping.cat.home.dependency.config.entity.NodeConfig; import com.dianping.cat.home.dependency.config.entity.TopologyGraphConfig; import com.dianping.cat.home.dependency.config.transform.DefaultSaxParser; +import com.dianping.cat.spring.CatSpringContext; @Named public class TopologyGraphConfigManager implements Initializable { @@ -240,6 +241,8 @@ public synchronized TopologyGraphConfig getConfig() { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + if (m_fileName != null) { try { String content = Files.forIO().readFrom(new File(m_fileName), "utf-8"); @@ -351,6 +354,8 @@ private boolean storeConfig() { return false; } } else { + refreshSpringBeans(); + try { Config config = m_configDao.createLocal(); config.setId(m_configId); @@ -367,4 +372,16 @@ private boolean storeConfig() { return true; } + private void refreshSpringBeans() { + ConfigRepository configDao = CatSpringContext.getBeanIfAvailable(ConfigRepository.class); + ContentFetcher fetcher = CatSpringContext.getBeanIfAvailable(ContentFetcher.class); + + if (configDao != null) { + m_configDao = configDao; + } + if (fetcher != null) { + m_fetcher = fetcher; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java index 81b3213531..4309d8545a 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java @@ -58,6 +58,7 @@ import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.spring.CatSpringContext; @Named public class TopologyGraphManager implements Initializable, LogEnabled { @@ -211,12 +212,16 @@ public void enableLogging(Logger logger) { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + if (m_manager.isJobMachine()) { Threads.forGroup("cat").start(new DependencyReloadTask()); } } public TopologyGraph queryGraphFromDB(long time) { + refreshSpringBeans(); + try { com.dianping.cat.home.dal.report.TopologyGraph topologyGraph = m_topologyGraphDao .findByPeriod(new Date(time), TopologyGraphEntity.READSET_FULL); @@ -286,6 +291,8 @@ public void run() { boolean active = TimeHelper.sleepToNextMinute(); while (active) { + refreshSpringBeans(); + Transaction t = Cat.newTransaction("ReloadTask", "Dependency"); long current = System.currentTimeMillis(); try { @@ -332,4 +339,21 @@ public void shutdown() { } } + private void refreshSpringBeans() { + ServerConfigManager manager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + ServerFilterConfigManager serverFilterConfigManager = CatSpringContext + .getBeanIfAvailable(ServerFilterConfigManager.class); + ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + + if (manager != null) { + m_manager = manager; + } + if (serverFilterConfigManager != null) { + m_serverFilterConfigManager = serverFilterConfigManager; + } + if (projectService != null) { + m_projectService = projectService; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java index 9656936fb4..0eb8f3683b 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java @@ -37,6 +37,7 @@ import com.dianping.cat.report.page.dependency.graph.TopologyGraphBuilder; import com.dianping.cat.report.page.dependency.service.DependencyReportService; import com.dianping.cat.report.task.TaskBuilder; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = DependencyReportBuilder.ID) public class DependencyReportBuilder implements TaskBuilder { @@ -59,6 +60,7 @@ public boolean buildDailyTask(String name, String reportDomain, Date reportPerio @Override public boolean buildHourlyTask(String name, String reportDomain, Date reportPeriod) { + refreshSpringBeans(); Date end = new Date(reportPeriod.getTime() + TimeHelper.ONE_HOUR); Set domains = m_reportService.queryAllDomainNames(reportPeriod, end, DependencyAnalyzer.ID); boolean result = true; @@ -104,4 +106,12 @@ public boolean buildWeeklyTask(String name, String reportDomain, Date reportPeri throw new UnsupportedOperationException("no week report builder for dependency!"); } + private void refreshSpringBeans() { + TopologyGraphRepository topologyGraphDao = CatSpringContext.getBeanIfAvailable(TopologyGraphRepository.class); + + if (topologyGraphDao != null) { + m_topologyGraphDao = topologyGraphDao; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java index 41006c50c6..c21520a10c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java @@ -43,6 +43,7 @@ import com.dianping.cat.report.task.TaskHelper; import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask; import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = EventReportBuilder.ID) public class EventReportBuilder implements TaskBuilder, Initializable { @@ -60,6 +61,8 @@ public class EventReportBuilder implements TaskBuilder, Initializable { @Override public boolean buildDailyTask(String name, String domain, Date period) { + refreshSpringBeans(); + try { EventReport eventReport = queryHourlyReportsByDuration(name, domain, period, TaskHelper.tomorrowZero(period)); @@ -86,6 +89,8 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { + refreshSpringBeans(); + Date end = null; if (period.equals(TimeHelper.getCurrentMonth())) { @@ -109,6 +114,8 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { + refreshSpringBeans(); + Date end = null; if (period.equals(TimeHelper.getCurrentWeek())) { @@ -132,6 +139,8 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + CurrentWeeklyMonthlyReportTask.getInstance().register(new CurrentWeeklyMonthlyTask() { @Override @@ -213,4 +222,17 @@ private EventReport queryHourlyReportsByDuration(String name, String domain, Dat return dailyReport; } + private void refreshSpringBeans() { + ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + AtomicMessageConfigManager atomicMessageConfigManager = CatSpringContext + .getBeanIfAvailable(AtomicMessageConfigManager.class); + + if (serverConfigManager != null) { + m_serverConfigManager = serverConfigManager; + } + if (atomicMessageConfigManager != null) { + m_atomicMessageConfigManager = atomicMessageConfigManager; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java index 8c4acfeeb8..5794014f86 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java @@ -39,6 +39,7 @@ import com.dianping.cat.home.heartbeat.entity.HeartbeatDisplayPolicy; import com.dianping.cat.home.heartbeat.entity.Metric; import com.dianping.cat.home.heartbeat.transform.DefaultSaxParser; +import com.dianping.cat.spring.CatSpringContext; public class HeartbeatDisplayPolicyManager implements Initializable { @@ -62,6 +63,8 @@ public HeartbeatDisplayPolicy getHeartbeatDisplayPolicy() { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + try { Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); String content = config.getContent(); @@ -234,6 +237,8 @@ public List sortMetricNames(String groupName, Set originMetricNa private boolean storeConfig() { synchronized (this) { + refreshSpringBeans(); + try { Config config = m_configDao.createLocal(); @@ -250,4 +255,16 @@ private boolean storeConfig() { return true; } + private void refreshSpringBeans() { + ConfigRepository configDao = CatSpringContext.getBeanIfAvailable(ConfigRepository.class); + ContentFetcher fetcher = CatSpringContext.getBeanIfAvailable(ContentFetcher.class); + + if (configDao != null) { + m_configDao = configDao; + } + if (fetcher != null) { + m_fetcher = fetcher; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/logview/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/logview/Handler.java index 3a4646c127..a66abc9dfc 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/logview/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/logview/Handler.java @@ -36,6 +36,7 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { @Inject @@ -48,6 +49,8 @@ public class Handler implements PageHandler { private ServerConfigManager m_configManager; private boolean checkStorageTime(MessageId msg) { + refreshSpringBeans(); + long time = msg.getTimestamp(); long current = TimeHelper.getCurrentDay().getTime(); @@ -105,6 +108,8 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = "m") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + Model model = new Model(ctx); Payload payload = ctx.getPayload(); @@ -137,4 +142,12 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { m_jspViewer.view(ctx, model); } + + private void refreshSpringBeans() { + ServerConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + + if (configManager != null) { + m_configManager = configManager; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/RemoteLogViewService.java b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/RemoteLogViewService.java index ca9d74ca67..85e8619b68 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/RemoteLogViewService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/RemoteLogViewService.java @@ -35,6 +35,7 @@ import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; +import com.dianping.cat.spring.CatSpringContext; public class RemoteLogViewService extends BaseRemoteModelService { @@ -83,6 +84,8 @@ public ModelResponse invoke(ModelRequest request) { @Override public boolean isEligable(ModelRequest request) { + refreshSpringBeans(); + if (m_manager.isHdfsOn()) { ModelPeriod period = request.getPeriod(); @@ -107,6 +110,14 @@ public void setManager(ServerConfigManager manager) { m_manager = manager; } + private void refreshSpringBeans() { + ServerConfigManager manager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + + if (manager != null) { + m_manager = manager; + } + } + @Override public boolean isServersFixed() { return true; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java b/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java index deb55e29ed..0c88f64fe2 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java @@ -39,6 +39,7 @@ import com.dianping.cat.home.dal.report.BaselineEntity; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.task.TaskHelper; +import com.dianping.cat.spring.CatSpringContext; @Named(type = BaselineService.class) public class DefaultBaselineService implements BaselineService { @@ -98,6 +99,7 @@ private Map getEmpties() { @Override public boolean hasDailyBaseline(String reportName, String key, Date reportPeriod) { + refreshSpringBeans(); String baselineKey = reportName + ":" + key + ":" + reportPeriod; Baseline baseline = m_baselines.get(baselineKey); boolean has = false; @@ -118,6 +120,7 @@ public boolean hasDailyBaseline(String reportName, String key, Date reportPeriod @Override public void insertBaseline(Baseline baseline) { + refreshSpringBeans(); try { baseline.setData(encodeBaselines(baseline.getDataInDoubleArray())); m_baselineDao.insert(baseline); @@ -190,6 +193,7 @@ private double[] queryBaseLine(int start, int end, String key, Date date, String @Override public double[] queryDailyBaseline(String reportName, String key, Date reportPeriod) { + refreshSpringBeans(); String baselineKey = reportName + ":" + key + ":" + reportPeriod; Baseline baseline = m_baselines.get(baselineKey); @@ -234,4 +238,12 @@ public double[] queryHourlyBaseline(String reportName, String key, Date reportPe } return result; } + + private void refreshSpringBeans() { + BaselineRepository baselineDao = CatSpringContext.getBeanIfAvailable(BaselineRepository.class); + + if (baselineDao != null) { + m_baselineDao = baselineDao; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java index 1791102b79..b4687d3fb9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java @@ -30,6 +30,7 @@ import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; import com.dianping.cat.home.dal.report.OverloadEntity; +import com.dianping.cat.spring.CatSpringContext; @Named public class CapacityUpdateStatusManager implements Initializable { @@ -87,6 +88,8 @@ public int getWeeklyStatus() { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + try { Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); String content = config.getContent(); @@ -118,6 +121,8 @@ public void initialize() throws InitializationException { private boolean storeConfig() { synchronized (this) { + refreshSpringBeans(); + try { Config config = m_configDao.createLocal(); @@ -154,4 +159,16 @@ public void updateWeeklyStatus(int weeklyStatus) { storeConfig(); } + private void refreshSpringBeans() { + ConfigRepository configDao = CatSpringContext.getBeanIfAvailable(ConfigRepository.class); + OverloadRepository overloadDao = CatSpringContext.getBeanIfAvailable(OverloadRepository.class); + + if (configDao != null) { + m_configDao = configDao; + } + if (overloadDao != null) { + m_overloadDao = overloadDao; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java index 283b380341..51e7f25cdb 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java @@ -34,6 +34,7 @@ import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; +import com.dianping.cat.spring.CatSpringContext; @Named(type = CapacityUpdater.class, value = DailyCapacityUpdater.ID) public class DailyCapacityUpdater implements CapacityUpdater { @@ -59,6 +60,8 @@ public String getId() { @Override public void updateDBCapacity() throws DalException { + refreshSpringBeans(); + int maxId = m_manager.getDailyStatus(); while (true) { @@ -101,4 +104,21 @@ public void updateDBCapacity() throws DalException { m_manager.updateDailyStatus(maxId); } + private void refreshSpringBeans() { + DailyReportContentRepository dailyReportContentDao = CatSpringContext + .getBeanIfAvailable(DailyReportContentRepository.class); + DailyReportRepository dailyReportDao = CatSpringContext.getBeanIfAvailable(DailyReportRepository.class); + OverloadRepository overloadDao = CatSpringContext.getBeanIfAvailable(OverloadRepository.class); + + if (dailyReportContentDao != null) { + m_dailyReportContentDao = dailyReportContentDao; + } + if (dailyReportDao != null) { + m_dailyReportDao = dailyReportDao; + } + if (overloadDao != null) { + m_overloadDao = overloadDao; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java index 30fae24a58..a5d5973e3f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java @@ -34,6 +34,7 @@ import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; +import com.dianping.cat.spring.CatSpringContext; @Named(type = CapacityUpdater.class, value = HourlyCapacityUpdater.ID) public class HourlyCapacityUpdater implements CapacityUpdater { @@ -59,6 +60,8 @@ public String getId() { @Override public void updateDBCapacity() throws DalException { + refreshSpringBeans(); + int maxId = m_manager.getHourlyStatus(); while (true) { @@ -103,4 +106,21 @@ public void updateDBCapacity() throws DalException { m_manager.updateHourlyStatus(maxId); } + private void refreshSpringBeans() { + HourlyReportContentRepository hourlyReportContentDao = CatSpringContext + .getBeanIfAvailable(HourlyReportContentRepository.class); + HourlyReportRepository hourlyReportDao = CatSpringContext.getBeanIfAvailable(HourlyReportRepository.class); + OverloadRepository overloadDao = CatSpringContext.getBeanIfAvailable(OverloadRepository.class); + + if (hourlyReportContentDao != null) { + m_hourlyReportContentDao = hourlyReportContentDao; + } + if (hourlyReportDao != null) { + m_hourlyReportDao = hourlyReportDao; + } + if (overloadDao != null) { + m_overloadDao = overloadDao; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java index 835a9f657d..e162baca41 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java @@ -34,6 +34,7 @@ import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; +import com.dianping.cat.spring.CatSpringContext; @Named(type = CapacityUpdater.class, value = MonthlyCapacityUpdater.ID) public class MonthlyCapacityUpdater implements CapacityUpdater { @@ -59,6 +60,8 @@ public String getId() { @Override public void updateDBCapacity() throws DalException { + refreshSpringBeans(); + int maxId = m_manager.getMonthlyStatus(); while (true) { @@ -101,4 +104,21 @@ public void updateDBCapacity() throws DalException { m_manager.updateMonthlyStatus(maxId); } + private void refreshSpringBeans() { + MonthlyReportRepository monthlyReportDao = CatSpringContext.getBeanIfAvailable(MonthlyReportRepository.class); + MonthlyReportContentRepository monthlyReportContentDao = CatSpringContext + .getBeanIfAvailable(MonthlyReportContentRepository.class); + OverloadRepository overloadDao = CatSpringContext.getBeanIfAvailable(OverloadRepository.class); + + if (monthlyReportDao != null) { + m_monthlyReportDao = monthlyReportDao; + } + if (monthlyReportContentDao != null) { + m_monthlyReportContentDao = monthlyReportContentDao; + } + if (overloadDao != null) { + m_overloadDao = overloadDao; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java index ebeb92f74f..e7218b05b2 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java @@ -44,6 +44,7 @@ import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; import com.dianping.cat.home.dal.report.OverloadEntity; +import com.dianping.cat.spring.CatSpringContext; @Named public class TableCapacityService extends ContainerHolder { @@ -103,6 +104,8 @@ private OverloadReport generateOverloadReport(Object object, double reportSize, } public List queryOverloadReports(Date startTime, Date endTime) { + refreshSpringBeans(); + List reports = new ArrayList(); try { @@ -143,4 +146,28 @@ public List queryOverloadReports(Date startTime, Date endTime) { return reports; } + private void refreshSpringBeans() { + OverloadRepository overloadDao = CatSpringContext.getBeanIfAvailable(OverloadRepository.class); + HourlyReportRepository hourlyReportDao = CatSpringContext.getBeanIfAvailable(HourlyReportRepository.class); + DailyReportRepository dailyReportDao = CatSpringContext.getBeanIfAvailable(DailyReportRepository.class); + WeeklyReportRepository weeklyReportDao = CatSpringContext.getBeanIfAvailable(WeeklyReportRepository.class); + MonthlyReportRepository monthlyReportDao = CatSpringContext.getBeanIfAvailable(MonthlyReportRepository.class); + + if (overloadDao != null) { + m_overloadDao = overloadDao; + } + if (hourlyReportDao != null) { + m_hourlyReportDao = hourlyReportDao; + } + if (dailyReportDao != null) { + m_dailyReportDao = dailyReportDao; + } + if (weeklyReportDao != null) { + m_weeklyReportDao = weeklyReportDao; + } + if (monthlyReportDao != null) { + m_monthlyReportDao = monthlyReportDao; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java index 6dd30539e8..ab97521c8e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java @@ -34,6 +34,7 @@ import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; +import com.dianping.cat.spring.CatSpringContext; @Named(type = CapacityUpdater.class, value = WeeklyCapacityUpdater.ID) public class WeeklyCapacityUpdater implements CapacityUpdater { @@ -59,6 +60,8 @@ public String getId() { @Override public void updateDBCapacity() throws DalException { + refreshSpringBeans(); + int maxId = m_manager.getWeeklyStatus(); while (true) { @@ -101,4 +104,21 @@ public void updateDBCapacity() throws DalException { m_manager.updateWeeklyStatus(maxId); } + private void refreshSpringBeans() { + WeeklyReportRepository weeklyReportDao = CatSpringContext.getBeanIfAvailable(WeeklyReportRepository.class); + WeeklyReportContentRepository weeklyReportContentDao = CatSpringContext + .getBeanIfAvailable(WeeklyReportContentRepository.class); + OverloadRepository overloadDao = CatSpringContext.getBeanIfAvailable(OverloadRepository.class); + + if (weeklyReportDao != null) { + m_weeklyReportDao = weeklyReportDao; + } + if (weeklyReportContentDao != null) { + m_weeklyReportContentDao = weeklyReportContentDao; + } + if (overloadDao != null) { + m_overloadDao = overloadDao; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java index ee8521df89..1064dab78b 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java @@ -55,6 +55,7 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { @@ -84,6 +85,8 @@ public class Handler implements PageHandler { private JsonBuilder m_jsonBuilder; private void buildDefaultThreshold(Model model, Payload payload) { + refreshSpringBeans(); + Map domains = m_manager.getLongConfigDomains(); Domain d = domains.get(payload.getDomain()); @@ -189,6 +192,8 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = "p") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + Model model = new Model(ctx); Payload payload = ctx.getPayload(); normalize(model, payload); @@ -394,4 +399,12 @@ public enum SummaryOrder { TOTAL_COUNT, DETAIL } + + private void refreshSpringBeans() { + ServerConfigManager manager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + + if (manager != null) { + m_manager = manager; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java index a9193a5745..7e4d7e3426 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java @@ -43,6 +43,7 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { @Inject @@ -67,6 +68,8 @@ public class Handler implements PageHandler { private ServerFilterConfigManager m_serverFilterConfigManager; private void buildDisplayInfo(Model model, Payload payload, StateReport report) { + refreshSpringBeans(); + StateDisplay display = new StateDisplay(payload.getIpAddress(), m_serverFilterConfigManager.getUnusedDomains()); display.setSortType(payload.getSort()); @@ -108,6 +111,8 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = StateAnalyzer.ID) public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + Model model = new Model(ctx); Payload payload = ctx.getPayload(); Action action = payload.getAction(); @@ -157,4 +162,13 @@ private void normalize(Model model, Payload payload) { m_normalizePayload.normalize(model, payload); } + private void refreshSpringBeans() { + ServerFilterConfigManager serverFilterConfigManager = CatSpringContext + .getBeanIfAvailable(ServerFilterConfigManager.class); + + if (serverFilterConfigManager != null) { + m_serverFilterConfigManager = serverFilterConfigManager; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java index 36b38cf05a..eeaf054f16 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java @@ -35,6 +35,7 @@ import com.dianping.cat.report.graph.PieChart; import com.dianping.cat.report.graph.PieChart.Item; import com.dianping.cat.report.page.state.service.StateReportService; +import com.dianping.cat.spring.CatSpringContext; @Named public class StateGraphBuilder { @@ -46,6 +47,8 @@ public class StateGraphBuilder { private ServerFilterConfigManager m_serverFilterConfigManager; public Pair buildGraph(Payload payload, String key) { + refreshSpringBeans(); + String domain = payload.getDomain(); Date start = payload.getHistoryStartDate(); Date end = payload.getHistoryEndDate(); @@ -55,6 +58,8 @@ public Pair buildGraph(Payload payload, String key) { } public Pair buildGraph(Payload payload, String key, StateReport report) { + refreshSpringBeans(); + String domain = payload.getDomain(); String ips = payload.getIpAddress(); @@ -123,4 +128,13 @@ private PieChart buildPiechart(Map distributes) { chart.addItems(items); return chart; } + + private void refreshSpringBeans() { + ServerFilterConfigManager serverFilterConfigManager = CatSpringContext + .getBeanIfAvailable(ServerFilterConfigManager.class); + + if (serverFilterConfigManager != null) { + m_serverFilterConfigManager = serverFilterConfigManager; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java index db8bd4cdf7..440394e4a3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java @@ -48,6 +48,7 @@ import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; import com.dianping.cat.service.HostinfoService; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = StateReportBuilder.ID) public class StateReportBuilder implements TaskBuilder, Initializable { @@ -71,6 +72,8 @@ public class StateReportBuilder implements TaskBuilder, Initializable { @Override public boolean buildDailyTask(String name, String domain, Date period) { + refreshSpringBeans(); + StateReport stateReport = queryHourlyReportsByDuration(domain, period, TaskHelper.tomorrowZero(period)); DailyReport report = new DailyReport(); @@ -86,6 +89,8 @@ public boolean buildDailyTask(String name, String domain, Date period) { @Override public boolean buildHourlyTask(String name, String domain, Date period) { + refreshSpringBeans(); + StateReport stateReport = m_reportService .queryReport(domain, period, new Date(period.getTime() + TimeHelper.ONE_HOUR)); @@ -96,6 +101,8 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { + refreshSpringBeans(); + StateReport stateReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); MonthlyReport report = new MonthlyReport(); @@ -111,6 +118,8 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { + refreshSpringBeans(); + Date start = period; Date end = new Date(start.getTime() + TimeHelper.ONE_DAY * 7); @@ -129,6 +138,8 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + CurrentWeeklyMonthlyReportTask.getInstance().register(new CurrentWeeklyMonthlyTask() { @Override @@ -195,6 +206,8 @@ private StateReport queryHourlyReportsByDuration(String domain, Date period, Dat } private void updateProjectAndHost(String domain, String ip) { + refreshSpringBeans(); + if (m_serverFilterConfigManager.validateDomain(domain)) { if (!m_projectService.contains(domain)) { m_projectService.insert(domain); @@ -214,6 +227,23 @@ private void updateProjectAndHost(String domain, String ip) { } } + private void refreshSpringBeans() { + ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + ServerFilterConfigManager serverFilterConfigManager = CatSpringContext + .getBeanIfAvailable(ServerFilterConfigManager.class); + ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + + if (serverConfigManager != null) { + m_serverConfigManager = serverConfigManager; + } + if (serverFilterConfigManager != null) { + m_serverFilterConfigManager = serverFilterConfigManager; + } + if (projectService != null) { + m_projectService = projectService; + } + } + public static class ClearDetailInfo extends BaseVisitor { @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/Handler.java index 5e681350cb..5c599690c6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/Handler.java @@ -58,9 +58,10 @@ import com.dianping.cat.report.page.statistics.service.ServiceReportService; import com.dianping.cat.report.page.statistics.service.UtilizationReportService; import com.dianping.cat.report.page.statistics.task.heavy.HeavyReportMerger.ServiceComparator; -import com.dianping.cat.report.page.statistics.task.heavy.HeavyReportMerger.UrlComparator; -import com.dianping.cat.report.page.statistics.task.jar.JarReportBuilder; -import com.dianping.cat.service.ProjectService; +import com.dianping.cat.report.page.statistics.task.heavy.HeavyReportMerger.UrlComparator; +import com.dianping.cat.report.page.statistics.task.jar.JarReportBuilder; +import com.dianping.cat.service.ProjectService; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { @Inject @@ -171,10 +172,12 @@ public void handleInbound(Context ctx) throws ServletException, IOException { // display only, no action here } - @Override - @OutboundActionMeta(name = "statistics") - public void handleOutbound(Context ctx) throws ServletException, IOException { - Model model = new Model(ctx); + @Override + @OutboundActionMeta(name = "statistics") + public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + + Model model = new Model(ctx); Payload payload = ctx.getPayload(); m_normalizePayload.normalize(model, payload); @@ -211,10 +214,18 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { break; } model.setPage(ReportPage.STATISTICS); - m_jspViewer.view(ctx, model); - } - - private void buildClientReport(Model model, Payload payload) { + m_jspViewer.view(ctx, model); + } + + private void refreshSpringBeans() { + ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + + if (projectService != null) { + m_projectService = projectService; + } + } + + private void buildClientReport(Model model, Payload payload) { Date startDate = payload.getDay(); Date endDate = TimeHelper.addDays(startDate, 1); ClientReport report = m_clientReportService.queryReport(Constants.CAT, startDate, endDate); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java index 34e4e36a05..5e1ea0072b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java @@ -41,6 +41,7 @@ import com.dianping.cat.report.page.statistics.service.HeavyReportService; import com.dianping.cat.report.task.TaskBuilder; import com.dianping.cat.report.task.TaskHelper; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = HeavyReportBuilder.ID) public class HeavyReportBuilder implements TaskBuilder { @@ -58,6 +59,8 @@ public class HeavyReportBuilder implements TaskBuilder { @Override public boolean buildDailyTask(String name, String domain, Date period) { + refreshSpringBeans(); + HeavyReport heavyReport = queryHourlyReportsByDuration(name, domain, period, TaskHelper.tomorrowZero(period)); DailyReport report = new DailyReport(); @@ -73,6 +76,8 @@ public boolean buildDailyTask(String name, String domain, Date period) { @Override public boolean buildHourlyTask(String name, String domain, Date start) { + refreshSpringBeans(); + HeavyReport heavyReport = new HeavyReport(Constants.CAT); MatrixReportVisitor visitor = new MatrixReportVisitor().setReport(heavyReport); Date end = new Date(start.getTime() + TimeHelper.ONE_HOUR); @@ -102,6 +107,8 @@ public boolean buildHourlyTask(String name, String domain, Date start) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { + refreshSpringBeans(); + HeavyReport heavyReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); MonthlyReport report = new MonthlyReport(); @@ -117,6 +124,8 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { + refreshSpringBeans(); + HeavyReport heavyReport = queryDailyReportsByDuration(domain, period, new Date(period.getTime() + TimeHelper.ONE_WEEK)); WeeklyReport report = new WeeklyReport(); @@ -132,6 +141,8 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { } private HeavyReport queryDailyReportsByDuration(String domain, Date start, Date end) { + refreshSpringBeans(); + long startTime = start.getTime(); long endTime = end.getTime(); HeavyReportMerger merger = new HeavyReportMerger(new HeavyReport(domain)); @@ -152,6 +163,8 @@ private HeavyReport queryDailyReportsByDuration(String domain, Date start, Date } private HeavyReport queryHourlyReportsByDuration(String name, String domain, Date period, Date endDate) { + refreshSpringBeans(); + long startTime = period.getTime(); long endTime = endDate.getTime(); HeavyReportMerger merger = new HeavyReportMerger(new HeavyReport(domain)); @@ -167,4 +180,12 @@ private HeavyReport queryHourlyReportsByDuration(String name, String domain, Dat return heavyReport; } + private void refreshSpringBeans() { + ServerFilterConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + + if (configManager != null) { + m_configManager = configManager; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java index 20bc3e51c3..347730b5e6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java @@ -45,6 +45,7 @@ import com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService; import com.dianping.cat.report.page.statistics.service.JarReportService; import com.dianping.cat.report.task.TaskBuilder; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = JarReportBuilder.ID) public class JarReportBuilder implements TaskBuilder { @@ -72,6 +73,8 @@ public boolean buildDailyTask(String name, String domain, Date period) { @Override public boolean buildHourlyTask(String name, String domain, Date period) { + refreshSpringBeans(); + Date end = new Date(period.getTime() + TimeHelper.ONE_HOUR); Set domains = m_reportService.queryAllDomainNames(period, end, HeartbeatAnalyzer.ID); JarReport jarReport = new JarReport(); @@ -109,6 +112,14 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { throw new RuntimeException(ID + " don't support weekly update"); } + private void refreshSpringBeans() { + ServerFilterConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + + if (configManager != null) { + m_configManager = configManager; + } + } + public class HeartbeatReportVisitor extends BaseVisitor { private String m_currentDomain; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java index 033a80b14d..7c30dca75a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java @@ -38,6 +38,7 @@ import com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper; import com.dianping.cat.report.task.TaskBuilder; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = ClientReportBuilder.ID) public class ClientReportBuilder implements TaskBuilder { @@ -61,6 +62,8 @@ public class ClientReportBuilder implements TaskBuilder { @Override public boolean buildDailyTask(String name, String domain, Date period) { + refreshSpringBeans(); + ClientReport clientReport = buildClientReport(period); DailyReport report = new DailyReport(); @@ -76,6 +79,8 @@ public boolean buildDailyTask(String name, String domain, Date period) { } private ClientReport buildClientReport(Date startTime) { + refreshSpringBeans(); + Date endTime = TimeHelper.addDays(startTime, 1); Set domains = m_projectService.findAllDomains(); ClientReportStatistics statistics = new ClientReportStatistics(); @@ -112,4 +117,16 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { throw new RuntimeException("Service client report don't support weekly report!"); } + private void refreshSpringBeans() { + ServerFilterConfigManager configManger = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + + if (configManger != null) { + m_configManger = configManger; + } + if (projectService != null) { + m_projectService = projectService; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java index b8f23bab0c..04b78c193a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java @@ -44,9 +44,10 @@ import com.dianping.cat.report.page.cross.display.ProjectInfo; import com.dianping.cat.report.page.cross.display.TypeDetailInfo; import com.dianping.cat.report.page.cross.service.CrossReportService; -import com.dianping.cat.report.page.statistics.service.ServiceReportService; -import com.dianping.cat.report.task.TaskBuilder; -import com.dianping.cat.report.task.TaskHelper; +import com.dianping.cat.report.page.statistics.service.ServiceReportService; +import com.dianping.cat.report.task.TaskBuilder; +import com.dianping.cat.report.task.TaskHelper; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = ServiceReportBuilder.ID) public class ServiceReportBuilder implements TaskBuilder { @@ -62,11 +63,13 @@ public class ServiceReportBuilder implements TaskBuilder { Map stat = new HashMap(); @Inject - private ServerFilterConfigManager m_configManger; - - @Override - public boolean buildDailyTask(String name, String domain, Date period) { - ServiceReport serviceReport = queryHourlyReportsByDuration(name, domain, period, TaskHelper.tomorrowZero(period)); + private ServerFilterConfigManager m_configManger; + + @Override + public boolean buildDailyTask(String name, String domain, Date period) { + refreshSpringBeans(); + + ServiceReport serviceReport = queryHourlyReportsByDuration(name, domain, period, TaskHelper.tomorrowZero(period)); DailyReport report = new DailyReport(); report.setCreationDate(new Date()); @@ -80,9 +83,11 @@ public boolean buildDailyTask(String name, String domain, Date period) { return m_reportService.insertDailyReport(report, binaryContent); } - @Override - public boolean buildHourlyTask(String name, String domain, Date start) { - ServiceReport serviceReport = new ServiceReport(Constants.CAT); + @Override + public boolean buildHourlyTask(String name, String domain, Date start) { + refreshSpringBeans(); + + ServiceReport serviceReport = new ServiceReport(Constants.CAT); Date end = new Date(start.getTime() + TimeHelper.ONE_HOUR); Set domains = m_reportService.queryAllDomainNames(start, end, CrossAnalyzer.ID); @@ -130,8 +135,10 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { } @Override - public boolean buildWeeklyTask(String name, String domain, Date period) { - ServiceReport serviceReport = queryDailyReportsByDuration(domain, period, + public boolean buildWeeklyTask(String name, String domain, Date period) { + refreshSpringBeans(); + + ServiceReport serviceReport = queryDailyReportsByDuration(domain, period, new Date(period.getTime() + TimeHelper.ONE_WEEK)); WeeklyReport report = new WeeklyReport(); @@ -156,8 +163,10 @@ public void merge(Domain domain, TypeDetailInfo info) { } } - private ServiceReport queryDailyReportsByDuration(String domain, Date start, Date end) { - long startTime = start.getTime(); + private ServiceReport queryDailyReportsByDuration(String domain, Date start, Date end) { + refreshSpringBeans(); + + long startTime = start.getTime(); long endTime = end.getTime(); ServiceReportMerger merger = new ServiceReportMerger(new ServiceReport(domain)); @@ -177,8 +186,10 @@ private ServiceReport queryDailyReportsByDuration(String domain, Date start, Dat return serviceReport; } - private ServiceReport queryHourlyReportsByDuration(String name, String domain, Date start, Date end) { - long startTime = start.getTime(); + private ServiceReport queryHourlyReportsByDuration(String name, String domain, Date start, Date end) { + refreshSpringBeans(); + + long startTime = start.getTime(); long endTime = end.getTime(); ServiceReportMerger merger = new ServiceReportMerger(new ServiceReport(domain)); @@ -198,8 +209,16 @@ private ServiceReport queryHourlyReportsByDuration(String name, String domain, D } private boolean validataService(TypeDetailInfo typeInfo) { - return typeInfo.getProjectName().equalsIgnoreCase(ProjectInfo.ALL_SERVER) || typeInfo.getProjectName() - .equalsIgnoreCase("UnknownProject"); - } - -} + return typeInfo.getProjectName().equalsIgnoreCase(ProjectInfo.ALL_SERVER) || typeInfo.getProjectName() + .equalsIgnoreCase("UnknownProject"); + } + + private void refreshSpringBeans() { + ServerFilterConfigManager configManger = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + + if (configManger != null) { + m_configManger = configManger; + } + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java index 6ebcbee79a..ebd9ec76af 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java @@ -48,9 +48,10 @@ import com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService; import com.dianping.cat.report.page.statistics.service.UtilizationReportService; import com.dianping.cat.report.page.transaction.service.TransactionReportService; -import com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper; -import com.dianping.cat.report.task.TaskBuilder; -import com.dianping.cat.report.task.TaskHelper; +import com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper; +import com.dianping.cat.report.task.TaskBuilder; +import com.dianping.cat.report.task.TaskHelper; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = UtilizationReportBuilder.ID) public class UtilizationReportBuilder implements TaskBuilder { @@ -73,11 +74,13 @@ public class UtilizationReportBuilder implements TaskBuilder { private TransactionMergeHelper m_mergeHelper; @Inject - private ServerFilterConfigManager m_configManger; - - @Override - public boolean buildDailyTask(String name, String domain, Date period) { - UtilizationReport utilizationReport = queryHourlyReportsByDuration(name, domain, period, + private ServerFilterConfigManager m_configManger; + + @Override + public boolean buildDailyTask(String name, String domain, Date period) { + refreshSpringBeans(); + + UtilizationReport utilizationReport = queryHourlyReportsByDuration(name, domain, period, TaskHelper.tomorrowZero(period)); DailyReport report = new DailyReport(); @@ -92,9 +95,11 @@ public boolean buildDailyTask(String name, String domain, Date period) { return m_reportService.insertDailyReport(report, binaryContent); } - @Override - public boolean buildHourlyTask(String name, String domain, Date start) { - UtilizationReport utilizationReport = new UtilizationReport(Constants.CAT); + @Override + public boolean buildHourlyTask(String name, String domain, Date start) { + refreshSpringBeans(); + + UtilizationReport utilizationReport = new UtilizationReport(Constants.CAT); Date end = new Date(start.getTime() + TimeHelper.ONE_HOUR); Set domains = m_reportService.queryAllDomainNames(start, end, TransactionAnalyzer.ID); TransactionReportVisitor transactionVisitor = new TransactionReportVisitor().setUtilizationReport(utilizationReport); @@ -165,9 +170,11 @@ public boolean buildHourlyTask(String name, String domain, Date start) { return m_reportService.insertHourlyReport(report, binaryContent); } - @Override - public boolean buildMonthlyTask(String name, String domain, Date period) { - UtilizationReport utilizationReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); + @Override + public boolean buildMonthlyTask(String name, String domain, Date period) { + refreshSpringBeans(); + + UtilizationReport utilizationReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); MonthlyReport report = new MonthlyReport(); report.setCreationDate(new Date()); @@ -181,9 +188,11 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { return m_reportService.insertMonthlyReport(report, binaryContent); } - @Override - public boolean buildWeeklyTask(String name, String domain, Date period) { - UtilizationReport utilizationReport = queryDailyReportsByDuration(domain, period, + @Override + public boolean buildWeeklyTask(String name, String domain, Date period) { + refreshSpringBeans(); + + UtilizationReport utilizationReport = queryDailyReportsByDuration(domain, period, new Date(period.getTime() + TimeHelper.ONE_WEEK)); WeeklyReport report = new WeeklyReport(); @@ -198,8 +207,10 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { return m_reportService.insertWeeklyReport(report, binaryContent); } - private UtilizationReport queryDailyReportsByDuration(String domain, Date start, Date end) { - long startTime = start.getTime(); + private UtilizationReport queryDailyReportsByDuration(String domain, Date start, Date end) { + refreshSpringBeans(); + + long startTime = start.getTime(); long endTime = end.getTime(); UtilizationReportMerger merger = new UtilizationReportMerger(new UtilizationReport(domain)); @@ -219,8 +230,10 @@ private UtilizationReport queryDailyReportsByDuration(String domain, Date start, return utilizationReport; } - private UtilizationReport queryHourlyReportsByDuration(String name, String domain, Date start, Date end) { - long startTime = start.getTime(); + private UtilizationReport queryHourlyReportsByDuration(String name, String domain, Date start, Date end) { + refreshSpringBeans(); + + long startTime = start.getTime(); long endTime = end.getTime(); UtilizationReportMerger merger = new UtilizationReportMerger(new UtilizationReport(domain)); @@ -239,7 +252,15 @@ private UtilizationReport queryHourlyReportsByDuration(String name, String domai } private boolean validataService(String projectName) { - return projectName.equalsIgnoreCase(ProjectInfo.ALL_SERVER) || projectName.equalsIgnoreCase("UnknownProject"); - } - -} + return projectName.equalsIgnoreCase(ProjectInfo.ALL_SERVER) || projectName.equalsIgnoreCase("UnknownProject"); + } + + private void refreshSpringBeans() { + ServerFilterConfigManager configManger = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + + if (configManger != null) { + m_configManger = configManger; + } + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java index 534f4ca519..8f427bf808 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java @@ -41,6 +41,7 @@ import com.dianping.cat.home.storage.entity.StorageGroup; import com.dianping.cat.home.storage.entity.StorageGroupConfig; import com.dianping.cat.home.storage.transform.DefaultSaxParser; +import com.dianping.cat.spring.CatSpringContext; @Named public class StorageGroupConfigManager implements Initializable { @@ -78,6 +79,8 @@ public StorageGroupConfig getConfig() { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + try { Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); String content = config.getContent(); @@ -171,6 +174,8 @@ public StorageGroup queryStorageGroup(String type) { private boolean storeConfig() { synchronized (this) { + refreshSpringBeans(); + try { Config config = m_configDao.createLocal(); @@ -240,4 +245,16 @@ public List getStorages() { return m_storages; } } + + private void refreshSpringBeans() { + ConfigRepository configDao = CatSpringContext.getBeanIfAvailable(ConfigRepository.class); + ContentFetcher fetcher = CatSpringContext.getBeanIfAvailable(ContentFetcher.class); + + if (configDao != null) { + m_configDao = configDao; + } + if (fetcher != null) { + m_fetcher = fetcher; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java index e93d936d92..13fff4e663 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java @@ -45,6 +45,7 @@ import com.dianping.cat.report.task.TaskHelper; import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask; import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = TransactionReportBuilder.ID) public class TransactionReportBuilder implements Initializable, TaskBuilder, LogEnabled { @@ -64,6 +65,8 @@ public class TransactionReportBuilder implements Initializable, TaskBuilder, Log @Override public boolean buildDailyTask(String name, String domain, Date period) { + refreshSpringBeans(); + try { Date end = TaskHelper.tomorrowZero(period); TransactionReport transactionReport = queryHourlyReportsByDuration(name, domain, period, end); @@ -92,6 +95,8 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { + refreshSpringBeans(); + Date end = null; if (period.equals(TimeHelper.getCurrentMonth())) { @@ -114,6 +119,8 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { + refreshSpringBeans(); + Date end = null; if (period.equals(TimeHelper.getCurrentWeek())) { @@ -143,6 +150,8 @@ public void enableLogging(Logger logger) { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + CurrentWeeklyMonthlyReportTask.getInstance().register(new CurrentWeeklyMonthlyTask() { @Override @@ -228,4 +237,17 @@ private TransactionReport queryHourlyReportsByDuration(String name, String domai return dailyreport; } + private void refreshSpringBeans() { + ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + AtomicMessageConfigManager atomicMessageConfigManager = CatSpringContext + .getBeanIfAvailable(AtomicMessageConfigManager.class); + + if (serverConfigManager != null) { + m_serverConfigManager = serverConfigManager; + } + if (atomicMessageConfigManager != null) { + m_atomicMessageConfigManager = atomicMessageConfigManager; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java index 16de4ebd7b..d47e13be7f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java @@ -34,6 +34,7 @@ import com.dianping.cat.core.mybatis.repository.task.TaskRepository; import com.dianping.cat.core.dal.TaskEntity; import com.dianping.cat.message.Transaction; +import com.dianping.cat.spring.CatSpringContext; @Named public class DefaultTaskConsumer extends TaskConsumer { @@ -46,6 +47,7 @@ public class DefaultTaskConsumer extends TaskConsumer { @Override protected Task findDoingTask(String ip) { + refreshSpringBeans(); Task task = null; try { task = m_taskDao.findByStatusConsumer(STATUS_DOING, ip, TaskEntity.READSET_FULL); @@ -56,6 +58,7 @@ protected Task findDoingTask(String ip) { @Override protected Task findTodoTask() { + refreshSpringBeans(); Task task = null; try { task = m_taskDao.findByStatusConsumer(STATUS_TODO, null, TaskEntity.READSET_FULL); @@ -108,6 +111,7 @@ protected void taskRetryDuration() { @Override protected boolean updateDoingToDone(Task doing) { + refreshSpringBeans(); doing.setStatus(STATUS_DONE); doing.setEndDate(new Date()); @@ -121,6 +125,7 @@ protected boolean updateDoingToDone(Task doing) { @Override protected boolean updateDoingToFailure(Task doing) { + refreshSpringBeans(); doing.setStatus(STATUS_FAIL); doing.setEndDate(new Date()); @@ -134,6 +139,7 @@ protected boolean updateDoingToFailure(Task doing) { @Override protected boolean updateTodoToDoing(Task todo) { + refreshSpringBeans(); todo.setStatus(STATUS_DOING); todo.setConsumer(NetworkInterfaceManager.INSTANCE.getLocalHostAddress()); todo.setStartDate(new Date()); @@ -145,4 +151,12 @@ protected boolean updateTodoToDoing(Task todo) { return false; } } + + private void refreshSpringBeans() { + TaskRepository taskDao = CatSpringContext.getBeanIfAvailable(TaskRepository.class); + + if (taskDao != null) { + m_taskDao = taskDao; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java index 46377a55f3..e044c8bad0 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java @@ -50,6 +50,7 @@ import com.dianping.cat.report.page.transaction.service.TransactionReportService; import com.dianping.cat.service.HostinfoService; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.spring.CatSpringContext; @Named public class ProjectUpdateTask implements Task, LogEnabled { @@ -99,6 +100,8 @@ private boolean checkIfValid(String source) { } public void deleteUnusedDomainInfo() { + refreshSpringBeans(); + try { List all = m_projectService.findAll(); Date start = TimeHelper.getCurrentDay(-30); @@ -321,6 +324,8 @@ private String queryProjectInfoFromCMDB(String url, String jsonName, String attr @Override public void run() { + refreshSpringBeans(); + // TODO // Transaction t1 = Cat.newTransaction("CMDB", "DeleteUnusedDomain"); // try { @@ -466,4 +471,16 @@ private void updateProjectInfo() { } } + private void refreshSpringBeans() { + HostinfoService hostinfoService = CatSpringContext.getBeanIfAvailable(HostinfoService.class); + ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + + if (hostinfoService != null) { + m_hostInfoService = hostinfoService; + } + if (projectService != null) { + m_projectService = projectService; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java index a7853ac1ab..968004e9d4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java @@ -33,6 +33,7 @@ import com.dianping.cat.core.dal.Project; import com.dianping.cat.report.task.TaskBuilder; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = CurrentReportBuilder.ID) public class CurrentReportBuilder implements TaskBuilder { @@ -47,6 +48,8 @@ public class CurrentReportBuilder implements TaskBuilder { @Override public boolean buildDailyTask(String name, String domain, Date period) { + refreshSpringBeans(); + CurrentWeeklyMonthlyReportTask reportTask = CurrentWeeklyMonthlyReportTask.getInstance(); try { @@ -82,4 +85,16 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { throw new RuntimeException("current weekly monthly report builder don't support weekly task"); } + private void refreshSpringBeans() { + ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + ServerFilterConfigManager serverFilterConfigManager = CatSpringContext + .getBeanIfAvailable(ServerFilterConfigManager.class); + + if (projectService != null) { + m_projectService = projectService; + } + if (serverFilterConfigManager != null) { + m_serverFilterConfigManager = serverFilterConfigManager; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java index bb269eadd1..44b1adb4c7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java @@ -29,6 +29,7 @@ import com.dianping.cat.core.dal.HourlyReportContent; import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.spring.CatSpringContext; public abstract class AbstractReportReloader implements ReportReloader { @@ -42,10 +43,13 @@ public abstract class AbstractReportReloader implements ReportReloader { protected ServerConfigManager m_serverConfigManager; protected int getAnalyzerCount() { + refreshSpringBeans(); return m_serverConfigManager.getThreadsOfRealtimeAnalyzer(getId()); } public boolean insertHourlyReport(ReportReloadEntity entity) { + refreshSpringBeans(); + try { HourlyReport report = entity.getReport(); m_hourlyReportDao.insert(report); @@ -66,6 +70,8 @@ public boolean insertHourlyReport(ReportReloadEntity entity) { @Override public boolean reload(long time) { + refreshSpringBeans(); + try { List reports = loadReport(time); @@ -78,4 +84,21 @@ public boolean reload(long time) { return true; } + private void refreshSpringBeans() { + HourlyReportRepository hourlyReportDao = CatSpringContext.getBeanIfAvailable(HourlyReportRepository.class); + HourlyReportContentRepository hourlyReportContentDao = CatSpringContext + .getBeanIfAvailable(HourlyReportContentRepository.class); + ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + + if (hourlyReportDao != null) { + m_hourlyReportDao = hourlyReportDao; + } + if (hourlyReportContentDao != null) { + m_hourlyReportContentDao = hourlyReportContentDao; + } + if (serverConfigManager != null) { + m_serverConfigManager = serverConfigManager; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java index 3d485116e0..2e975c33d4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java @@ -33,6 +33,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.ReportReloadConfigManager; import com.dianping.cat.helper.TimeHelper; +import com.dianping.cat.spring.CatSpringContext; @Named public class ReportReloadTask extends ContainerHolder implements Initializable, Task { @@ -51,6 +52,11 @@ public String getName() { @Override public void initialize() throws InitializationException { + ReportReloadConfigManager configManager = CatSpringContext.getBeanIfAvailable(ReportReloadConfigManager.class); + + if (configManager != null) { + m_configManager = configManager; + } m_reloaders = lookupMap(ReportReloader.class); } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java index b0118eff47..ec96dfc018 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java @@ -45,6 +45,7 @@ import com.dianping.cat.configuration.business.entity.CustomConfig; import com.dianping.cat.report.alert.business.BusinessRuleConfigManager; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.system.SystemPage; import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; import com.dianping.cat.system.page.config.ConfigHtmlParser; @@ -84,6 +85,8 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @PreInboundActionMeta("login") @OutboundActionMeta(name = "business") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + Model model = new Model(ctx); Payload payload = ctx.getPayload(); Action action = payload.getAction(); @@ -160,6 +163,18 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { } } + private void refreshSpringBeans() { + ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + BusinessConfigManager configManager = CatSpringContext.getBeanIfAvailable(BusinessConfigManager.class); + + if (projectService != null) { + m_projectService = projectService; + } + if (configManager != null) { + m_configManager = configManager; + } + } + private void alertRuleAddSubmit(Payload payload, Model model) { String domain = payload.getDomain(); String key = payload.getKey(); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java index ea0f07dc5d..c27ab219a5 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java @@ -38,6 +38,7 @@ import com.dianping.cat.home.business.entity.BusinessTagConfig; import com.dianping.cat.home.business.entity.Tag; import com.dianping.cat.home.business.transform.DefaultSaxParser; +import com.dianping.cat.spring.CatSpringContext; public class BusinessTagConfigManager implements Initializable { @@ -88,6 +89,8 @@ public BusinessTagConfig getConfig() { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + try { List result = m_configDao.findByName(TAG_CONFIG, BusinessConfigEntity.READSET_FULL); @@ -127,6 +130,8 @@ public boolean store(String xml) { private boolean storeConfig() { synchronized (this) { + refreshSpringBeans(); + try { BusinessConfig config = m_configDao.createLocal(); @@ -144,4 +149,12 @@ private boolean storeConfig() { return true; } + private void refreshSpringBeans() { + BusinessConfigRepository configDao = CatSpringContext.getBeanIfAvailable(BusinessConfigRepository.class); + + if (configDao != null) { + m_configDao = configDao; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java index d931152785..7a44dbefa0 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java @@ -44,6 +44,7 @@ import com.dianping.cat.system.page.config.processor.HeartbeatConfigProcessor; import com.dianping.cat.system.page.config.processor.StorageConfigProcessor; import com.dianping.cat.system.page.config.processor.TransactionConfigProcessor; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { @Inject @@ -88,6 +89,7 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @PreInboundActionMeta("login") @OutboundActionMeta(name = "config") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); Model model = new Model(ctx); Payload payload = ctx.getPayload(); @@ -177,6 +179,7 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { } public void store(String userName, String accountName, Payload payload) { + refreshSpringBeans(); ConfigModification modification = m_configModificationDao.createLocal(); modification.setUserName(userName); @@ -192,6 +195,15 @@ public void store(String userName, String accountName, Payload payload) { } } + private void refreshSpringBeans() { + ConfigModificationRepository configModificationDao = CatSpringContext + .getBeanIfAvailable(ConfigModificationRepository.class); + + if (configModificationDao != null) { + m_configModificationDao = configModificationDao; + } + } + private void storeModifyInfo(Context ctx, Payload payload) { Cookie cookie = ctx.getCookie("ct"); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java index 2e74d9abcd..c58bc4e6f2 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java @@ -44,6 +44,7 @@ import com.dianping.cat.system.page.config.Model; import com.dianping.cat.system.page.config.Payload; import com.dianping.cat.system.page.router.config.RouterConfigManager; +import com.dianping.cat.spring.CatSpringContext; public class GlobalConfigProcessor { @@ -90,6 +91,8 @@ private boolean deleteProject(Payload payload) { } public void process(Action action, Payload payload, Model model) { + refreshSpringBeans(); + switch (action) { case PROJECT_ALL: String domain = payload.getDomain(); @@ -212,6 +215,31 @@ public void process(Action action, Payload payload, Model model) { } } + private void refreshSpringBeans() { + ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + SampleConfigManager sampleConfigManager = CatSpringContext.getBeanIfAvailable(SampleConfigManager.class); + ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + ServerFilterConfigManager serverFilterConfigManager = CatSpringContext + .getBeanIfAvailable(ServerFilterConfigManager.class); + ReportReloadConfigManager reloadConfigManager = CatSpringContext.getBeanIfAvailable(ReportReloadConfigManager.class); + + if (projectService != null) { + m_projectService = projectService; + } + if (sampleConfigManager != null) { + m_sampleConfigManager = sampleConfigManager; + } + if (serverConfigManager != null) { + m_serverConfigManager = serverConfigManager; + } + if (serverFilterConfigManager != null) { + m_serverFilterConfigManager = serverFilterConfigManager; + } + if (reloadConfigManager != null) { + m_reloadConfigManager = reloadConfigManager; + } + } + public List queryAllProjects() { List projects = new ArrayList(); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java index b5c1bdfaad..249db6be87 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java @@ -35,6 +35,7 @@ import com.dianping.cat.home.resource.entity.Resource; import com.dianping.cat.home.resource.entity.ResourceConfig; import com.dianping.cat.home.resource.transform.DefaultSaxParser; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -89,6 +90,8 @@ public int getRole(String path, String op) { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + try { Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); String content = config.getContent(); @@ -144,6 +147,8 @@ public boolean insert(String xml) { } private void refreshConfig() throws Exception { + refreshSpringBeans(); + Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); long modifyTime = config.getModifyDate().getTime(); @@ -179,6 +184,8 @@ private void refreshData() { private boolean storeConfig() { synchronized (this) { + refreshSpringBeans(); + try { Config config = m_configDao.createLocal(); @@ -197,4 +204,16 @@ private boolean storeConfig() { return true; } + private void refreshSpringBeans() { + ConfigRepository configDao = CatSpringContext.getBeanIfAvailable(ConfigRepository.class); + ContentFetcher fetcher = CatSpringContext.getBeanIfAvailable(ContentFetcher.class); + + if (configDao != null) { + m_configDao = configDao; + } + if (fetcher != null) { + m_fetcher = fetcher; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java index f9a152c845..48dab1931f 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java @@ -32,6 +32,7 @@ import com.dianping.cat.home.user.entity.User; import com.dianping.cat.home.user.entity.UserConfig; import com.dianping.cat.home.user.transform.DefaultSaxParser; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -70,6 +71,8 @@ public int getRole(String user) { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + try { Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); String content = config.getContent(); @@ -113,6 +116,8 @@ public void handle() throws Exception { } private void refreshConfig() throws Exception { + refreshSpringBeans(); + Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); long modifyTime = config.getModifyDate().getTime(); @@ -139,6 +144,8 @@ public boolean insert(String xml) { private boolean storeConfig() { synchronized (this) { + refreshSpringBeans(); + try { Config config = m_configDao.createLocal(); @@ -155,4 +162,16 @@ private boolean storeConfig() { return true; } + private void refreshSpringBeans() { + ConfigRepository configDao = CatSpringContext.getBeanIfAvailable(ConfigRepository.class); + ContentFetcher fetcher = CatSpringContext.getBeanIfAvailable(ContentFetcher.class); + + if (configDao != null) { + m_configDao = configDao; + } + if (fetcher != null) { + m_fetcher = fetcher; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/project/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/project/Handler.java index 0839f05a62..11913abbcf 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/project/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/project/Handler.java @@ -35,6 +35,7 @@ import com.dianping.cat.core.dal.Project; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.system.SystemPage; public class Handler implements PageHandler { @@ -54,6 +55,8 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = "project") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + Model model = new Model(ctx); Payload payload = ctx.getPayload(); Action action = payload.getAction(); @@ -97,4 +100,12 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { m_jspViewer.view(ctx, model); } } + + private void refreshSpringBeans() { + ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + + if (projectService != null) { + m_projectService = projectService; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java index cac4599887..1b24e4d30e 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java @@ -45,6 +45,7 @@ import com.dianping.cat.system.page.router.config.RouterConfigManager; import com.dianping.cat.system.page.router.service.CachedRouterConfigService; import com.dianping.cat.system.page.router.task.RouterConfigBuilder; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { @@ -127,6 +128,8 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = "router") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + Model model = new Model(ctx); Payload payload = ctx.getPayload(); Action action = payload.getAction(); @@ -160,6 +163,18 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { ctx.getHttpServletResponse().getWriter().write(model.getContent()); } + private void refreshSpringBeans() { + SampleConfigManager sampleConfigManager = CatSpringContext.getBeanIfAvailable(SampleConfigManager.class); + ServerFilterConfigManager filterManager = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + + if (sampleConfigManager != null) { + m_sampleConfigManager = sampleConfigManager; + } + if (filterManager != null) { + m_filterManager = filterManager; + } + } + private Map buildKvs(RouterConfig report, String domain, String ip) { Map kvs = new HashMap(); @@ -171,4 +186,4 @@ private Map buildKvs(RouterConfig report, String domain, String return kvs; } -} \ No newline at end of file +} diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java index 7721affa7c..5624782702 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java @@ -50,6 +50,7 @@ import com.dianping.cat.home.router.transform.DefaultNativeBuilder; import com.dianping.cat.report.page.state.StateBuilder; import com.dianping.cat.report.page.state.service.StateReportService; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.system.page.router.service.RouterConfigService; import com.dianping.cat.system.page.router.task.RouterConfigBuilder; @@ -72,6 +73,8 @@ public class RouterConfigAdjustor { private DailyReportRepository m_dailyReportDao; public void Adjust(Date period) { + refreshSpringBeans(); + Date end = new Date(period.getTime() + TimeHelper.ONE_HOUR); RouterConfig routerConfig = m_routerService.queryLastReport(Constants.CAT); StateReport report = m_stateReportService.queryHourlyReport(Constants.CAT, period, end); @@ -275,6 +278,8 @@ private void updateRouterConfig(RouterConfig routerConfig, Map> getRouterConfigs() { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + try { Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); String content = config.getContent(); @@ -300,6 +303,8 @@ public List queryServersByDomain(String group, String domain) { } private void refreshConfigInfo() throws DalException, SAXException, IOException { + refreshSpringBeans(); + Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); long modifyTime = config.getModifyDate().getTime(); @@ -340,6 +345,8 @@ private void refreshNetInfo() { } private void refreshReportInfo() throws Exception { + refreshSpringBeans(); + Date period = TimeHelper.getCurrentDay(-1); long time = period.getTime(); @@ -379,6 +386,8 @@ public boolean shouldBlock(String ip) { private boolean storeConfig() { synchronized (this) { + refreshSpringBeans(); + try { Config config = m_configDao.createLocal(); @@ -419,4 +428,25 @@ public boolean validate(final RouterConfig routerConfig) { return true; } + + private void refreshSpringBeans() { + ConfigRepository configDao = CatSpringContext.getBeanIfAvailable(ConfigRepository.class); + ContentFetcher fetcher = CatSpringContext.getBeanIfAvailable(ContentFetcher.class); + DailyReportRepository dailyReportDao = CatSpringContext.getBeanIfAvailable(DailyReportRepository.class); + DailyReportContentRepository dailyReportContentDao = CatSpringContext + .getBeanIfAvailable(DailyReportContentRepository.class); + + if (configDao != null) { + m_configDao = configDao; + } + if (fetcher != null) { + m_fetcher = fetcher; + } + if (dailyReportDao != null) { + m_dailyReportDao = dailyReportDao; + } + if (dailyReportContentDao != null) { + m_dailyReportContentDao = dailyReportContentDao; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/task/RouterConfigBuilder.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/task/RouterConfigBuilder.java index 3dc2b1d42c..395e6a4a0e 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/task/RouterConfigBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/task/RouterConfigBuilder.java @@ -30,6 +30,7 @@ import com.dianping.cat.home.router.entity.RouterConfig; import com.dianping.cat.home.router.transform.DefaultNativeBuilder; import com.dianping.cat.report.task.TaskBuilder; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.system.page.router.config.RouterConfigAdjustor; import com.dianping.cat.system.page.router.config.RouterConfigHandler; import com.dianping.cat.system.page.router.service.RouterConfigService; @@ -53,6 +54,8 @@ public class RouterConfigBuilder implements TaskBuilder { @Override public boolean buildDailyTask(String name, String domain, Date period) { + refreshSpringBeans(); + RouterConfig routerConfig = m_routerConfigHandler.buildRouterConfig(domain, period); DailyReport dailyReport = new DailyReport(); @@ -70,6 +73,8 @@ public boolean buildDailyTask(String name, String domain, Date period) { @Override public boolean buildHourlyTask(String name, String domain, Date period) { + refreshSpringBeans(); + if (m_serverConfigManager.isRouterAdjustEnabled()) { m_routerAdjustor.Adjust(period); } @@ -86,4 +91,11 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { throw new RuntimeException("router builder doesn't support weekly task"); } + private void refreshSpringBeans() { + ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + + if (serverConfigManager != null) { + m_serverConfigManager = serverConfigManager; + } + } } diff --git a/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml b/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml index 29e9d9edda..2f7630de3d 100644 --- a/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml @@ -77,18 +77,18 @@ diff --git a/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml b/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml index b968d52911..e78cdbaad5 100644 --- a/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml @@ -64,6 +64,6 @@ - DELETE FROM metric_graph WHERE creation_date < #{record.creationDate} + DELETE FROM metric_graph WHERE creation_date < #{record.creationDate} diff --git a/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml b/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml index ba1139286e..1aa1a2ac1d 100644 --- a/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml @@ -77,7 +77,9 @@ - INSERT INTO metric_screen(id, name, graph_name, view, endPoints, measurements, content, creation_date, updatetime) VALUES() ON DUPLICATE KEY UPDATE view = #{record.view}, endPoints = #{record.endPoints}, measurements = #{record.measurements}, content = #{record.content} + INSERT INTO metric_screen(id, name, graph_name, view, endPoints, measurements, content, creation_date, updatetime) + VALUES(#{record.id}, #{record.name}, #{record.graphName}, #{record.view}, #{record.endPoints}, #{record.measurements}, #{record.content}, #{record.creationDate}, #{record.updatetime}) + ON DUPLICATE KEY UPDATE view = #{record.view}, endPoints = #{record.endPoints}, measurements = #{record.measurements}, content = #{record.content} diff --git a/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml b/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml index fc78724fb0..fa450297cc 100644 --- a/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml @@ -66,6 +66,6 @@ diff --git a/cat-home/src/main/webapp/WEB-INF/web.xml b/cat-home/src/main/webapp/WEB-INF/web.xml index 10254892de..519173e22e 100755 --- a/cat-home/src/main/webapp/WEB-INF/web.xml +++ b/cat-home/src/main/webapp/WEB-INF/web.xml @@ -2,6 +2,9 @@ + + com.dianping.cat.home.spring.CatHomeSpringContextListener + cat-filter com.dianping.cat.support.servlet.CatFilter diff --git a/pom.xml b/pom.xml index 90abb84de2..d441472e1a 100644 --- a/pom.xml +++ b/pom.xml @@ -188,6 +188,26 @@ mybatis ${mybatis.version} + + org.mybatis + mybatis-spring + ${mybatis-spring.version} + + + org.springframework + spring-context + ${spring-framework.version} + + + org.springframework + spring-jdbc + ${spring-framework.version} + + + org.springframework + spring-tx + ${spring-framework.version} + commons-codec commons-codec @@ -512,8 +532,10 @@ org.eclipse.jdt.core.compiler.compliance=21 1.5.34 2.0.62 3.5.19 + 4.0.0 1.18.46 4.0.2 + 7.0.3 9.0.112 false From 2b1eb1e20181ea63fe94464d9eafb39f6f983eee Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 9 Jun 2026 09:25:30 +0800 Subject: [PATCH 006/231] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...NG_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md | 162 +++++++++++- .../cat/alarm/service/AlertService.java | 8 + .../dianping/cat/alarm/spi/AlertManager.java | 37 ++- .../alarm/spi/config/AlertConfigManager.java | 23 ++ .../alarm/spi/config/AlertPolicyManager.java | 51 +++- .../alarm/spi/config/SenderConfigManager.java | 41 +++ .../alarm/spi/decorator/ProjectDecorator.java | 4 + .../alarm/spi/decorator/RuleFTLDecorator.java | 5 + .../spi/decorator/ServerRuleFTLDecorator.java | 5 + .../alarm/spi/rule/DefaultDataChecker.java | 5 + .../dianping/cat/alarm/spi/rule/RuleType.java | 6 + .../cat/alarm/spi/sender/AbstractSender.java | 25 ++ .../cat/alarm/spi/sender/MailSender.java | 6 + .../cat/alarm/spi/sender/SenderManager.java | 14 + .../cat/alarm/spi/sender/SmsSender.java | 6 + .../cat/alarm/spi/sender/WeixinSender.java | 6 + .../config/AtomicMessageConfigManager.java | 19 +- .../cat/config/ReportReloadConfigManager.java | 17 ++ .../business/BusinessConfigManager.java | 20 +- .../config/server/ServerConfigManager.java | 21 ++ .../SpringBackedRepositorySupport.java | 9 + .../dianping/cat/service/HostinfoService.java | 17 ++ .../com/dianping/cat/service/IpService.java | 21 +- .../dianping/cat/service/ProjectService.java | 19 ++ .../com/dianping/cat/task/TimerSyncTask.java | 15 ++ .../spring/CatHomeSpringConfiguration.java | 249 ++++++++++++++++++ .../spring/CatHomeSpringContextListener.java | 18 +- .../CatHomeSpringDataSourceFactory.java | 18 +- .../report/alert/business/BusinessAlert.java | 35 +++ .../business/BusinessRuleConfigManager.java | 13 + .../report/alert/config/BaseRuleHelper.java | 4 + .../cat/report/alert/event/EventAlert.java | 10 + .../report/alert/event/EventDecorator.java | 6 + .../alert/exception/ExceptionAlert.java | 10 + .../alert/exception/ExceptionDecorator.java | 8 + .../exception/ExceptionRuleConfigManager.java | 19 ++ .../alert/heartbeat/HeartbeatAlert.java | 11 + .../spi/config/BaseRuleConfigManager.java | 44 ++++ .../alert/summary/AlertSummaryExecutor.java | 7 + .../alert/summary/AlertSummaryService.java | 5 + .../alert/summary/build/AlertInfoBuilder.java | 11 + .../build/AlterationSummaryBuilder.java | 4 + .../summary/build/FailureSummaryBuilder.java | 7 + .../summary/build/RelatedSummaryBuilder.java | 8 +- .../alert/summary/build/SummaryBuilder.java | 7 + .../alert/transaction/TransactionAlert.java | 10 + .../transaction/TransactionDecorator.java | 6 + .../report/page/DomainGroupConfigManager.java | 25 ++ .../cat/report/page/alert/Handler.java | 16 ++ .../cat/report/page/alert/Payload.java | 7 + .../cat/report/page/alteration/Handler.java | 12 + .../cat/report/page/alteration/Payload.java | 7 + .../cat/report/page/business/Handler.java | 11 + .../business/graph/BusinessDataFetcher.java | 14 + .../business/graph/BusinessGraphCreator.java | 37 +++ .../business/graph/CustomDataCalculator.java | 4 + .../service/CachedBusinessReportService.java | 11 + .../service/HistoricalBusinessService.java | 11 + .../task/BusinessBaselineReportBuilder.java | 20 ++ .../cross/service/CrossReportService.java | 20 +- .../page/cross/task/CrossReportBuilder.java | 8 + .../config/TopoGraphFormatConfigManager.java | 8 + .../graph/TopologyGraphConfigManager.java | 8 + .../service/DependencyReportService.java | 10 +- .../task/DependencyReportBuilder.java | 9 + .../event/service/EventReportService.java | 23 +- .../page/event/task/EventReportBuilder.java | 8 + .../config/HeartbeatDisplayPolicyManager.java | 8 + .../service/HeartbeatReportService.java | 14 +- .../task/HeartbeatReportBuilder.java | 7 + .../cat/report/page/logview/Handler.java | 13 + .../service/HistoricalMessageService.java | 6 +- .../logview/service/LocalMessageService.java | 12 +- .../logview/service/RemoteLogViewService.java | 4 + .../matrix/service/MatrixReportService.java | 20 +- .../page/matrix/task/MatrixReportBuilder.java | 8 + .../cat/report/page/model/Handler.java | 6 + .../cat/report/page/overload/Handler.java | 6 + .../cat/report/page/overload/Payload.java | 6 + .../task/CapacityUpdateStatusManager.java | 15 ++ .../overload/task/CapacityUpdateTask.java | 20 ++ .../overload/task/DailyCapacityUpdater.java | 9 + .../overload/task/HourlyCapacityUpdater.java | 9 + .../overload/task/MonthlyCapacityUpdater.java | 9 + .../overload/task/TableCapacityService.java | 8 + .../overload/task/WeeklyCapacityUpdater.java | 9 + .../problem/service/ProblemReportService.java | 20 +- .../problem/task/ProblemReportBuilder.java | 8 + .../state/service/StateReportService.java | 20 +- .../page/state/task/StateReportBuilder.java | 13 + .../service/ClientReportService.java | 6 +- .../service/HeavyReportService.java | 20 +- .../statistics/service/JarReportService.java | 7 + .../service/ServiceReportService.java | 20 +- .../service/UtilizationReportService.java | 20 +- .../task/heavy/HeavyReportBuilder.java | 9 + .../statistics/task/jar/JarReportBuilder.java | 5 + .../task/service/ClientReportBuilder.java | 6 + .../task/service/ServiceReportBuilder.java | 47 ++-- .../utilization/UtilizationReportBuilder.java | 41 +-- .../cat/report/page/storage/Handler.java | 6 + .../config/StorageGroupConfigManager.java | 8 + .../storage/task/StorageReportBuilder.java | 10 + .../storage/task/StorageReportService.java | 19 +- .../dianping/cat/report/page/top/Handler.java | 9 + .../page/top/service/TopReportService.java | 10 +- .../service/TransactionReportService.java | 22 +- .../task/TransactionReportBuilder.java | 8 + .../cat/report/task/DefaultTaskConsumer.java | 17 ++ .../cat/report/task/ReportFacade.java | 90 ++++--- .../cat/report/task/TaskConsumer.java | 22 +- .../task/current/CurrentReportBuilder.java | 7 + .../CurrentWeeklyMonthlyReportTask.java | 22 +- .../task/reload/AbstractReportReloader.java | 11 + .../report/task/reload/ReportReloadTask.java | 10 + .../com/dianping/cat/servlet/CatServlet.java | 40 +-- .../cat/system/page/business/Handler.java | 12 + .../config/BusinessTagConfigManager.java | 17 ++ .../processor/AlertConfigProcessor.java | 19 ++ .../page/config/processor/BaseProcesser.java | 3 + .../processor/DependencyConfigProcessor.java | 28 ++ .../processor/EventConfigProcessor.java | 14 + .../processor/ExceptionConfigProcessor.java | 19 ++ .../processor/GlobalConfigProcessor.java | 23 +- .../processor/HeartbeatConfigProcessor.java | 24 ++ .../processor/StorageConfigProcessor.java | 1 + .../processor/TransactionConfigProcessor.java | 14 + .../cat/system/page/login/Handler.java | 11 + .../page/login/service/SessionManager.java | 7 + .../page/login/service/TokenBuilder.java | 69 ++--- .../cat/system/page/permission/Handler.java | 15 ++ .../page/permission/PermissionFilter.java | 15 ++ .../permission/ResourceConfigManager.java | 29 ++ .../page/permission/UserConfigManager.java | 25 ++ .../cat/system/page/project/Handler.java | 8 + .../cat/system/page/router/Handler.java | 4 + .../router/config/RouterConfigHandler.java | 9 + .../router/config/RouterConfigManager.java | 40 ++- .../router/service/RouterConfigService.java | 6 + 139 files changed, 2289 insertions(+), 206 deletions(-) diff --git a/SPRING_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md b/SPRING_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md index f338bd472e..949db6ec32 100644 --- a/SPRING_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md +++ b/SPRING_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md @@ -26,6 +26,46 @@ D:\workspace\cat ## 2. 当前可运行状态 +### 2.1 最新进度快照(本节优先) + +截至 2026-06-07 最近一轮迁移,配置页 Processor 的 Spring 依赖刷新和一批配置 Manager 的 Spring 注册已经完成,并通过编译、打包、临时启动和多条配置页 URL 验证。 + +本节是最新状态摘要;如果后文旧计划与本节冲突,以本节为准。 + +已完成的最新迁移点: + +1. `CatHomeSpringConfiguration` 继续扩展,新增注册了 `ConfigHtmlParser`、`RouterConfigManager`、`DomainGroupConfigManager`、`StorageGroupConfigManager`、`TopologyGraphConfigManager`、`TopoGraphFormatConfigManager`、`HeartbeatDisplayPolicyManager`、`ExceptionRuleConfigManager`、`AlertConfigManager`、`AlertPolicyManager`、`BaseRuleHelper`、`TransactionRuleConfigManager`、`EventRuleConfigManager`、`HeartbeatRuleConfigManager`。 +2. 多个配置 Manager 已补 setter,使 Spring 初始化不再依赖 `CatSpringContext` 在 `context.refresh()` 过程中已经可用。 +3. 配置页 Processor 已增加执行前刷新 Spring 依赖的逻辑,但 Processor 本体仍由 Plexus 创建。 +4. `TimerSyncTask.register` 已按 handler name 去重,避免 Plexus 和 Spring 双实例初始化时重复注册同名同步 handler。 +5. 最新一次启动日志显示 Spring Home 侧 `beanCount=90`。 + +当前工作树中,本轮迁移相关 Java 文件仍处于未提交修改状态。不要回滚这些改动,下一次继续前先用 `git status --short` 确认: + +```text +cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java +cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java +cat-core/src/main/java/com/dianping/cat/task/TimerSyncTask.java +cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java +cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java +cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java +cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java +cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java +cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java +cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/AlertConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/BaseProcesser.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/DependencyConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/EventConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/ExceptionConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/HeartbeatConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/StorageConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/config/processor/TransactionConfigProcessor.java +cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java +``` + 截至本交接文档编写时,用户已经多次确认项目可以正常启动和访问,最近一次用户反馈是: ```text @@ -196,12 +236,26 @@ BaselineService RemoteServersManager DomainValidator ServerStatisticManager +ConfigHtmlParser +RouterConfigManager +DomainGroupConfigManager +StorageGroupConfigManager +TopologyGraphConfigManager +TopoGraphFormatConfigManager +HeartbeatDisplayPolicyManager +ExceptionRuleConfigManager +AlertConfigManager +AlertPolicyManager +BaseRuleHelper +TransactionRuleConfigManager +EventRuleConfigManager +HeartbeatRuleConfigManager ``` 最近一次启动验证看到 Spring Home 侧 Bean 数量约为: ```text -beanCount=76 +beanCount=90 ``` ### 3.6 Repository 和 Service 桥接 @@ -277,6 +331,27 @@ http://127.0.0.1:18080/cat/s/config http://127.0.0.1:18080/cat/s/router?op=json&domain=cat&ip=127.0.0.1 ``` +最近一轮已经额外验证过的配置页和路由入口: + +```text +http://127.0.0.1:18080/cat/s/config?op=routerConfigUpdate +http://127.0.0.1:18080/cat/s/config?op=domainGroupConfigs +http://127.0.0.1:18080/cat/s/config?op=storageGroupConfigUpdate +http://127.0.0.1:18080/cat/s/config?op=serverConfigUpdate +http://127.0.0.1:18080/cat/s/config?op=sampleConfigUpdate +http://127.0.0.1:18080/cat/s/config?op=topologyGraphNodeConfigList +http://127.0.0.1:18080/cat/s/config?op=topologyGraphEdgeConfigList +http://127.0.0.1:18080/cat/s/config?op=topoGraphFormatConfigUpdate +http://127.0.0.1:18080/cat/s/config?op=heartbeatDisplayPolicy +http://127.0.0.1:18080/cat/s/config?op=heartbeatRuleConfigList +http://127.0.0.1:18080/cat/s/config?op=exception +http://127.0.0.1:18080/cat/s/config?op=alertPolicy +http://127.0.0.1:18080/cat/s/config?op=alertDefaultReceivers +http://127.0.0.1:18080/cat/s/config?op=transactionRule +http://127.0.0.1:18080/cat/s/config?op=eventRule +http://127.0.0.1:18080/cat/s/router?op=json&domain=cat&ip=127.0.0.1 +``` + 可暂时忽略的日志: ```text @@ -293,6 +368,14 @@ Logback Missing watchable .xml... ## 5. 当前正在推进但尚未完成的工作 +最新状态: + +```text +配置页 Processor Spring 依赖刷新已经完成并验证。 +``` + +本节下面保留的是迁移背景和当时的推进思路。下一次继续时不要再把“补 ConfigHtmlParser Spring Bean”或“给 Processor 增加 refreshSpringBeans()”当作未完成任务;这些已经完成。真正的下一步见文末“最新下一步计划”。 + 当前最近一轮准备推进的是: ```text @@ -393,6 +476,8 @@ RuleFTLDecorator(来自 BaseProcesser) ## 6. 配置 Processor 迁移的推荐下一步 +注意:本节是配置 Processor 迁移前写下的推荐顺序,其中 6.2 和 6.3 已经执行完成。下一次继续请以文末“最新下一步计划”为准。 + 下一次建议按下面顺序执行。 ### 6.1 不直接切换为 Spring 新建 Processor @@ -644,4 +729,77 @@ rg -n "DataSourceManager|MyBatisRepositorySupport" cat-core/src/main/java cat-ho rg -n "refreshSpringBeans|class .*ConfigProcessor|class BaseProcesser" cat-home/src/main/java/com/dianping/cat/system/page/config/processor cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java ``` -然后继续执行第 6 节的配置 Processor Spring 桥接计划。 +然后以第 11 节的最新下一步计划为准继续推进。 + +## 11. 最新下一步计划(2026-06-07 更新) + +最终目标仍然是: + +```text +移除 Plexus / Unidal Lookup,使用 Spring 管理所有 Bean。 +``` + +当前已经完成到“配置页 Processor 执行前刷新 Spring 依赖 + 多个配置 Manager 注册为 Spring Bean”这一阶段。下一步不要急着删除 Plexus,也不要直接把 Handler 或 Processor 本体整体切到 Spring;应该继续扩大低风险 Bean 的 Spring 管理范围,并持续验证。 + +推荐下一步顺序: + +1. 先检查当前未提交改动和编译状态: + +```powershell +git status --short +mvn -pl cat-home -am compile -DskipTests +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +``` + +2. 继续挑选低风险 Manager 注册到 Spring,优先看业务规则和业务告警相关对象,例如: + +```text +BusinessRuleConfigManager +业务告警相关 ConfigManager / PolicyManager +只依赖 ConfigRepository、ContentFetcher、BaseRuleHelper、UserDefinedRuleManager 的 Manager +``` + +迁移方式沿用本轮做法: + +```text +先补 setter -> 在 CatHomeSpringConfiguration 注册 Bean -> Plexus 旧对象执行前 refreshSpringBeans() -> 编译/打包/启动/HTTP 验证。 +``` + +3. 暂缓把 `RuleFTLDecorator` 和配置 Processor 本体 Spring 化。`RuleFTLDecorator` 涉及模板装饰器和旧 components 注入,建议等更多 Manager 都稳定由 Spring 管理后再处理。 + +4. 后台任务迁移前先继续观察 `TimerSyncTask`。本轮已经给 `TimerSyncTask.register` 增加同名 handler 去重,但任务类后续 Spring 化时仍必须确认没有双容器重复启动。 + +5. 当配置 Manager 和后台任务基本稳定后,再迁移 Web 层: + +```text +Unidal Handler 暂时保留请求分发。 +等依赖都可从 Spring 获取后,再逐步用 Spring MVC Controller 替换低风险页面。 +``` + +最近一轮已通过的验证结果: + +```text +mvn -pl cat-home -am compile -DskipTests BUILD SUCCESS +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" BUILD SUCCESS +临时启动 cat-boot,端口 18080 / TCP 12280 OK +Spring Home beanCount 90 +多条 /cat/s/config 和 /cat/s/router URL HTTP 200 +``` + +可接受的已知日志: + +```text +Logback Missing watchable .xml +Maven shade overlap warnings +deprecated API warnings +``` + +不可忽略的日志: + +```text +NullPointerException +UnsatisfiedDependencyException +NoSuchBeanDefinitionException +Address already in use +同一个任务或 SyncHandler 重复启动导致的重复执行 +``` diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java index 865b485db9..438e6bf913 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java @@ -26,6 +26,8 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.alarm.Alert; @@ -35,6 +37,7 @@ @Named public class AlertService { + private static final Logger LOGGER = LoggerFactory.getLogger(AlertService.class); @Inject private AlertRepository m_alertDao; @@ -61,6 +64,7 @@ public List query(Date start, Date end, String type) { } catch (DalNotFoundException e) { // ignore } catch (Exception e) { + LOGGER.error("Unable to query alerts, start={}, end={}, type={}.", start, end, type, e); Cat.logError(e); } @@ -74,9 +78,13 @@ public void insert(AlertEntity alertEntity, SendMessageEntity message) { int count = m_alertDao.insert(alert); if (count != 1) { + LOGGER.error("Unexpected alert insert count, count={}, domain={}, category={}, metric={}.", count, + alert.getDomain(), alert.getCategory(), alert.getMetric()); Cat.logError("insert alert error: " + alert.toString(), new RuntimeException()); } } catch (DalException e) { + LOGGER.error("Unable to insert alert, domain={}, type={}, metric={}.", alertEntity.getDomain(), + alertEntity.getType().getName(), alertEntity.getMetric(), e); Cat.logError(e); } } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/AlertManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/AlertManager.java index 6b4ec81784..7add6e70dc 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/AlertManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/AlertManager.java @@ -31,6 +31,8 @@ import com.dianping.cat.message.Event; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.helper.Threads; import org.unidal.helper.Threads.Task; import org.unidal.lookup.annotation.Inject; @@ -49,6 +51,7 @@ @Named public class AlertManager implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(AlertManager.class); private static final int MILLIS1MINUTE = 60 * 1000; @@ -88,14 +91,23 @@ public boolean addAlert(AlertEntity entity) { Cat.logEvent("Alert:" + entity.getType().getName(), group, Event.SUCCESS, entity.toString()); if (m_configManager.isAlertMachine()) { - return m_alerts.offer(entity); + boolean offered = m_alerts.offer(entity); + + if (!offered) { + LOGGER.warn("Alert queue is full, alert is dropped, type={}, group={}, metric={}, key={}.", + entity.getType().getName(), group, entity.getMetric(), entity.getKey()); + } + return offered; } else { + LOGGER.info("Current machine is not configured as alert machine, skip queueing alert, type={}, group={}, key={}.", + entity.getType().getName(), group, entity.getKey()); return true; } } @Override public void initialize() throws InitializationException { + LOGGER.info("Initializing alert manager executors."); Threads.forGroup("Cat").start(new SendExecutor()); Threads.forGroup("Cat").start(new RecoveryAnnouncer()); } @@ -107,6 +119,8 @@ public boolean isSuspend(String alertKey, int suspendMinute) { long duration = System.currentTimeMillis() - sendedAlert.getDate().getTime(); if (duration / MILLIS1MINUTE < suspendMinute) { + LOGGER.info("Alert is suspended, key={}, suspendMinute={}, elapsedMinute={}.", alertKey, suspendMinute, + duration / MILLIS1MINUTE); Cat.logEvent("SuspendAlert", alertKey, Event.SUCCESS, null); return true; } @@ -178,8 +192,15 @@ private boolean send(AlertEntity alert) { if (m_senderManager.sendAlert(channel, message)) { result = true; + LOGGER.info("Sent alert message, type={}, group={}, level={}, channel={}, receivers={}.", type, + group, level, channel, receivers.size()); + } else { + LOGGER.warn("Alert sender returned false, type={}, group={}, level={}, channel={}, receivers={}.", + type, group, level, channel, receivers.size()); } } else { + LOGGER.warn("No alert receiver found, type={}, group={}, contactGroup={}, channel={}.", type, group, + contactGroup, channel); Cat.logEvent("NoneReceiver:" + channel, type + ":" + contactGroup, Event.SUCCESS, null); } } @@ -212,8 +233,16 @@ private boolean sendRecoveryMessage(AlertEntity alert, String currentMinute) { SendMessageEntity message = new SendMessageEntity(group, title, type, content, receivers); if (m_senderManager.sendAlert(channel, message)) { + LOGGER.info("Sent alert recovery message, type={}, group={}, level={}, channel={}, receivers={}.", + type, group, level, channel, receivers.size()); return true; + } else { + LOGGER.warn("Alert recovery sender returned false, type={}, group={}, level={}, channel={}, receivers={}.", + type, group, level, channel, receivers.size()); } + } else { + LOGGER.warn("No alert recovery receiver found, type={}, group={}, contactGroup={}, channel={}.", type, + group, alert.getContactGroup(), channel); } } @@ -257,6 +286,7 @@ public void run() { sendRecoveryMessage(alert, currentStr); } } catch (Exception e) { + LOGGER.error("Unable to announce alert recovery, key={}.", entry.getKey(), e); Cat.logError(e); } } @@ -272,7 +302,10 @@ public void run() { try { TimeUnit.MILLISECONDS.sleep(lackMills); } catch (InterruptedException e) { + LOGGER.warn("Alert recovery announcer interrupted."); + Thread.currentThread().interrupt(); Cat.logError(e); + break; } } } @@ -299,8 +332,8 @@ public void run() { send(alert); } } catch (Exception e) { + LOGGER.error("Unable to process alert from queue.", e); Cat.logError(e); - e.printStackTrace(); } } } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java index c8643d1a08..5c57f2b97a 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java @@ -20,6 +20,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -36,6 +38,7 @@ @Named public class AlertConfigManager implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(AlertConfigManager.class); private static final String CONFIG_NAME = "alertConfig"; @@ -49,6 +52,14 @@ public class AlertConfigManager implements Initializable { private AlertConfig m_config; + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + public String buildReceiverContentByOnOff(String originXml, String allOnOrOff) { try { if (StringUtils.isEmpty(allOnOrOff)) { @@ -65,6 +76,7 @@ public String buildReceiverContentByOnOff(String originXml, String allOnOrOff) { return tmpConfig.toString(); } catch (Exception e) { + LOGGER.error("Unable to build alert receiver config by onOff={}.", allOnOrOff, e); Cat.logError(e); return null; } @@ -82,7 +94,10 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); + LOGGER.info("Loaded alert config from repository, configId={}.", m_configId); } catch (DalNotFoundException e) { + LOGGER.warn("Alert config is missing in repository, loading default content from fetcher.", e); + try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -93,14 +108,18 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); + LOGGER.info("Initialized alert config from default content, configId={}.", m_configId); } catch (Exception ex) { + LOGGER.error("Unable to initialize alert config from default content.", ex); Cat.logError(ex); } } catch (Exception e) { + LOGGER.error("Unable to load alert config from repository.", e); Cat.logError(e); } if (m_config == null) { m_config = new AlertConfig(); + LOGGER.warn("Alert config is empty after initialization, using a new empty config."); } } @@ -110,6 +129,7 @@ public boolean insert(String xml) { return storeConfig(); } catch (Exception e) { + LOGGER.error("Unable to parse alert config xml for insert. xmlLength={}.", xml == null ? 0 : xml.length(), e); Cat.logError(e); return false; } @@ -129,7 +149,10 @@ private boolean storeConfig() { config.setName(CONFIG_NAME); config.setContent(m_config.toString()); m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + LOGGER.info("Stored alert config, configId={}, receiverCount={}.", m_configId, + m_config.getReceivers().size()); } catch (Exception e) { + LOGGER.error("Unable to store alert config, configId={}.", m_configId, e); Cat.logError(e); return false; } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java index 4b49b3b3e7..035fe192cc 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java @@ -23,6 +23,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -41,6 +43,7 @@ @Named public class AlertPolicyManager implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(AlertPolicyManager.class); private static final String CONFIG_NAME = "alertPolicy"; @@ -58,6 +61,14 @@ public class AlertPolicyManager implements Initializable { private AlertPolicy m_config; + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + public AlertPolicy getAlertPolicy() { return m_config; } @@ -70,7 +81,10 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); + LOGGER.info("Loaded alert policy from repository, configId={}.", m_configId); } catch (DalNotFoundException e) { + LOGGER.warn("Alert policy is missing in repository, loading default content from fetcher.", e); + try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -81,14 +95,18 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); + LOGGER.info("Initialized alert policy from default content, configId={}.", m_configId); } catch (Exception ex) { + LOGGER.error("Unable to initialize alert policy from default content.", ex); Cat.logError(ex); } } catch (Exception e) { + LOGGER.error("Unable to load alert policy from repository.", e); Cat.logError(e); } if (m_config == null) { m_config = new AlertPolicy(); + LOGGER.warn("Alert policy is empty after initialization, using a new empty policy."); } } @@ -98,6 +116,7 @@ public boolean insert(String xml) { return storeConfig(); } catch (Exception e) { + LOGGER.error("Unable to parse alert policy xml for insert. xmlLength={}.", xml == null ? 0 : xml.length(), e); Cat.logError(e); return false; } @@ -121,12 +140,14 @@ public List queryChannels(String typeName, String groupName, Strin } } - return channels; - } - } catch (Exception ex) { - return new ArrayList(); + return channels; } + } catch (Exception ex) { + LOGGER.warn("Unable to query alert channels, type={}, group={}, level={}; returning empty channels.", typeName, + groupName, levelName, ex); + return new ArrayList(); } +} private Level queryLevel(String typeName, String groupName, String levelName) { Type type = m_config.findType(typeName); @@ -151,12 +172,14 @@ public int queryRecoverMinute(String typeName, String groupName, String levelNam if (level == null) { return 1; } else { - return level.getRecoverMinute(); - } - } catch (Exception ex) { - return 1; + return level.getRecoverMinute(); } + } catch (Exception ex) { + LOGGER.warn("Unable to query alert recover minute, type={}, group={}, level={}; returning default value 1.", + typeName, groupName, levelName, ex); + return 1; } +} public int querySuspendMinute(String typeName, String groupName, String levelName) { try { @@ -165,12 +188,14 @@ public int querySuspendMinute(String typeName, String groupName, String levelNam if (level == null) { return 0; } else { - return level.getSuspendMinute(); - } - } catch (Exception ex) { - return 0; + return level.getSuspendMinute(); } + } catch (Exception ex) { + LOGGER.warn("Unable to query alert suspend minute, type={}, group={}, level={}; returning default value 0.", + typeName, groupName, levelName, ex); + return 0; } +} private boolean storeConfig() { synchronized (this) { @@ -182,7 +207,9 @@ private boolean storeConfig() { config.setName(CONFIG_NAME); config.setContent(m_config.toString()); m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + LOGGER.info("Stored alert policy, configId={}, typeCount={}.", m_configId, m_config.getTypes().size()); } catch (Exception e) { + LOGGER.error("Unable to store alert policy, configId={}.", m_configId, e); Cat.logError(e); return false; } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java index f54cb965fc..6c101734cc 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java @@ -22,6 +22,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -35,9 +37,11 @@ import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; +import com.dianping.cat.spring.CatSpringContext; @Named public class SenderConfigManager implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(SenderConfigManager.class); private static final String CONFIG_NAME = "senderConfig"; @@ -51,19 +55,32 @@ public class SenderConfigManager implements Initializable { private SenderConfig m_senderConfig; + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + public SenderConfig getConfig() { return m_senderConfig; } @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + try { Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); String content = config.getContent(); m_senderConfig = DefaultSaxParser.parse(content); m_configId = config.getId(); + LOGGER.info("Loaded sender config from repository, configId={}.", m_configId); } catch (DalNotFoundException e) { + LOGGER.warn("Sender config is missing in repository, loading default content from fetcher.", e); + try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -74,14 +91,18 @@ public void initialize() throws InitializationException { m_senderConfig = DefaultSaxParser.parse(content); m_configId = config.getId(); + LOGGER.info("Initialized sender config from default content, configId={}.", m_configId); } catch (Exception ex) { + LOGGER.error("Unable to initialize sender config from default content.", ex); Cat.logError(ex); } } catch (Exception e) { + LOGGER.error("Unable to load sender config from repository.", e); Cat.logError(e); } if (m_senderConfig == null) { m_senderConfig = new SenderConfig(); + LOGGER.warn("Sender config is empty after initialization, using a new empty config."); } } @@ -97,6 +118,7 @@ public boolean insert(String xml) { return storeConfig(); } catch (Exception e) { + LOGGER.error("Unable to parse sender config xml for insert. xmlLength={}.", xml == null ? 0 : xml.length(), e); Cat.logError(e); return false; } @@ -142,6 +164,8 @@ public boolean remove(String id) { private boolean storeConfig() { synchronized (this) { + refreshSpringBeans(); + try { Config config = m_configDao.createLocal(); @@ -150,11 +174,28 @@ private boolean storeConfig() { config.setName(CONFIG_NAME); config.setContent(m_senderConfig.toString()); m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + LOGGER.info("Stored sender config, configId={}, senderCount={}.", m_configId, + m_senderConfig.getSenders().size()); } catch (Exception e) { + LOGGER.error("Unable to store sender config, configId={}.", m_configId, e); Cat.logError(e); return false; } } return true; } + + private void refreshSpringBeans() { + ConfigRepository configDao = CatSpringContext.getBeanIfAvailable(ConfigRepository.class); + ContentFetcher fetcher = CatSpringContext.getBeanIfAvailable(ContentFetcher.class); + + if (configDao != null) { + m_configDao = configDao; + LOGGER.info("SenderConfigManager refreshed Spring ConfigRepository dependency."); + } + if (fetcher != null) { + m_fetcher = fetcher; + LOGGER.info("SenderConfigManager refreshed Spring ContentFetcher dependency."); + } + } } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java index 8e1ef8e187..32f5437c6b 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java @@ -20,12 +20,15 @@ import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.Project; import com.dianping.cat.service.ProjectService; public abstract class ProjectDecorator extends Decorator { + private static final Logger LOGGER = LoggerFactory.getLogger(ProjectDecorator.class); @Inject protected ProjectService m_projectService; @@ -49,6 +52,7 @@ public String buildContactInfo(String domainName) { return builder.toString(); } } catch (Exception ex) { + LOGGER.error("Unable to build project contact info, domain={}.", domainName, ex); Cat.logError("build project contact info error for domain: " + domainName, ex); } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/RuleFTLDecorator.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/RuleFTLDecorator.java index 96cb114165..c8f454a65f 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/RuleFTLDecorator.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/RuleFTLDecorator.java @@ -26,10 +26,13 @@ import freemarker.template.Template; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; public class RuleFTLDecorator implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(RuleFTLDecorator.class); public Configuration m_configuration; @@ -42,6 +45,7 @@ public String generateConfigsHtml(String templateValue) { Template configsTemplate = m_configuration.getTemplate("rule_configs.ftl"); configsTemplate.process(dataMap, sw); } catch (Exception e) { + LOGGER.error("Unable to render alert rule config html, template=rule_configs.ftl.", e); Cat.logError(e); } return sw.toString(); @@ -54,6 +58,7 @@ public void initialize() throws InitializationException { try { m_configuration.setClassForTemplateLoading(this.getClass(), "/freemaker"); } catch (Exception e) { + LOGGER.error("Unable to initialize alert rule FTL decorator template loading.", e); Cat.logError(e); } } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ServerRuleFTLDecorator.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ServerRuleFTLDecorator.java index 1dce71cdcf..127c14e973 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ServerRuleFTLDecorator.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ServerRuleFTLDecorator.java @@ -26,10 +26,13 @@ import freemarker.template.Template; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; public class ServerRuleFTLDecorator implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(ServerRuleFTLDecorator.class); public Configuration m_configuration; @@ -42,6 +45,7 @@ public String generateConfigsHtml(String templateValue) { Template configsTemplate = m_configuration.getTemplate("server_rule_configs.ftl"); configsTemplate.process(dataMap, sw); } catch (Exception e) { + LOGGER.error("Unable to render server alert rule config html, template=server_rule_configs.ftl.", e); Cat.logError(e); } return sw.toString(); @@ -54,6 +58,7 @@ public void initialize() throws InitializationException { try { m_configuration.setClassForTemplateLoading(this.getClass(), "/freemaker"); } catch (Exception e) { + LOGGER.error("Unable to initialize server alert rule FTL decorator template loading.", e); Cat.logError(e); } } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/DefaultDataChecker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/DefaultDataChecker.java index abe27c90ea..bd2205d767 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/DefaultDataChecker.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/DefaultDataChecker.java @@ -21,6 +21,8 @@ import com.dianping.cat.Cat; import com.dianping.cat.alarm.rule.entity.Condition; import com.dianping.cat.alarm.rule.entity.SubCondition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; @@ -29,6 +31,7 @@ @Named(type = DataChecker.class) public class DefaultDataChecker implements DataChecker { + private static final Logger LOGGER = LoggerFactory.getLogger(DefaultDataChecker.class); private double[] buildLastMinutesDoubleArray(double[] doubleList, int remainCount) { if (doubleList.length <= remainCount) { @@ -96,6 +99,8 @@ private Pair checkDataByCondition(double[] value, double[] base } builder.append(subResult.getValue()).append("
"); } catch (Exception ex) { + LOGGER.error("Unable to check alert rule condition, condition={}, subCondition={}.", condition, + subCondition, ex); Cat.logError(condition.toString(), ex); return new Pair(false, ""); } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/RuleType.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/RuleType.java index 669f07efd7..649bbe1114 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/RuleType.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/RuleType.java @@ -19,6 +19,8 @@ package com.dianping.cat.alarm.spi.rule; import com.dianping.cat.Cat; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.tuple.Pair; import javax.tools.JavaCompiler; @@ -491,6 +493,8 @@ public Pair executeRule(double[] values, double[] baselines, St m_rules.put(rawValue, instance); } catch (Exception e) { + LOGGER.error("Unable to generate user defined alert rule, rawValueLength={}.", + rawValue == null ? 0 : rawValue.length(), e); Cat.logError("generate user defined rule error: " + rawValue, e); return new Pair(false, ""); } @@ -524,6 +528,8 @@ public String getId() { } }; + private static final Logger LOGGER = LoggerFactory.getLogger(RuleType.class); + protected static final long MbS = 60 * 1024 * 1024; protected static final long GbS = MbS * 1024; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java index 665c2540fc..fe2b1c9ede 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java @@ -26,13 +26,16 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; +import org.slf4j.LoggerFactory; import org.unidal.helper.Files; import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.alarm.spi.config.SenderConfigManager; +import com.dianping.cat.spring.CatSpringContext; public abstract class AbstractSender implements Sender, LogEnabled { + private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(AbstractSender.class); @Inject protected SenderConfigManager m_senderConfigManager; @@ -65,9 +68,12 @@ private boolean httpGetSend(String successCode, String urlPrefix, String urlPars sendSuccess = true; return true; } else { + LOGGER.warn("Alert HTTP GET returned unexpected response, urlPrefix={}, successCode={}, response={}.", + urlPrefix, successCode, sb); return false; } } catch (Exception e) { + LOGGER.error("Unable to send alert by HTTP GET, urlPrefix={}, urlPars={}.", urlPrefix, urlPars, e); m_logger.error(e.getMessage(), e); return false; } finally { @@ -76,6 +82,7 @@ private boolean httpGetSend(String successCode, String urlPrefix, String urlPars in.close(); } } catch (IOException e) { + LOGGER.warn("Unable to close alert HTTP GET response stream, urlPrefix={}.", urlPrefix, e); } if (!sendSuccess) { recordSendLog(urlPrefix, urlPars); @@ -112,9 +119,13 @@ private boolean httpPostSend(String successCode, String urlPrefix, String conten sendSuccess = true; return true; } else { + LOGGER.warn("Alert HTTP POST returned unexpected response, urlPrefix={}, successCode={}, response={}.", + urlPrefix, successCode, sb); return false; } } catch (Exception e) { + LOGGER.error("Unable to send alert by HTTP POST, urlPrefix={}, contentLength={}.", urlPrefix, + content == null ? 0 : content.length(), e); m_logger.error(e.getMessage(), e); return false; } finally { @@ -126,6 +137,7 @@ private boolean httpPostSend(String successCode, String urlPrefix, String conten writer.close(); } } catch (IOException e) { + LOGGER.warn("Unable to close alert HTTP POST resources, urlPrefix={}.", urlPrefix, e); } if (!sendSuccess) { recordSendLog(urlPrefix, content); @@ -139,18 +151,31 @@ public boolean httpSend(String successCode, String type, String urlPrefix, Strin } else if ("post".equalsIgnoreCase(type)) { return httpPostSend(successCode, urlPrefix, urlPars); } else { + LOGGER.error("Illegal alert sender request type, type={}, urlPrefix={}.", type, urlPrefix); Cat.logError(new RuntimeException("Illegal request type: " + type)); return false; } } public com.dianping.cat.alarm.sender.entity.Sender querySender() { + refreshSpringBeans(); + String id = getId(); return m_senderConfigManager.querySender(id); } + private void refreshSpringBeans() { + SenderConfigManager senderConfigManager = CatSpringContext.getBeanIfAvailable(SenderConfigManager.class); + + if (senderConfigManager != null) { + m_senderConfigManager = senderConfigManager; + LOGGER.info("Alert sender refreshed Spring SenderConfigManager dependency, senderId={}.", getId()); + } + } + private void recordSendLog(String urlPrefix, String paras) { + LOGGER.error("Alert send failed, urlPrefix={}, paras={}.", urlPrefix, paras, new AlertSendException()); Cat.logError(urlPrefix + "---" + paras, new AlertSendException()); } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/MailSender.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/MailSender.java index cf4145c158..741ed1a35c 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/MailSender.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/MailSender.java @@ -23,11 +23,15 @@ import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.dianping.cat.Cat; import com.dianping.cat.alarm.sender.entity.Sender; import com.dianping.cat.alarm.spi.AlertChannel; public class MailSender extends AbstractSender { + private static final Logger LOGGER = LoggerFactory.getLogger(MailSender.class); public static final String ID = AlertChannel.MAIL.getName(); @@ -70,6 +74,8 @@ private boolean sendEmail(SendMessageEntity message, String receiver, Sender sen .replace("${time}", URLEncoder.encode(time, "utf-8")); } catch (Exception e) { + LOGGER.error("Unable to encode mail alert request parameters, receiver={}, title={}.", receiver, + message.getTitle(), e); Cat.logError(e); } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SenderManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SenderManager.java index 624773803c..4432c334b2 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SenderManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SenderManager.java @@ -23,6 +23,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.ContainerHolder; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -34,6 +36,7 @@ @Named public class SenderManager extends ContainerHolder implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(SenderManager.class); @Inject private ServerConfigManager m_configManager; @@ -43,6 +46,7 @@ public class SenderManager extends ContainerHolder implements Initializable { @Override public void initialize() throws InitializationException { m_senders = lookupMap(Sender.class); + LOGGER.info("Initialized alert sender manager, senderCount={}.", m_senders.size()); } public boolean sendAlert(AlertChannel channel, SendMessageEntity message) { @@ -55,12 +59,22 @@ public boolean sendAlert(AlertChannel channel, SendMessageEntity message) { if (m_configManager.isSendMachine()) { Sender sender = m_senders.get(channelName); + if (sender == null) { + LOGGER.warn("Alert sender is not configured, channel={}, messageType={}.", channelName, + message.getType()); + Cat.logEvent("Channel:" + channel, message.getType() + ":nosender", Event.SUCCESS, null); + return false; + } result = sender.send(message); str = String.valueOf(result); + } else { + LOGGER.info("Current machine is not configured as send machine, skip alert sending, channel={}, type={}.", + channelName, message.getType()); } Cat.logEvent("Channel:" + channel, message.getType() + ":" + str, Event.SUCCESS, null); return result; } catch (Exception e) { + LOGGER.error("Unable to send alert, channel={}, message={}.", channel, message, e); Cat.logError("Channel [" + channel + "] " + message.toString(), e); return false; } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SmsSender.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SmsSender.java index 42a0b3cfda..85e59d08b6 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SmsSender.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SmsSender.java @@ -21,11 +21,15 @@ import java.net.URLEncoder; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.dianping.cat.Cat; import com.dianping.cat.alarm.sender.entity.Sender; import com.dianping.cat.alarm.spi.AlertChannel; public class SmsSender extends AbstractSender { + private static final Logger LOGGER = LoggerFactory.getLogger(SmsSender.class); public static final String ID = AlertChannel.SMS.getName(); @@ -65,6 +69,8 @@ private boolean sendSms(SendMessageEntity message, String receiver, Sender sende urlPars = urlPars.replace("${receiver}", URLEncoder.encode(receiver, "utf-8")) .replace("${content}", URLEncoder.encode(content, "utf-8")); } catch (Exception e) { + LOGGER.error("Unable to encode SMS alert request parameters, receiver={}, title={}.", receiver, + message.getTitle(), e); Cat.logError(e); } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/WeixinSender.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/WeixinSender.java index 3756aee1f6..9322996e6e 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/WeixinSender.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/WeixinSender.java @@ -21,11 +21,15 @@ import java.net.URLEncoder; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.dianping.cat.Cat; import com.dianping.cat.alarm.sender.entity.Sender; import com.dianping.cat.alarm.spi.AlertChannel; public class WeixinSender extends AbstractSender { + private static final Logger LOGGER = LoggerFactory.getLogger(WeixinSender.class); public static final String ID = AlertChannel.WEIXIN.getName(); @@ -69,6 +73,8 @@ private boolean sendWeixin(SendMessageEntity message, String receiver, Sender se .replace("${content}", URLEncoder.encode(content, "utf-8")) .replace("${type}", URLEncoder.encode(message.getType(), "utf-8")); } catch (Exception e) { + LOGGER.error("Unable to encode Weixin alert request parameters, domain={}, receiver={}, title={}.", domain, + receiver, message.getTitle(), e); Cat.logError(e); } diff --git a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java index c447692ab9..85c1e4f352 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java @@ -20,6 +20,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -37,6 +39,7 @@ @Named public class AtomicMessageConfigManager implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(AtomicMessageConfigManager.class); private static final String CONFIG_NAME = "atomic-message-config"; @@ -67,7 +70,11 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_modifyTime = config.getModifyDate().getTime(); m_config = DefaultSaxParser.parse(content); + LOGGER.info("Loaded atomic message config from repository, configId={}, modifyTime={}.", m_configId, + m_modifyTime); } catch (DalNotFoundException e) { + LOGGER.warn("Atomic message config is missing in repository, loading default content from fetcher.", e); + try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -77,14 +84,18 @@ public void initialize() throws InitializationException { m_configDao.insert(config); m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); + LOGGER.info("Initialized atomic message config from default content, configId={}.", m_configId); } catch (Exception ex) { + LOGGER.error("Unable to initialize atomic message config from default content.", ex); Cat.logError(ex); } } catch (Exception e) { + LOGGER.error("Unable to load atomic message config from repository.", e); Cat.logError(e); } if (m_config == null) { m_config = new AtomicMessageConfig(); + LOGGER.warn("Atomic message config is empty after initialization, using a new empty config."); } TimerSyncTask.getInstance().register(new TimerSyncTask.SyncHandler() { @@ -107,6 +118,8 @@ public boolean insert(String xml) { return storeConfig(); } catch (Exception e) { + LOGGER.error("Unable to parse atomic message config xml for insert. xmlLength={}.", + xml == null ? 0 : xml.length(), e); Cat.logError(e); return false; } @@ -181,7 +194,8 @@ public int getPropertyValue(String domain, String propertyName, int defaultValue try { result = Integer.parseInt(property.getValue()); } catch (Exception e) { - //ignore + LOGGER.warn("Unable to parse atomic message property, domain={}, propertyName={}, value={}; " + + "using defaultValue={}.", domain, propertyName, property.getValue(), defaultValue, e); } } } @@ -211,6 +225,7 @@ private void refreshConfig() throws Exception { m_config = messageConfig; m_modifyTime = modifyTime; + LOGGER.info("Refreshed atomic message config, configId={}, modifyTime={}.", m_configId, m_modifyTime); } } } @@ -225,7 +240,9 @@ private boolean storeConfig() { config.setName(CONFIG_NAME); config.setContent(m_config.toString()); m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + LOGGER.info("Stored atomic message config, configId={}.", m_configId); } catch (Exception e) { + LOGGER.error("Unable to store atomic message config, configId={}.", m_configId, e); Cat.logError(e); return false; } diff --git a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java index 024f6ba6d9..7b3b1ba4e6 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java @@ -26,6 +26,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -44,6 +46,7 @@ @Named public class ReportReloadConfigManager implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(ReportReloadConfigManager.class); private static final String CONFIG_NAME = "report-reload-config"; @@ -74,7 +77,11 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_modifyTime = config.getModifyDate().getTime(); m_config = DefaultSaxParser.parse(content); + LOGGER.info("Loaded report reload config from repository, configId={}, modifyTime={}.", m_configId, + m_modifyTime); } catch (DalNotFoundException e) { + LOGGER.warn("Report reload config is missing in repository, loading default content from fetcher.", e); + try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -84,14 +91,18 @@ public void initialize() throws InitializationException { m_configDao.insert(config); m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); + LOGGER.info("Initialized report reload config from default content, configId={}.", m_configId); } catch (Exception ex) { + LOGGER.error("Unable to initialize report reload config from default content.", ex); Cat.logError(ex); } } catch (Exception e) { + LOGGER.error("Unable to load report reload config from repository.", e); Cat.logError(e); } if (m_config == null) { m_config = new ReportReloadConfig(); + LOGGER.warn("Report reload config is empty after initialization, using a new empty config."); } TimerSyncTask.getInstance().register(new SyncHandler() { @@ -114,6 +125,8 @@ public boolean insert(String xml) { return storeConfig(); } catch (Exception e) { + LOGGER.error("Unable to parse report reload config xml for insert. xmlLength={}.", + xml == null ? 0 : xml.length(), e); Cat.logError(e); return false; } @@ -137,6 +150,7 @@ public List queryByReportType(String type) { results.add(period); } catch (ParseException e) { + LOGGER.warn("Unable to parse report reload period, type={}, periodId={}.", type, rp.getId(), e); Cat.logError(e); } } @@ -164,6 +178,7 @@ private void refreshConfig() throws Exception { m_config = reportReloadConfig; m_modifyTime = modifyTime; + LOGGER.info("Refreshed report reload config, configId={}, modifyTime={}.", m_configId, m_modifyTime); } } } @@ -178,7 +193,9 @@ private boolean storeConfig() { config.setName(CONFIG_NAME); config.setContent(m_config.toString()); m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + LOGGER.info("Stored report reload config, configId={}.", m_configId); } catch (Exception e) { + LOGGER.error("Unable to store report reload config, configId={}.", m_configId, e); Cat.logError(e); return false; } diff --git a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java index 23cf8d40d7..f461ff1eba 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java @@ -27,6 +27,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.ContainerHolder; @@ -47,6 +49,7 @@ @Named public class BusinessConfigManager extends ContainerHolder implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(BusinessConfigManager.class); public final static String BASE_CONFIG = "base"; @@ -88,6 +91,7 @@ public boolean deleteBusinessItem(String domain, String key) { itemIds.remove(key); cacheConfigs(businessReportConfig, domain); } catch (Exception e) { + LOGGER.error("Unable to delete business item config, domain={}, key={}.", domain, key, e); Cat.logError(e); return false; } @@ -106,6 +110,7 @@ public boolean deleteCustomItem(String domain, String key) { m_configDao.updateByPK(config, BusinessConfigEntity.UPDATESET_FULL); cacheConfigs(businessReportConfig, domain); } catch (Exception e) { + LOGGER.error("Unable to delete business custom config, domain={}, key={}.", domain, key, e); Cat.logError(e); return false; } @@ -125,6 +130,7 @@ public void initialize() throws InitializationException { } m_alertMachine = serverConfigManager.isAlertMachine(); + LOGGER.info("Initializing business config manager, alertMachine={}.", m_alertMachine); loadData(); @@ -164,12 +170,16 @@ private void loadData() { domains.put(domain, itemIds); cacheConfigs(businessReportConfig, domain); } catch (Exception e) { + LOGGER.error("Unable to parse business config, configId={}, domain={}.", config.getId(), + config.getDomain(), e); Cat.logError(e); } } m_domains = domains; + LOGGER.info("Loaded business configs, configCount={}, domainCount={}.", configs.size(), m_domains.size()); } catch (Exception e) { + LOGGER.error("Unable to load business configs.", e); Cat.logError(e); } } @@ -200,6 +210,7 @@ public boolean insertBusinessConfigIfNotExist(String domain, String key, ConfigI itemIds.add(key); m_domains.put(domain, itemIds); cacheConfigs(config, domain); + LOGGER.info("Inserted new business config, domain={}, key={}.", domain, key); } else { Set itemIds = m_domains.get(domain); @@ -215,11 +226,13 @@ public boolean insertBusinessConfigIfNotExist(String domain, String key, ConfigI itemIds.add(key); cacheConfigs(config, domain); + LOGGER.info("Inserted business item config, domain={}, key={}.", domain, key); } } return true; } catch (Exception e) { + LOGGER.error("Unable to insert business config if not exists, domain={}, key={}.", domain, key, e); Cat.logError(e); } return false; @@ -237,8 +250,9 @@ public BusinessReportConfig queryConfigByDomain(String domain) { businessReportConfig = DefaultSaxParser.parse(config.getContent()); } } catch (DalNotFoundException notFound) { - // Ignore + LOGGER.warn("Business config is missing, domain={}; returning empty config.", domain, notFound); } catch (Exception e) { + LOGGER.error("Unable to query business config by domain={}.", domain, e); Cat.logError(e); } @@ -259,8 +273,10 @@ public boolean updateConfigByDomain(BusinessReportConfig config) { try { m_configDao.updateBaseConfigByDomain(proto, BusinessConfigEntity.UPDATESET_FULL); cacheConfigs(config, domain); + LOGGER.info("Updated business config, domain={}.", domain); return true; } catch (DalException e) { + LOGGER.error("Unable to update business config, domain={}.", domain, e); Cat.logError(e); } @@ -279,8 +295,10 @@ public boolean insertConfigByDomain(BusinessReportConfig config) { try { m_configDao.insert(proto); cacheConfigs(config, domain); + LOGGER.info("Inserted business config, domain={}.", domain); return true; } catch (DalException e) { + LOGGER.error("Unable to insert business config, domain={}.", domain, e); Cat.logError(e); } diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java index ca918dc845..d57fc4768e 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java @@ -34,6 +34,7 @@ import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.helper.Files; import org.unidal.helper.Splitters; @@ -64,6 +65,7 @@ @Named public class ServerConfigManager implements LogEnabled, Initializable { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(ServerConfigManager.class); public static final String DUMP_DIR = "dump"; @@ -404,7 +406,11 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_modifyTime = config.getModifyDate().getTime(); m_config = DefaultSaxParser.parse(content); + SLF4J_LOGGER.info("Loaded server config from repository, configId={}, modifyTime={}.", m_configId, + m_modifyTime); } catch (DalNotFoundException e) { + SLF4J_LOGGER.warn("Server config is missing in repository, loading default content from fetcher.", e); + try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -414,11 +420,14 @@ public void initialize() throws InitializationException { m_configDao.insert(config); m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); + SLF4J_LOGGER.info("Initialized server config from default content, configId={}.", m_configId); } catch (Exception ex) { + SLF4J_LOGGER.error("Unable to initialize server config from default content.", ex); m_logger.error("Failed to initialize server config from database fallback.", ex); Cat.logError(ex); } } catch (Exception e) { + SLF4J_LOGGER.error("Unable to load server config from repository.", e); m_logger.error("Failed to load server config from database.", e); Cat.logError(e); } @@ -430,6 +439,7 @@ public void initialize() throws InitializationException { m_logger.info("init cat server with cat server xml " + localServerFile); initialize(localServerFile); } catch (Exception e) { + SLF4J_LOGGER.error("Unable to initialize server config from local server.xml.", e); m_logger.error("Failed to initialize server config from local server.xml.", e); Cat.logError(e); } @@ -437,6 +447,7 @@ public void initialize() throws InitializationException { if (m_config == null) { m_config = new ServerConfig(); + SLF4J_LOGGER.warn("Server config is empty after initialization, using a new empty config."); } m_config.accept(new ServerConfigValidator()); @@ -444,6 +455,7 @@ public void initialize() throws InitializationException { try { refreshServer(); } catch (Exception e) { + SLF4J_LOGGER.error("Unable to refresh local server config view.", e); m_logger.error("Failed to refresh server config.", e); Cat.logError(e); } @@ -470,9 +482,11 @@ public void initialize(File configFile) throws Exception { String xml = Files.forIO().readFrom(configFile, "utf-8"); m_config = DefaultSaxParser.parse(xml); + SLF4J_LOGGER.info("Loaded server config from local file, path={}.", configFile.getCanonicalPath()); } else { if (configFile != null) { m_logger.warn(String.format("Configuration file(%s) not found, IGNORED.", configFile.getCanonicalPath())); + SLF4J_LOGGER.warn("Server config local file is not readable, path={}.", configFile.getCanonicalPath()); } m_config = new ServerConfig(); @@ -485,6 +499,8 @@ public boolean insert(String xml) { return storeConfig(); } catch (Exception e) { + SLF4J_LOGGER.error("Unable to parse server config xml for insert. xmlLength={}.", + xml == null ? 0 : xml.length(), e); Cat.logError(e); return false; } @@ -570,6 +586,7 @@ private void refreshConfig() throws Exception { m_modifyTime = modifyTime; refreshServer(); + SLF4J_LOGGER.info("Refreshed server config, configId={}, modifyTime={}.", m_configId, m_modifyTime); } } } @@ -590,6 +607,8 @@ private void refreshServer() throws SAXException, IOException { String forcedStatisticTypePrefixStr = getProperty("forced-statistic-type-prefixes", "Cellar.,Squirrel."); List forcedStatisticTypePrefixes = Splitters.by(",").noEmptyItem().split(forcedStatisticTypePrefixStr); m_forcedStatisticTypePrefixes = new HashSet<>(forcedStatisticTypePrefixes); + SLF4J_LOGGER.info("Refreshed server runtime config, localIp={}, forcedStatisticTypePrefixes={}.", ip, + m_forcedStatisticTypePrefixes); } public boolean storeConfig() { @@ -602,7 +621,9 @@ public boolean storeConfig() { config.setContent(m_config.toString()); m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); refreshServer(); + SLF4J_LOGGER.info("Stored server config, configId={}.", m_configId); } catch (Exception e) { + SLF4J_LOGGER.error("Unable to store server config, configId={}.", m_configId, e); Cat.logError(e); return false; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java index 0e1d3439d8..485c9eef37 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java @@ -5,11 +5,14 @@ import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.datasource.DataSourceManager; import org.unidal.lookup.annotation.Inject; public abstract class SpringBackedRepositorySupport { + private static final Logger LOGGER = LoggerFactory.getLogger(SpringBackedRepositorySupport.class); + @Inject private DataSourceManager m_dataSourceManager; @@ -51,6 +54,12 @@ private SqlSessionFactory getSqlSessionFactory() { sqlSessionFactory = m_sqlSessionFactory; if (sqlSessionFactory == null) { + if (m_dataSourceManager == null) { + LOGGER.error("Cannot create fallback MyBatis SqlSessionFactory for mapper {} because " + + "DataSourceManager is not injected. Spring mapper is unavailable and legacy " + + "Unidal datasource fallback cannot be used.", m_mapperClass.getName()); + } + sqlSessionFactory = SupportingMyBatisRepository.newSqlSessionFactory(m_dataSourceManager, m_mapperClass, m_mapperResource); m_sqlSessionFactory = sqlSessionFactory; diff --git a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java index cd5644fe00..918a5ef7bd 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java @@ -29,6 +29,7 @@ import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.helper.Threads; @@ -47,6 +48,7 @@ @Named(type = HostinfoService.class) public class HostinfoService implements Initializable, LogEnabled { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(HostinfoService.class); public static final String UNKNOWN_PROJECT = "UnknownProject"; @@ -91,7 +93,9 @@ public Hostinfo findByIp(String ip) { return null; } } catch (DalNotFoundException e) { + SLF4J_LOGGER.warn("Hostinfo is missing by ip={}.", ip, e); } catch (Exception e) { + SLF4J_LOGGER.error("Unable to find hostinfo by ip={}.", ip, e); Cat.logError(e); } return null; @@ -105,11 +109,14 @@ public void initialize() throws InitializationException { if (hostinfoDao != null) { m_hostinfoDao = hostinfoDao; + SLF4J_LOGGER.info("HostinfoService refreshed Spring HostinfoRepository dependency."); } if (manager != null) { m_manager = manager; + SLF4J_LOGGER.info("HostinfoService refreshed Spring ServerConfigManager dependency."); } Threads.forGroup("Cat").start(new RefreshHost()); + SLF4J_LOGGER.info("HostinfoService started refresh task."); } private boolean insert(Hostinfo hostinfo) throws DalException { @@ -131,8 +138,10 @@ public boolean insert(String domain, String ip) { info.setIp(ip); insert(info); m_hostinfos.put(ip, info); + SLF4J_LOGGER.info("Inserted hostinfo, domain={}, ip={}.", domain, ip); return true; } catch (DalException e) { + SLF4J_LOGGER.error("Unable to insert hostinfo, domain={}, ip={}.", domain, ip, e); Cat.logError(e); } return false; @@ -171,6 +180,7 @@ public String queryHostnameByIp(String ip) { return null; } } catch (Exception e) { + SLF4J_LOGGER.error("Unable to query hostname by ip={}.", ip, e); Cat.logError(e); } @@ -208,7 +218,9 @@ protected void refresh() { } m_hostinfos = tmpHostInfos; m_ipDomains = tmpIpDomains; + SLF4J_LOGGER.info("Refreshed hostinfo cache, hostCount={}.", hostinfos.size()); } catch (DalException e) { + SLF4J_LOGGER.error("Unable to refresh hostinfo cache.", e); Cat.logError("initialize HostService error", e); } } @@ -230,8 +242,12 @@ public boolean updateHostinfo(Hostinfo hostinfo) { try { m_hostinfoDao.updateByPK(hostinfo, HostinfoEntity.UPDATESET_FULL); + SLF4J_LOGGER.info("Updated hostinfo, id={}, domain={}, ip={}.", hostinfo.getId(), hostinfo.getDomain(), + hostinfo.getIp()); return true; } catch (DalException e) { + SLF4J_LOGGER.error("Unable to update hostinfo, id={}, domain={}, ip={}.", hostinfo.getId(), + hostinfo.getDomain(), hostinfo.getIp(), e); Cat.logError(e); return false; } @@ -257,6 +273,7 @@ public void run() { try { Thread.sleep(TimeHelper.ONE_MINUTE); } catch (InterruptedException e) { + SLF4J_LOGGER.warn("Hostinfo refresh task interrupted.", e); Cat.logError(e); } } diff --git a/cat-core/src/main/java/com/dianping/cat/service/IpService.java b/cat-core/src/main/java/com/dianping/cat/service/IpService.java index 210f7da862..cf28a6c706 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/IpService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/IpService.java @@ -27,12 +27,16 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; @Named public class IpService implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(IpService.class); + private static final String OTHER = "其他"; private int[] m_areaIds; @@ -158,6 +162,7 @@ public IpInfo findIpInfoByString(String ip) { return findIpInfo(ip_num); } catch (Exception e) { + LOGGER.warn("Unable to parse ip string, ip={}.", ip, e); return null; } } @@ -184,6 +189,7 @@ private void initAreaMap(InputStream areaFile) { } areaReader.close(); } catch (Exception e) { + LOGGER.error("Unable to initialize China area map.", e); Cat.logError(e); } } @@ -207,6 +213,7 @@ private void initCorpMap(InputStream corpFile) { } corpReader.close(); } catch (Exception e) { + LOGGER.error("Unable to initialize China corporation map.", e); Cat.logError(e); } } @@ -233,6 +240,7 @@ private void initForeignAreaMap(InputStream areaFile) { } areaReader.close(); } catch (Exception e) { + LOGGER.error("Unable to initialize foreign area map.", e); Cat.logError(e); } } @@ -258,11 +266,15 @@ public void initForeignIpTable(InputStream ipFile) { } } catch (IOException e) { + LOGGER.error("Unable to initialize foreign ip table.", e); Cat.logError(e); } finally { try { - reader.close(); + if (reader != null) { + reader.close(); + } } catch (Exception e) { + LOGGER.warn("Unable to close foreign ip table reader.", e); Cat.logError(e); } } @@ -283,6 +295,7 @@ public void initialize() throws InitializationException { initForeignAreaMap(foreignAreaFile); initForeignIpTable(foreignIpFile); + LOGGER.info("IpService initialized."); } public void initIpTable(InputStream ipFile) { @@ -308,11 +321,15 @@ public void initIpTable(InputStream ipFile) { } } catch (IOException e) { + LOGGER.error("Unable to initialize China ip table.", e); Cat.logError(e); } finally { try { - reader.close(); + if (reader != null) { + reader.close(); + } } catch (Exception e) { + LOGGER.warn("Unable to close China ip table reader.", e); Cat.logError(e); } } diff --git a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java index 6c212626c7..1b4cb89e0b 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java @@ -25,6 +25,8 @@ import com.dianping.cat.core.dal.ProjectEntity; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -35,6 +37,7 @@ @Named public class ProjectService implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(ProjectService.class); public static final String DEFAULT = "Default"; @@ -87,6 +90,7 @@ public boolean delete(Project project) { return true; } catch (Exception e) { + LOGGER.error("Unable to delete project, id={}, domain={}.", id, domainName, e); Cat.logError("delete project error ", e); return false; } @@ -112,7 +116,9 @@ public Project findByDomain(String domainName) { m_domainToProjects.put(pro.getDomain(), pro); return project; } catch (DalException e) { + LOGGER.warn("Project is missing or unavailable by domain={}.", domainName, e); } catch (Exception e) { + LOGGER.error("Unable to find project by domain={}.", domainName, e); Cat.logError(e); } return null; @@ -158,7 +164,10 @@ public Project findProject(String domain) { @Override public void initialize() throws InitializationException { if (!m_manager.isLocalMode()) { + LOGGER.info("Initializing ProjectService in remote mode."); refresh(); + } else { + LOGGER.info("Initializing ProjectService in local mode; skip database refresh."); } } @@ -177,11 +186,15 @@ public boolean insert(Project project) { int result = m_projectDao.insert(project); if (result == 1) { + LOGGER.info("Inserted project, domain={}, id={}.", project.getDomain(), project.getId()); return true; } else { + LOGGER.warn("Project insert returned unexpected row count, domain={}, result={}.", project.getDomain(), + result); return false; } } catch (DalException e) { + LOGGER.error("Unable to insert project, domain={}.", project.getDomain(), e); Cat.logError(e); return false; } @@ -200,6 +213,7 @@ public boolean insert(String domain) { return true; } catch (Exception ex) { + LOGGER.error("Unable to insert default project, domain={}.", domain, ex); Cat.logError(ex); } return false; @@ -227,7 +241,10 @@ protected void refresh() { m_domains = tmpDomains; m_domainToProjects = tmpDomainProjects; m_cmdbToProjects = tmpCmdbProjects; + LOGGER.info("Refreshed projects, projectCount={}, cmdbDomainCount={}.", projects.size(), + tmpCmdbProjects.size()); } catch (DalException e) { + LOGGER.error("Unable to refresh ProjectService projects.", e); Cat.logError("initialize ProjectService error", e); } } @@ -237,8 +254,10 @@ public boolean update(Project project) { try { m_projectDao.updateByPK(project, ProjectEntity.UPDATESET_FULL); + LOGGER.info("Updated project, domain={}, id={}.", project.getDomain(), project.getId()); return true; } catch (DalException e) { + LOGGER.error("Unable to update project, domain={}, id={}.", project.getDomain(), project.getId(), e); Cat.logError(e); return false; } diff --git a/cat-core/src/main/java/com/dianping/cat/task/TimerSyncTask.java b/cat-core/src/main/java/com/dianping/cat/task/TimerSyncTask.java index fa5f315268..de62eea480 100644 --- a/cat-core/src/main/java/com/dianping/cat/task/TimerSyncTask.java +++ b/cat-core/src/main/java/com/dianping/cat/task/TimerSyncTask.java @@ -21,6 +21,8 @@ import com.dianping.cat.Cat; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.message.Transaction; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.helper.Threads; import org.unidal.helper.Threads.Task; @@ -29,6 +31,7 @@ import java.util.concurrent.ExecutorService; public class TimerSyncTask implements Task { + private static final Logger LOGGER = LoggerFactory.getLogger(TimerSyncTask.class); private static final long DURATION = TimeHelper.ONE_MINUTE; @@ -47,6 +50,7 @@ public static TimerSyncTask getInstance() { Threads.forGroup("Cat").start(m_instance); m_active = true; + LOGGER.info("TimerSyncTask started."); } } } @@ -60,7 +64,15 @@ public String getName() { public void register(SyncHandler handler) { synchronized (this) { + String name = handler.getName(); + + for (int i = m_handlers.size() - 1; i >= 0; i--) { + if (name.equals(m_handlers.get(i).getName())) { + m_handlers.remove(i); + } + } m_handlers.add(handler); + LOGGER.info("Registered timer sync handler, name={}, handlerCount={}.", name, m_handlers.size()); } } @@ -83,6 +95,7 @@ public void run() { t.setStatus(Transaction.SUCCESS); } catch (Exception e) { t.setStatus(e); + LOGGER.error("Timer sync handler failed, name={}.", handler.getName(), e); Cat.logError(e); } finally { t.complete(); @@ -98,9 +111,11 @@ public void run() { Thread.sleep(DURATION - duration); } } catch (InterruptedException e) { + LOGGER.warn("TimerSyncTask interrupted, shutting down.", e); active = false; } } + LOGGER.info("TimerSyncTask stopped."); } @Override diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index bc37d9dfba..a26d00222a 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -25,6 +25,9 @@ import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.alarm.spi.config.AlertConfigManager; +import com.dianping.cat.alarm.spi.config.AlertPolicyManager; +import com.dianping.cat.alarm.spi.config.SenderConfigManager; import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; import com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository; import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; @@ -48,14 +51,38 @@ import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; import com.dianping.cat.core.report.daily.repository.DailyReportRepository; +import com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager; +import com.dianping.cat.report.alert.config.BaseRuleHelper; +import com.dianping.cat.report.alert.business.BusinessRuleConfigManager; +import com.dianping.cat.report.alert.event.EventRuleConfigManager; +import com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager; import com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager; import com.dianping.cat.report.alert.summary.AlertSummaryService; +import com.dianping.cat.report.alert.transaction.TransactionRuleConfigManager; import com.dianping.cat.report.DomainValidator; +import com.dianping.cat.report.page.DomainGroupConfigManager; +import com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager; +import com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager; +import com.dianping.cat.report.page.business.graph.BusinessDataFetcher; +import com.dianping.cat.report.page.business.graph.CustomDataCalculator; +import com.dianping.cat.report.page.business.service.BusinessReportService; +import com.dianping.cat.report.page.business.task.BusinessKeyHelper; +import com.dianping.cat.report.page.business.task.BusinessPointParser; +import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; import com.dianping.cat.report.page.metric.service.BaselineService; import com.dianping.cat.report.page.metric.service.DefaultBaselineService; +import com.dianping.cat.report.page.metric.task.BaselineConfigManager; +import com.dianping.cat.report.page.metric.task.BaselineCreator; +import com.dianping.cat.report.page.metric.task.DefaultBaselineCreator; +import com.dianping.cat.report.page.storage.config.StorageGroupConfigManager; import com.dianping.cat.report.server.RemoteServersManager; import com.dianping.cat.service.ProjectService; import com.dianping.cat.statistic.ServerStatisticManager; +import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; +import com.dianping.cat.system.page.config.ConfigHtmlParser; +import com.dianping.cat.system.page.permission.ResourceConfigManager; +import com.dianping.cat.system.page.permission.UserConfigManager; +import com.dianping.cat.system.page.router.config.RouterConfigManager; @Configuration @MapperScan(basePackages = { @@ -328,6 +355,228 @@ public ServerStatisticManager serverStatisticManager() { return new ServerStatisticManager(); } + @Bean + public ConfigHtmlParser configHtmlParser() { + return new ConfigHtmlParser(); + } + + @Bean(initMethod = "initialize") + public RouterConfigManager routerConfigManager(ConfigRepository configRepository, ContentFetcher contentFetcher, + DailyReportRepository dailyReportRepository, DailyReportContentRepository dailyReportContentRepository, + Logger plexusConsoleLogger) { + RouterConfigManager manager = new RouterConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + manager.setDailyReportDao(dailyReportRepository); + manager.setDailyReportContentDao(dailyReportContentRepository); + manager.enableLogging(plexusConsoleLogger.getChildLogger(RouterConfigManager.class.getName())); + return manager; + } + + @Bean(initMethod = "initialize") + public DomainGroupConfigManager domainGroupConfigManager(ConfigRepository configRepository, + ContentFetcher contentFetcher) { + DomainGroupConfigManager manager = new DomainGroupConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean(initMethod = "initialize") + public StorageGroupConfigManager storageGroupConfigManager(ConfigRepository configRepository, + ContentFetcher contentFetcher) { + StorageGroupConfigManager manager = new StorageGroupConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean(initMethod = "initialize") + public TopologyGraphConfigManager topologyGraphConfigManager(ConfigRepository configRepository, + ContentFetcher contentFetcher) { + TopologyGraphConfigManager manager = new TopologyGraphConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean(initMethod = "initialize") + public TopoGraphFormatConfigManager topoGraphFormatConfigManager(ConfigRepository configRepository, + ContentFetcher contentFetcher) { + TopoGraphFormatConfigManager manager = new TopoGraphFormatConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean(initMethod = "initialize") + public HeartbeatDisplayPolicyManager heartbeatDisplayPolicyManager(ConfigRepository configRepository, + ContentFetcher contentFetcher) { + HeartbeatDisplayPolicyManager manager = new HeartbeatDisplayPolicyManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean(initMethod = "initialize") + public ExceptionRuleConfigManager exceptionRuleConfigManager(ConfigRepository configRepository, + ContentFetcher contentFetcher) { + ExceptionRuleConfigManager manager = new ExceptionRuleConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean(initMethod = "initialize") + public AlertConfigManager alertConfigManager(ConfigRepository configRepository, ContentFetcher contentFetcher) { + AlertConfigManager manager = new AlertConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean(initMethod = "initialize") + public AlertPolicyManager alertPolicyManager(ConfigRepository configRepository, ContentFetcher contentFetcher) { + AlertPolicyManager manager = new AlertPolicyManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean + public BaseRuleHelper baseRuleHelper() { + return new BaseRuleHelper(); + } + + @Bean(initMethod = "initialize") + public TransactionRuleConfigManager transactionRuleConfigManager(ConfigRepository configRepository, + ContentFetcher contentFetcher, UserDefinedRuleManager userDefinedRuleManager, BaseRuleHelper baseRuleHelper) { + TransactionRuleConfigManager manager = new TransactionRuleConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + manager.setUserDefinedRuleManager(userDefinedRuleManager); + manager.setHelper(baseRuleHelper); + return manager; + } + + @Bean(initMethod = "initialize") + public EventRuleConfigManager eventRuleConfigManager(ConfigRepository configRepository, ContentFetcher contentFetcher, + UserDefinedRuleManager userDefinedRuleManager, BaseRuleHelper baseRuleHelper) { + EventRuleConfigManager manager = new EventRuleConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + manager.setUserDefinedRuleManager(userDefinedRuleManager); + manager.setHelper(baseRuleHelper); + return manager; + } + + @Bean(initMethod = "initialize") + public HeartbeatRuleConfigManager heartbeatRuleConfigManager(ConfigRepository configRepository, + ContentFetcher contentFetcher, UserDefinedRuleManager userDefinedRuleManager, BaseRuleHelper baseRuleHelper) { + HeartbeatRuleConfigManager manager = new HeartbeatRuleConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + manager.setUserDefinedRuleManager(userDefinedRuleManager); + manager.setHelper(baseRuleHelper); + return manager; + } + + @Bean(initMethod = "initialize") + public BusinessRuleConfigManager businessRuleConfigManager(BusinessConfigRepository businessConfigRepository) { + BusinessRuleConfigManager manager = new BusinessRuleConfigManager(); + + manager.setConfigDao(businessConfigRepository); + return manager; + } + + @Bean(initMethod = "initialize") + public BusinessTagConfigManager businessTagConfigManager(BusinessConfigRepository businessConfigRepository) { + BusinessTagConfigManager manager = new BusinessTagConfigManager(); + + manager.setConfigDao(businessConfigRepository); + return manager; + } + + @Bean + public BusinessKeyHelper businessKeyHelper() { + return new BusinessKeyHelper(); + } + + @Bean + public BusinessDataFetcher businessDataFetcher(BusinessKeyHelper businessKeyHelper) { + BusinessDataFetcher fetcher = new BusinessDataFetcher(); + + fetcher.setKeyHelper(businessKeyHelper); + return fetcher; + } + + @Bean + public CustomDataCalculator customDataCalculator(BusinessKeyHelper businessKeyHelper) { + CustomDataCalculator calculator = new CustomDataCalculator(); + + calculator.setKeyHelper(businessKeyHelper); + return calculator; + } + + @Bean + public BusinessPointParser businessPointParser() { + return new BusinessPointParser(); + } + + @Bean + public BaselineConfigManager baselineConfigManager() { + return new BaselineConfigManager(); + } + + @Bean + public BaselineCreator baselineCreator() { + return new DefaultBaselineCreator(); + } + + @Bean + public BusinessReportService businessReportService() { + return new BusinessReportService(); + } + + @Bean(initMethod = "initialize") + public SenderConfigManager senderConfigManager(ConfigRepository configRepository, ContentFetcher contentFetcher) { + SenderConfigManager manager = new SenderConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean(initMethod = "initialize") + public UserConfigManager userConfigManager(ConfigRepository configRepository, ContentFetcher contentFetcher) { + UserConfigManager manager = new UserConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean(initMethod = "initialize") + public ResourceConfigManager resourceConfigManager(ConfigRepository configRepository, ContentFetcher contentFetcher) { + ResourceConfigManager manager = new ResourceConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + @Bean(initMethod = "initialize") public ProjectService projectService(ProjectRepository projectRepository, ServerConfigManager serverConfigManager) { ProjectService service = new ProjectService(); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java index 724c3c7d10..0f3f939794 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java @@ -20,12 +20,18 @@ public class CatHomeSpringContextListener implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); - context.register(CatHomeSpringConfiguration.class); - context.refresh(); - event.getServletContext().setAttribute(ATTRIBUTE_NAME, context); - CatSpringContext.setContext(context); - m_context = context; - LOGGER.info("CAT home Spring context initialized, beanCount={}.", context.getBeanDefinitionCount()); + try { + context.register(CatHomeSpringConfiguration.class); + context.refresh(); + event.getServletContext().setAttribute(ATTRIBUTE_NAME, context); + CatSpringContext.setContext(context); + m_context = context; + LOGGER.info("CAT home Spring context initialized, beanCount={}.", context.getBeanDefinitionCount()); + } catch (RuntimeException | Error e) { + LOGGER.error("Failed to initialize CAT home Spring context.", e); + context.close(); + throw e; + } } @Override diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringDataSourceFactory.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringDataSourceFactory.java index 40f4bc4395..2f11489b76 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringDataSourceFactory.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringDataSourceFactory.java @@ -9,6 +9,8 @@ import javax.xml.parsers.DocumentBuilderFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -16,6 +18,8 @@ import org.xml.sax.InputSource; final class CatHomeSpringDataSourceFactory { + private static final Logger LOGGER = LoggerFactory.getLogger(CatHomeSpringDataSourceFactory.class); + private static final String CAT_DATA_SOURCE_ID = "cat"; private CatHomeSpringDataSourceFactory() { @@ -57,7 +61,11 @@ private static Element findCatDataSource(Document document) { } } - throw new IllegalStateException("Missing data-source id=" + CAT_DATA_SOURCE_ID + " in " + dataSourcesPath()); + IllegalStateException error = new IllegalStateException( + "Missing data-source id=" + CAT_DATA_SOURCE_ID + " in " + dataSourcesPath()); + + LOGGER.error("Unable to find CAT datasource definition in Spring datasource config.", error); + throw error; } private static Document loadDataSourcesXml() { @@ -70,8 +78,10 @@ private static Document loadDataSourcesXml() { factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); return factory.newDocumentBuilder().parse(new InputSource(new StringReader(xml))); } catch (IOException e) { + LOGGER.error("Unable to read Spring datasource config: {}.", path, e); throw new IllegalStateException("Unable to read Spring datasource config: " + path, e); } catch (Exception e) { + LOGGER.error("Unable to parse Spring datasource config: {}.", path, e); throw new IllegalStateException("Unable to parse Spring datasource config: " + path, e); } } @@ -86,7 +96,11 @@ private static Element properties(Element dataSource) { NodeList nodes = dataSource.getElementsByTagName("properties"); if (nodes.getLength() == 0) { - throw new IllegalStateException("Missing properties in data-source id=" + CAT_DATA_SOURCE_ID); + IllegalStateException error = new IllegalStateException( + "Missing properties in data-source id=" + CAT_DATA_SOURCE_ID); + + LOGGER.error("CAT datasource definition is missing properties.", error); + throw error; } return (Element) nodes.item(0); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java index 4044e4aa10..b9994ea712 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java @@ -26,6 +26,8 @@ import java.util.Map.Entry; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.helper.Threads.Task; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -59,6 +61,7 @@ @Named public class BusinessAlert implements Task { + private static final Logger LOGGER = LoggerFactory.getLogger(BusinessAlert.class); public static final String DEFAULT_TAG = "业务大盘"; @@ -240,6 +243,8 @@ private List processCustomItem(BusinessReportGroup currentRepor return m_dataChecker.checkData(currentData, currentBaseLine, conditions); } } catch (Exception e) { + LOGGER.error("Unable to process custom business alert item, key={}, minute={}, maxDuration={}, pattern={}.", + key, minute, maxDuration, customConfig == null ? null : customConfig.getPattern(), e); Cat.logError(e); } return new ArrayList(); @@ -254,6 +259,8 @@ private void processDomain(String domain) { int maxDuration = monitorConfigs.calMaxRuleMinute(); if (maxDuration > 0) { + LOGGER.info("Processing business alert domain, domain={}, minute={}, maxDuration={}.", domain, minute, + maxDuration); BusinessReportGroup reportGroup = m_service.prepareDatas(domain, minute, maxDuration); if (reportGroup.isDataReady()) { @@ -317,16 +324,19 @@ public void run() { try { Set domains = m_projectService.findAllDomains(); + LOGGER.info("Business alert cycle started, domainCount={}.", domains.size()); for (String domain : domains) { try { processDomain(domain); } catch (Exception e) { + LOGGER.error("Unable to process business alert domain, domain={}.", domain, e); Cat.logError(e); } } t.setStatus(Transaction.SUCCESS); } catch (Exception e) { t.setStatus(e); + LOGGER.error("Business alert cycle failed.", e); Cat.logError(e); } finally { t.complete(); @@ -339,6 +349,7 @@ public void run() { Thread.sleep(DURATION - duration); } } catch (InterruptedException e) { + LOGGER.warn("Business alert task interrupted."); active = false; } } @@ -354,6 +365,10 @@ private void sendBusinessAlerts(String domain, String metricName, List buildDefaultConfigs() { List configs = new ArrayList(); Config config = new Config(); @@ -117,6 +124,7 @@ public Map> getDefaultRulesForCustomItem() { public void initialize() throws InitializationException { refreshSpringBeans(); + LOGGER.info("Initializing business alert rule config manager."); loadData(); TimerSyncTask.getInstance().register(new SyncHandler() { @@ -146,11 +154,15 @@ private void loadData() { MonitorRules rule = DefaultSaxParser.parse(config.getContent()); rules.put(doamin, rule); } catch (Exception e) { + LOGGER.error("Unable to parse business alert rule config, domain={}, id={}.", config.getDomain(), + config.getId(), e); Cat.logError(e); } } m_rules = rules; + LOGGER.info("Loaded business alert rule configs, count={}.", m_rules.size()); } catch (DalException e) { + LOGGER.error("Unable to load business alert rule configs from repository.", e); Cat.logError(e); } } @@ -217,6 +229,7 @@ public void updateRule(String domain, String key, String configsStr, String type m_configDao.insert(proto); } } catch (Exception e) { + LOGGER.error("Unable to update business alert rule, domain={}, key={}, type={}.", domain, key, type, e); Cat.logError(e); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/config/BaseRuleHelper.java b/cat-home/src/main/java/com/dianping/cat/report/alert/config/BaseRuleHelper.java index 8fe0cad115..a33c9fc4ba 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/config/BaseRuleHelper.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/config/BaseRuleHelper.java @@ -23,6 +23,8 @@ import java.util.Iterator; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; @@ -32,6 +34,7 @@ @Named public class BaseRuleHelper { + private static final Logger LOGGER = LoggerFactory.getLogger(BaseRuleHelper.class); public Pair> convertConditions(List configs) { int maxMinute = 0; @@ -70,6 +73,7 @@ private boolean checkTimeValidate(Config config) { return false; } } catch (Exception ex) { + LOGGER.warn("Unable to validate alert rule time window, config={}.", config, ex); Cat.logError("throw exception when judge time: " + config.toString(), ex); return false; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventAlert.java index db92bae6c3..f12babd81f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventAlert.java @@ -27,6 +27,7 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.util.StringUtils; +import org.slf4j.LoggerFactory; import org.unidal.helper.Splitters; import org.unidal.helper.Threads.Task; import org.unidal.lookup.annotation.Inject; @@ -59,6 +60,7 @@ @Named public class EventAlert implements Task, LogEnabled { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(EventAlert.class); protected static final long DURATION = TimeHelper.ONE_MINUTE; @@ -246,6 +248,10 @@ private void processRule(Rule rule) { String monitor = fields.get(3); List alertResults = computeAlertForRule(domain, type, name, monitor, rule.getConfigs()); + if (!alertResults.isEmpty()) { + SLF4J_LOGGER.info("Event alerts queued, ruleId={}, domain={}, metric={}, alertCount={}.", rule.getId(), + domain, type + "-" + name + "-" + monitor, alertResults.size()); + } for (DataCheckEntity alertResult : alertResults) { AlertEntity entity = new AlertEntity(); @@ -268,6 +274,7 @@ public void run() { MonitorRules monitorRules = m_ruleConfigManager.getMonitorRules(); Map rules = monitorRules.getRules(); + SLF4J_LOGGER.info("Event alert cycle started, ruleCount={}.", rules.size()); for (Entry entry : rules.entrySet()) { //Event告警开关 if (null != entry.getValue().getAvailable() && !entry.getValue().getAvailable()) { @@ -276,12 +283,14 @@ public void run() { try { processRule(entry.getValue()); } catch (Exception e) { + SLF4J_LOGGER.error("Unable to process event alert rule, ruleId={}.", entry.getKey(), e); Cat.logError(e); } } t.setStatus(Transaction.SUCCESS); } catch (Exception e) { t.setStatus(e); + SLF4J_LOGGER.error("Event alert cycle failed.", e); Cat.logError(e); } finally { t.complete(); @@ -293,6 +302,7 @@ public void run() { Thread.sleep(DURATION - duration); } } catch (InterruptedException e) { + SLF4J_LOGGER.warn("Event alert task interrupted."); active = false; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventDecorator.java b/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventDecorator.java index 04370dbf7f..ada6be1c4c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventDecorator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventDecorator.java @@ -28,6 +28,8 @@ import freemarker.template.Template; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.alarm.spi.AlertEntity; @@ -35,6 +37,7 @@ import com.dianping.cat.alarm.spi.decorator.Decorator; public class EventDecorator extends Decorator implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(EventDecorator.class); public static final String ID = AlertType.Event.getName(); @@ -60,6 +63,8 @@ public String generateContent(AlertEntity alert) { Template t = m_configuration.getTemplate("eventAlert.ftl"); t.process(datas, sw); } catch (Exception e) { + LOGGER.error("Unable to build event alert content, group={}, metric={}, date={}.", alert.getGroup(), + alert.getMetric(), alert.getDate(), e); Cat.logError("build front end content error:" + alert.toString(), e); } @@ -86,6 +91,7 @@ public void initialize() throws InitializationException { try { m_configuration.setClassForTemplateLoading(this.getClass(), "/freemaker"); } catch (Exception e) { + LOGGER.error("Unable to initialize event alert decorator template loading.", e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionAlert.java index c1893e1afc..27a67441af 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionAlert.java @@ -25,6 +25,8 @@ import java.util.Map; import java.util.Map.Entry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.helper.Threads.Task; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -48,6 +50,7 @@ @Named public class ExceptionAlert implements Task { + private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionAlert.class); protected static final long DURATION = TimeHelper.ONE_MINUTE; @@ -99,7 +102,9 @@ private void handleExceptions(List itemList) { entity.setMetric(metricName).setType(getName()).setGroup(domain); m_sendManager.addAlert(entity); } + LOGGER.info("Exception alerts queued, domain={}, alertCount={}.", domain, exceptions.size()); } catch (Exception e) { + LOGGER.error("Unable to handle exception alerts, domain={}.", entry.getKey(), e); Cat.logError(e); } } @@ -144,11 +149,15 @@ public void run() { items.add(item); } } + LOGGER.info("Exception alert cycle started, itemCount={}, filteredItemCount={}.", itemList.size(), + items.size()); handleExceptions(items); t.setStatus(Transaction.SUCCESS); } catch (Exception e) { t.setStatus(e); + LOGGER.error("Exception alert cycle failed.", e); + Cat.logError(e); } finally { t.complete(); } @@ -159,6 +168,7 @@ public void run() { Thread.sleep(DURATION - duration); } } catch (InterruptedException e) { + LOGGER.warn("Exception alert task interrupted."); active = false; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java index 7de1b3543c..37ad44b5c7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java @@ -28,6 +28,8 @@ import freemarker.template.Template; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; @@ -37,6 +39,7 @@ import com.dianping.cat.report.alert.summary.AlertSummaryExecutor; public class ExceptionDecorator extends ProjectDecorator implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionDecorator.class); public static final String ID = AlertType.Exception.getName(); @@ -56,6 +59,8 @@ public String generateContent(AlertEntity alert) { Template t = m_configuration.getTemplate("exceptionAlert.ftl"); t.process(dataMap, sw); } catch (Exception e) { + LOGGER.error("Unable to build exception alert content, group={}, date={}, content={}.", alert.getGroup(), + alert.getDate(), alert.getContent(), e); Cat.logError("build exception content error:" + alert.toString(), e); } @@ -65,6 +70,8 @@ public String generateContent(AlertEntity alert) { try { summaryContext = m_executor.execute(alert.getGroup(), alert.getDate()); } catch (Exception e) { + LOGGER.error("Unable to append exception alert summary, group={}, date={}.", alert.getGroup(), + alert.getDate(), e); Cat.logError(alert.toString(), e); } @@ -108,6 +115,7 @@ public void initialize() throws InitializationException { try { m_configuration.setClassForTemplateLoading(this.getClass(), "/freemaker"); } catch (Exception e) { + LOGGER.error("Unable to initialize exception alert decorator template loading.", e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java index 64fe7aa321..989db1f824 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java @@ -23,6 +23,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -40,6 +42,7 @@ @Named public class ExceptionRuleConfigManager implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionRuleConfigManager.class); private static final String CONFIG_NAME = "exceptionRuleConfig"; @@ -57,6 +60,14 @@ public class ExceptionRuleConfigManager implements Initializable { private ExceptionRuleConfig m_exceptionRuleConfig; + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + public boolean deleteExceptionExclude(String domain, String exceptionName) { m_exceptionRuleConfig.removeExceptionExclude(domain + ":" + exceptionName); @@ -73,12 +84,15 @@ public boolean deleteExceptionLimit(String domain, String exceptionName) { public void initialize() throws InitializationException { refreshSpringBeans(); + LOGGER.info("Initializing exception rule config manager, configName={}.", CONFIG_NAME); try { Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); String content = config.getContent(); m_configId = config.getId(); m_exceptionRuleConfig = DefaultSaxParser.parse(content); } catch (DalNotFoundException e) { + LOGGER.warn("Exception rule config not found in repository, loading default content, configName={}.", + CONFIG_NAME); try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -90,12 +104,15 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_exceptionRuleConfig = DefaultSaxParser.parse(content); } catch (Exception ex) { + LOGGER.error("Unable to create default exception rule config, configName={}.", CONFIG_NAME, ex); Cat.logError(ex); } } catch (Exception e) { + LOGGER.error("Unable to initialize exception rule config, configName={}.", CONFIG_NAME, e); Cat.logError(e); } if (m_exceptionRuleConfig == null) { + LOGGER.warn("Exception rule config is empty after initialization, using an empty config."); m_exceptionRuleConfig = new ExceptionRuleConfig(); } } @@ -163,6 +180,8 @@ private boolean storeConfig() { config.setContent(m_exceptionRuleConfig.toString()); m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); } catch (Exception e) { + LOGGER.error("Unable to store exception rule config, configName={}, configId={}.", CONFIG_NAME, + m_configId, e); Cat.logError(e); return false; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java index ccbc462023..73e279f744 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java @@ -25,6 +25,8 @@ import java.util.Map.Entry; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.helper.Threads.Task; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -59,6 +61,7 @@ @Named public class HeartbeatAlert implements Task { + private static final Logger LOGGER = LoggerFactory.getLogger(HeartbeatAlert.class); protected static final long DURATION = TimeHelper.ONE_MINUTE; @@ -108,6 +111,8 @@ private Map buildArrayForExtensions(List periods) { array[index] = detail.getValue() / unit; } catch (Exception e) { + LOGGER.warn("Unable to calculate heartbeat extension metric, periodMinute={}, metric={}:{}.", + period.getMinute(), metric.getKey(), metric.getValue(), e); array[index] = 0; } } @@ -363,6 +368,8 @@ private void processMeitrc(String domain, String ip, String metric, List domains = m_projectService.findAllDomains(); + LOGGER.info("Heartbeat alert cycle started, domainCount={}.", domains.size()); for (String domain : domains) { if (m_serverFilterConfigManager.validateDomain(domain) && StringUtils.isNotEmpty(domain)) { try { processDomain(domain); } catch (Exception e) { + LOGGER.error("Unable to process heartbeat alert domain, domain={}.", domain, e); Cat.logError(e); } } @@ -394,6 +403,7 @@ public void run() { t.setStatus(Transaction.SUCCESS); } catch (Exception e) { t.setStatus(e); + LOGGER.error("Heartbeat alert cycle failed.", e); } finally { t.complete(); } @@ -404,6 +414,7 @@ public void run() { Thread.sleep(DURATION - duration); } } catch (InterruptedException e) { + LOGGER.warn("Heartbeat alert task interrupted."); active = false; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java index 1a08bb5ac1..ca4bb11be9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java @@ -29,6 +29,8 @@ import java.util.regex.Pattern; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; @@ -58,6 +60,7 @@ import com.dianping.cat.task.TimerSyncTask.SyncHandler; public abstract class BaseRuleConfigManager { + private static final Logger LOGGER = LoggerFactory.getLogger(BaseRuleConfigManager.class); @Inject protected ConfigRepository m_configDao; @@ -77,9 +80,26 @@ public abstract class BaseRuleConfigManager { private long m_modifyTime; + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + + public void setHelper(BaseRuleHelper helper) { + m_helper = helper; + } + + public void setUserDefinedRuleManager(UserDefinedRuleManager manager) { + m_manager = manager; + } + public void initialize() throws InitializationException { refreshSpringBeans(); + LOGGER.info("Initializing alert rule config manager, configName={}.", getConfigName()); try { com.dianping.cat.core.config.Config config = m_configDao.findByName(getConfigName(), ConfigEntity.READSET_FULL); @@ -88,6 +108,8 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); } catch (DalNotFoundException e) { + LOGGER.warn("Alert rule config not found in repository, loading default content, configName={}.", + getConfigName()); try { String content = m_fetcher.getConfigContent(getConfigName()); com.dianping.cat.core.config.Config config = m_configDao.createLocal(); @@ -99,12 +121,16 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); } catch (Exception ex) { + LOGGER.error("Unable to create default alert rule config, configName={}.", getConfigName(), ex); Cat.logError(ex); } } catch (Exception e) { + LOGGER.error("Unable to initialize alert rule config, configName={}.", getConfigName(), e); Cat.logError(e); } if (m_config == null) { + LOGGER.warn("Alert rule config is empty after initialization, using an empty config, configName={}.", + getConfigName()); m_config = new MonitorRules(); } @@ -140,6 +166,7 @@ private void refreshConfig() throws DalException, SAXException, IOException { m_config = DefaultSaxParser.parse(content); m_modifyTime = modifyTime; + LOGGER.info("Refreshed alert rule config, configName={}, modifyTime={}.", getConfigName(), modifyTime); } } } @@ -163,6 +190,7 @@ private Rule copyRule(Rule rule) { try { return DefaultSaxParser.parseEntity(Rule.class, rule.toString()); } catch (Exception e) { + LOGGER.error("Unable to copy alert rule, configName={}, ruleId={}.", getConfigName(), rule.getId(), e); Cat.logError(e); return null; } @@ -178,6 +206,8 @@ private void decorateConfigOnDelete(List configs) { m_manager.removeById(id); } catch (DalException e) { + LOGGER.error("Unable to remove user defined alert rule text, configName={}, id={}.", + getConfigName(), subCondition.getText(), e); Cat.logError(e); } } @@ -198,6 +228,8 @@ private List decorateConfigOnRead(List originConfigs) { subCondition.setText(m_manager.getUserDefineText(id)); } catch (DalException e) { + LOGGER.error("Unable to read user defined alert rule text, configName={}, id={}.", + getConfigName(), subCondition.getText(), e); Cat.logError(e); } } @@ -226,6 +258,8 @@ private void decorateConfigOnStore(List configs) throws DalException { subCondition.setText(m_manager.addUserDefineText(userDefinedText)); } catch (DalException e) { + LOGGER.error("Unable to store user defined alert rule text, configName={}.", + getConfigName(), e); Cat.logError(e); } } @@ -243,6 +277,8 @@ private List deepCopy(List originConfigs) { result.add(copiedConfig); } catch (Exception e) { + LOGGER.error("Unable to copy alert rule config item, configName={}, item={}.", getConfigName(), config, + e); Cat.logError(e); } } @@ -339,6 +375,8 @@ public boolean insert(String xml) { return storeConfig(); } catch (Exception e) { + LOGGER.error("Unable to insert alert rule config, configName={}, xmlLength={}.", getConfigName(), + xml == null ? 0 : xml.length(), e); Cat.logError(e); return false; } @@ -378,6 +416,8 @@ protected boolean storeConfig() { config.setContent(m_config.toString()); m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); } catch (Exception e) { + LOGGER.error("Unable to store alert rule config, configName={}, configId={}.", getConfigName(), + m_configId, e); Cat.logError(e); return false; } @@ -389,6 +429,7 @@ protected void refreshSpringBeans() { ConfigRepository configDao = CatSpringContext.getBeanIfAvailable(ConfigRepository.class); ContentFetcher fetcher = CatSpringContext.getBeanIfAvailable(ContentFetcher.class); UserDefinedRuleManager manager = CatSpringContext.getBeanIfAvailable(UserDefinedRuleManager.class); + BaseRuleHelper helper = CatSpringContext.getBeanIfAvailable(BaseRuleHelper.class); if (configDao != null) { m_configDao = configDao; @@ -399,6 +440,9 @@ protected void refreshSpringBeans() { if (manager != null) { m_manager = manager; } + if (helper != null) { + m_helper = helper; + } } public String updateRule(String id, String metricsStr, String configsStr) throws Exception { diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java index 71cf185d35..6948035984 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java @@ -24,6 +24,8 @@ import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.helper.Splitters; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -41,6 +43,7 @@ @Named public class AlertSummaryExecutor { + private static final Logger LOGGER = LoggerFactory.getLogger(AlertSummaryExecutor.class); public static final long SUMMARY_DURATION = 5 * TimeHelper.ONE_MINUTE; @@ -82,6 +85,7 @@ public String execute(String domain, Date date) { date = normalizeDate(date); try { + LOGGER.info("Generating alert summary, domain={}, date={}.", domain, date); StringBuilder builder = new StringBuilder(); builder.append(m_relatedBuilder.generateHtml(domain, date)); @@ -92,6 +96,7 @@ public String execute(String domain, Date date) { return builder.toString(); } catch (Exception e) { t.setStatus(e); + LOGGER.error("Unable to generate alert summary, domain={}, date={}.", domain, date, e); Cat.logError("generate alert summary fail:" + domain + " " + date, e); } finally { t.complete(); @@ -110,6 +115,8 @@ public String execute(String domain, Date date, String receiverStr) { SendMessageEntity message = new SendMessageEntity(domain, title, "alertSummary", content, receivers); if (receivers.size() > 0) { + LOGGER.info("Sending alert summary mail, domain={}, date={}, receiverCount={}.", domain, date, + receivers.size()); m_sendManager.sendAlert(AlertChannel.MAIL, message); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java index d5ab62099c..3856a2f069 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java @@ -18,6 +18,8 @@ */ package com.dianping.cat.report.alert.summary; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -29,6 +31,7 @@ @Named public class AlertSummaryService { + private static final Logger LOGGER = LoggerFactory.getLogger(AlertSummaryService.class); @Inject private AlertSummaryRepository m_alertSummaryDao; @@ -45,6 +48,8 @@ public void insert(com.dianping.cat.home.alert.summary.entity.AlertSummary alert try { m_alertSummaryDao.insert(summary); } catch (DalException e) { + LOGGER.error("Unable to insert alert summary, domain={}, alertTime={}.", alertSummary.getDomain(), + alertSummary.getAlertDate(), e); Cat.logError("insert alert summary error: " + content, e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java index fc07986d55..8ee41fe0c4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java @@ -26,6 +26,8 @@ import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -44,6 +46,7 @@ @Named public class AlertInfoBuilder { + private static final Logger LOGGER = LoggerFactory.getLogger(AlertInfoBuilder.class); public static final String LONG_CALL = "long_call"; @@ -141,8 +144,12 @@ private Category generateCategoryByTimeCateDomain(Date date, String cate, String try { List dbAlerts = m_alertDao .queryAlertsByTimeCategoryDomain(startTime, date, dbCategoryName, domain, AlertEntity.READSET_FULL); + LOGGER.info("Loaded alert summary category alerts, category={}, domain={}, start={}, end={}, alertCount={}.", + cate, domain, startTime, date, dbAlerts.size()); setDBAlertsToCategory(category, dbAlerts); } catch (DalException e) { + LOGGER.error("Unable to load alert summary category alerts, category={}, domain={}, start={}, end={}.", cate, + domain, startTime, date, e); Cat.logError("find alerts error for category:" + cate + " domain:" + domain + " date:" + date, e); } @@ -160,8 +167,12 @@ private Category generateDependCategoryByTimeCateDomain(Date date, String cate, List dbAlerts = m_alertDao .queryAlertsByTimeCategoryDomain(startTime, date, dbCategoryName, domain, AlertEntity.READSET_FULL); + LOGGER.info("Loaded dependency alert summary alerts, category={}, domain={}, start={}, end={}, alertCount={}.", + cate, domain, startTime, date, dbAlerts.size()); setDBAlertsToCategory(category, dbAlerts); } catch (DalException e) { + LOGGER.error("Unable to load dependency alert summary alerts, category={}, domain={}, start={}, end={}.", + cate, domain, startTime, date, e); Cat.logError("find dependency alerts error for category:" + cate + " domain:" + domain + " date:" + date, e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java index ab33d31b33..11b5a7f6f5 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java @@ -23,6 +23,8 @@ import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -35,6 +37,7 @@ @Named(type = SummaryBuilder.class, value = AlterationSummaryBuilder.ID) public class AlterationSummaryBuilder extends SummaryBuilder { + private static final Logger LOGGER = LoggerFactory.getLogger(AlterationSummaryBuilder.class); public static final String ID = "AlterationSummaryContentGenerator"; @@ -52,6 +55,7 @@ public Map generateModel(String domain, Date date) { dataMap.put("count", alterations.size()); dataMap.put("items", alterations); } catch (DalException e) { + LOGGER.error("Unable to query alteration summary data, domain={}, date={}.", domain, date, e); Cat.logError(e); } return dataMap; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java index 9ce52d89b0..e395051ef0 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java @@ -23,6 +23,8 @@ import java.util.HashMap; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -40,6 +42,7 @@ @Named(type = SummaryBuilder.class, value = FailureSummaryBuilder.ID) public class FailureSummaryBuilder extends SummaryBuilder { + private static final Logger LOGGER = LoggerFactory.getLogger(FailureSummaryBuilder.class); public static final String ID = "FailureDecorator"; @@ -85,12 +88,16 @@ public Map generateModel(String domain, Date endTime) { if (m_service.isEligable(request)) { ModelResponse response = m_service.invoke(request); report = response.getModel(); + } else { + LOGGER.warn("Problem report service is not eligible for alert failure summary, domain={}, date={}.", domain, + endTime); } try { addFailureInfo(result, report); addDistributeInfo(result, report); } catch (Exception ex) { + LOGGER.error("Unable to build failure summary model, domain={}, date={}.", domain, endTime, ex); Cat.logError(ex); } return result; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java index f863751546..a5f6e5cfe5 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java @@ -24,15 +24,19 @@ import java.util.Map; import java.util.TreeMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; +import com.dianping.cat.Cat; import com.dianping.cat.home.alert.summary.entity.AlertSummary; import com.dianping.cat.report.alert.summary.AlertSummaryService; import com.dianping.cat.spring.CatSpringContext; @Named(type = SummaryBuilder.class, value = RelatedSummaryBuilder.ID) public class RelatedSummaryBuilder extends SummaryBuilder { + private static final Logger LOGGER = LoggerFactory.getLogger(RelatedSummaryBuilder.class); public static final String ID = "AlertSummaryContentGenerator"; @@ -64,7 +68,8 @@ private Map gatherDomainsForDependBusiness(Map m categories.put(AlertInfoBuilder.LONG_CALL, longCallMap); map.put(AlertInfoBuilder.LONG_CALL + "_length", alerts.size()); } catch (Exception ex) { - ex.printStackTrace(); + LOGGER.error("Unable to gather dependent business domains for alert summary, keys={}.", map.keySet(), ex); + Cat.logError("gather dependent business domains for alert summary error", ex); } return map; @@ -73,6 +78,7 @@ private Map gatherDomainsForDependBusiness(Map m @Override public Map generateModel(String domain, Date date) { refreshSpringBeans(); + LOGGER.info("Generating related alert summary model, domain={}, date={}.", domain, date); AlertSummary alertSummary = m_alertSummaryManager.generateAlertSummary(domain, date); AlertSummaryVisitor visitor = new AlertSummaryVisitor(alertSummary.getDomain()); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/SummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/SummaryBuilder.java index a4b3d9d3db..21578af5e1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/SummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/SummaryBuilder.java @@ -26,10 +26,13 @@ import freemarker.template.Template; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; public abstract class SummaryBuilder implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(SummaryBuilder.class); public Configuration m_configuration; @@ -43,6 +46,8 @@ public String generateHtml(String domain, Date date) { Template t = m_configuration.getTemplate(getTemplateAddress()); t.process(dataMap, sw); } catch (Exception e) { + LOGGER.error("Unable to generate alert summary html, builder={}, template={}, domain={}, date={}.", + getID(), getTemplateAddress(), domain, date, e); Cat.logError(e); } return sw.toString(); @@ -56,6 +61,8 @@ public void initialize() throws InitializationException { try { m_configuration.setClassForTemplateLoading(this.getClass(), "/freemaker"); } catch (Exception e) { + LOGGER.error("Unable to initialize alert summary template loading, builder={}, template={}.", getID(), + getTemplateAddress(), e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java index 1994a4e831..9329c92ff7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java @@ -44,6 +44,7 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.util.StringUtils; +import org.slf4j.LoggerFactory; import org.unidal.helper.Splitters; import org.unidal.helper.Threads.Task; import org.unidal.lookup.annotation.Inject; @@ -58,6 +59,7 @@ @Named public class TransactionAlert implements Task, LogEnabled { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(TransactionAlert.class); private static final long DURATION = TimeHelper.ONE_MINUTE; @@ -251,6 +253,10 @@ private void processRule(Rule rule) { String monitor = fields.get(3); List alertResults = computeAlertForRule(domain, type, name, monitor, rule.getConfigs()); + if (!alertResults.isEmpty()) { + SLF4J_LOGGER.info("Transaction alerts queued, ruleId={}, domain={}, metric={}, alertCount={}.", rule.getId(), + domain, type + "-" + name + "-" + monitor, alertResults.size()); + } for (DataCheckEntity alertResult : alertResults) { AlertEntity entity = new AlertEntity(); @@ -273,6 +279,7 @@ public void run() { MonitorRules monitorRules = m_ruleConfigManager.getMonitorRules(); Map rules = monitorRules.getRules(); + SLF4J_LOGGER.info("Transaction alert cycle started, ruleCount={}.", rules.size()); for (Entry entry : rules.entrySet()) { //告警开关 if (null != entry.getValue().getAvailable() && !entry.getValue().getAvailable()) { @@ -281,12 +288,14 @@ public void run() { try { processRule(entry.getValue()); } catch (Exception e) { + SLF4J_LOGGER.error("Unable to process transaction alert rule, ruleId={}.", entry.getKey(), e); Cat.logError(e); } } t.setStatus(Transaction.SUCCESS); } catch (Exception e) { t.setStatus(e); + SLF4J_LOGGER.error("Transaction alert cycle failed.", e); Cat.logError(e); } finally { t.complete(); @@ -298,6 +307,7 @@ public void run() { Thread.sleep(DURATION - duration); } } catch (InterruptedException e) { + SLF4J_LOGGER.warn("Transaction alert task interrupted."); active = false; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionDecorator.java b/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionDecorator.java index f51809e6c5..e4bb63e185 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionDecorator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionDecorator.java @@ -28,6 +28,8 @@ import freemarker.template.Template; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.alarm.spi.AlertEntity; @@ -35,6 +37,7 @@ import com.dianping.cat.alarm.spi.decorator.Decorator; public class TransactionDecorator extends Decorator implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(TransactionDecorator.class); public static final String ID = AlertType.Transaction.getName(); @@ -60,6 +63,8 @@ public String generateContent(AlertEntity alert) { Template t = m_configuration.getTemplate("transactionAlert.ftl"); t.process(datas, sw); } catch (Exception e) { + LOGGER.error("Unable to build transaction alert content, group={}, metric={}, date={}.", alert.getGroup(), + alert.getMetric(), alert.getDate(), e); Cat.logError("build front end content error:" + alert.toString(), e); } @@ -87,6 +92,7 @@ public void initialize() throws InitializationException { try { m_configuration.setClassForTemplateLoading(this.getClass(), "/freemaker"); } catch (Exception e) { + LOGGER.error("Unable to initialize transaction alert decorator template loading.", e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java index 3686ae07ea..d603cdf15b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java @@ -23,6 +23,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -41,6 +43,7 @@ @Named public class DomainGroupConfigManager implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(DomainGroupConfigManager.class); private static final String CONFIG_NAME = "domainGroup"; @@ -58,6 +61,14 @@ public DomainGroup getDomainGroup() { return m_domainGroup; } + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + @Override public void initialize() throws InitializationException { refreshSpringBeans(); @@ -68,7 +79,10 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_domainGroup = DefaultSaxParser.parse(content); + LOGGER.info("Loaded domain group config from repository, configId={}.", m_configId); } catch (DalNotFoundException e) { + LOGGER.warn("Domain group config is missing in repository, loading default content from fetcher.", e); + try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -79,14 +93,18 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_domainGroup = DefaultSaxParser.parse(content); + LOGGER.info("Initialized domain group config from default content, configId={}.", m_configId); } catch (Exception ex) { + LOGGER.error("Unable to initialize domain group config from default content.", ex); Cat.logError(ex); } } catch (Exception e) { + LOGGER.error("Unable to load domain group config from repository.", e); Cat.logError(e); } if (m_domainGroup == null) { m_domainGroup = new DomainGroup(); + LOGGER.warn("Domain group config is empty after initialization, using a new empty config."); } } @@ -96,6 +114,7 @@ public boolean insert(String xml) { return storeConfig(); } catch (Exception e) { + LOGGER.error("Unable to parse domain group xml for insert. xmlLength={}.", xml == null ? 0 : xml.length(), e); Cat.logError(e); return false; } @@ -108,6 +127,7 @@ public boolean insertFromJson(String json) { m_domainGroup.addDomain(domain); return storeConfig(); } catch (Exception e) { + LOGGER.error("Unable to parse domain group json for insert. jsonLength={}.", json == null ? 0 : json.length(), e); Cat.logError(e); return false; } @@ -170,7 +190,10 @@ private boolean storeConfig() { config.setName(CONFIG_NAME); config.setContent(m_domainGroup.toString()); m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + LOGGER.info("Stored domain group config, configId={}, domainCount={}.", m_configId, + m_domainGroup.getDomains().size()); } catch (Exception e) { + LOGGER.error("Unable to store domain group config, configId={}.", m_configId, e); Cat.logError(e); return false; } @@ -184,9 +207,11 @@ private void refreshSpringBeans() { if (configDao != null) { m_configDao = configDao; + LOGGER.info("DomainGroupConfigManager refreshed Spring ConfigRepository dependency."); } if (fetcher != null) { m_fetcher = fetcher; + LOGGER.info("DomainGroupConfigManager refreshed Spring ContentFetcher dependency."); } } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java index 9538e08a6e..fc1d3984f3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java @@ -35,6 +35,8 @@ import org.unidal.helper.Splitters; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -51,6 +53,8 @@ import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); + @Inject private JspViewer m_jspViewer; @@ -110,6 +114,8 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { case ALERT: List receivers = Splitters.by(",").noEmptyItem().split(payload.getReceivers()); if (receivers == null || receivers.size() == 0) { + LOGGER.warn("Manual alert send request lacks receivers, channel={}, type={}, group={}.", + payload.getChannel(), payload.getType(), payload.getGroup()); setAlertResult(model, 0); } else { SendMessageEntity message = new SendMessageEntity(payload.getGroup(), payload.getTitle(), payload.getType(), @@ -120,9 +126,13 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { if (result) { setAlertResult(model, 1); } else { + LOGGER.warn("Manual alert send failed, channel={}, type={}, group={}, receiverCount={}.", + payload.getChannel(), payload.getType(), payload.getGroup(), receivers.size()); setAlertResult(model, 2); } } catch (NullPointerException ex) { + LOGGER.error("Manual alert send failed because channel is invalid, channel={}, type={}, group={}.", + payload.getChannel(), payload.getType(), payload.getGroup(), ex); setAlertResult(model, 3); } } @@ -137,12 +147,16 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { int count = m_alertDao.insert(alertEntity); if (count == 0) { + LOGGER.warn("Manual alert insert returned zero, domain={}, category={}, metric={}.", + alertEntity.getDomain(), alertEntity.getCategory(), alertEntity.getMetric()); setAlertResult(model, 5); } else { setAlertResult(model, 1); } } catch (DalException e) { setAlertResult(model, 5); + LOGGER.error("Unable to insert manual alert, domain={}, category={}, metric={}.", + alertEntity.getDomain(), alertEntity.getCategory(), alertEntity.getMetric(), e); Cat.logError(e); } } @@ -162,6 +176,8 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { } } catch (DalException e) { alerts = new ArrayList(); + LOGGER.error("Unable to query alerts, startTime={}, endTime={}, domain={}, alertTypes={}.", startTime, + endTime, domain, alertTypeStr, e); Cat.logError(e); } model.setAlertMinutes(generateAlertMinutes(alerts)); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Payload.java b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Payload.java index eb27a50943..e25cf83741 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Payload.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Payload.java @@ -23,6 +23,8 @@ import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.helper.Splitters; import org.unidal.lookup.util.StringUtils; import org.unidal.web.mvc.ActionContext; @@ -33,6 +35,8 @@ import com.dianping.cat.report.ReportPage; public class Payload implements ActionPayload { + private static final Logger LOGGER = LoggerFactory.getLogger(Payload.class); + private ReportPage m_page; @FieldMeta("channel") @@ -110,6 +114,7 @@ public Date getAlertTime() { try { return m_format.parse(m_alertTime); } catch (Exception e) { + LOGGER.warn("Unable to parse alertTime, value={}. Use current time.", m_alertTime); return new Date(); } } @@ -196,6 +201,7 @@ public Date getEndTime() { try { return m_format.parse(m_endTime); } catch (Exception e) { + LOGGER.warn("Unable to parse alert endTime, value={}. Use current time.", m_endTime); return new Date(); } } @@ -281,6 +287,7 @@ public Date getStartTime() { try { return m_format.parse(m_startTime); } catch (Exception e) { + LOGGER.warn("Unable to parse alert startTime, value={}. Use default 15 minutes ago.", m_startTime); return new Date(System.currentTimeMillis() - 15 * TimeHelper.ONE_MINUTE); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java index d7438774a7..2dd620734f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java @@ -36,6 +36,8 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -50,6 +52,7 @@ import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); private final static String EMPTY = "N/A"; @@ -89,6 +92,7 @@ private Alteration buildAlteration(Payload payload) { try { alt.setUrl(URLDecoder.decode(url, "UTF-8")); } catch (UnsupportedEncodingException e) { + LOGGER.warn("Unable to decode alteration url, domain={}, type={}, title={}.", domain, type, title, e); Cat.logError(e); alt.setUrl(""); } @@ -134,6 +138,8 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { switch (action) { case INSERT: if (isIllegalArgs(payload)) { + LOGGER.warn("Illegal alteration insert request, type={}, domain={}, hostname={}, title={}.", + payload.getType(), payload.getDomain(), payload.getHostname(), payload.getTitle()); setInsertResult(model, 2); } else { Alteration alt = buildAlteration(payload); @@ -141,12 +147,16 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { int count = m_alterationDao.insert(alt); if (count == 0) { + LOGGER.warn("Alteration insert returned zero, type={}, domain={}, title={}.", alt.getType(), + alt.getDomain(), alt.getTitle()); setInsertResult(model, 1); break; } else { setInsertResult(model, 0); } } catch (Exception e) { + LOGGER.error("Unable to insert alteration, type={}, domain={}, title={}.", alt.getType(), + alt.getDomain(), alt.getTitle(), e); Cat.logError(e); setInsertResult(model, 1); } @@ -171,6 +181,8 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { } catch (DalNotFoundException e) { // ignore it } catch (Exception e) { + LOGGER.error("Unable to query alterations, startTime={}, endTime={}, type={}, domain={}, hostname={}.", + startTime, endTime, type, domain, hostname, e); Cat.logError(e); } model.setAlterationMinuites(generateAlterationMinutes(alts)); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Payload.java b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Payload.java index cf519f87e9..1f555b6d57 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Payload.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Payload.java @@ -22,6 +22,8 @@ import java.text.SimpleDateFormat; import java.util.Date; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.util.StringUtils; import org.unidal.web.mvc.ActionContext; import org.unidal.web.mvc.payload.annotation.FieldMeta; @@ -31,6 +33,8 @@ import com.dianping.cat.report.ReportPage; public class Payload extends AbstractReportPayload { + private static final Logger LOGGER = LoggerFactory.getLogger(Payload.class); + private ReportPage m_page; @FieldMeta("altType") @@ -111,6 +115,7 @@ public Date getAlterationDate() { } } catch (ParseException e) { + LOGGER.warn("Unable to parse alterationDate, value={}. Use current time.", m_alterationDate); return new Date(); } } @@ -174,6 +179,7 @@ public Date getEndTime() { try { return m_sdf.parse(m_endTime); } catch (ParseException e) { + LOGGER.warn("Unable to parse alteration endTime, value={}. Use current time.", m_endTime); return new Date(); } } @@ -227,6 +233,7 @@ public Date getStartTime() { try { return m_sdf.parse(m_startTime); } catch (ParseException e) { + LOGGER.warn("Unable to parse alteration startTime, value={}. Use current time.", m_startTime); return new Date(); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/Handler.java index dbc1c47579..32b8f3089b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/Handler.java @@ -24,6 +24,8 @@ import java.util.Date; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -39,6 +41,8 @@ import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; public class Handler implements PageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); + @Inject private JspViewer m_jspViewer; @@ -77,6 +81,8 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { model.setStartTime(startDate); model.setEndTime(endDate); + LOGGER.info("Handling business report outbound, action={}, type={}, name={}, start={}, end={}.", action, + payload.getType(), payload.getName(), startDate, endDate); switch (action) { case VIEW: @@ -98,14 +104,19 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { private void refreshSpringBeans() { ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + BusinessTagConfigManager tagConfigManager = CatSpringContext.getBeanIfAvailable(BusinessTagConfigManager.class); if (projectService != null) { m_projectService = projectService; } + if (tagConfigManager != null) { + m_tagConfigManager = tagConfigManager; + } } private Map buildLineCharts(Type type, String name, Date start, Date end) { Map allCharts = null; + LOGGER.info("Building business line charts, type={}, name={}, start={}, end={}.", type, name, start, end); if (type == Type.Tag) { allCharts = m_graphCreator.buildGraphByTag(start, end, name); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessDataFetcher.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessDataFetcher.java index 61d85712f6..2a2e7c30aa 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessDataFetcher.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessDataFetcher.java @@ -21,6 +21,8 @@ import java.util.LinkedHashMap; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import com.dianping.cat.consumer.business.model.entity.BusinessItem; @@ -31,13 +33,21 @@ import com.dianping.cat.report.page.business.task.BusinessKeyHelper; public class BusinessDataFetcher { + private static final Logger LOGGER = LoggerFactory.getLogger(BusinessDataFetcher.class); @Inject private BusinessKeyHelper m_keyHelper; + public void setKeyHelper(BusinessKeyHelper keyHelper) { + m_keyHelper = keyHelper; + } + public Map buildGraphData(BusinessReport businessReport) { BusinessDataBuilder builder = new BusinessDataBuilder(); + if (businessReport == null) { + LOGGER.error("Business report is null while building graph data."); + } builder.visitBusinessReport(businessReport); return builder.getDatas(); } @@ -50,6 +60,10 @@ public class BusinessDataBuilder extends BaseVisitor { @Override public void visitBusinessReport(BusinessReport report) { + if (report == null) { + LOGGER.error("Cannot visit null business report."); + } + m_domain = report.getDomain(); super.visitBusinessReport(report); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java index 684da8616f..20642cb362 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java @@ -30,6 +30,8 @@ import java.util.Map.Entry; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.tuple.Pair; @@ -57,6 +59,7 @@ import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; public class BusinessGraphCreator extends AbstractGraphCreator { + private static final Logger LOGGER = LoggerFactory.getLogger(BusinessGraphCreator.class); @Inject private CachedBusinessReportService m_reportService; @@ -132,6 +135,8 @@ private Map buildCharts(final Map datas, Ma lineChart.add(Chinese.BASELINE_VALUE, convertToMap(m_dataExtractor.extract(baselines), start, step)); charts.put(key, lineChart); } catch (Exception e) { + LOGGER.error("Unable to build business line chart, key={}, start={}, end={}.", entry.getKey(), start, end, + e); Cat.logError(e); } } @@ -157,6 +162,7 @@ protected String buildContactInfo(String domainName) { return builder.toString(); } } catch (Exception ex) { + LOGGER.error("Unable to build business contact info, domain={}.", domainName, ex); Cat.logError("build contact info error for doamin: " + domainName, ex); } return null; @@ -164,6 +170,7 @@ protected String buildContactInfo(String domainName) { public Map buildGraphByDomain(Date start, Date end, String domain) { refreshSpringBeans(); + LOGGER.info("Building business graph by domain, domain={}, start={}, end={}.", domain, start, end); BusinessReportConfig config = m_configManager.queryConfigByDomain(domain); HashMap result = new LinkedHashMap(); @@ -181,6 +188,8 @@ public Map buildGraphByDomain(Date start, Date end, String do result.putAll(buildCharts(datas, baseLines, start, end, configs)); result.putAll(buildCharts(customDatas, customBaseLines, start, end, configs)); + } else { + LOGGER.warn("Business report config is null while building graph by domain, domain={}.", domain); } return result; @@ -188,6 +197,7 @@ public Map buildGraphByDomain(Date start, Date end, String do public Map buildGraphByTag(Date start, Date end, String tag) { refreshSpringBeans(); + LOGGER.info("Building business graph by tag, tag={}, start={}, end={}.", tag, start, end); Tag tagConfig = m_tagManager.findTag(tag); @@ -233,6 +243,7 @@ public Map buildGraphByTag(Date start, Date end, String tag) return buildCharts(needed, baseLines, start, end, configs); } else { + LOGGER.warn("Business tag config is missing while building graph, tag={}.", tag); return new HashMap(); } } @@ -274,6 +285,12 @@ private void buildTagConfigs(List items, Map buildGraphData(BusinessReport report, BusinessReportConfig config) { + if (report == null) { + LOGGER.error("Business report is null before graph data extraction, configDomain={}, itemCount={}.", + config == null ? null : config.getId(), + config == null ? 0 : config.getBusinessItemConfigs().size()); + } + Map values = new LinkedHashMap(); Map datas = m_dataFetcher.buildGraphData(report); Map businessItemConfigs = config.getBusinessItemConfigs(); @@ -388,6 +405,8 @@ private Map prepareCustomBaseLines(Date start, Date end, Strin customBaseLines.put(key, baseLine); } catch (Exception e) { + LOGGER.error("Unable to prepare custom baseline, currentDomain={}, customConfigId={}, start={}, end={}.", + currentDomain, customConfig.getId(), start, end, e); Cat.logError(e); } } @@ -424,6 +443,8 @@ private Map prepareCustomDatas(Date start, Date end, String cu customDatas.put(key, data); } catch (Exception e) { + LOGGER.error("Unable to prepare custom business data, currentDomain={}, customConfigId={}, start={}, end={}.", + currentDomain, customConfig.getId(), start, end, e); Cat.logError(e); } } @@ -433,6 +454,10 @@ private Map prepareCustomDatas(Date start, Date end, String cu private void refreshSpringBeans() { BusinessConfigManager configManager = CatSpringContext.getBeanIfAvailable(BusinessConfigManager.class); ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + BusinessTagConfigManager tagManager = CatSpringContext.getBeanIfAvailable(BusinessTagConfigManager.class); + BusinessDataFetcher dataFetcher = CatSpringContext.getBeanIfAvailable(BusinessDataFetcher.class); + BusinessKeyHelper keyHelper = CatSpringContext.getBeanIfAvailable(BusinessKeyHelper.class); + CustomDataCalculator customDataCalculator = CatSpringContext.getBeanIfAvailable(CustomDataCalculator.class); if (configManager != null) { m_configManager = configManager; @@ -440,5 +465,17 @@ private void refreshSpringBeans() { if (projectService != null) { m_projectService = projectService; } + if (tagManager != null) { + m_tagManager = tagManager; + } + if (dataFetcher != null) { + m_dataFetcher = dataFetcher; + } + if (keyHelper != null) { + m_keyHelper = keyHelper; + } + if (customDataCalculator != null) { + m_customDataCalculator = customDataCalculator; + } } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/CustomDataCalculator.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/CustomDataCalculator.java index a9cfd23991..80bdf2965e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/CustomDataCalculator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/CustomDataCalculator.java @@ -44,6 +44,10 @@ public class CustomDataCalculator { @Inject private BusinessKeyHelper m_keyHelper; + public void setKeyHelper(BusinessKeyHelper keyHelper) { + m_keyHelper = keyHelper; + } + public List translatePattern(String pattern) { List infos = new ArrayList(); boolean result = true; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/CachedBusinessReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/CachedBusinessReportService.java index e610f4782e..c2dd738a49 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/CachedBusinessReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/CachedBusinessReportService.java @@ -32,6 +32,7 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.spring.CatSpringContext; public class CachedBusinessReportService { @@ -52,6 +53,8 @@ protected boolean removeEldestEntry(Entry eldest) { private ModelService m_service; public BusinessReport queryBusinessReport(String domain, Date start) { + refreshSpringBeans(); + long time = start.getTime(); ModelPeriod period = ModelPeriod.getByTime(time); @@ -84,4 +87,12 @@ private BusinessReport getReportFromCache(String domain, long time) { } return result; } + + private void refreshSpringBeans() { + BusinessReportService reportService = CatSpringContext.getBeanIfAvailable(BusinessReportService.class); + + if (reportService != null) { + m_reportService = reportService; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/HistoricalBusinessService.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/HistoricalBusinessService.java index 59822d3563..a791ee40be 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/HistoricalBusinessService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/HistoricalBusinessService.java @@ -27,6 +27,7 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.BaseHistoricalModelService; import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.spring.CatSpringContext; public class HistoricalBusinessService extends BaseHistoricalModelService { @@ -47,7 +48,17 @@ protected BusinessReport buildModel(ModelRequest request) throws Exception { } private BusinessReport getReportFromDatabase(long date, String domain) { + refreshSpringBeans(); + return m_reportService.queryReport(domain, new Date(date), new Date(date + TimeHelper.ONE_HOUR)); } + private void refreshSpringBeans() { + BusinessReportService reportService = CatSpringContext.getBeanIfAvailable(BusinessReportService.class); + + if (reportService != null) { + m_reportService = reportService; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java index 7711806198..d1cd1160a1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java @@ -168,6 +168,11 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { private void refreshSpringBeans() { BusinessConfigManager configManager = CatSpringContext.getBeanIfAvailable(BusinessConfigManager.class); BaselineService baselineService = CatSpringContext.getBeanIfAvailable(BaselineService.class); + BusinessKeyHelper keyHelper = CatSpringContext.getBeanIfAvailable(BusinessKeyHelper.class); + BaselineConfigManager baselineConfigManager = CatSpringContext.getBeanIfAvailable(BaselineConfigManager.class); + BusinessPointParser parser = CatSpringContext.getBeanIfAvailable(BusinessPointParser.class); + BaselineCreator baselineCreator = CatSpringContext.getBeanIfAvailable(BaselineCreator.class); + BusinessReportService reportService = CatSpringContext.getBeanIfAvailable(BusinessReportService.class); if (configManager != null) { m_configManager = configManager; @@ -175,6 +180,21 @@ private void refreshSpringBeans() { if (baselineService != null) { m_baselineService = baselineService; } + if (keyHelper != null) { + m_keyHelper = keyHelper; + } + if (baselineConfigManager != null) { + m_baselineConfigManager = baselineConfigManager; + } + if (parser != null) { + m_parser = parser; + } + if (baselineCreator != null) { + m_baselineCreator = baselineCreator; + } + if (reportService != null) { + m_reportService = reportService; + } } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java index 4249e2820c..6635270390 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java @@ -21,6 +21,8 @@ import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Named; @@ -51,6 +53,7 @@ @Named public class CrossReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(CrossReportService.class); @Override public CrossReport makeReport(String domain, Date start, Date end) { @@ -76,8 +79,10 @@ public CrossReport queryDailyReport(String domain, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Cross daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { + LOGGER.error("Unable to query cross daily report, domain={}, period={}.", domain, new Date(startTime), + e); Cat.logError(e); } } @@ -142,6 +147,8 @@ public CrossReport queryHourlyReport(String domain, Date start, Date end) { reports = m_hourlyReportDao .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to query cross hourly report list, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } if (reports != null) { @@ -151,8 +158,11 @@ public CrossReport queryHourlyReport(String domain, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Cross hourly report content is missing, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); } catch (Exception e) { + LOGGER.error("Unable to parse cross hourly report, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); Cat.logError(e); } } @@ -173,8 +183,9 @@ public CrossReport queryMonthlyReport(String domain, Date start) { .findReportByDomainNamePeriod(start, domain, CrossAnalyzer.ID, MonthlyReportEntity.READSET_FULL); return queryFromMonthlyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Cross monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query cross monthly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return new CrossReport(domain); @@ -188,8 +199,9 @@ public CrossReport queryWeeklyReport(String domain, Date start) { return queryFromWeeklyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Cross weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query cross weekly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return new CrossReport(domain); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java index ea4e4c1ae9..bf5d91e2ac 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java @@ -22,6 +22,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -43,6 +45,7 @@ @Named(type = TaskBuilder.class, value = CrossReportBuilder.ID) public class CrossReportBuilder implements TaskBuilder, Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(CrossReportBuilder.class); public static final String ID = CrossAnalyzer.ID; @@ -51,6 +54,7 @@ public class CrossReportBuilder implements TaskBuilder, Initializable { @Override public boolean buildDailyTask(String name, String domain, Date period) { + LOGGER.info("Building cross daily report, name={}, domain={}, period={}.", name, domain, period); CrossReport crossReport = queryHourlyReportsByDuration(name, domain, period, TaskHelper.tomorrowZero(period)); DailyReport report = new DailyReport(); @@ -71,6 +75,7 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { + LOGGER.info("Building cross monthly report, name={}, domain={}, period={}.", name, domain, period); CrossReport crossReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); MonthlyReport report = new MonthlyReport(); @@ -86,6 +91,7 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { + LOGGER.info("Building cross weekly report, name={}, domain={}, period={}.", name, domain, period); CrossReport crossReport = queryDailyReportsByDuration(domain, period, new Date(period.getTime() + TimeHelper.ONE_WEEK)); WeeklyReport report = new WeeklyReport(); @@ -132,6 +138,8 @@ private CrossReport queryDailyReportsByDuration(String domain, Date start, Date .queryReport(domain, new Date(startTime), new Date(startTime + TimeHelper.ONE_DAY)); reportModel.accept(merger); } catch (Exception e) { + LOGGER.error("Unable to merge cross daily report into duration report, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java index ebe3aad7ed..525e515dee 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java @@ -70,6 +70,14 @@ public TopoGraphFormatConfig getConfig() { return m_config; } + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + @Override public void initialize() throws InitializationException { refreshSpringBeans(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java index 0c042a88ac..da462eacab 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java @@ -239,6 +239,14 @@ public synchronized TopologyGraphConfig getConfig() { return m_config; } + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + @Override public void initialize() throws InitializationException { refreshSpringBeans(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java index 0a4974096c..95634d673a 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java @@ -21,6 +21,8 @@ import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Named; @@ -39,6 +41,7 @@ @Named public class DependencyReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(DependencyReportService.class); @Override public DependencyReport makeReport(String domain, Date start, Date end) { @@ -78,6 +81,8 @@ public DependencyReport queryHourlyReport(String domain, Date start, Date end) { reports = m_hourlyReportDao .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to query dependency hourly report list, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } if (reports != null) { @@ -86,8 +91,11 @@ public DependencyReport queryHourlyReport(String domain, Date start, Date end) { DependencyReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Dependency hourly report content is missing, domain={}, reportId={}, period={}.", + domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { + LOGGER.error("Unable to parse dependency hourly report, domain={}, reportId={}, period={}.", + domain, report.getId(), report.getPeriod(), e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java index 0eb8f3683b..806a0a1208 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java @@ -23,6 +23,8 @@ import java.util.Map.Entry; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -41,6 +43,7 @@ @Named(type = TaskBuilder.class, value = DependencyReportBuilder.ID) public class DependencyReportBuilder implements TaskBuilder { + private static final Logger LOGGER = LoggerFactory.getLogger(DependencyReportBuilder.class); public static final String ID = DependencyAnalyzer.ID; @@ -61,10 +64,14 @@ public boolean buildDailyTask(String name, String reportDomain, Date reportPerio @Override public boolean buildHourlyTask(String name, String reportDomain, Date reportPeriod) { refreshSpringBeans(); + LOGGER.info("Building dependency hourly topology graph, name={}, reportDomain={}, period={}.", name, reportDomain, + reportPeriod); + Date end = new Date(reportPeriod.getTime() + TimeHelper.ONE_HOUR); Set domains = m_reportService.queryAllDomainNames(reportPeriod, end, DependencyAnalyzer.ID); boolean result = true; + LOGGER.info("Preparing dependency topology graph, period={}, domainCount={}.", reportPeriod, domains.size()); m_graphBuilder.getGraphs().clear(); for (String domain : domains) { DependencyReport report = m_reportService.queryReport(domain, reportPeriod, end); @@ -90,6 +97,8 @@ public boolean buildHourlyTask(String name, String reportDomain, Date reportPeri m_topologyGraphDao.insert(proto); } catch (Exception e) { result = false; + LOGGER.error("Unable to insert dependency topology graph, reportDomain={}, period={}, graphPeriod={}.", + reportDomain, reportPeriod, new Date(entry.getKey()), e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java index 22ae0a60f7..e7206e6810 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java @@ -24,6 +24,8 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; @@ -56,6 +58,7 @@ @Named public class EventReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(EventReportService.class); private SimpleDateFormat m_sdf = new SimpleDateFormat("yyyy-MM-dd"); @@ -70,6 +73,8 @@ private EventReport convert(EventReport report) { report.accept(statistics); } } catch (Exception e) { + LOGGER.error("Unable to convert event report, domain={}, start={}, end={}.", report.getDomain(), start, end, + e); Cat.logError(e); } @@ -104,8 +109,9 @@ public EventReport queryDailyReport(String domain, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Event daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { + LOGGER.error("Unable to query event daily report, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); } } @@ -170,6 +176,8 @@ public EventReport queryHourlyReport(String domain, Date start, Date end) { reports = m_hourlyReportDao .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to query event hourly report list, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } if (reports != null) { @@ -179,8 +187,11 @@ public EventReport queryHourlyReport(String domain, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Event hourly report content is missing, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); } catch (Exception e) { + LOGGER.error("Unable to parse event hourly report, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); Cat.logError(e); } } @@ -204,8 +215,9 @@ public EventReport queryMonthlyReport(String domain, Date start) { eventReport = queryFromMonthlyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Event monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query event monthly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return convert(eventReport); @@ -221,8 +233,9 @@ public EventReport queryWeeklyReport(String domain, Date start) { eventReport = queryFromWeeklyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Event weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query event weekly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return convert(eventReport); @@ -259,4 +272,4 @@ public void visitEventReport(EventReport eventReport) { eventReport.removeMachine(Constants.ALL); } } -} \ No newline at end of file +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java index c21520a10c..0236cb613a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java @@ -22,6 +22,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -47,6 +49,7 @@ @Named(type = TaskBuilder.class, value = EventReportBuilder.ID) public class EventReportBuilder implements TaskBuilder, Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(EventReportBuilder.class); public static final String ID = EventAnalyzer.ID; @@ -77,6 +80,7 @@ public boolean buildDailyTask(String name, String domain, Date period) { byte[] binaryContent = DefaultNativeBuilder.build(eventReport); return m_reportService.insertDailyReport(report, binaryContent); } catch (Exception e) { + LOGGER.error("Unable to build event daily report, name={}, domain={}, period={}.", name, domain, period, e); Cat.logError(e); return false; } @@ -90,6 +94,7 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building event monthly report, name={}, domain={}, period={}.", name, domain, period); Date end = null; @@ -115,6 +120,7 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building event weekly report, name={}, domain={}, period={}.", name, domain, period); Date end = null; @@ -178,6 +184,8 @@ private EventReport queryDailyReportsByDuration(String domain, Date start, Date creator.createGraph(reportModel); reportModel.accept(merger); } catch (Exception e) { + LOGGER.error("Unable to merge event daily report into duration report, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java index 5794014f86..3f593b7f09 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java @@ -61,6 +61,14 @@ public HeartbeatDisplayPolicy getHeartbeatDisplayPolicy() { return m_config; } + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + @Override public void initialize() throws InitializationException { refreshSpringBeans(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java index 897838164c..99d7a38654 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java @@ -23,6 +23,8 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; @@ -47,6 +49,7 @@ @Named public class HeartbeatReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(HeartbeatReportService.class); @Override public HeartbeatReport makeReport(String domain, Date start, Date end) { @@ -72,8 +75,10 @@ public HeartbeatReport queryDailyReport(String domain, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Heartbeat daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { + LOGGER.error("Unable to query heartbeat daily report, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } } @@ -120,6 +125,8 @@ public HeartbeatReport queryHourlyReport(String domain, Date start, Date end) { reports = m_hourlyReportDao .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to query heartbeat hourly report list, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } if (reports != null) { @@ -128,8 +135,11 @@ public HeartbeatReport queryHourlyReport(String domain, Date start, Date end) { HeartbeatReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Heartbeat hourly report content is missing, domain={}, reportId={}, period={}.", + domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { + LOGGER.error("Unable to parse heartbeat hourly report, domain={}, reportId={}, period={}.", + domain, report.getId(), report.getPeriod(), e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/task/HeartbeatReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/task/HeartbeatReportBuilder.java index 21f0ac79c9..c01b4bc637 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/task/HeartbeatReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/task/HeartbeatReportBuilder.java @@ -20,6 +20,8 @@ import java.util.Date; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -36,6 +38,7 @@ @Named(type = TaskBuilder.class, value = HeartbeatReportBuilder.ID) public class HeartbeatReportBuilder implements TaskBuilder { + private static final Logger LOGGER = LoggerFactory.getLogger(HeartbeatReportBuilder.class); public static final String ID = HeartbeatAnalyzer.ID; @@ -59,6 +62,8 @@ public boolean buildDailyTask(String name, String domain, Date period) { return m_reportService.insertDailyReport(report, binaryContent); } catch (Exception e) { + LOGGER.error("Unable to build heartbeat daily report, name={}, domain={}, period={}.", name, domain, period, + e); Cat.logError(e); return false; } @@ -85,6 +90,8 @@ private HeartbeatReport queryDailyHeartbeatReport(String name, String domain, Da long endTime = end.getTime(); for (; startTime < endTime; startTime += TimeHelper.ONE_HOUR) { + LOGGER.info("Merging heartbeat hourly report into daily report, name={}, domain={}, period={}.", name, + domain, new Date(startTime)); HeartbeatReport report = m_reportService .queryReport(domain, new Date(startTime), new Date(startTime + TimeHelper.ONE_HOUR)); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/logview/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/logview/Handler.java index a66abc9dfc..6e3d6b366e 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/logview/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/logview/Handler.java @@ -21,6 +21,8 @@ import javax.servlet.ServletException; import java.io.IOException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -39,6 +41,8 @@ import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); + @Inject private JspViewer m_jspViewer; @@ -81,6 +85,7 @@ private String getLogView(String messageId, boolean waterfall) { } } } catch (Exception e) { + LOGGER.error("Unable to load logview, messageId={}, waterfall={}.", messageId, waterfall, e); Cat.logError(e); return null; } @@ -122,15 +127,23 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { String logView = null; MessageId msgId = MessageId.parse(messageId); + LOGGER.info("Handling logview outbound, action={}, domain={}, messageId={}, waterfall={}.", payload.getAction(), + payload.getDomain(), messageId, payload.isWaterfall()); if (checkStorageTime(msgId)) { logView = getLogView(messageId, payload.isWaterfall()); if (logView == null || logView.length() == 0) { + LOGGER.warn("Logview not found, domain={}, messageId={}, waterfall={}.", msgId.getDomain(), messageId, + payload.isWaterfall()); Cat.logEvent("Logview", msgId.getDomain() + ":Fail", Event.SUCCESS, messageId); } else { + LOGGER.info("Logview loaded, domain={}, messageId={}, length={}.", msgId.getDomain(), messageId, + logView.length()); Cat.logEvent("Logview", "Success", Event.SUCCESS, messageId); } } else { + LOGGER.warn("Logview message is outside storage window, domain={}, messageId={}, timestamp={}.", + msgId.getDomain(), messageId, msgId.getTimestamp()); Cat.logEvent("Logview", "OldMessage", Event.SUCCESS, messageId); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/HistoricalMessageService.java b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/HistoricalMessageService.java index 4820f3bcdd..9ccc80f547 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/HistoricalMessageService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/HistoricalMessageService.java @@ -22,6 +22,8 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.cat.message.storage.hdfs.HdfsBucketManager; import org.unidal.lookup.annotation.Inject; @@ -38,6 +40,7 @@ import com.dianping.cat.report.service.ModelRequest; public class HistoricalMessageService extends BaseHistoricalModelService { + private static final Logger LOGGER = LoggerFactory.getLogger(HistoricalMessageService.class); @Inject private HdfsBucketManager m_bucketManager; @@ -108,7 +111,8 @@ protected String toString(ModelRequest request, MessageTree tree) { buf.readInt(); // get rid of length return buf.toString(Charset.forName("utf-8")); } catch (Exception e) { - // ignore it + LOGGER.error("Unable to render historical logview message, messageId={}, waterfall={}.", + request.getProperty("messageId"), request.getProperty("waterfall", "false"), e); } return null; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java index 7d233fcc64..2782ce949e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java @@ -22,6 +22,8 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.cat.message.storage.Bucket; import org.unidal.cat.message.storage.BucketManager; import org.unidal.cat.message.storage.MessageFinderManager; @@ -49,6 +51,8 @@ @Named(type = LocalModelService.class, value = "logview") public class LocalMessageService extends LocalModelService implements ModelService { + private static final Logger LOGGER = LoggerFactory.getLogger(LocalMessageService.class); + public static final String ID = DumpAnalyzer.ID; @Inject @@ -119,7 +123,8 @@ private String buildNewReport(ModelRequest request, ModelPeriod period, String d content.readInt(); // get rid of length return content.toString(Charset.forName("utf-8")); } catch (Exception e) { - // ignore it + LOGGER.error("Unable to render new local logview message, messageId={}, waterfall={}.", messageId, + waterfall, e); } } @@ -156,7 +161,8 @@ public String buildOldReport(ModelRequest request, ModelPeriod period, String do buf.readInt(); // get rid of length return buf.toString(Charset.forName("utf-8")); } catch (Exception e) { - // ignore it + LOGGER.error("Unable to render old local logview message, messageId={}, waterfall={}.", messageId, + waterfall, e); } } return null; @@ -183,7 +189,7 @@ public ModelResponse invoke(ModelRequest request) { t.addData("domain", domain); t.setStatus(Message.SUCCESS); } catch (Exception e) { - e.printStackTrace(); + LOGGER.error("Unable to invoke local logview service, request={}, domain={}.", request, request.getDomain(), e); Cat.logError(e); t.setStatus(e); response.setException(e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/RemoteLogViewService.java b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/RemoteLogViewService.java index 85e8619b68..4878912726 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/RemoteLogViewService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/RemoteLogViewService.java @@ -25,6 +25,8 @@ import org.unidal.helper.Files; import org.unidal.helper.Urls; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; import com.dianping.cat.config.server.ServerConfigManager; @@ -38,6 +40,7 @@ import com.dianping.cat.spring.CatSpringContext; public class RemoteLogViewService extends BaseRemoteModelService { + private static final Logger LOGGER = LoggerFactory.getLogger(RemoteLogViewService.class); private ServerConfigManager m_manager; @@ -75,6 +78,7 @@ public ModelResponse invoke(ModelRequest request) { } t.setStatus(Message.SUCCESS); } catch (Exception e) { + LOGGER.warn("Unable to invoke remote logview service, request={}, domain={}.", request, request.getDomain(), e); t.setStatus(Message.SUCCESS); } finally { t.complete(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java index 87618ea372..df951ef647 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java @@ -21,6 +21,8 @@ import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Named; @@ -51,6 +53,7 @@ @Named public class MatrixReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(MatrixReportService.class); @Override public MatrixReport makeReport(String domain, Date start, Date end) { @@ -76,8 +79,10 @@ public MatrixReport queryDailyReport(String domain, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Matrix daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { + LOGGER.error("Unable to query matrix daily report, domain={}, period={}.", domain, new Date(startTime), + e); Cat.logError(e); } } @@ -142,6 +147,8 @@ public MatrixReport queryHourlyReport(String domain, Date start, Date end) { reports = m_hourlyReportDao .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to query matrix hourly report list, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } if (reports != null) { @@ -151,8 +158,11 @@ public MatrixReport queryHourlyReport(String domain, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Matrix hourly report content is missing, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); } catch (Exception e) { + LOGGER.error("Unable to parse matrix hourly report, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); Cat.logError(e); } } @@ -173,8 +183,9 @@ public MatrixReport queryMonthlyReport(String domain, Date start) { .findReportByDomainNamePeriod(start, domain, MatrixAnalyzer.ID, MonthlyReportEntity.READSET_FULL); return queryFromMonthlyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Matrix monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query matrix monthly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return new MatrixReport(domain); @@ -187,8 +198,9 @@ public MatrixReport queryWeeklyReport(String domain, Date start) { .findReportByDomainNamePeriod(start, domain, MatrixAnalyzer.ID, WeeklyReportEntity.READSET_FULL); return queryFromWeeklyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Matrix weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query matrix weekly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return new MatrixReport(domain); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java index 8c1fe74060..beed5fb334 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java @@ -22,6 +22,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -44,6 +46,7 @@ @Named(type = TaskBuilder.class, value = MatrixReportBuilder.ID) public class MatrixReportBuilder implements TaskBuilder, Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(MatrixReportBuilder.class); public static final String ID = MatrixAnalyzer.ID; @@ -52,6 +55,7 @@ public class MatrixReportBuilder implements TaskBuilder, Initializable { @Override public boolean buildDailyTask(String name, String domain, Date period) { + LOGGER.info("Building matrix daily report, name={}, domain={}, period={}.", name, domain, period); MatrixReport matrixReport = queryHourlyReportByDuration(name, domain, period, TaskHelper.tomorrowZero(period)); DailyReport report = new DailyReport(); @@ -72,6 +76,7 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { + LOGGER.info("Building matrix monthly report, name={}, domain={}, period={}.", name, domain, period); MatrixReport matrixReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); MonthlyReport report = new MonthlyReport(); @@ -87,6 +92,7 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { + LOGGER.info("Building matrix weekly report, name={}, domain={}, period={}.", name, domain, period); MatrixReport matrixReport = queryDailyReportsByDuration(domain, period, new Date(period.getTime() + TimeHelper.ONE_WEEK)); WeeklyReport report = new WeeklyReport(); @@ -134,6 +140,8 @@ private MatrixReport queryDailyReportsByDuration(String domain, Date start, Date reportModel.accept(merger); } catch (Exception e) { + LOGGER.error("Unable to merge matrix daily report into duration report, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java index a6f890635a..7aa4a01da7 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java @@ -29,6 +29,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.ContainerHolder; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -44,6 +46,7 @@ @SuppressWarnings("rawtypes") public class Handler extends ContainerHolder implements Initializable, PageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); public Map m_localServices; @@ -101,6 +104,8 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { outputStream.write(compress); } } catch (Throwable e) { + LOGGER.error("Unable to render model report, report={}, domain={}, period={}, messageId={}.", + payload.getReport(), payload.getDomain(), payload.getPeriod(), payload.getMessageId(), e); Cat.logError(e); } } @@ -108,6 +113,7 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { @Override public void initialize() throws InitializationException { m_localServices = lookupMap(LocalModelService.class); + LOGGER.info("Initialized model page handler, localServiceCount={}.", m_localServices.size()); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/Handler.java index 81ec9ffde6..82b7392a2b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/Handler.java @@ -21,6 +21,8 @@ import javax.servlet.ServletException; import java.io.IOException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -32,6 +34,8 @@ import com.dianping.cat.report.page.overload.task.TableCapacityService; public class Handler implements PageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); + @Inject private JspViewer m_jspViewer; @@ -57,6 +61,8 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { try { model.setReports(m_tableCapacityService.queryOverloadReports(payload.getStartTime(), payload.getEndTime())); } catch (Exception e) { + LOGGER.error("Unable to query overload reports, startTime={}, endTime={}.", payload.getStartTime(), + payload.getEndTime(), e); Cat.logError(e); } break; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/Payload.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/Payload.java index 6d604a8f02..de6f4bbe0b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/Payload.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/Payload.java @@ -22,6 +22,8 @@ import java.text.SimpleDateFormat; import java.util.Date; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.web.mvc.ActionContext; import org.unidal.web.mvc.ActionPayload; import org.unidal.web.mvc.payload.annotation.FieldMeta; @@ -30,6 +32,8 @@ import com.dianping.cat.report.ReportPage; public class Payload implements ActionPayload { + private static final Logger LOGGER = LoggerFactory.getLogger(Payload.class); + private ReportPage m_page; @FieldMeta("op") @@ -74,6 +78,7 @@ public Date getEndTime() { try { return m_format.parse(m_endTime); } catch (Exception e) { + LOGGER.warn("Unable to parse overload endTime, value={}. Use current time.", m_endTime); return new Date(); } } @@ -104,6 +109,7 @@ public Date getStartTime() { try { return m_format.parse(m_startTime); } catch (Exception e) { + LOGGER.warn("Unable to parse overload startTime, value={}. Use one day ago.", m_startTime); return new Date(System.currentTimeMillis() - TimeHelper.ONE_DAY); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java index b4687d3fb9..d4e45ef53e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java @@ -20,6 +20,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -34,6 +36,7 @@ @Named public class CapacityUpdateStatusManager implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(CapacityUpdateStatusManager.class); private static final String CONFIG_NAME = "capacityUpdateStatus"; @@ -53,6 +56,14 @@ public class CapacityUpdateStatusManager implements Initializable { private int m_configId; + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setOverloadDao(OverloadRepository overloadDao) { + m_overloadDao = overloadDao; + } + private String buildConfigContent() { StringBuilder builder = new StringBuilder(); @@ -97,6 +108,8 @@ public void initialize() throws InitializationException { extractStatus(content); } catch (DalException e) { + LOGGER.warn("Unable to load capacity update status config, will initialize it from overload table.", e); + try { m_hourlyStatus = m_overloadDao.findMaxIdByType(CapacityUpdater.HOURLY_TYPE, OverloadEntity.READSET_MAXID) .getMaxId(); @@ -114,6 +127,7 @@ public void initialize() throws InitializationException { m_configId = config.getId(); } catch (DalException ex) { + LOGGER.error("Unable to initialize capacity update status config from overload table.", ex); Cat.logError(ex); } } @@ -132,6 +146,7 @@ private boolean storeConfig() { config.setContent(buildConfigContent()); m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); } catch (Exception e) { + LOGGER.error("Unable to store capacity update status config. content={}", buildConfigContent(), e); Cat.logError(e); return false; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java index d325d4afb9..8f8c458330 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java @@ -22,6 +22,7 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -32,6 +33,7 @@ @Named(type = TaskBuilder.class, value = CapacityUpdateTask.ID) public class CapacityUpdateTask implements TaskBuilder, LogEnabled { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(CapacityUpdateTask.class); public static final String ID = Constants.REPORT_DATABASE_CAPACITY; @@ -52,9 +54,13 @@ public class CapacityUpdateTask implements TaskBuilder, LogEnabled { @Override public boolean buildDailyTask(String name, String domain, Date period) { try { + SLF4J_LOGGER.info("Starting daily capacity update task, name={}, domain={}, period={}.", name, domain, period); m_dailyUpdater.updateDBCapacity(); + SLF4J_LOGGER.info("Finished daily capacity update task, name={}, domain={}, period={}.", name, domain, period); return true; } catch (DalException e) { + SLF4J_LOGGER.error("Unable to build daily capacity update task, name={}, domain={}, period={}.", name, + domain, period, e); Cat.logError(e); return false; } @@ -63,9 +69,13 @@ public boolean buildDailyTask(String name, String domain, Date period) { @Override public boolean buildHourlyTask(String name, String domain, Date period) { try { + SLF4J_LOGGER.info("Starting hourly capacity update task, name={}, domain={}, period={}.", name, domain, period); m_hourlyUpdater.updateDBCapacity(); + SLF4J_LOGGER.info("Finished hourly capacity update task, name={}, domain={}, period={}.", name, domain, period); return true; } catch (DalException e) { + SLF4J_LOGGER.error("Unable to build hourly capacity update task, name={}, domain={}, period={}.", name, + domain, period, e); Cat.logError(e); return false; } @@ -74,9 +84,15 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { try { + SLF4J_LOGGER.info("Starting monthly capacity update task, name={}, domain={}, period={}.", name, domain, + period); m_monthlyUpdater.updateDBCapacity(); + SLF4J_LOGGER.info("Finished monthly capacity update task, name={}, domain={}, period={}.", name, domain, + period); return true; } catch (DalException e) { + SLF4J_LOGGER.error("Unable to build monthly capacity update task, name={}, domain={}, period={}.", name, + domain, period, e); Cat.logError(e); return false; } @@ -85,9 +101,13 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { try { + SLF4J_LOGGER.info("Starting weekly capacity update task, name={}, domain={}, period={}.", name, domain, period); m_weeklyUpdater.updateDBCapacity(); + SLF4J_LOGGER.info("Finished weekly capacity update task, name={}, domain={}, period={}.", name, domain, period); return true; } catch (DalException e) { + SLF4J_LOGGER.error("Unable to build weekly capacity update task, name={}, domain={}, period={}.", name, + domain, period, e); Cat.logError(e); return false; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java index 51e7f25cdb..251e1143d9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java @@ -24,6 +24,8 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; @@ -38,6 +40,7 @@ @Named(type = CapacityUpdater.class, value = DailyCapacityUpdater.ID) public class DailyCapacityUpdater implements CapacityUpdater { + private static final Logger LOGGER = LoggerFactory.getLogger(DailyCapacityUpdater.class); public static final String ID = "daily_capacity_updater"; @@ -63,6 +66,7 @@ public void updateDBCapacity() throws DalException { refreshSpringBeans(); int maxId = m_manager.getDailyStatus(); + LOGGER.info("Starting daily report capacity scan, startMaxId={}.", maxId); while (true) { List reports = m_dailyReportContentDao @@ -85,11 +89,15 @@ public void updateDBCapacity() throws DalException { overload.setPeriod(report.getPeriod()); m_overloadDao.insert(overload); } catch (DalNotFoundException e) { + LOGGER.warn("Daily report not found while recording overload report, reportId={}.", reportId); } catch (Exception e) { + LOGGER.error("Unable to record daily overload report, reportId={}, contentLength={}.", + reportId, contentLength, e); Cat.logError(e); } } } catch (Exception ex) { + LOGGER.error("Unable to process daily report capacity item, content={}.", content, ex); Cat.logError(ex); } } @@ -102,6 +110,7 @@ public void updateDBCapacity() throws DalException { } } m_manager.updateDailyStatus(maxId); + LOGGER.info("Finished daily report capacity scan, finalMaxId={}.", maxId); } private void refreshSpringBeans() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java index a5d5973e3f..ec44e2c2b4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java @@ -24,6 +24,8 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.HourlyReport; @@ -38,6 +40,7 @@ @Named(type = CapacityUpdater.class, value = HourlyCapacityUpdater.ID) public class HourlyCapacityUpdater implements CapacityUpdater { + private static final Logger LOGGER = LoggerFactory.getLogger(HourlyCapacityUpdater.class); public static final String ID = "hourly_capacity_updater"; @@ -63,6 +66,7 @@ public void updateDBCapacity() throws DalException { refreshSpringBeans(); int maxId = m_manager.getHourlyStatus(); + LOGGER.info("Starting hourly report capacity scan, startMaxId={}.", maxId); while (true) { List reports = m_hourlyReportContentDao @@ -87,11 +91,15 @@ public void updateDBCapacity() throws DalException { m_overloadDao.insert(overload); } catch (DalNotFoundException e) { + LOGGER.warn("Hourly report not found while recording overload report, reportId={}.", reportId); } catch (Exception e) { + LOGGER.error("Unable to record hourly overload report, reportId={}, contentLength={}.", + reportId, contentLength, e); Cat.logError(e); } } } catch (Exception ex) { + LOGGER.error("Unable to process hourly report capacity item, content={}.", content, ex); Cat.logError(ex); } } @@ -104,6 +112,7 @@ public void updateDBCapacity() throws DalException { } } m_manager.updateHourlyStatus(maxId); + LOGGER.info("Finished hourly report capacity scan, finalMaxId={}.", maxId); } private void refreshSpringBeans() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java index e162baca41..0af22c30e7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java @@ -24,6 +24,8 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.MonthlyReport; @@ -38,6 +40,7 @@ @Named(type = CapacityUpdater.class, value = MonthlyCapacityUpdater.ID) public class MonthlyCapacityUpdater implements CapacityUpdater { + private static final Logger LOGGER = LoggerFactory.getLogger(MonthlyCapacityUpdater.class); public static final String ID = "monthly_capacity_updater"; @@ -63,6 +66,7 @@ public void updateDBCapacity() throws DalException { refreshSpringBeans(); int maxId = m_manager.getMonthlyStatus(); + LOGGER.info("Starting monthly report capacity scan, startMaxId={}.", maxId); while (true) { List reports = m_monthlyReportContentDao @@ -85,11 +89,15 @@ public void updateDBCapacity() throws DalException { overload.setPeriod(report.getPeriod()); m_overloadDao.insert(overload); } catch (DalNotFoundException e) { + LOGGER.warn("Monthly report not found while recording overload report, reportId={}.", reportId); } catch (Exception e) { + LOGGER.error("Unable to record monthly overload report, reportId={}, contentLength={}.", + reportId, contentLength, e); Cat.logError(e); } } } catch (Exception ex) { + LOGGER.error("Unable to process monthly report capacity item, content={}.", content, ex); Cat.logError(ex); } } @@ -102,6 +110,7 @@ public void updateDBCapacity() throws DalException { } } m_manager.updateMonthlyStatus(maxId); + LOGGER.info("Finished monthly report capacity scan, finalMaxId={}.", maxId); } private void refreshSpringBeans() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java index e7218b05b2..9b0d0e7647 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java @@ -27,6 +27,8 @@ import org.unidal.lookup.ContainerHolder; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; @@ -48,6 +50,7 @@ @Named public class TableCapacityService extends ContainerHolder { + private static final Logger LOGGER = LoggerFactory.getLogger(TableCapacityService.class); @Inject private OverloadRepository m_overloadDao; @@ -135,11 +138,16 @@ public List queryOverloadReports(Date startTime, Date endTime) { } reports.add(generateOverloadReport(report, reportSize, reportType)); } catch (DalNotFoundException e) { + LOGGER.warn("Overload report target record not found, overloadId={}, reportId={}, reportType={}.", + overload.getId(), overload.getReportId(), overload.getReportType()); } catch (Exception ex) { + LOGGER.error("Unable to build overload report item, overloadId={}, reportId={}, reportType={}.", + overload.getId(), overload.getReportId(), overload.getReportType(), ex); Cat.logError(ex); } } } catch (DalException e) { + LOGGER.error("Unable to query overload reports, startTime={}, endTime={}.", startTime, endTime, e); Cat.logError(e); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java index ab97521c8e..7f35b3f26d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java @@ -24,6 +24,8 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.WeeklyReport; @@ -38,6 +40,7 @@ @Named(type = CapacityUpdater.class, value = WeeklyCapacityUpdater.ID) public class WeeklyCapacityUpdater implements CapacityUpdater { + private static final Logger LOGGER = LoggerFactory.getLogger(WeeklyCapacityUpdater.class); public static final String ID = "weekly_capacity_updater"; @@ -63,6 +66,7 @@ public void updateDBCapacity() throws DalException { refreshSpringBeans(); int maxId = m_manager.getWeeklyStatus(); + LOGGER.info("Starting weekly report capacity scan, startMaxId={}.", maxId); while (true) { List reports = m_weeklyReportContentDao @@ -85,11 +89,15 @@ public void updateDBCapacity() throws DalException { overload.setPeriod(report.getPeriod()); m_overloadDao.insert(overload); } catch (DalNotFoundException e) { + LOGGER.warn("Weekly report not found while recording overload report, reportId={}.", reportId); } catch (Exception e) { + LOGGER.error("Unable to record weekly overload report, reportId={}, contentLength={}.", + reportId, contentLength, e); Cat.logError(e); } } } catch (Exception ex) { + LOGGER.error("Unable to process weekly report capacity item, content={}.", content, ex); Cat.logError(ex); } } @@ -102,6 +110,7 @@ public void updateDBCapacity() throws DalException { } } m_manager.updateWeeklyStatus(maxId); + LOGGER.info("Finished weekly report capacity scan, finalMaxId={}.", maxId); } private void refreshSpringBeans() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java index b2351107f9..011e5a01f0 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java @@ -23,6 +23,8 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; @@ -52,6 +54,7 @@ @Named public class ProblemReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(ProblemReportService.class); @Override public ProblemReport makeReport(String domain, Date start, Date end) { @@ -77,8 +80,10 @@ public ProblemReport queryDailyReport(String domain, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Problem daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { + LOGGER.error("Unable to query problem daily report, domain={}, period={}.", domain, new Date(startTime), + e); Cat.logError(e); } } @@ -145,6 +150,8 @@ public ProblemReport queryHourlyReport(String domain, Date start, Date end) { reports = m_hourlyReportDao .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to query problem hourly report list, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } if (reports != null) { @@ -154,8 +161,11 @@ public ProblemReport queryHourlyReport(String domain, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Problem hourly report content is missing, domain={}, reportId={}, period={}.", + domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { + LOGGER.error("Unable to parse problem hourly report, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); Cat.logError(e); } } @@ -181,8 +191,9 @@ public ProblemReport queryMonthlyReport(String domain, Date start) { problemReport = queryFromMonthlyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Problem monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query problem monthly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } ProblemReportConvertor convertor = new ProblemReportConvertor(); @@ -201,8 +212,9 @@ public ProblemReport queryWeeklyReport(String domain, Date start) { problemReport = queryFromWeeklyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Problem weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query problem weekly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } ProblemReportConvertor convertor = new ProblemReportConvertor(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java index 651f53416a..f28362e316 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java @@ -22,6 +22,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -45,6 +47,7 @@ @Named(type = TaskBuilder.class, value = ProblemReportBuilder.ID) public class ProblemReportBuilder implements TaskBuilder, Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(ProblemReportBuilder.class); public static final String ID = ProblemAnalyzer.ID; @@ -68,6 +71,7 @@ public boolean buildDailyTask(String name, String domain, Date period) { return m_reportService.insertDailyReport(report, binaryContent); } catch (DalException e) { + LOGGER.error("Unable to build problem daily report, name={}, domain={}, period={}.", name, domain, period, e); Cat.logError(e); return false; } @@ -80,6 +84,7 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { + LOGGER.info("Building problem monthly report, name={}, domain={}, period={}.", name, domain, period); ProblemReport problemReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); new ProblemReportFilter().visitProblemReport(problemReport); @@ -98,6 +103,7 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { + LOGGER.info("Building problem weekly report, name={}, domain={}, period={}.", name, domain, period); ProblemReport problemReport = queryDailyReportsByDuration(domain, period, new Date(period.getTime() + TimeHelper.ONE_WEEK)); WeeklyReport report = new WeeklyReport(); @@ -151,6 +157,8 @@ private ProblemReport queryDailyReportsByDuration(String domain, Date start, Dat creator.createGraph(reportModel); reportModel.accept(merger); } catch (Exception e) { + LOGGER.error("Unable to merge problem daily report into duration report, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java index 162292f930..ab7c3d1456 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java @@ -21,6 +21,8 @@ import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Named; @@ -51,6 +53,7 @@ @Named public class StateReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(StateReportService.class); @Override public StateReport makeReport(String domain, Date start, Date end) { @@ -76,8 +79,10 @@ public StateReport queryDailyReport(String domain, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("State daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { + LOGGER.error("Unable to query state daily report, domain={}, period={}.", domain, new Date(startTime), + e); Cat.logError(e); } } @@ -142,6 +147,8 @@ public StateReport queryHourlyReport(String domain, Date start, Date end) { reports = m_hourlyReportDao .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to query state hourly report list, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } if (reports != null) { @@ -151,8 +158,11 @@ public StateReport queryHourlyReport(String domain, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("State hourly report content is missing, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); } catch (Exception e) { + LOGGER.error("Unable to parse state hourly report, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); Cat.logError(e); } } @@ -173,8 +183,9 @@ public StateReport queryMonthlyReport(String domain, Date start) { return queryFromMonthlyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("State monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query state monthly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return new StateReport(domain); @@ -188,8 +199,9 @@ public StateReport queryWeeklyReport(String domain, Date start) { return queryFromWeeklyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("State weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query state weekly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return new StateReport(domain); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java index 440394e4a3..e318e2a632 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java @@ -23,6 +23,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -52,6 +54,7 @@ @Named(type = TaskBuilder.class, value = StateReportBuilder.ID) public class StateReportBuilder implements TaskBuilder, Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(StateReportBuilder.class); public static final String ID = StateAnalyzer.ID; @@ -73,6 +76,7 @@ public class StateReportBuilder implements TaskBuilder, Initializable { @Override public boolean buildDailyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building state daily report, name={}, domain={}, period={}.", name, domain, period); StateReport stateReport = queryHourlyReportsByDuration(domain, period, TaskHelper.tomorrowZero(period)); DailyReport report = new DailyReport(); @@ -90,6 +94,7 @@ public boolean buildDailyTask(String name, String domain, Date period) { @Override public boolean buildHourlyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building state hourly report side effects, name={}, domain={}, period={}.", name, domain, period); StateReport stateReport = m_reportService .queryReport(domain, period, new Date(period.getTime() + TimeHelper.ONE_HOUR)); @@ -102,6 +107,7 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building state monthly report, name={}, domain={}, period={}.", name, domain, period); StateReport stateReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); MonthlyReport report = new MonthlyReport(); @@ -119,6 +125,7 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building state weekly report, name={}, domain={}, period={}.", name, domain, period); Date start = period; Date end = new Date(start.getTime() + TimeHelper.ONE_DAY * 7); @@ -175,6 +182,8 @@ private StateReport queryDailyReportsByDuration(String domain, Date start, Date reportModel.accept(merger); } catch (Exception e) { + LOGGER.error("Unable to merge state daily report into duration report, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } } @@ -210,17 +219,21 @@ private void updateProjectAndHost(String domain, String ip) { if (m_serverFilterConfigManager.validateDomain(domain)) { if (!m_projectService.contains(domain)) { + LOGGER.info("State report discovered new project domain, domain={}, ip={}.", domain, ip); m_projectService.insert(domain); } Hostinfo info = m_hostinfoService.findByIp(ip); if (info == null) { + LOGGER.info("State report discovered new host, domain={}, ip={}.", domain, ip); m_hostinfoService.insert(domain, ip); } else { String oldDomain = info.getDomain(); if (!domain.equals(oldDomain) && !Constants.CAT.equals(oldDomain)) { + LOGGER.warn("State report updates host domain, ip={}, oldDomain={}, newDomain={}.", ip, oldDomain, + domain); m_hostinfoService.update(info.getId(), domain, ip); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java index 6a427af1ea..bb5e8be997 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java @@ -20,6 +20,8 @@ import java.util.Date; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Named; @@ -36,6 +38,7 @@ @Named public class ClientReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(ClientReportService.class); @Override public ClientReport makeReport(String domain, Date start, Date end) { @@ -56,8 +59,9 @@ public ClientReport queryDailyReport(String domain, Date start, Date end) { .findByDomainNamePeriod(domain, name, new Date(startTime), DailyReportEntity.READSET_FULL); return queryFromDailyBinary(report.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Client daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { + LOGGER.error("Unable to query client daily report, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); } ClientReport report = new ClientReport(Constants.CAT); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java index 695b245f15..3e98456060 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java @@ -21,6 +21,8 @@ import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Named; @@ -51,6 +53,7 @@ @Named public class HeavyReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(HeavyReportService.class); @Override public HeavyReport makeReport(String domain, Date start, Date end) { @@ -76,8 +79,10 @@ public HeavyReport queryDailyReport(String domain, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Heavy daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { + LOGGER.error("Unable to query heavy daily report, domain={}, period={}.", domain, new Date(startTime), + e); Cat.logError(e); } } @@ -142,6 +147,8 @@ public HeavyReport queryHourlyReport(String domain, Date start, Date end) { reports = m_hourlyReportDao .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to query heavy hourly report list, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } if (reports != null) { @@ -150,8 +157,11 @@ public HeavyReport queryHourlyReport(String domain, Date start, Date end) { HeavyReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Heavy hourly report content is missing, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); } catch (Exception e) { + LOGGER.error("Unable to parse heavy hourly report, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); Cat.logError(e); } } @@ -172,8 +182,9 @@ public HeavyReport queryMonthlyReport(String domain, Date start) { .findReportByDomainNamePeriod(start, domain, Constants.REPORT_HEAVY, MonthlyReportEntity.READSET_FULL); return queryFromMonthlyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Heavy monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query heavy monthly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return new HeavyReport(domain); @@ -186,8 +197,9 @@ public HeavyReport queryWeeklyReport(String domain, Date start) { .findReportByDomainNamePeriod(start, domain, Constants.REPORT_HEAVY, WeeklyReportEntity.READSET_FULL); return queryFromWeeklyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Heavy weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query heavy weekly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return new HeavyReport(domain); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java index e2935fb0de..df139fe3a6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java @@ -21,6 +21,8 @@ import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Named; @@ -37,6 +39,7 @@ @Named public class JarReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(JarReportService.class); @Override public JarReport makeReport(String domain, Date start, Date end) { @@ -70,6 +73,8 @@ public JarReport queryHourlyReport(String domain, Date start, Date end) { try { reports = m_hourlyReportDao.findAllByDomainNamePeriod(start, domain, name, HourlyReportEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to query jar hourly report list, domain={}, period={}.", domain, new Date(startTime), + e); Cat.logError(e); } if (reports != null) { @@ -77,6 +82,8 @@ public JarReport queryHourlyReport(String domain, Date start, Date end) { try { return queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); } catch (DalException e) { + LOGGER.error("Unable to parse jar hourly report, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java index 5d4535a2ce..159c99eceb 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java @@ -21,6 +21,8 @@ import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Named; @@ -51,6 +53,7 @@ @Named public class ServiceReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(ServiceReportService.class); @Override public ServiceReport makeReport(String domain, Date start, Date end) { @@ -76,8 +79,10 @@ public ServiceReport queryDailyReport(String domain, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Service daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { + LOGGER.error("Unable to query service daily report, domain={}, period={}.", domain, new Date(startTime), + e); Cat.logError(e); } } @@ -142,6 +147,8 @@ public ServiceReport queryHourlyReport(String domain, Date start, Date end) { reports = m_hourlyReportDao .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to query service hourly report list, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } if (reports != null) { @@ -150,8 +157,11 @@ public ServiceReport queryHourlyReport(String domain, Date start, Date end) { ServiceReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Service hourly report content is missing, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); } catch (Exception e) { + LOGGER.error("Unable to parse service hourly report, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); Cat.logError(e); } } @@ -172,8 +182,9 @@ public ServiceReport queryMonthlyReport(String domain, Date start) { .findReportByDomainNamePeriod(start, domain, Constants.REPORT_SERVICE, MonthlyReportEntity.READSET_FULL); return queryFromMonthlyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Service monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query service monthly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return new ServiceReport(domain); @@ -187,8 +198,9 @@ public ServiceReport queryWeeklyReport(String domain, Date start) { return queryFromWeeklyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Service weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query service weekly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return new ServiceReport(domain); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java index 983f716b2c..4cfc027d7c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java @@ -21,6 +21,8 @@ import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Named; @@ -51,6 +53,7 @@ @Named public class UtilizationReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(UtilizationReportService.class); @Override public UtilizationReport makeReport(String domain, Date start, Date end) { @@ -75,8 +78,10 @@ public UtilizationReport queryDailyReport(String domain, Date start, Date end) { UtilizationReport reportModel = queryFromDailyBinary(report.getId(), domain); reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Utilization daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { + LOGGER.error("Unable to query utilization daily report, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } } @@ -141,6 +146,8 @@ public UtilizationReport queryHourlyReport(String domain, Date start, Date end) reports = m_hourlyReportDao .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to query utilization hourly report list, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } if (reports != null) { @@ -149,8 +156,11 @@ public UtilizationReport queryHourlyReport(String domain, Date start, Date end) UtilizationReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Utilization hourly report content is missing, domain={}, reportId={}, period={}.", + domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { + LOGGER.error("Unable to parse utilization hourly report, domain={}, reportId={}, period={}.", + domain, report.getId(), report.getPeriod(), e); Cat.logError(e); } } @@ -171,8 +181,9 @@ public UtilizationReport queryMonthlyReport(String domain, Date start) { .findReportByDomainNamePeriod(start, domain, Constants.REPORT_UTILIZATION, MonthlyReportEntity.READSET_FULL); return queryFromMonthlyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Utilization monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query utilization monthly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return new UtilizationReport(domain); @@ -185,8 +196,9 @@ public UtilizationReport queryWeeklyReport(String domain, Date start) { .findReportByDomainNamePeriod(start, domain, Constants.REPORT_UTILIZATION, WeeklyReportEntity.READSET_FULL); return queryFromWeeklyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Utilization weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query utilization weekly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return new UtilizationReport(domain); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java index 5e1ea0072b..fbfa471bd6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java @@ -21,6 +21,8 @@ import java.util.Date; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -45,6 +47,7 @@ @Named(type = TaskBuilder.class, value = HeavyReportBuilder.ID) public class HeavyReportBuilder implements TaskBuilder { + private static final Logger LOGGER = LoggerFactory.getLogger(HeavyReportBuilder.class); public static final String ID = Constants.REPORT_HEAVY; @@ -60,6 +63,7 @@ public class HeavyReportBuilder implements TaskBuilder { @Override public boolean buildDailyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building heavy daily report, name={}, domain={}, period={}.", name, domain, period); HeavyReport heavyReport = queryHourlyReportsByDuration(name, domain, period, TaskHelper.tomorrowZero(period)); DailyReport report = new DailyReport(); @@ -77,6 +81,7 @@ public boolean buildDailyTask(String name, String domain, Date period) { @Override public boolean buildHourlyTask(String name, String domain, Date start) { refreshSpringBeans(); + LOGGER.info("Building heavy hourly report, name={}, domain={}, period={}.", name, domain, start); HeavyReport heavyReport = new HeavyReport(Constants.CAT); MatrixReportVisitor visitor = new MatrixReportVisitor().setReport(heavyReport); @@ -108,6 +113,7 @@ public boolean buildHourlyTask(String name, String domain, Date start) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building heavy monthly report, name={}, domain={}, period={}.", name, domain, period); HeavyReport heavyReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); MonthlyReport report = new MonthlyReport(); @@ -125,6 +131,7 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building heavy weekly report, name={}, domain={}, period={}.", name, domain, period); HeavyReport heavyReport = queryDailyReportsByDuration(domain, period, new Date(period.getTime() + TimeHelper.ONE_WEEK)); @@ -153,6 +160,8 @@ private HeavyReport queryDailyReportsByDuration(String domain, Date start, Date .queryReport(domain, new Date(startTime), new Date(startTime + TimeHelper.ONE_DAY)); reportModel.accept(merger); } catch (Exception e) { + LOGGER.error("Unable to merge heavy daily report into duration report, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java index 347730b5e6..a642c88f80 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java @@ -26,6 +26,8 @@ import java.util.Map.Entry; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -49,6 +51,7 @@ @Named(type = TaskBuilder.class, value = JarReportBuilder.ID) public class JarReportBuilder implements TaskBuilder { + private static final Logger LOGGER = LoggerFactory.getLogger(JarReportBuilder.class); public static final String ID = Constants.REPORT_JAR; @@ -74,12 +77,14 @@ public boolean buildDailyTask(String name, String domain, Date period) { @Override public boolean buildHourlyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building jar hourly report, name={}, domain={}, period={}.", name, domain, period); Date end = new Date(period.getTime() + TimeHelper.ONE_HOUR); Set domains = m_reportService.queryAllDomainNames(period, end, HeartbeatAnalyzer.ID); JarReport jarReport = new JarReport(); HeartbeatReportVisitor visitor = new HeartbeatReportVisitor(jarReport); + LOGGER.info("Preparing jar report from heartbeat reports, period={}, domainCount={}.", period, domains.size()); for (String domainName : domains) { if (m_configManager.validateDomain(domainName)) { HeartbeatReport heartbeatReport = m_heartbeatReportService.queryReport(domainName, period, end); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java index 7c30dca75a..2e801d08cf 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java @@ -21,6 +21,8 @@ import java.util.Date; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -42,6 +44,7 @@ @Named(type = TaskBuilder.class, value = ClientReportBuilder.ID) public class ClientReportBuilder implements TaskBuilder { + private static final Logger LOGGER = LoggerFactory.getLogger(ClientReportBuilder.class); public static final String ID = Constants.REPORT_CLIENT; @@ -63,6 +66,7 @@ public class ClientReportBuilder implements TaskBuilder { @Override public boolean buildDailyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building client daily report, name={}, domain={}, period={}.", name, domain, period); ClientReport clientReport = buildClientReport(period); DailyReport report = new DailyReport(); @@ -96,6 +100,8 @@ private ClientReport buildClientReport(Date startTime) { } } } catch (Exception e) { + LOGGER.error("Unable to visit transaction report for client report, domain={}, start={}, end={}.", domain, + startTime, endTime, e); Cat.logError(domain + " client report visitor error", e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java index 04b78c193a..dd447caf01 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java @@ -21,11 +21,13 @@ import java.util.Collection; import java.util.Date; import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; +import java.util.Map; +import java.util.Set; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.unidal.lookup.annotation.Inject; +import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -49,10 +51,11 @@ import com.dianping.cat.report.task.TaskHelper; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = ServiceReportBuilder.ID) -public class ServiceReportBuilder implements TaskBuilder { - - public static final String ID = Constants.REPORT_SERVICE; +@Named(type = TaskBuilder.class, value = ServiceReportBuilder.ID) +public class ServiceReportBuilder implements TaskBuilder { + private static final Logger LOGGER = LoggerFactory.getLogger(ServiceReportBuilder.class); + + public static final String ID = Constants.REPORT_SERVICE; @Inject protected ServiceReportService m_reportService; @@ -68,6 +71,7 @@ public class ServiceReportBuilder implements TaskBuilder { @Override public boolean buildDailyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building service daily report, name={}, domain={}, period={}.", name, domain, period); ServiceReport serviceReport = queryHourlyReportsByDuration(name, domain, period, TaskHelper.tomorrowZero(period)); DailyReport report = new DailyReport(); @@ -86,6 +90,7 @@ public boolean buildDailyTask(String name, String domain, Date period) { @Override public boolean buildHourlyTask(String name, String domain, Date start) { refreshSpringBeans(); + LOGGER.info("Building service hourly report, name={}, domain={}, period={}.", name, domain, start); ServiceReport serviceReport = new ServiceReport(Constants.CAT); Date end = new Date(start.getTime() + TimeHelper.ONE_HOUR); @@ -120,9 +125,10 @@ public boolean buildHourlyTask(String name, String domain, Date start) { } @Override - public boolean buildMonthlyTask(String name, String domain, Date period) { - ServiceReport serviceReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); - MonthlyReport report = new MonthlyReport(); + public boolean buildMonthlyTask(String name, String domain, Date period) { + LOGGER.info("Building service monthly report, name={}, domain={}, period={}.", name, domain, period); + ServiceReport serviceReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); + MonthlyReport report = new MonthlyReport(); report.setCreationDate(new Date()); report.setDomain(domain); @@ -137,6 +143,7 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building service weekly report, name={}, domain={}, period={}.", name, domain, period); ServiceReport serviceReport = queryDailyReportsByDuration(domain, period, new Date(period.getTime() + TimeHelper.ONE_WEEK)); @@ -172,13 +179,15 @@ private ServiceReport queryDailyReportsByDuration(String domain, Date start, Dat for (; startTime < endTime; startTime += TimeHelper.ONE_DAY) { try { - ServiceReport reportModel = m_reportService - .queryReport(domain, new Date(startTime), new Date(startTime + TimeHelper.ONE_DAY)); - reportModel.accept(merger); - } catch (Exception e) { - Cat.logError(e); - } - } + ServiceReport reportModel = m_reportService + .queryReport(domain, new Date(startTime), new Date(startTime + TimeHelper.ONE_DAY)); + reportModel.accept(merger); + } catch (Exception e) { + LOGGER.error("Unable to merge service daily report into duration report, domain={}, period={}.", domain, + new Date(startTime), e); + Cat.logError(e); + } + } ServiceReport serviceReport = merger.getServiceReport(); serviceReport.setStartTime(start); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java index ebd9ec76af..36488cb42d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java @@ -19,11 +19,13 @@ package com.dianping.cat.report.page.statistics.task.utilization; import java.util.Collection; -import java.util.Date; -import java.util.Set; - -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; +import java.util.Date; +import java.util.Set; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.unidal.lookup.annotation.Inject; +import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -53,10 +55,11 @@ import com.dianping.cat.report.task.TaskHelper; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = UtilizationReportBuilder.ID) -public class UtilizationReportBuilder implements TaskBuilder { - - public static final String ID = Constants.REPORT_UTILIZATION; +@Named(type = TaskBuilder.class, value = UtilizationReportBuilder.ID) +public class UtilizationReportBuilder implements TaskBuilder { + private static final Logger LOGGER = LoggerFactory.getLogger(UtilizationReportBuilder.class); + + public static final String ID = Constants.REPORT_UTILIZATION; @Inject protected UtilizationReportService m_reportService; @@ -79,6 +82,7 @@ public class UtilizationReportBuilder implements TaskBuilder { @Override public boolean buildDailyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building utilization daily report, name={}, domain={}, period={}.", name, domain, period); UtilizationReport utilizationReport = queryHourlyReportsByDuration(name, domain, period, TaskHelper.tomorrowZero(period)); @@ -98,6 +102,7 @@ public boolean buildDailyTask(String name, String domain, Date period) { @Override public boolean buildHourlyTask(String name, String domain, Date start) { refreshSpringBeans(); + LOGGER.info("Building utilization hourly report, name={}, domain={}, period={}.", name, domain, start); UtilizationReport utilizationReport = new UtilizationReport(Constants.CAT); Date end = new Date(start.getTime() + TimeHelper.ONE_HOUR); @@ -173,6 +178,7 @@ public boolean buildHourlyTask(String name, String domain, Date start) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building utilization monthly report, name={}, domain={}, period={}.", name, domain, period); UtilizationReport utilizationReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); MonthlyReport report = new MonthlyReport(); @@ -191,6 +197,7 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building utilization weekly report, name={}, domain={}, period={}.", name, domain, period); UtilizationReport utilizationReport = queryDailyReportsByDuration(domain, period, new Date(period.getTime() + TimeHelper.ONE_WEEK)); @@ -216,13 +223,15 @@ private UtilizationReport queryDailyReportsByDuration(String domain, Date start, for (; startTime < endTime; startTime += TimeHelper.ONE_DAY) { try { - UtilizationReport reportModel = m_reportService - .queryReport(domain, new Date(startTime), new Date(startTime + TimeHelper.ONE_DAY)); - reportModel.accept(merger); - } catch (Exception e) { - Cat.logError(e); - } - } + UtilizationReport reportModel = m_reportService + .queryReport(domain, new Date(startTime), new Date(startTime + TimeHelper.ONE_DAY)); + reportModel.accept(merger); + } catch (Exception e) { + LOGGER.error("Unable to merge utilization daily report into duration report, domain={}, period={}.", + domain, new Date(startTime), e); + Cat.logError(e); + } + } UtilizationReport utilizationReport = merger.getUtilizationReport(); utilizationReport.setStartTime(start); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java index 7a2b514196..25b7f78e39 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java @@ -36,6 +36,8 @@ import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.tuple.Pair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -73,6 +75,8 @@ import com.dianping.cat.report.service.ModelService; public class Handler implements PageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); + @Inject private JspViewer m_jspViewer; @@ -153,6 +157,7 @@ private List buildAlterations(Date start, Date end, String type) { } catch (DalNotFoundException e) { // ignore it } catch (Exception e) { + LOGGER.error("Unable to query storage alterations, start={}, end={}, type={}.", start, end, type, e); Cat.logError(e); } return results; @@ -372,6 +377,7 @@ private StorageReport queryHourlyReport(Payload payload) { return report; } else { + LOGGER.error("No eligible storage model service registered, request={}.", request); throw new RuntimeException("Internal error: no eligable transaction service registered for " + request + "!"); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java index 8f427bf808..c3c41ad901 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java @@ -77,6 +77,14 @@ public StorageGroupConfig getConfig() { return m_config; } + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + @Override public void initialize() throws InitializationException { refreshSpringBeans(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java index 0ab074842b..21a6143d1c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java @@ -23,6 +23,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -46,6 +48,7 @@ @Named(type = TaskBuilder.class, value = StorageReportBuilder.ID) public class StorageReportBuilder implements TaskBuilder, Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(StorageReportBuilder.class); public static final String ID = StorageAnalyzer.ID; @@ -57,6 +60,7 @@ public class StorageReportBuilder implements TaskBuilder, Initializable { @Override public boolean buildDailyTask(String name, String reportId, Date period) { + LOGGER.info("Building storage daily report, name={}, reportId={}, period={}.", name, reportId, period); try { StorageReport storageReport = queryHourlyReportsByDuration(reportId, period, TaskHelper.tomorrowZero(period)); @@ -71,6 +75,8 @@ public boolean buildDailyTask(String name, String reportId, Date period) { byte[] binaryContent = DefaultNativeBuilder.build(storageReport); return m_reportService.insertDailyReport(report, binaryContent); } catch (Exception e) { + LOGGER.error("Unable to build storage daily report, name={}, reportId={}, period={}.", name, reportId, period, + e); Cat.logError(e); return false; } @@ -83,6 +89,7 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String reportId, Date period) { + LOGGER.info("Building storage monthly report, name={}, reportId={}, period={}.", name, reportId, period); Date end = null; if (period.equals(TimeHelper.getCurrentMonth())) { @@ -106,6 +113,7 @@ public boolean buildMonthlyTask(String name, String reportId, Date period) { @Override public boolean buildWeeklyTask(String name, String reportId, Date period) { + LOGGER.info("Building storage weekly report, name={}, reportId={}, period={}.", name, reportId, period); Date end = null; if (period.equals(TimeHelper.getCurrentWeek())) { @@ -142,6 +150,8 @@ private StorageReport queryDailyReportsByDuration(String reportId, Date start, D .queryReport(reportId, new Date(startTime), new Date(startTime + TimeHelper.ONE_DAY)); reportModel.accept(merger); } catch (Exception e) { + LOGGER.error("Unable to merge storage daily report into duration report, reportId={}, period={}.", + reportId, new Date(startTime), e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java index 20155e1eba..756b049342 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java @@ -23,6 +23,8 @@ import java.util.List; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Named; @@ -53,6 +55,7 @@ @Named public class StorageReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(StorageReportService.class); @Override public StorageReport makeReport(String id, Date start, Date end) { @@ -104,8 +107,9 @@ public StorageReport queryDailyReport(String id, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Storage daily report is missing, reportId={}, period={}.", id, new Date(startTime), e); } catch (Exception e) { + LOGGER.error("Unable to query storage daily report, reportId={}, period={}.", id, new Date(startTime), e); Cat.logError(e); } } @@ -170,6 +174,8 @@ public StorageReport queryHourlyReport(String reportId, Date start, Date end) { reports = m_hourlyReportDao .findAllByDomainNamePeriod(new Date(startTime), reportId, name, HourlyReportEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to query storage hourly report list, reportId={}, period={}.", reportId, + new Date(startTime), e); Cat.logError(e); } if (reports != null) { @@ -178,8 +184,11 @@ public StorageReport queryHourlyReport(String reportId, Date start, Date end) { StorageReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), reportId); reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Storage hourly report content is missing, reportId={}, reportDbId={}, period={}.", + reportId, report.getId(), report.getPeriod(), e); } catch (Exception e) { + LOGGER.error("Unable to parse storage hourly report, reportId={}, reportDbId={}, period={}.", + reportId, report.getId(), report.getPeriod(), e); Cat.logError(e); } } @@ -203,8 +212,9 @@ public StorageReport queryMonthlyReport(String reportId, Date start) { return queryFromMonthlyBinary(entity.getId(), reportId); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Storage monthly report is missing, reportId={}, period={}.", reportId, start, e); } catch (Exception e) { + LOGGER.error("Unable to query storage monthly report, reportId={}, period={}.", reportId, start, e); Cat.logError(e); } return new StorageReport(reportId); @@ -218,8 +228,9 @@ public StorageReport queryWeeklyReport(String reportId, Date start) { return queryFromWeeklyBinary(entity.getId(), reportId); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Storage weekly report is missing, reportId={}, period={}.", reportId, start, e); } catch (Exception e) { + LOGGER.error("Unable to query storage weekly report, reportId={}, period={}.", reportId, start, e); Cat.logError(e); } return new StorageReport(reportId); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/top/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/top/Handler.java index 25ec53258f..c3a6a356f8 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/top/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/top/Handler.java @@ -30,6 +30,8 @@ import java.util.Map.Entry; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.web.mvc.PageHandler; @@ -62,6 +64,8 @@ import com.dianping.cat.report.service.ModelService; public class Handler implements PageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); + @Inject private JspViewer m_jspViewer; @@ -139,6 +143,9 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { Payload payload = ctx.getPayload(); Action action = payload.getAction(); + LOGGER.info("Handling top report outbound, action={}, domain={}, ip={}, date={}, minute={}, minuteCounts={}.", + action, payload.getDomain(), payload.getIpAddress(), payload.getDate(), payload.getMinute(), + payload.getMinuteCounts()); model.setAction(action); model.setPage(ReportPage.TOP); normalize(model, payload); @@ -226,6 +233,8 @@ private DomainInfo buildDomainInfo(Payload payload, Model model) { removed.add(key); } } catch (Exception e) { + LOGGER.error("Unable to parse top metric time key, key={}, domain={}, date={}, minute={}, minuteCounts={}.", + key, payload.getDomain(), date, minute, exceptedMinute, e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java index 4a770256a3..543447a843 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java @@ -21,6 +21,8 @@ import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Named; @@ -39,6 +41,7 @@ @Named public class TopReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(TopReportService.class); @Override public TopReport makeReport(String domain, Date start, Date end) { @@ -78,6 +81,8 @@ public TopReport queryHourlyReport(String domain, Date start, Date end) { reports = m_hourlyReportDao .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to query top hourly report list, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } if (reports != null) { @@ -86,8 +91,11 @@ public TopReport queryHourlyReport(String domain, Date start, Date end) { TopReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Top hourly report content is missing, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); } catch (Exception e) { + LOGGER.error("Unable to parse top hourly report, domain={}, reportId={}, period={}.", domain, + report.getId(), report.getPeriod(), e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java index 17ddd0e696..2cf4c24b44 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java @@ -24,6 +24,8 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; @@ -59,6 +61,7 @@ @Named public class TransactionReportService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(TransactionReportService.class); private TransactionReport convert(TransactionReport report) { Date start = report.getStartTime(); @@ -71,6 +74,8 @@ private TransactionReport convert(TransactionReport report) { report.accept(statistics); } } catch (Exception e) { + LOGGER.error("Unable to convert transaction report, domain={}, start={}, end={}.", report.getDomain(), start, + end, e); Cat.logError(e); } @@ -108,8 +113,10 @@ public TransactionReport queryDailyReport(String domain, Date start, Date end) { reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Transaction daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { + LOGGER.error("Unable to query transaction daily report, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } } @@ -174,6 +181,8 @@ public TransactionReport queryHourlyReport(String domain, Date start, Date end) reports = m_hourlyReportDao .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to query transaction hourly report list, domain={}, period={}.", domain, + new Date(startTime), e); Cat.logError(e); } if (reports != null) { @@ -183,8 +192,11 @@ public TransactionReport queryHourlyReport(String domain, Date start, Date end) reportModel.accept(merger); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Transaction hourly report content is missing, domain={}, reportId={}, period={}.", + domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { + LOGGER.error("Unable to parse transaction hourly report, domain={}, reportId={}, period={}.", + domain, report.getId(), report.getPeriod(), e); Cat.logError(e); } } @@ -207,8 +219,9 @@ public TransactionReport queryMonthlyReport(String domain, Date start) { .findReportByDomainNamePeriod(start, domain, TransactionAnalyzer.ID, MonthlyReportEntity.READSET_FULL); transactionReport = queryFromMonthlyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Transaction monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query transaction monthly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return convert(transactionReport); @@ -223,8 +236,9 @@ public TransactionReport queryWeeklyReport(String domain, Date start) { .findReportByDomainNamePeriod(start, domain, TransactionAnalyzer.ID, WeeklyReportEntity.READSET_FULL); transactionReport = queryFromWeeklyBinary(entity.getId(), domain); } catch (DalNotFoundException e) { - // ignore + LOGGER.warn("Transaction weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { + LOGGER.error("Unable to query transaction weekly report, domain={}, period={}.", domain, start, e); Cat.logError(e); } return convert(transactionReport); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java index 13fff4e663..a5518b3a99 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java @@ -24,6 +24,7 @@ import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -49,6 +50,7 @@ @Named(type = TaskBuilder.class, value = TransactionReportBuilder.ID) public class TransactionReportBuilder implements Initializable, TaskBuilder, LogEnabled { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(TransactionReportBuilder.class); public static final String ID = TransactionAnalyzer.ID; @@ -82,6 +84,8 @@ public boolean buildDailyTask(String name, String domain, Date period) { byte[] binaryContent = DefaultNativeBuilder.build(transactionReport); return m_reportService.insertDailyReport(report, binaryContent); } catch (Exception e) { + SLF4J_LOGGER.error("Unable to build transaction daily report, name={}, domain={}, period={}.", name, domain, + period, e); m_logger.error(e.getMessage(), e); Cat.logError(e); return false; @@ -96,6 +100,7 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { refreshSpringBeans(); + SLF4J_LOGGER.info("Building transaction monthly report, name={}, domain={}, period={}.", name, domain, period); Date end = null; @@ -120,6 +125,7 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { refreshSpringBeans(); + SLF4J_LOGGER.info("Building transaction weekly report, name={}, domain={}, period={}.", name, domain, period); Date end = null; @@ -191,6 +197,8 @@ private TransactionReport queryDailyReportsByDuration(String domain, Date start, creator.createGraph(reportModel); reportModel.accept(merger); } catch (Exception e) { + SLF4J_LOGGER.error("Unable to merge transaction daily report into duration report, domain={}, period={}.", + domain, new Date(startTime), e); Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java index d47e13be7f..34fa51f1fc 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java @@ -24,6 +24,8 @@ import java.util.Date; import java.util.concurrent.locks.LockSupport; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -38,6 +40,7 @@ @Named public class DefaultTaskConsumer extends TaskConsumer { + private static final Logger LOGGER = LoggerFactory.getLogger(DefaultTaskConsumer.class); @Inject private ReportFacade m_reportFacade; @@ -52,6 +55,7 @@ protected Task findDoingTask(String ip) { try { task = m_taskDao.findByStatusConsumer(STATUS_DOING, ip, TaskEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to find doing task, consumerIp={}.", ip, e); } return task; } @@ -63,6 +67,7 @@ protected Task findTodoTask() { try { task = m_taskDao.findByStatusConsumer(STATUS_TODO, null, TaskEntity.READSET_FULL); } catch (DalException e) { + LOGGER.error("Unable to find todo task.", e); } return task; } @@ -79,9 +84,14 @@ protected boolean processTask(Task doing) { t.addData(doing.toString()); try { + LOGGER.info("Processing report task, reportName={}, domain={}, type={}, period={}, taskId={}.", + doing.getReportName(), doing.getReportDomain(), doing.getTaskType(), doing.getReportPeriod(), doing.getId()); result = m_reportFacade.builderReport(doing); t.setStatus(Transaction.SUCCESS); } catch (Throwable e) { + LOGGER.error("Unable to process report task, reportName={}, domain={}, type={}, period={}, taskId={}.", + doing.getReportName(), doing.getReportDomain(), doing.getTaskType(), doing.getReportPeriod(), doing.getId(), + e); Cat.logError(e); t.setStatus(e); } finally { @@ -118,6 +128,8 @@ protected boolean updateDoingToDone(Task doing) { try { return m_taskDao.updateDoingToDone(doing, TaskEntity.UPDATESET_FULL) == 1; } catch (DalException e) { + LOGGER.error("Unable to mark task done, reportName={}, domain={}, type={}, period={}, taskId={}.", + doing.getReportName(), doing.getReportDomain(), doing.getTaskType(), doing.getReportPeriod(), doing.getId(), e); Cat.logError(e); } return true; @@ -132,6 +144,8 @@ protected boolean updateDoingToFailure(Task doing) { try { return m_taskDao.updateDoingToFail(doing, TaskEntity.UPDATESET_FULL) == 1; } catch (DalException e) { + LOGGER.error("Unable to mark task failed, reportName={}, domain={}, type={}, period={}, taskId={}.", + doing.getReportName(), doing.getReportDomain(), doing.getTaskType(), doing.getReportPeriod(), doing.getId(), e); Cat.logError(e); return false; } @@ -147,6 +161,9 @@ protected boolean updateTodoToDoing(Task todo) { try { return m_taskDao.updateTodoToDoing(todo, TaskEntity.UPDATESET_FULL) == 1; } catch (DalException e) { + LOGGER.error("Unable to claim todo task, reportName={}, domain={}, type={}, period={}, taskId={}, consumer={}.", + todo.getReportName(), todo.getReportDomain(), todo.getTaskType(), todo.getReportPeriod(), todo.getId(), + todo.getConsumer(), e); Cat.logError(e); return false; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java b/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java index b7180cd9a6..1fdb992d23 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java @@ -23,59 +23,69 @@ import java.util.Map; import org.codehaus.plexus.logging.LogEnabled; -import org.codehaus.plexus.logging.Logger; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; -import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Named; +import org.codehaus.plexus.logging.Logger; +import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; +import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.LoggerFactory; +import org.unidal.lookup.ContainerHolder; +import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.Task; import com.dianping.cat.task.TaskManager; -@Named -public class ReportFacade extends ContainerHolder implements LogEnabled, Initializable { - - private Logger m_logger; +@Named +public class ReportFacade extends ContainerHolder implements LogEnabled, Initializable { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(ReportFacade.class); + + private Logger m_logger; private Map m_reportBuilders = new HashMap(); public boolean builderReport(Task task) { - try { - if (task == null) { - return false; - } - int type = task.getTaskType(); + try { + if (task == null) { + SLF4J_LOGGER.warn("Report build skipped because task is null."); + return false; + } + int type = task.getTaskType(); String reportName = task.getReportName(); String reportDomain = task.getReportDomain(); Date reportPeriod = task.getReportPeriod(); - TaskBuilder reportBuilder = getReportBuilder(reportName); - - if (reportBuilder == null) { - Cat.logError(new RuntimeException("no report builder for type:" + " " + reportName)); - return false; - } else { - boolean result = false; - - if (type == TaskManager.REPORT_HOUR) { - result = reportBuilder.buildHourlyTask(reportName, reportDomain, reportPeriod); - } else if (type == TaskManager.REPORT_DAILY) { + TaskBuilder reportBuilder = getReportBuilder(reportName); + + if (reportBuilder == null) { + SLF4J_LOGGER.error("No report builder found, reportName={}, domain={}, type={}, period={}, taskId={}.", + reportName, reportDomain, type, reportPeriod, task.getId()); + Cat.logError(new RuntimeException("no report builder for type:" + " " + reportName)); + return false; + } else { + boolean result = false; + + SLF4J_LOGGER.info("Building report task, reportName={}, domain={}, type={}, period={}, taskId={}.", + reportName, reportDomain, type, reportPeriod, task.getId()); + if (type == TaskManager.REPORT_HOUR) { + result = reportBuilder.buildHourlyTask(reportName, reportDomain, reportPeriod); + } else if (type == TaskManager.REPORT_DAILY) { result = reportBuilder.buildDailyTask(reportName, reportDomain, reportPeriod); } else if (type == TaskManager.REPORT_WEEK) { result = reportBuilder.buildWeeklyTask(reportName, reportDomain, reportPeriod); } else if (type == TaskManager.REPORT_MONTH) { result = reportBuilder.buildMonthlyTask(reportName, reportDomain, reportPeriod); } - if (result) { - return result; - } else { - m_logger.error(task.toString()); - } - } - } catch (Exception e) { - m_logger.error("Error when building report," + e.getMessage(), e); - Cat.logError(e); - return false; + if (result) { + return result; + } else { + SLF4J_LOGGER.error("Report builder returned false, reportName={}, domain={}, type={}, period={}, taskId={}.", + reportName, reportDomain, type, reportPeriod, task.getId()); + m_logger.error(task.toString()); + } + } + } catch (Exception e) { + SLF4J_LOGGER.error("Error when building report, task={}.", task, e); + m_logger.error("Error when building report," + e.getMessage(), e); + Cat.logError(e); + return false; } return false; } @@ -89,9 +99,11 @@ private TaskBuilder getReportBuilder(String reportName) { return m_reportBuilders.get(reportName); } - @Override - public void initialize() throws InitializationException { - m_reportBuilders = lookupMap(TaskBuilder.class); - } + @Override + public void initialize() throws InitializationException { + m_reportBuilders = lookupMap(TaskBuilder.class); + SLF4J_LOGGER.info("Initialized report facade, builderCount={}, builders={}.", m_reportBuilders.size(), + m_reportBuilders.keySet()); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/TaskConsumer.java b/cat-home/src/main/java/com/dianping/cat/report/task/TaskConsumer.java index 6087e388be..22cba54b29 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/TaskConsumer.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/TaskConsumer.java @@ -20,11 +20,15 @@ import java.util.Calendar; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.core.dal.Task; public abstract class TaskConsumer implements org.unidal.helper.Threads.Task { + private static final Logger LOGGER = LoggerFactory.getLogger(TaskConsumer.class); public static final int STATUS_TODO = 1; @@ -74,6 +78,7 @@ public boolean isStopped() { @Override public void run() { String localIp = getLoaclIp(); + LOGGER.info("Task consumer started, name={}, localIp={}.", getName(), localIp); while (m_running) { try { if (checkTime()) { @@ -86,22 +91,35 @@ public void run() { try { task.setConsumer(localIp); if (task.getStatus() == TaskConsumer.STATUS_DOING || updateTodoToDoing(task)) { + LOGGER.info("Task claimed for processing, name={}, reportName={}, domain={}, type={}, period={}, taskId={}.", + getName(), task.getReportName(), task.getReportDomain(), task.getTaskType(), + task.getReportPeriod(), task.getId()); int retryTimes = 0; while (!processTask(task)) { retryTimes++; if (retryTimes < MAX_TODO_RETRY_TIMES) { + LOGGER.warn("Task processing failed, retrying, name={}, reportName={}, domain={}, type={}, period={}, taskId={}, retryTimes={}.", + getName(), task.getReportName(), task.getReportDomain(), task.getTaskType(), + task.getReportPeriod(), task.getId(), retryTimes); taskRetryDuration(); } else { + LOGGER.error("Task processing failed after retries, name={}, reportName={}, domain={}, type={}, period={}, taskId={}, retryTimes={}.", + getName(), task.getReportName(), task.getReportDomain(), task.getTaskType(), + task.getReportPeriod(), task.getId(), retryTimes); updateDoingToFailure(task); again = true; break; } } if (!again) { + LOGGER.info("Task processing succeeded, name={}, reportName={}, domain={}, type={}, period={}, taskId={}.", + getName(), task.getReportName(), task.getReportDomain(), task.getTaskType(), + task.getReportPeriod(), task.getId()); updateDoingToDone(task); } } } catch (Throwable e) { + LOGGER.error("Unexpected error while processing task, task={}.", task, e); Cat.logError(task.toString(), e); } } else { @@ -111,14 +129,16 @@ public void run() { try { Thread.sleep(60 * 1000); } catch (InterruptedException e) { - // Ignore + LOGGER.warn("Task consumer sleep interrupted before active window, name={}.", getName(), e); } } } catch (Throwable e) { + LOGGER.error("Task consumer loop failed, name={}.", getName(), e); Cat.logError(e); } } m_stopped = true; + LOGGER.info("Task consumer stopped, name={}, localIp={}.", getName(), localIp); } public void stop() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java index 968004e9d4..82e6bcd58d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java @@ -22,6 +22,8 @@ import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.helper.Threads; import org.unidal.lookup.annotation.Inject; @@ -37,6 +39,7 @@ @Named(type = TaskBuilder.class, value = CurrentReportBuilder.ID) public class CurrentReportBuilder implements TaskBuilder { + private static final Logger LOGGER = LoggerFactory.getLogger(CurrentReportBuilder.class); public static final String ID = Constants.CURRENT_REPORT; @@ -49,6 +52,7 @@ public class CurrentReportBuilder implements TaskBuilder { @Override public boolean buildDailyTask(String name, String domain, Date period) { refreshSpringBeans(); + LOGGER.info("Building current weekly/monthly refresh task, name={}, domain={}, period={}.", name, domain, period); CurrentWeeklyMonthlyReportTask reportTask = CurrentWeeklyMonthlyReportTask.getInstance(); @@ -62,9 +66,12 @@ public boolean buildDailyTask(String name, String domain, Date period) { } } reportTask.setDomains(domains); + LOGGER.info("Starting current weekly/monthly refresh task, domainCount={}.", domains.size()); Threads.forGroup(Constants.CAT).start(reportTask); } catch (DalException e) { + LOGGER.error("Unable to build current weekly/monthly refresh task, name={}, domain={}, period={}.", name, + domain, period, e); Cat.logError(e); } return true; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentWeeklyMonthlyReportTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentWeeklyMonthlyReportTask.java index 9c6916f1ac..1ca4efecc6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentWeeklyMonthlyReportTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentWeeklyMonthlyReportTask.java @@ -22,6 +22,8 @@ import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.helper.Threads.Task; import com.dianping.cat.Cat; @@ -29,6 +31,7 @@ import com.dianping.cat.message.Transaction; public class CurrentWeeklyMonthlyReportTask implements Task { + private static final Logger LOGGER = LoggerFactory.getLogger(CurrentWeeklyMonthlyReportTask.class); private static CurrentWeeklyMonthlyReportTask m_instance = new CurrentWeeklyMonthlyReportTask(); @@ -48,6 +51,8 @@ public String getName() { public void register(CurrentWeeklyMonthlyTask handler) { synchronized (this) { m_tasks.add(handler); + LOGGER.info("Registered current weekly/monthly report task, reportName={}, taskCount={}.", + handler.getReportName(), m_tasks.size()); } } @@ -57,8 +62,12 @@ private void reloadCurrentMonthly() { for (CurrentWeeklyMonthlyTask task : m_tasks) { try { + LOGGER.info("Reloading current monthly report, reportName={}, domain={}.", task.getReportName(), + domain); task.buildCurrentMonthlyTask(task.getReportName(), domain, TimeHelper.getCurrentMonth()); } catch (Exception e) { + LOGGER.error("Unable to reload current monthly report, reportName={}, domain={}.", + task.getReportName(), domain, e); Cat.logError(e); } } @@ -73,7 +82,15 @@ private void reloadCurrentWeekly() { Transaction t = Cat.newTransaction("ReloadTask", "Reload-Week-" + domain); for (CurrentWeeklyMonthlyTask task : m_tasks) { - task.buildCurrentWeeklyTask(task.getReportName(), domain, TimeHelper.getCurrentWeek()); + try { + LOGGER.info("Reloading current weekly report, reportName={}, domain={}.", task.getReportName(), + domain); + task.buildCurrentWeeklyTask(task.getReportName(), domain, TimeHelper.getCurrentWeek()); + } catch (Exception e) { + LOGGER.error("Unable to reload current weekly report, reportName={}, domain={}.", task.getReportName(), + domain, e); + Cat.logError(e); + } } t.setStatus(Transaction.SUCCESS); @@ -83,8 +100,11 @@ private void reloadCurrentWeekly() { @Override public void run() { + LOGGER.info("Current weekly/monthly reload task started, domainCount={}, taskCount={}.", + m_domains == null ? 0 : m_domains.size(), m_tasks.size()); reloadCurrentWeekly(); reloadCurrentMonthly(); + LOGGER.info("Current weekly/monthly reload task finished."); } public void setDomains(List domains) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java index 44b1adb4c7..62748af3de 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java @@ -20,6 +20,8 @@ import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; @@ -32,6 +34,7 @@ import com.dianping.cat.spring.CatSpringContext; public abstract class AbstractReportReloader implements ReportReloader { + private static final Logger LOGGER = LoggerFactory.getLogger(AbstractReportReloader.class); @Inject protected HourlyReportRepository m_hourlyReportDao; @@ -63,6 +66,10 @@ public boolean insertHourlyReport(ReportReloadEntity entity) { m_hourlyReportContentDao.insert(proto); return true; } catch (DalException e) { + HourlyReport report = entity == null ? null : entity.getReport(); + LOGGER.error("Unable to insert reloaded hourly report, reloader={}, reportName={}, domain={}, period={}.", + getId(), report == null ? null : report.getName(), report == null ? null : report.getDomain(), + report == null ? null : report.getPeriod(), e); Cat.logError(e); return false; } @@ -73,12 +80,16 @@ public boolean reload(long time) { refreshSpringBeans(); try { + LOGGER.info("Reloading hourly reports, reloader={}, time={}.", getId(), time); List reports = loadReport(time); + LOGGER.info("Loaded reports for reload, reloader={}, time={}, reportCount={}.", getId(), time, + reports == null ? 0 : reports.size()); for (ReportReloadEntity entity : reports) { insertHourlyReport(entity); } } catch (Exception e) { + LOGGER.error("Unable to reload hourly reports, reloader={}, time={}.", getId(), time, e); Cat.logError(e); } return true; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java index 2e975c33d4..818b32030c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java @@ -25,6 +25,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.helper.Threads.Task; import org.unidal.lookup.ContainerHolder; import org.unidal.lookup.annotation.Inject; @@ -37,6 +39,7 @@ @Named public class ReportReloadTask extends ContainerHolder implements Initializable, Task { + private static final Logger LOGGER = LoggerFactory.getLogger(ReportReloadTask.class); private static final long DURATION = TimeHelper.ONE_HOUR; @@ -58,6 +61,8 @@ public void initialize() throws InitializationException { m_configManager = configManager; } m_reloaders = lookupMap(ReportReloader.class); + LOGGER.info("Initialized report reload task, reloaderCount={}, reloaders={}.", m_reloaders.size(), + m_reloaders.keySet()); } @Override @@ -72,13 +77,17 @@ public void run() { String type = entry.getKey(); List dates = m_configManager.queryByReportType(type); + LOGGER.info("Report reload cycle found configured dates, type={}, dateCount={}.", type, + dates == null ? 0 : dates.size()); for (Date date : dates) { ReportReloader reloader = entry.getValue(); + LOGGER.info("Running report reloader, type={}, date={}.", type, date); reloader.reload(date.getTime()); } } } catch (Exception e) { + LOGGER.error("Report reload cycle failed.", e); Cat.logError(e); } long duration = System.currentTimeMillis() - current; @@ -88,6 +97,7 @@ public void run() { Thread.sleep(DURATION - duration); } } catch (InterruptedException e) { + LOGGER.warn("Report reload task interrupted."); active = false; } } diff --git a/cat-home/src/main/java/com/dianping/cat/servlet/CatServlet.java b/cat-home/src/main/java/com/dianping/cat/servlet/CatServlet.java index 8575bb091d..dd10df7f1d 100755 --- a/cat-home/src/main/java/com/dianping/cat/servlet/CatServlet.java +++ b/cat-home/src/main/java/com/dianping/cat/servlet/CatServlet.java @@ -24,19 +24,23 @@ import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; -import java.io.PrintWriter; - -import org.unidal.initialization.DefaultModuleContext; -import org.unidal.initialization.ModuleContext; -import org.unidal.initialization.ModuleInitializer; +import java.io.PrintWriter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.unidal.initialization.DefaultModuleContext; +import org.unidal.initialization.ModuleContext; +import org.unidal.initialization.ModuleInitializer; import org.unidal.web.AbstractContainerServlet; import com.dianping.cat.Cat; -public class CatServlet extends AbstractContainerServlet { - private static final long serialVersionUID = 1L; - - private Exception m_exception; +public class CatServlet extends AbstractContainerServlet { + private static final long serialVersionUID = 1L; + + private static final Logger LOGGER = LoggerFactory.getLogger(CatServlet.class); + + private Exception m_exception; private File getConfigFile(ServletConfig config, String name, String defaultConfigValue) { String configValue = config.getInitParameter(name); @@ -61,14 +65,14 @@ protected void initComponents(ServletConfig servletConfig) throws ServletExcepti File serverXmlFile = getConfigFile(servletConfig, "cat-server-xml", "server.xml"); ctx.setAttribute("cat-client-config-file", clientXmlFile); - ctx.setAttribute("cat-server-config-file", serverXmlFile); - initializer.execute(ctx); - } catch (Exception e) { - m_exception = e; - System.err.println(e); - throw new ServletException(e); - } - } + ctx.setAttribute("cat-server-config-file", serverXmlFile); + initializer.execute(ctx); + } catch (Exception e) { + m_exception = e; + LOGGER.error("Unable to initialize CAT servlet components.", e); + throw new ServletException(e); + } + } @Override protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { @@ -84,4 +88,4 @@ protected void service(HttpServletRequest req, HttpServletResponse res) throws S writer.write("Not implemented yet!"); } } -} \ No newline at end of file +} diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java index ec96dfc018..44e16f7298 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java @@ -166,6 +166,9 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { private void refreshSpringBeans() { ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); BusinessConfigManager configManager = CatSpringContext.getBeanIfAvailable(BusinessConfigManager.class); + BusinessTagConfigManager tagConfigManager = CatSpringContext.getBeanIfAvailable(BusinessTagConfigManager.class); + BusinessRuleConfigManager alertConfigManager = CatSpringContext.getBeanIfAvailable(BusinessRuleConfigManager.class); + ConfigHtmlParser configHtmlParser = CatSpringContext.getBeanIfAvailable(ConfigHtmlParser.class); if (projectService != null) { m_projectService = projectService; @@ -173,6 +176,15 @@ private void refreshSpringBeans() { if (configManager != null) { m_configManager = configManager; } + if (tagConfigManager != null) { + m_tagConfigManger = tagConfigManager; + } + if (alertConfigManager != null) { + m_alertConfigManager = alertConfigManager; + } + if (configHtmlParser != null) { + m_configHtmlParser = configHtmlParser; + } } private void alertRuleAddSubmit(Payload payload, Model model) { diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java index c27ab219a5..a6ef839281 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java @@ -27,6 +27,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; @@ -41,6 +43,7 @@ import com.dianping.cat.spring.CatSpringContext; public class BusinessTagConfigManager implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(BusinessTagConfigManager.class); public final static String TAG_CONFIG = "tag"; @@ -51,6 +54,10 @@ public class BusinessTagConfigManager implements Initializable { private BusinessTagConfig m_tagConfig = new BusinessTagConfig(); + public void setConfigDao(BusinessConfigRepository configDao) { + m_configDao = configDao; + } + public Set findAllTags() { return m_tagConfig.getTags().keySet(); } @@ -98,6 +105,8 @@ public void initialize() throws InitializationException { BusinessConfig config = result.get(0); m_configId = config.getId(); m_tagConfig = DefaultSaxParser.parse(config.getContent()); + LOGGER.info("Loaded business tag config from repository, configId={}, tagCount={}.", m_configId, + m_tagConfig.getTags().size()); } else { m_tagConfig = new BusinessTagConfig(); @@ -110,9 +119,11 @@ public void initialize() throws InitializationException { m_configDao.insert(config); m_configId = config.getId(); + LOGGER.info("Initialized empty business tag config, configId={}.", m_configId); } } catch (Exception e) { + LOGGER.error("Unable to initialize business tag config.", e); Cat.logError(e); } } @@ -123,6 +134,8 @@ public boolean store(String xml) { return storeConfig(); } catch (Exception e) { + LOGGER.error("Unable to parse business tag config xml for store. xmlLength={}.", + xml == null ? 0 : xml.length(), e); Cat.logError(e); return false; } @@ -141,7 +154,10 @@ private boolean storeConfig() { config.setContent(m_tagConfig.toString()); config.setUpdatetime(new Date()); m_configDao.updateByPK(config, BusinessConfigEntity.UPDATESET_FULL); + LOGGER.info("Stored business tag config, configId={}, tagCount={}.", m_configId, + m_tagConfig.getTags().size()); } catch (Exception e) { + LOGGER.error("Unable to store business tag config, configId={}.", m_configId, e); Cat.logError(e); return false; } @@ -154,6 +170,7 @@ private void refreshSpringBeans() { if (configDao != null) { m_configDao = configDao; + LOGGER.info("BusinessTagConfigManager refreshed Spring BusinessConfigRepository dependency."); } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/AlertConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/AlertConfigProcessor.java index 262f18f8db..5cb94e04cb 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/AlertConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/AlertConfigProcessor.java @@ -27,6 +27,7 @@ import com.dianping.cat.system.page.config.ConfigHtmlParser; import com.dianping.cat.system.page.config.Model; import com.dianping.cat.system.page.config.Payload; +import com.dianping.cat.spring.CatSpringContext; public class AlertConfigProcessor { @@ -40,6 +41,8 @@ public class AlertConfigProcessor { private ConfigHtmlParser m_configHtmlParser; public void process(Action action, Payload payload, Model model) { + refreshSpringBeans(); + switch (action) { case ALERT_DEFAULT_RECEIVERS: String alertDefaultReceivers = payload.getContent(); @@ -67,4 +70,20 @@ public void process(Action action, Payload payload, Model model) { throw new RuntimeException("Error action name " + action.getName()); } } + + public void refreshSpringBeans() { + AlertConfigManager alertConfigManager = CatSpringContext.getBeanIfAvailable(AlertConfigManager.class); + AlertPolicyManager alertPolicyManager = CatSpringContext.getBeanIfAvailable(AlertPolicyManager.class); + ConfigHtmlParser configHtmlParser = CatSpringContext.getBeanIfAvailable(ConfigHtmlParser.class); + + if (alertConfigManager != null) { + m_alertConfigManager = alertConfigManager; + } + if (alertPolicyManager != null) { + m_alertPolicyManager = alertPolicyManager; + } + if (configHtmlParser != null) { + m_configHtmlParser = configHtmlParser; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/BaseProcesser.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/BaseProcesser.java index 1c16a1c3b5..0d2cdccf91 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/BaseProcesser.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/BaseProcesser.java @@ -38,6 +38,9 @@ public class BaseProcesser { @Inject protected RuleFTLDecorator m_ruleDecorator; + protected void refreshSpringBeans() { + } + public boolean addSubmitRule(BaseRuleConfigManager manager, String id, String metrics, String configs) { try { String xmlContent = manager.updateRule(id, metrics, configs); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/DependencyConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/DependencyConfigProcessor.java index f37da655d4..405d03002a 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/DependencyConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/DependencyConfigProcessor.java @@ -30,6 +30,7 @@ import com.dianping.cat.system.page.config.ConfigHtmlParser; import com.dianping.cat.system.page.config.Model; import com.dianping.cat.system.page.config.Payload; +import com.dianping.cat.spring.CatSpringContext; public class DependencyConfigProcessor { @@ -45,6 +46,31 @@ public class DependencyConfigProcessor { @Inject private ConfigHtmlParser m_configHtmlParser; + public void refreshSpringBeans() { + GlobalConfigProcessor globalConfigManager = CatSpringContext.getBeanIfAvailable(GlobalConfigProcessor.class); + TopologyGraphConfigManager topologyConfigManager = CatSpringContext + .getBeanIfAvailable(TopologyGraphConfigManager.class); + TopoGraphFormatConfigManager formatConfigManager = CatSpringContext + .getBeanIfAvailable(TopoGraphFormatConfigManager.class); + ConfigHtmlParser configHtmlParser = CatSpringContext.getBeanIfAvailable(ConfigHtmlParser.class); + + if (globalConfigManager != null) { + m_globalConfigManager = globalConfigManager; + } + if (m_globalConfigManager != null) { + m_globalConfigManager.refreshSpringBeans(); + } + if (topologyConfigManager != null) { + m_topologyConfigManager = topologyConfigManager; + } + if (formatConfigManager != null) { + m_formatConfigManager = formatConfigManager; + } + if (configHtmlParser != null) { + m_configHtmlParser = configHtmlParser; + } + } + private void graphEdgeConfigAdd(Payload payload, Model model) { String type = payload.getType(); String from = payload.getFrom(); @@ -97,6 +123,8 @@ private boolean graphNodeConfigDelete(Payload payload) { } public void process(Action action, Payload payload, Model model) { + refreshSpringBeans(); + switch (action) { case TOPOLOGY_GRAPH_NODE_CONFIG_LIST: model.setGraphConfig(m_topologyConfigManager.getConfig()); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/EventConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/EventConfigProcessor.java index 975d9c87ef..63752895ad 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/EventConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/EventConfigProcessor.java @@ -27,13 +27,27 @@ import com.dianping.cat.system.page.config.Action; import com.dianping.cat.system.page.config.Model; import com.dianping.cat.system.page.config.Payload; +import com.dianping.cat.spring.CatSpringContext; public class EventConfigProcessor extends BaseProcesser { @Inject private EventRuleConfigManager m_configManager; + @Override + protected void refreshSpringBeans() { + super.refreshSpringBeans(); + + EventRuleConfigManager configManager = CatSpringContext.getBeanIfAvailable(EventRuleConfigManager.class); + + if (configManager != null) { + m_configManager = configManager; + } + } + public void process(Action action, Payload payload, Model model) { + refreshSpringBeans(); + switch (action) { case EVENT_RULE: Map ruleMap = m_configManager.getMonitorRules().getRules(); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/ExceptionConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/ExceptionConfigProcessor.java index 28c6a52324..5bca68d657 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/ExceptionConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/ExceptionConfigProcessor.java @@ -30,6 +30,7 @@ import com.dianping.cat.system.page.config.Action; import com.dianping.cat.system.page.config.Model; import com.dianping.cat.system.page.config.Payload; +import com.dianping.cat.spring.CatSpringContext; public class ExceptionConfigProcessor { @@ -39,6 +40,22 @@ public class ExceptionConfigProcessor { @Inject private ExceptionRuleConfigManager m_exceptionRuleConfigManager; + public void refreshSpringBeans() { + GlobalConfigProcessor globalConfigProcessor = CatSpringContext.getBeanIfAvailable(GlobalConfigProcessor.class); + ExceptionRuleConfigManager exceptionRuleConfigManager = CatSpringContext + .getBeanIfAvailable(ExceptionRuleConfigManager.class); + + if (globalConfigProcessor != null) { + m_globalConfigProcessor = globalConfigProcessor; + } + if (m_globalConfigProcessor != null) { + m_globalConfigProcessor.refreshSpringBeans(); + } + if (exceptionRuleConfigManager != null) { + m_exceptionRuleConfigManager = exceptionRuleConfigManager; + } + } + private void deleteExceptionExclude(Payload payload) { m_exceptionRuleConfigManager.deleteExceptionExclude(payload.getDomain(), payload.getException()); } @@ -69,6 +86,8 @@ private void rulesAvailableBuild(List exceptionLimits) { } public void process(Action action, Payload payload, Model model) { + refreshSpringBeans(); + switch (action) { case EXCEPTION: loadExceptionConfig(model); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java index c58bc4e6f2..a1eb0b545e 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java @@ -215,17 +215,35 @@ public void process(Action action, Payload payload, Model model) { } } - private void refreshSpringBeans() { + public void refreshSpringBeans() { ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + RouterConfigManager routerConfigManager = CatSpringContext.getBeanIfAvailable(RouterConfigManager.class); + DomainGroupConfigManager domainGroupConfigManager = CatSpringContext.getBeanIfAvailable(DomainGroupConfigManager.class); + StorageGroupConfigManager storageGroupConfigManager = CatSpringContext + .getBeanIfAvailable(StorageGroupConfigManager.class); + ConfigHtmlParser configHtmlParser = CatSpringContext.getBeanIfAvailable(ConfigHtmlParser.class); SampleConfigManager sampleConfigManager = CatSpringContext.getBeanIfAvailable(SampleConfigManager.class); ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); ServerFilterConfigManager serverFilterConfigManager = CatSpringContext .getBeanIfAvailable(ServerFilterConfigManager.class); ReportReloadConfigManager reloadConfigManager = CatSpringContext.getBeanIfAvailable(ReportReloadConfigManager.class); + SenderConfigManager senderConfigManager = CatSpringContext.getBeanIfAvailable(SenderConfigManager.class); if (projectService != null) { m_projectService = projectService; } + if (routerConfigManager != null) { + m_routerConfigManager = routerConfigManager; + } + if (domainGroupConfigManager != null) { + m_domainGroupConfigManger = domainGroupConfigManager; + } + if (storageGroupConfigManager != null) { + m_groupConfigManager = storageGroupConfigManager; + } + if (configHtmlParser != null) { + m_configHtmlParser = configHtmlParser; + } if (sampleConfigManager != null) { m_sampleConfigManager = sampleConfigManager; } @@ -238,6 +256,9 @@ private void refreshSpringBeans() { if (reloadConfigManager != null) { m_reloadConfigManager = reloadConfigManager; } + if (senderConfigManager != null) { + m_senderConfigManager = senderConfigManager; + } } public List queryAllProjects() { diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/HeartbeatConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/HeartbeatConfigProcessor.java index 9a296018b0..39c341f8c0 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/HeartbeatConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/HeartbeatConfigProcessor.java @@ -27,6 +27,7 @@ import com.dianping.cat.system.page.config.ConfigHtmlParser; import com.dianping.cat.system.page.config.Model; import com.dianping.cat.system.page.config.Payload; +import com.dianping.cat.spring.CatSpringContext; public class HeartbeatConfigProcessor extends BaseProcesser { @@ -40,6 +41,8 @@ public class HeartbeatConfigProcessor extends BaseProcesser { private ConfigHtmlParser m_configHtmlParser; public void process(Action action, Payload payload, Model model) { + refreshSpringBeans(); + switch (action) { case HEARTBEAT_RULE_CONFIG_LIST: generateRuleItemList(m_heartbeatRuleConfigManager, model); @@ -72,4 +75,25 @@ public void process(Action action, Payload payload, Model model) { } } + @Override + protected void refreshSpringBeans() { + super.refreshSpringBeans(); + + HeartbeatRuleConfigManager heartbeatRuleConfigManager = CatSpringContext + .getBeanIfAvailable(HeartbeatRuleConfigManager.class); + HeartbeatDisplayPolicyManager displayPolicyManager = CatSpringContext + .getBeanIfAvailable(HeartbeatDisplayPolicyManager.class); + ConfigHtmlParser configHtmlParser = CatSpringContext.getBeanIfAvailable(ConfigHtmlParser.class); + + if (heartbeatRuleConfigManager != null) { + m_heartbeatRuleConfigManager = heartbeatRuleConfigManager; + } + if (displayPolicyManager != null) { + m_displayPolicyManager = displayPolicyManager; + } + if (configHtmlParser != null) { + m_configHtmlParser = configHtmlParser; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/StorageConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/StorageConfigProcessor.java index ff67df9a9a..d81d0cdee0 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/StorageConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/StorageConfigProcessor.java @@ -26,6 +26,7 @@ public class StorageConfigProcessor extends BaseProcesser { public void process(Action action, Payload payload, Model model) { + refreshSpringBeans(); switch (action) { case STORAGE_RULE: diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/TransactionConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/TransactionConfigProcessor.java index 4fa8f67968..d7a4720484 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/TransactionConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/TransactionConfigProcessor.java @@ -27,13 +27,27 @@ import com.dianping.cat.system.page.config.Action; import com.dianping.cat.system.page.config.Model; import com.dianping.cat.system.page.config.Payload; +import com.dianping.cat.spring.CatSpringContext; public class TransactionConfigProcessor extends BaseProcesser { @Inject private TransactionRuleConfigManager m_configManager; + @Override + protected void refreshSpringBeans() { + super.refreshSpringBeans(); + + TransactionRuleConfigManager configManager = CatSpringContext.getBeanIfAvailable(TransactionRuleConfigManager.class); + + if (configManager != null) { + m_configManager = configManager; + } + } + public void process(Action action, Payload payload, Model model) { + refreshSpringBeans(); + switch (action) { case TRANSACTION_RULE: Map ruleMap = m_configManager.getMonitorRules().getRules(); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/login/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/login/Handler.java index da7e1ac6ee..3e31205b8d 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/login/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/login/Handler.java @@ -25,6 +25,8 @@ import java.util.Date; import java.util.Enumeration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.web.jsp.function.CodecFunction; import org.unidal.web.mvc.ActionContext; @@ -44,6 +46,8 @@ import com.dianping.cat.system.page.login.service.SigninService; public class Handler implements PageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); + @Inject private JspViewer m_jspViewer; @@ -71,18 +75,23 @@ public void handleInbound(Context ctx) throws ServletException, IOException { Session session = m_signinService.signin(sc, credential); if (session == null) { + LOGGER.warn("User login failed, account={}.", account); ctx.addError(new ErrorObject("biz.login")); } else { + LOGGER.info("User login succeeded, account={}.", account); redirect(ctx, payload); return; } } else { + LOGGER.warn("User login input is incomplete, accountPresent={}, passwordPresent={}.", account != null, + password != null); ctx.addError(new ErrorObject("biz.login.input").addArgument("account", account).addArgument("password", password)); } } else if (action == Action.LOGOUT) { SigninContext sc = createSigninContext(ctx); m_signinService.signout(sc); + LOGGER.info("User logout requested."); redirect(ctx, payload); return; } else { @@ -98,6 +107,7 @@ public void handleInbound(Context ctx) throws ServletException, IOException { LoginMember member = session.getMember(); context.setSigninMember(member); logAccess(ctx, member); + LOGGER.info("User session validated, userName={}.", member.getUserName()); return; } else if (parent != null) { throw new RuntimeException(String.format("%s should extend %s!", ctx.getClass(), SystemContext.class)); @@ -136,6 +146,7 @@ private boolean shouldLogin(Context ctx) { return true; } catch (Exception e) { + LOGGER.warn("Unable to determine whether current action requires login.", e); return false; } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/login/service/SessionManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/login/service/SessionManager.java index caa2d6846b..fc134a1740 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/login/service/SessionManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/login/service/SessionManager.java @@ -27,12 +27,16 @@ import javax.naming.ldap.InitialLdapContext; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.system.page.login.spi.ISessionManager; import com.google.common.base.Function; public class SessionManager implements ISessionManager { + private static final Logger LOGGER = LoggerFactory.getLogger(SessionManager.class); + private CatPropertyProvider m_provider; private Function tokenCreator; @@ -71,6 +75,8 @@ public Token apply(Credential credential) { final String account = credential.getAccount(); final String pwd = credential.getPassword(); if (StringUtils.isEmpty(account) || StringUtils.isEmpty(pwd)) { + LOGGER.warn("LDAP authentication skipped because account or password is empty, accountPresent={}.", + !StringUtils.isEmpty(account)); return null; } Hashtable env = new Hashtable(); @@ -95,6 +101,7 @@ public Token apply(Credential credential) { return new Token(account, displayName == null ? account : displayName); } catch (Exception e) { + LOGGER.warn("LDAP authentication failed, account={}, ldapUrl={}.", account, ldapUrl, e); Cat.logError(e); return null; } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/login/service/TokenBuilder.java b/cat-home/src/main/java/com/dianping/cat/system/page/login/service/TokenBuilder.java index 82114f484c..ea92dc7e60 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/login/service/TokenBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/login/service/TokenBuilder.java @@ -16,16 +16,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.dianping.cat.system.page.login.service; - -import com.dianping.cat.util.HttpUtils; -import java.io.UnsupportedEncodingException; -import java.util.regex.Pattern; - -import com.dianping.cat.system.page.login.spi.ITokenBuilder; - -public class TokenBuilder implements ITokenBuilder { - private static final String SP = "|"; +package com.dianping.cat.system.page.login.service; + +import com.dianping.cat.util.HttpUtils; +import java.io.UnsupportedEncodingException; +import java.util.regex.Pattern; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.dianping.cat.system.page.login.spi.ITokenBuilder; + +public class TokenBuilder implements ITokenBuilder { + private static final Logger LOGGER = LoggerFactory.getLogger(TokenBuilder.class); + + private static final String SP = "|"; private static final long ONE_DAY = 24 * 60 * 60 * 1000L; @@ -35,17 +40,19 @@ public String build(SigninContext ctx, Token token) { String userName = token.getUserName(); String userNameValue = ""; - try { - userNameValue = java.net.URLEncoder.encode(userName, "utf-8"); - } catch (UnsupportedEncodingException e) { - } - - String realName = token.getRealName(); - String value = ""; - try { - value = java.net.URLEncoder.encode(realName, "utf-8"); - } catch (UnsupportedEncodingException e) { - } + try { + userNameValue = java.net.URLEncoder.encode(userName, "utf-8"); + } catch (UnsupportedEncodingException e) { + LOGGER.warn("Unable to encode login token user name."); + } + + String realName = token.getRealName(); + String value = ""; + try { + value = java.net.URLEncoder.encode(realName, "utf-8"); + } catch (UnsupportedEncodingException e) { + LOGGER.warn("Unable to encode login token real name."); + } sb.append(value).append(SP); sb.append(userNameValue).append(SP); sb.append(System.currentTimeMillis()).append(SP); @@ -77,15 +84,17 @@ public Token parse(SigninContext ctx, String value) { if (lastLoginDate + ONE_DAY > System.currentTimeMillis()) { String realNameValue = ""; String userNameVaule = ""; - try { - realNameValue = java.net.URLDecoder.decode(realName, "utf-8"); - } catch (UnsupportedEncodingException e) { - } - try { - userNameVaule = java.net.URLDecoder.decode(userName, "utf-8"); - } catch (UnsupportedEncodingException e) { - } - return new Token(realNameValue, userNameVaule); + try { + realNameValue = java.net.URLDecoder.decode(realName, "utf-8"); + } catch (UnsupportedEncodingException e) { + LOGGER.warn("Unable to decode login token real name."); + } + try { + userNameVaule = java.net.URLDecoder.decode(userName, "utf-8"); + } catch (UnsupportedEncodingException e) { + LOGGER.warn("Unable to decode login token user name."); + } + return new Token(realNameValue, userNameVaule); } } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/Handler.java index 4bb5f60b39..280c4a5206 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/Handler.java @@ -30,6 +30,7 @@ import com.dianping.cat.system.SystemPage; import com.dianping.cat.system.page.config.ConfigHtmlParser; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { @@ -55,6 +56,8 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = "permission") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + Model model = new Model(ctx); Payload payload = ctx.getPayload(); Action action = payload.getAction(); @@ -84,4 +87,16 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { m_jspViewer.view(ctx, model); } } + + private void refreshSpringBeans() { + UserConfigManager userConfigManager = CatSpringContext.getBeanIfAvailable(UserConfigManager.class); + ResourceConfigManager resourceConfigManager = CatSpringContext.getBeanIfAvailable(ResourceConfigManager.class); + + if (userConfigManager != null) { + m_userConfigManager = userConfigManager; + } + if (resourceConfigManager != null) { + m_resourceConfigManager = resourceConfigManager; + } + } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/PermissionFilter.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/PermissionFilter.java index e03eaabadf..3dfbd70950 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/PermissionFilter.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/PermissionFilter.java @@ -36,6 +36,7 @@ import com.dianping.cat.system.page.login.service.SigninContext; import com.dianping.cat.system.page.login.service.Token; import com.dianping.cat.system.page.login.service.TokenManager; +import com.dianping.cat.spring.CatSpringContext; public class PermissionFilter implements Filter { @@ -63,6 +64,7 @@ public void init(FilterConfig filterConfig) throws ServletException { ModuleContext ctx = new DefaultModuleContext(container); m_userConfigManager = ctx.lookup(UserConfigManager.class); m_resourceConfigManager = ctx.lookup(ResourceConfigManager.class); + refreshSpringBeans(); m_tokenManager = ctx.lookup(TokenManager.class); m_errorPage = filterConfig.getInitParameter("errorPage"); m_loginPage = filterConfig.getInitParameter(LOGIN); @@ -73,6 +75,7 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; + refreshSpringBeans(); httpRequest.setCharacterEncoding("utf-8"); SigninContext ctx = new SigninContext(httpRequest, httpResponse); @@ -114,4 +117,16 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha public void destroy() { } + private void refreshSpringBeans() { + UserConfigManager userConfigManager = CatSpringContext.getBeanIfAvailable(UserConfigManager.class); + ResourceConfigManager resourceConfigManager = CatSpringContext.getBeanIfAvailable(ResourceConfigManager.class); + + if (userConfigManager != null) { + m_userConfigManager = userConfigManager; + } + if (resourceConfigManager != null) { + m_resourceConfigManager = resourceConfigManager; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java index 249db6be87..fb79752d83 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java @@ -23,6 +23,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -41,6 +43,7 @@ @Named public class ResourceConfigManager implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(ResourceConfigManager.class); public static final int DEFAULT_RESOURCE_ROLE = 1; @@ -62,6 +65,14 @@ public class ResourceConfigManager implements Initializable { private volatile Map> m_permissions = new ConcurrentHashMap>(); + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + public ResourceConfig getConfig() { return m_config; } @@ -99,7 +110,11 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_modifyTime = config.getModifyDate().getTime(); m_config = DefaultSaxParser.parse(content); + LOGGER.info("Loaded resource config from repository, configId={}, modifyTime={}.", m_configId, + m_modifyTime); } catch (DalNotFoundException e) { + LOGGER.warn("Resource config is missing in repository, loading default content from fetcher.", e); + try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -109,14 +124,18 @@ public void initialize() throws InitializationException { m_configDao.insert(config); m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); + LOGGER.info("Initialized resource config from default content, configId={}.", m_configId); } catch (Exception ex) { + LOGGER.error("Unable to initialize resource config from default content.", ex); Cat.logError(ex); } } catch (Exception e) { + LOGGER.error("Unable to load resource config from repository.", e); Cat.logError(e); } if (m_config == null) { m_config = new ResourceConfig(); + LOGGER.warn("Resource config is empty after initialization, using a new empty config."); } refreshData(); @@ -141,6 +160,8 @@ public boolean insert(String xml) { return storeConfig(); } catch (Exception e) { + LOGGER.error("Unable to parse resource config xml for insert. xmlLength={}.", + xml == null ? 0 : xml.length(), e); Cat.logError(e); return false; } @@ -160,6 +181,8 @@ private void refreshConfig() throws Exception { m_modifyTime = modifyTime; refreshData(); + LOGGER.info("Refreshed resource config, configId={}, modifyTime={}, resourceCount={}.", m_configId, + m_modifyTime, m_config.getResources().size()); } } } @@ -180,6 +203,7 @@ private void refreshData() { } m_permissions = permissions; + LOGGER.info("Rebuilt resource permissions cache, pathCount={}.", permissions.size()); } private boolean storeConfig() { @@ -196,7 +220,10 @@ private boolean storeConfig() { m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); refreshData(); + LOGGER.info("Stored resource config, configId={}, resourceCount={}.", m_configId, + m_config.getResources().size()); } catch (Exception e) { + LOGGER.error("Unable to store resource config, configId={}.", m_configId, e); Cat.logError(e); return false; } @@ -210,9 +237,11 @@ private void refreshSpringBeans() { if (configDao != null) { m_configDao = configDao; + LOGGER.info("ResourceConfigManager refreshed Spring ConfigRepository dependency."); } if (fetcher != null) { m_fetcher = fetcher; + LOGGER.info("ResourceConfigManager refreshed Spring ContentFetcher dependency."); } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java index 48dab1931f..574d14182e 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java @@ -20,6 +20,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -38,6 +40,7 @@ @Named public class UserConfigManager implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(UserConfigManager.class); public static final int DEFAULT_ROLE = 1; @@ -55,6 +58,14 @@ public class UserConfigManager implements Initializable { private UserConfig m_config; + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + public UserConfig getConfig() { return m_config; } @@ -80,7 +91,10 @@ public void initialize() throws InitializationException { m_configId = config.getId(); m_modifyTime = config.getModifyDate().getTime(); m_config = DefaultSaxParser.parse(content); + LOGGER.info("Loaded user config from repository, configId={}, modifyTime={}.", m_configId, m_modifyTime); } catch (DalNotFoundException e) { + LOGGER.warn("User config is missing in repository, loading default content from fetcher.", e); + try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -90,14 +104,18 @@ public void initialize() throws InitializationException { m_configDao.insert(config); m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); + LOGGER.info("Initialized user config from default content, configId={}.", m_configId); } catch (Exception ex) { + LOGGER.error("Unable to initialize user config from default content.", ex); Cat.logError(ex); } } catch (Exception e) { + LOGGER.error("Unable to load user config from repository.", e); Cat.logError(e); } if (m_config == null) { m_config = new UserConfig(); + LOGGER.warn("User config is empty after initialization, using a new empty config."); } TimerSyncTask.getInstance().register(new SyncHandler() { @@ -127,6 +145,8 @@ private void refreshConfig() throws Exception { UserConfig userConfig = DefaultSaxParser.parse(content); m_config = userConfig; m_modifyTime = modifyTime; + LOGGER.info("Refreshed user config, configId={}, modifyTime={}, userCount={}.", m_configId, + m_modifyTime, m_config.getUsers().size()); } } } @@ -137,6 +157,7 @@ public boolean insert(String xml) { return storeConfig(); } catch (Exception e) { + LOGGER.error("Unable to parse user config xml for insert. xmlLength={}.", xml == null ? 0 : xml.length(), e); Cat.logError(e); return false; } @@ -154,7 +175,9 @@ private boolean storeConfig() { config.setName(CONFIG_NAME); config.setContent(m_config.toString()); m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + LOGGER.info("Stored user config, configId={}, userCount={}.", m_configId, m_config.getUsers().size()); } catch (Exception e) { + LOGGER.error("Unable to store user config, configId={}.", m_configId, e); Cat.logError(e); return false; } @@ -168,9 +191,11 @@ private void refreshSpringBeans() { if (configDao != null) { m_configDao = configDao; + LOGGER.info("UserConfigManager refreshed Spring ConfigRepository dependency."); } if (fetcher != null) { m_fetcher = fetcher; + LOGGER.info("UserConfigManager refreshed Spring ContentFetcher dependency."); } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/project/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/project/Handler.java index 11913abbcf..984eca6f8a 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/project/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/project/Handler.java @@ -24,6 +24,8 @@ import java.util.Map; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -39,6 +41,8 @@ import com.dianping.cat.system.SystemPage; public class Handler implements PageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); + @Inject public ProjectService m_projectService; @@ -82,12 +86,16 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { if (temp == null) { m_projectService.insert(project); + LOGGER.info("Inserted project config, domain={}.", project.getDomain()); } else { m_projectService.update(project); + LOGGER.info("Updated project config, domain={}.", project.getDomain()); } model.setContent(UpdateStatus.SUCCESS.getStatusJson()); } catch (Exception e) { model.setContent(UpdateStatus.INTERNAL_ERROR.getStatusJson()); + LOGGER.error("Unable to update project config, domain={}.", + payload.getProject() == null ? null : payload.getProject().getDomain(), e); Cat.logError(e); } break; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java index 1b24e4d30e..e8f08b3610 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java @@ -27,6 +27,8 @@ import javax.servlet.ServletException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -48,6 +50,7 @@ import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); @Inject private CachedRouterConfigService m_cachedReportService; @@ -80,6 +83,7 @@ private String buildRouterInfo(String ip, String domain, RouterConfig config) { servers = d.findGroup(group).getServers(); if (servers.isEmpty()) { + LOGGER.warn("Router report has empty servers for domain={}, group={}, ip={}.", domain, group, ip); Cat.logError(new RuntimeException("Error when build router config, domain: " + domain)); } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java index 8139b1d43d..4c2d4810a6 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java @@ -28,6 +28,7 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -53,6 +54,7 @@ @Named public class RouterConfigHandler implements LogEnabled { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(RouterConfigHandler.class); protected Logger m_logger; @@ -217,6 +219,8 @@ private void processBackServer(Map servers, RouterConfig routerCon } } } catch (Exception e) { + SLF4J_LOGGER.error("Unable to process router backup server, domain={}, group={}.", domain.getId(), + group, e); Cat.logError(e); } } @@ -255,6 +259,8 @@ private void processMainServer(Map servers, RouterConfig routerCon } } } catch (Exception e) { + SLF4J_LOGGER.error("Unable to process router main server, domain={}, group={}, value={}.", + entry.getKey(), group, entry.getValue(), e); Cat.logError(e); } } @@ -262,6 +268,7 @@ private void processMainServer(Map servers, RouterConfig routerCon public boolean updateRouterConfig(Date period) { try { + SLF4J_LOGGER.info("Updating router config report, period={}.", period); String name = RouterConfigBuilder.ID; String domain = Constants.CAT; RouterConfig routerConfig = buildRouterConfig(domain, period); @@ -278,8 +285,10 @@ public boolean updateRouterConfig(Date period) { byte[] binaryContent = DefaultNativeBuilder.build(routerConfig); m_reportService.insertDailyReport(dailyReport, binaryContent); + SLF4J_LOGGER.info("Updated router config report, period={}, binarySize={}.", period, binaryContent.length); return true; } catch (Exception e) { + SLF4J_LOGGER.error("Unable to update router config report, period={}.", period, e); Cat.logError(e); return false; } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java index 0145752f8a..2253120940 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java @@ -41,6 +41,7 @@ import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.annotation.Inject; @@ -54,6 +55,7 @@ @Named public class RouterConfigManager implements Initializable, LogEnabled { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(RouterConfigManager.class); public static final String DEFAULT = "default"; @@ -114,11 +116,28 @@ public Map> getRouterConfigs() { return m_routerConfigs; } + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setDailyReportContentDao(DailyReportContentRepository dailyReportContentDao) { + m_dailyReportContentDao = dailyReportContentDao; + } + + public void setDailyReportDao(DailyReportRepository dailyReportDao) { + m_dailyReportDao = dailyReportDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + @Override public void initialize() throws InitializationException { refreshSpringBeans(); try { + SLF4J_LOGGER.info("Initializing router config manager, configName={}.", CONFIG_NAME); Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); String content = config.getContent(); @@ -126,6 +145,8 @@ public void initialize() throws InitializationException { m_routerConfig = DefaultSaxParser.parse(content); m_modifyTime = config.getModifyDate().getTime(); } catch (DalNotFoundException e) { + SLF4J_LOGGER.warn("Router config not found in repository, loading default content, configName={}.", + CONFIG_NAME); try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -140,12 +161,15 @@ public void initialize() throws InitializationException { m_routerConfig = DefaultSaxParser.parse(content); m_modifyTime = now.getTime(); } catch (Exception ex) { + SLF4J_LOGGER.error("Unable to create default router config, configName={}.", CONFIG_NAME, ex); Cat.logError(ex); } } catch (Exception e) { + SLF4J_LOGGER.error("Unable to initialize router config, configName={}.", CONFIG_NAME, e); Cat.logError(e); } if (m_routerConfig == null) { + SLF4J_LOGGER.warn("Router config is empty after initialization, using an empty config."); m_routerConfig = new RouterConfig(); } @@ -177,11 +201,14 @@ public boolean insert(String xml) { if (result) { refreshNetInfo(); } + SLF4J_LOGGER.info("Inserted router config, result={}, xmlLength={}.", result, xml == null ? 0 : xml.length()); return result; } else { + SLF4J_LOGGER.warn("Router config validation failed, xmlLength={}.", xml == null ? 0 : xml.length()); return false; } } catch (Exception e) { + SLF4J_LOGGER.error("Unable to insert router config, xmlLength={}.", xml == null ? 0 : xml.length(), e); Cat.logError(e); m_logger.error(e.getMessage(), e); return false; @@ -315,6 +342,7 @@ private void refreshConfigInfo() throws DalException, SAXException, IOException m_routerConfig = DefaultSaxParser.parse(content); m_modifyTime = modifyTime; refreshNetInfo(); + SLF4J_LOGGER.info("Refreshed router config, configName={}, modifyTime={}.", CONFIG_NAME, modifyTime); } } } @@ -333,6 +361,8 @@ private void refreshNetInfo() { infos.add(netInfo); } catch (Exception e) { + SLF4J_LOGGER.warn("Unable to parse router network subnet, policy={}, network={}.", + netPolicy.getKey(), network.getValue().getId(), e); Cat.logError(e); } } @@ -365,11 +395,12 @@ private void refreshReportInfo() throws Exception { m_routerConfigs.put(time, new Pair(routerConfig, modifyTime)); Cat.logEvent("ReloadConfig", "router"); } catch (DalNotFoundException ignored) { - + SLF4J_LOGGER.warn("Router report content not found while refreshing report cache, reportId={}.", + report.getId()); } } } catch (DalNotFoundException ignored) { - + SLF4J_LOGGER.warn("Router daily report not found while refreshing report cache, period={}.", period); } } @@ -397,6 +428,8 @@ private boolean storeConfig() { config.setContent(m_routerConfig.toString()); m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); } catch (Exception e) { + SLF4J_LOGGER.error("Unable to store router config, configName={}, configId={}.", CONFIG_NAME, + m_configId, e); Cat.logError(e); return false; } @@ -410,6 +443,8 @@ public boolean validate(final RouterConfig routerConfig) { for (ServerGroup serverGroup : routerConfig.getServerGroups().values()) { for (GroupServer server : serverGroup.getGroupServers().values()) { if (!servers.contains(server.getId())) { + SLF4J_LOGGER.warn("Router config validation failed, groupServer has no default server, server={}.", + server); Cat.logError(new RuntimeException("Error router config in group server, has no server ip: " + server)); return false; } @@ -417,6 +452,7 @@ public boolean validate(final RouterConfig routerConfig) { } if (queryEnableServers(routerConfig).isEmpty()) { + SLF4J_LOGGER.warn("Router config validation failed, enabled servers are empty."); Cat.logError(new RuntimeException("Error router config, enable servers not exist.")); return false; } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java index 4c702828a2..7de4a6e4f7 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java @@ -27,6 +27,8 @@ import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -41,6 +43,7 @@ @Named public class RouterConfigService extends AbstractReportService { + private static final Logger LOGGER = LoggerFactory.getLogger(RouterConfigService.class); @Inject private RouterConfigManager m_routerConfigManager; @@ -68,6 +71,8 @@ public RouterConfig queryDailyReport(String domain, Date start, Date end) { } catch (DalNotFoundException e) { // ignore } catch (Exception e) { + LOGGER.error("Unable to query daily router config report, domain={}, start={}, end={}.", domain, start, + end, e); Cat.logError(e); } return null; @@ -107,6 +112,7 @@ public RouterConfig queryLastReport(String domain) { } catch (DalNotFoundException e) { // ignore } catch (Exception e) { + LOGGER.error("Unable to query latest router config report, domain={}.", domain, e); Cat.logError(e); } return null; From f6580f3c68ba501894d8b304535f9415e239ccdc Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 9 Jun 2026 10:03:01 +0800 Subject: [PATCH 007/231] Migrate alarm SPI managers to Spring-backed lookup maps --- SPRING_CONTEXT_MIGRATION_PLAN.md | 114 ++++++++++++++ .../alarm/spi/decorator/DecoratorManager.java | 62 +++++++- .../alarm/spi/decorator/ProjectDecorator.java | 4 + .../cat/alarm/spi/sender/AbstractSender.java | 12 +- .../cat/alarm/spi/sender/SenderManager.java | 40 ++++- .../cat/alarm/spi/spliter/SpliterManager.java | 43 +++++- .../dianping/cat/spring/CatSpringContext.java | 13 ++ .../spring/CatHomeSpringConfiguration.java | 141 ++++++++++++++++++ .../alert/business/BusinessDecorator.java | 4 + .../alert/exception/ExceptionDecorator.java | 4 + 10 files changed, 431 insertions(+), 6 deletions(-) diff --git a/SPRING_CONTEXT_MIGRATION_PLAN.md b/SPRING_CONTEXT_MIGRATION_PLAN.md index 80a4000dc8..1de05aeb88 100644 --- a/SPRING_CONTEXT_MIGRATION_PLAN.md +++ b/SPRING_CONTEXT_MIGRATION_PLAN.md @@ -1000,3 +1000,117 @@ rg -n "DataSourceManager|MyBatisRepositorySupport" cat-core/src/main/java cat-ho 6. 通过后再批量迁移其他 Repository。 这个顺序收益最大,因为它先把 DAO 基础设施从 Unidal 中解耦出来,同时不会立即触碰最高风险的 Web MVC 链路。 + +## 17. 2026-06-09 当前结论与下一步计划 + +### 当前代码基线 + +用户已提交上一轮日志补充和 Spring 迁移相关代码。以 2026-06-09 当前工作树为新基线,`git status --short` 为空。 + +当前项目仍不能直接删除 Plexus / Unidal 依赖。原因是旧框架仍承担三类核心职责: + +1. 组件容器和运行时查找:仍有约 27 个生产 Java 文件使用 `ContainerHolder`、`lookup(...)`、`lookupMap(...)`。 +2. Unidal Web MVC:`cat-home` 中约 146 个生产 Java 文件仍涉及 `org.unidal.web`、`PageHandler`、`ActionPayload`、`ViewModel`、`BaseJspViewer`、`FieldMeta` 等。 +3. Unidal DAL / codegen:约 154 个生产 Java 文件仍涉及 `org.unidal.dal`、`DalException`、`DalNotFoundException` 或生成 DAO / model。 + +根 `pom.xml` 中仍存在以下关键依赖或插件管理项: + +```text +org.unidal.framework:dal-jdbc +org.unidal.framework:foundation-service +org.unidal.framework:web-framework +org.unidal.framework:test-framework +org.unidal.webres:WebResServer +org.unidal.maven.plugins:codegen-maven-plugin +org.unidal.maven.plugins:plexus-maven-plugin +``` + +源码资源中仍存在 Plexus 组件描述文件: + +```text +cat-alarm/src/main/resources/META-INF/plexus/components.xml +cat-consumer/src/main/resources/META-INF/plexus/components.xml +cat-core/src/main/resources/META-INF/plexus/components.xml +cat-hadoop/src/main/resources/META-INF/plexus/components.xml +cat-home/src/main/resources/META-INF/plexus/components.xml +``` + +这些文件暂时不能提前删除,必须等对应 Spring 替代链路验证通过后再分批移除。 + +### 已存在的迁移桥接基础 + +当前已经具备继续迁移的 Spring 桥接基础: + +1. `cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java` 已创建 Spring `AnnotationConfigApplicationContext`,并将上下文写入 `ServletContext` 和 `CatSpringContext`。 +2. `cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java` 已手动注册大量 Repository、ConfigManager、Service Bean。 +3. `cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java` 已提供旧代码获取 Spring Bean 的过渡桥。 +4. `cat-boot/src/main/java/com/dianping/cat/boot/CatBootApplication.java` 已作为 Spring Boot 启动入口。 + +但当前 `cat-home/src/main/webapp/WEB-INF/web.xml` 仍将 `/r/*` 和 `/s/*` 交给 `org.unidal.web.MVC`,`CatServlet` 也仍依赖 `AbstractContainerServlet`、`DefaultModuleContext`、`ModuleInitializer`。因此 Web MVC 和启动模块初始化仍属于高风险区域,暂不作为下一步优先项。 + +### 迁移顺序调整 + +截至 2026-06-09,推荐迁移顺序调整为: + +1. 先替换组件容器和 `lookupMap(...)` 型扩展点。 +2. 再移除 Plexus 生命周期和日志接口,例如 `Initializable`、`LogEnabled`、`org.codehaus.plexus.logging.Logger`。 +3. 然后迁移 Unidal Web MVC。 +4. 再继续替换 Unidal DAL / codegen。 +5. 最后移除 `plexus-maven-plugin`、`codegen-maven-plugin`、`components.xml` 和根 POM 中的 Unidal 依赖。 + +此顺序的原因是:如果先迁移 Web MVC 或 DAL,会同时牵动 URL 路由、JSP、Filter、Repository、异常语义和启动流程;而 `lookupMap(...)` 型 Manager 边界较清晰,可以先通过 Spring `Map` / `List` 注入建立替代链路,并保留旧 Plexus fallback 作为回滚保护。 + +### 下一步执行项 + +下一步建议迁移第一组低风险 `lookupMap(...)` 管理器: + +```text +cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SenderManager.java +cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java +cat-alarm/src/main/java/com/dianping/cat/alarm/spi/spliter/SpliterManager.java +``` + +执行方式: + +1. 为 Manager 增加 Spring 注入入口,例如 setter 或构造器注入。 +2. 优先使用 Spring 注入的 `Map`、`Map`、`Map`。 +3. 暂时保留原有 `lookupMap(...)` fallback,确保 Spring Bean 未完全注册时旧链路仍可运行。 +4. 在 `CatHomeSpringConfiguration` 中注册 Manager 及其扩展点 Bean。 +5. 增加必要的 `info` / `warn` 日志,明确当前使用的是 Spring 注入还是 Plexus fallback。 +6. 编译并启动验证告警相关初始化、配置页和常用 `/cat/r/*` 页面。 + +### 验证命令 + +```powershell +mvn -pl cat-alarm,cat-home -am compile -DskipTests +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +java -Dserver.port=18080 -Dcat.tcp.port=12280 -jar cat-boot\target\cat-boot-4.0-RC1.jar +``` + +建议验证 URL: + +```text +http://127.0.0.1:18080/cat +http://127.0.0.1:18080/cat/r +http://127.0.0.1:18080/cat/r/business +http://127.0.0.1:18080/cat/s/config +``` + +验收标准: + +1. 编译和打包通过。 +2. 应用能启动,且没有重复初始化同一 Manager。 +3. 告警 SPI Manager 能正常加载扩展点。 +4. 日志能看出 Spring 注入是否生效。 +5. 如果 Spring 注入缺失,应有明确 warn,并能回退到 Plexus `lookupMap(...)`。 +6. `/cat/r/business` 和配置页保持可访问。 + +### 暂缓事项 + +以下事项暂缓,不进入下一步改动: + +1. 暂不修复用户当前环境中没有复现的 `/cat/r/business` NPE。 +2. 暂不删除任何 `META-INF/plexus/components.xml`。 +3. 暂不移除根 POM 中的 Unidal / Plexus 依赖。 +4. 暂不迁移 `org.unidal.web.MVC`。 +5. 暂不批量替换所有 DAL / codegen 相关代码。 diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java index 95b16083b2..af3f95d836 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java @@ -18,20 +18,25 @@ */ package com.dianping.cat.alarm.spi.decorator; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.ContainerHolder; import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; import com.dianping.cat.alarm.spi.AlertEntity; import com.dianping.cat.alarm.spi.AlertType; +import com.dianping.cat.spring.CatSpringContext; @Named public class DecoratorManager extends ContainerHolder implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(DecoratorManager.class); private Map m_decorators = new HashMap(); @@ -45,13 +50,68 @@ public Pair generateTitleAndContent(AlertEntity alert) { return new Pair(title, content); } else { + LOGGER.error("Alert decorator is not configured, alertType={}, availableDecorators={}.", alertType.getName(), + m_decorators.keySet()); throw new RuntimeException("error alert type:" + alert.getType()); } } @Override + @SuppressWarnings("unchecked") public void initialize() throws InitializationException { - m_decorators = lookupMap(Decorator.class); + if (m_decorators.isEmpty()) { + Map springDecorators = CatSpringContext.getBeanIfAvailable("alertDecorators", Map.class); + + if (springDecorators != null && !springDecorators.isEmpty()) { + setDecorators(springDecorators); + mergePlexusDecoratorsIfAvailable(); + LOGGER.info("Initialized alert decorator manager from Spring context bridge, decoratorCount={}.", + m_decorators.size()); + return; + } + try { + m_decorators = lookupMap(Decorator.class); + LOGGER.warn("Initialized alert decorator manager from Plexus fallback, decoratorCount={}.", + m_decorators.size()); + } catch (RuntimeException e) { + LOGGER.warn("Unable to initialize alert decorator manager from Plexus fallback, keep empty decorators.", + e); + } + } else { + LOGGER.info("Initialized alert decorator manager from Spring injection, decoratorCount={}.", + m_decorators.size()); + } + } + + public void setDecorators(Map decorators) { + if (decorators == null || decorators.isEmpty()) { + m_decorators = new HashMap(); + } else { + m_decorators = new HashMap(decorators); + } + LOGGER.info("Configured alert decorators from Spring, decoratorKeys={}.", m_decorators.keySet()); + } + + public Map getDecorators() { + return Collections.unmodifiableMap(m_decorators); + } + + private void mergePlexusDecoratorsIfAvailable() { + try { + Map plexusDecorators = lookupMap(Decorator.class); + + if (plexusDecorators != null && !plexusDecorators.isEmpty()) { + for (Map.Entry entry : plexusDecorators.entrySet()) { + if (!m_decorators.containsKey(entry.getKey())) { + m_decorators.put(entry.getKey(), entry.getValue()); + } + } + LOGGER.info("Merged Plexus alert decorators as fallback, decoratorCount={}, decoratorKeys={}.", + plexusDecorators.size(), plexusDecorators.keySet()); + } + } catch (RuntimeException e) { + LOGGER.warn("Unable to merge Plexus alert decorators as fallback.", e); + } } } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java index 32f5437c6b..d7f20e47a2 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java @@ -33,6 +33,10 @@ public abstract class ProjectDecorator extends Decorator { @Inject protected ProjectService m_projectService; + public void setProjectService(ProjectService projectService) { + m_projectService = projectService; + } + public String buildContactInfo(String domainName) { try { Project project = m_projectService.findByDomain(domainName); diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java index fe2b1c9ede..b2fb551756 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java @@ -47,6 +47,10 @@ public void enableLogging(Logger logger) { m_logger = logger; } + public void setSenderConfigManager(SenderConfigManager senderConfigManager) { + m_senderConfigManager = senderConfigManager; + } + private boolean httpGetSend(String successCode, String urlPrefix, String urlPars) { URL url = null; InputStream in = null; @@ -74,7 +78,9 @@ private boolean httpGetSend(String successCode, String urlPrefix, String urlPars } } catch (Exception e) { LOGGER.error("Unable to send alert by HTTP GET, urlPrefix={}, urlPars={}.", urlPrefix, urlPars, e); - m_logger.error(e.getMessage(), e); + if (m_logger != null) { + m_logger.error(e.getMessage(), e); + } return false; } finally { try { @@ -126,7 +132,9 @@ private boolean httpPostSend(String successCode, String urlPrefix, String conten } catch (Exception e) { LOGGER.error("Unable to send alert by HTTP POST, urlPrefix={}, contentLength={}.", urlPrefix, content == null ? 0 : content.length(), e); - m_logger.error(e.getMessage(), e); + if (m_logger != null) { + m_logger.error(e.getMessage(), e); + } return false; } finally { try { diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SenderManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SenderManager.java index 4432c334b2..3320af4868 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SenderManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SenderManager.java @@ -18,6 +18,7 @@ */ package com.dianping.cat.alarm.spi.sender; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -33,6 +34,7 @@ import com.dianping.cat.alarm.spi.AlertChannel; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.message.Event; +import com.dianping.cat.spring.CatSpringContext; @Named public class SenderManager extends ContainerHolder implements Initializable { @@ -44,9 +46,43 @@ public class SenderManager extends ContainerHolder implements Initializable { private Map m_senders = new HashMap(); @Override + @SuppressWarnings("unchecked") public void initialize() throws InitializationException { - m_senders = lookupMap(Sender.class); - LOGGER.info("Initialized alert sender manager, senderCount={}.", m_senders.size()); + if (m_senders.isEmpty()) { + Map springSenders = CatSpringContext.getBeanIfAvailable("alertSenders", Map.class); + + if (springSenders != null && !springSenders.isEmpty()) { + setSenders(springSenders); + LOGGER.info("Initialized alert sender manager from Spring context bridge, senderCount={}.", + m_senders.size()); + return; + } + try { + m_senders = lookupMap(Sender.class); + LOGGER.warn("Initialized alert sender manager from Plexus fallback, senderCount={}.", m_senders.size()); + } catch (RuntimeException e) { + LOGGER.warn("Unable to initialize alert sender manager from Plexus fallback, keep empty senders.", e); + } + } else { + LOGGER.info("Initialized alert sender manager from Spring injection, senderCount={}.", m_senders.size()); + } + } + + public void setSenders(Map senders) { + if (senders == null || senders.isEmpty()) { + m_senders = new HashMap(); + } else { + m_senders = new HashMap(senders); + } + LOGGER.info("Configured alert senders from Spring, senderKeys={}.", m_senders.keySet()); + } + + public void setConfigManager(ServerConfigManager configManager) { + m_configManager = configManager; + } + + public Map getSenders() { + return Collections.unmodifiableMap(m_senders); } public boolean sendAlert(AlertChannel channel, SendMessageEntity message) { diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/spliter/SpliterManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/spliter/SpliterManager.java index a78cc9ac34..5aa3581fab 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/spliter/SpliterManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/spliter/SpliterManager.java @@ -18,31 +18,72 @@ */ package com.dianping.cat.alarm.spi.spliter; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.ContainerHolder; import org.unidal.lookup.annotation.Named; import com.dianping.cat.alarm.spi.AlertChannel; +import com.dianping.cat.spring.CatSpringContext; @Named public class SpliterManager extends ContainerHolder implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(SpliterManager.class); private Map m_spliters = new HashMap(); @Override + @SuppressWarnings("unchecked") public void initialize() throws InitializationException { - m_spliters = lookupMap(Spliter.class); + if (m_spliters.isEmpty()) { + Map springSpliters = CatSpringContext.getBeanIfAvailable("alertSpliters", Map.class); + + if (springSpliters != null && !springSpliters.isEmpty()) { + setSpliters(springSpliters); + LOGGER.info("Initialized alert splitter manager from Spring context bridge, splitterCount={}.", + m_spliters.size()); + return; + } + try { + m_spliters = lookupMap(Spliter.class); + LOGGER.warn("Initialized alert splitter manager from Plexus fallback, splitterCount={}.", m_spliters.size()); + } catch (RuntimeException e) { + LOGGER.warn("Unable to initialize alert splitter manager from Plexus fallback, keep empty splitters.", e); + } + } else { + LOGGER.info("Initialized alert splitter manager from Spring injection, splitterCount={}.", m_spliters.size()); + } } public String process(String content, AlertChannel channel) { String channelName = channel.getName(); Spliter splitter = m_spliters.get(channelName); + if (splitter == null) { + LOGGER.error("Alert splitter is not configured, channel={}, availableSplitters={}.", channelName, + m_spliters.keySet()); + throw new IllegalStateException("Alert splitter is not configured for channel: " + channelName); + } return splitter.process(content); } + public void setSpliters(Map spliters) { + if (spliters == null || spliters.isEmpty()) { + m_spliters = new HashMap(); + } else { + m_spliters = new HashMap(spliters); + } + LOGGER.info("Configured alert splitters from Spring, splitterKeys={}.", m_spliters.keySet()); + } + + public Map getSpliters() { + return Collections.unmodifiableMap(m_spliters); + } + } diff --git a/cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java b/cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java index f1ec51360b..4f757829e2 100644 --- a/cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java +++ b/cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java @@ -28,6 +28,19 @@ public static T getBeanIfAvailable(Class type) { } } + public static T getBeanIfAvailable(String name, Class type) { + ApplicationContext context = s_context; + + if (context == null) { + return null; + } + try { + return context.getBean(name, type); + } catch (BeansException e) { + return null; + } + } + public static void setContext(ApplicationContext context) { s_context = context; } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index a26d00222a..e9ccdf8636 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -1,5 +1,8 @@ package com.dianping.cat.home.spring; +import java.util.LinkedHashMap; +import java.util.Map; + import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory; @@ -10,6 +13,7 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; @@ -28,6 +32,19 @@ import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.config.AlertPolicyManager; import com.dianping.cat.alarm.spi.config.SenderConfigManager; +import com.dianping.cat.alarm.spi.decorator.Decorator; +import com.dianping.cat.alarm.spi.decorator.DecoratorManager; +import com.dianping.cat.alarm.spi.sender.MailSender; +import com.dianping.cat.alarm.spi.sender.Sender; +import com.dianping.cat.alarm.spi.sender.SenderManager; +import com.dianping.cat.alarm.spi.sender.SmsSender; +import com.dianping.cat.alarm.spi.sender.WeixinSender; +import com.dianping.cat.alarm.spi.spliter.DXSpliter; +import com.dianping.cat.alarm.spi.spliter.MailSpliter; +import com.dianping.cat.alarm.spi.spliter.SmsSpliter; +import com.dianping.cat.alarm.spi.spliter.Spliter; +import com.dianping.cat.alarm.spi.spliter.SpliterManager; +import com.dianping.cat.alarm.spi.spliter.WeixinSpliter; import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; import com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository; import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; @@ -54,10 +71,13 @@ import com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager; import com.dianping.cat.report.alert.config.BaseRuleHelper; import com.dianping.cat.report.alert.business.BusinessRuleConfigManager; +import com.dianping.cat.report.alert.event.EventDecorator; import com.dianping.cat.report.alert.event.EventRuleConfigManager; +import com.dianping.cat.report.alert.heartbeat.HeartbeatDecorator; import com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager; import com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager; import com.dianping.cat.report.alert.summary.AlertSummaryService; +import com.dianping.cat.report.alert.transaction.TransactionDecorator; import com.dianping.cat.report.alert.transaction.TransactionRuleConfigManager; import com.dianping.cat.report.DomainValidator; import com.dianping.cat.report.page.DomainGroupConfigManager; @@ -559,6 +579,127 @@ public SenderConfigManager senderConfigManager(ConfigRepository configRepository return manager; } + @Bean + public Sender mailSender(SenderConfigManager senderConfigManager) { + MailSender sender = new MailSender(); + + sender.setSenderConfigManager(senderConfigManager); + return sender; + } + + @Bean + public Sender smsSender(SenderConfigManager senderConfigManager) { + SmsSender sender = new SmsSender(); + + sender.setSenderConfigManager(senderConfigManager); + return sender; + } + + @Bean + public Sender weixinSender(SenderConfigManager senderConfigManager) { + WeixinSender sender = new WeixinSender(); + + sender.setSenderConfigManager(senderConfigManager); + return sender; + } + + @Bean + public Map alertSenders(@Qualifier("mailSender") Sender mailSender, + @Qualifier("smsSender") Sender smsSender, @Qualifier("weixinSender") Sender weixinSender) { + Map senders = new LinkedHashMap(); + + senders.put(MailSender.ID, mailSender); + senders.put(SmsSender.ID, smsSender); + senders.put(WeixinSender.ID, weixinSender); + return senders; + } + + @Bean(initMethod = "initialize") + public SenderManager senderManager(ServerConfigManager serverConfigManager, + @Qualifier("alertSenders") Map alertSenders) { + SenderManager manager = new SenderManager(); + + manager.setConfigManager(serverConfigManager); + manager.setSenders(alertSenders); + return manager; + } + + @Bean + public Spliter mailSpliter() { + return new MailSpliter(); + } + + @Bean + public Spliter smsSpliter() { + return new SmsSpliter(); + } + + @Bean + public Spliter weixinSpliter() { + return new WeixinSpliter(); + } + + @Bean + public Spliter dxSpliter() { + return new DXSpliter(); + } + + @Bean + public Map alertSpliters(@Qualifier("mailSpliter") Spliter mailSpliter, + @Qualifier("smsSpliter") Spliter smsSpliter, @Qualifier("weixinSpliter") Spliter weixinSpliter, + @Qualifier("dxSpliter") Spliter dxSpliter) { + Map spliters = new LinkedHashMap(); + + spliters.put(MailSpliter.ID, mailSpliter); + spliters.put(SmsSpliter.ID, smsSpliter); + spliters.put(WeixinSpliter.ID, weixinSpliter); + spliters.put(DXSpliter.ID, dxSpliter); + return spliters; + } + + @Bean(initMethod = "initialize") + public SpliterManager spliterManager(@Qualifier("alertSpliters") Map alertSpliters) { + SpliterManager manager = new SpliterManager(); + + manager.setSpliters(alertSpliters); + return manager; + } + + @Bean(initMethod = "initialize") + public DecoratorManager decoratorManager(@Qualifier("alertDecorators") Map alertDecorators) { + DecoratorManager manager = new DecoratorManager(); + + manager.setDecorators(alertDecorators); + return manager; + } + + @Bean + public Map alertDecorators(@Qualifier("eventDecorator") Decorator eventDecorator, + @Qualifier("heartbeatDecorator") Decorator heartbeatDecorator, + @Qualifier("transactionDecorator") Decorator transactionDecorator) { + Map decorators = new LinkedHashMap(); + + decorators.put(EventDecorator.ID, eventDecorator); + decorators.put(HeartbeatDecorator.ID, heartbeatDecorator); + decorators.put(TransactionDecorator.ID, transactionDecorator); + return decorators; + } + + @Bean(initMethod = "initialize") + public Decorator eventDecorator() { + return new EventDecorator(); + } + + @Bean + public Decorator heartbeatDecorator() { + return new HeartbeatDecorator(); + } + + @Bean(initMethod = "initialize") + public Decorator transactionDecorator() { + return new TransactionDecorator(); + } + @Bean(initMethod = "initialize") public UserConfigManager userConfigManager(ConfigRepository configRepository, ContentFetcher contentFetcher) { UserConfigManager manager = new UserConfigManager(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessDecorator.java b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessDecorator.java index bd5d3de2bf..7ac755c63d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessDecorator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessDecorator.java @@ -35,6 +35,10 @@ public class BusinessDecorator extends ProjectDecorator { @Inject private AlertSummaryExecutor m_executor; + public void setExecutor(AlertSummaryExecutor executor) { + m_executor = executor; + } + @Override public String generateContent(AlertEntity alert) { Calendar cal = Calendar.getInstance(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java index 37ad44b5c7..11d27ca8b1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java @@ -50,6 +50,10 @@ public class ExceptionDecorator extends ProjectDecorator implements Initializabl @Inject private AlertSummaryExecutor m_executor; + public void setExecutor(AlertSummaryExecutor executor) { + m_executor = executor; + } + @Override public String generateContent(AlertEntity alert) { Map dataMap = generateExceptionMap(alert); From 0663ae6f3914b43716d53242646a20fc3ea78925 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 9 Jun 2026 21:58:44 +0800 Subject: [PATCH 008/231] Migrate alert decorators to Spring-backed registration --- .../alarm/spi/decorator/DecoratorManager.java | 8 +++++-- .../alarm/spi/decorator/ProjectDecorator.java | 16 ++++++++++++- .../spring/CatHomeSpringConfiguration.java | 24 ++++++++++++++++++- .../alert/business/BusinessDecorator.java | 19 ++++++++++++++- .../alert/exception/ExceptionDecorator.java | 17 ++++++++++++- 5 files changed, 78 insertions(+), 6 deletions(-) diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java index af3f95d836..f1a13502d3 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java @@ -64,7 +64,7 @@ public void initialize() throws InitializationException { if (springDecorators != null && !springDecorators.isEmpty()) { setDecorators(springDecorators); - mergePlexusDecoratorsIfAvailable(); + mergePlexusDecoratorsIfMissing(); LOGGER.info("Initialized alert decorator manager from Spring context bridge, decoratorCount={}.", m_decorators.size()); return; @@ -96,7 +96,11 @@ public Map getDecorators() { return Collections.unmodifiableMap(m_decorators); } - private void mergePlexusDecoratorsIfAvailable() { + private void mergePlexusDecoratorsIfMissing() { + if (m_decorators.containsKey(AlertType.Business.getName()) + && m_decorators.containsKey(AlertType.Exception.getName())) { + return; + } try { Map plexusDecorators = lookupMap(Decorator.class); diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java index d7f20e47a2..8ec0ab6b19 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java @@ -26,6 +26,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.Project; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.spring.CatSpringContext; public abstract class ProjectDecorator extends Decorator { private static final Logger LOGGER = LoggerFactory.getLogger(ProjectDecorator.class); @@ -37,9 +38,22 @@ public void setProjectService(ProjectService projectService) { m_projectService = projectService; } + private ProjectService getProjectService() { + if (m_projectService == null) { + ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + + if (projectService != null) { + m_projectService = projectService; + LOGGER.info("ProjectDecorator refreshed Spring ProjectService dependency."); + } + } + return m_projectService; + } + public String buildContactInfo(String domainName) { try { - Project project = m_projectService.findByDomain(domainName); + ProjectService projectService = getProjectService(); + Project project = projectService == null ? null : projectService.findByDomain(domainName); if (project != null) { String owners = project.getOwner(); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index e9ccdf8636..85f9c70310 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -70,9 +70,11 @@ import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager; import com.dianping.cat.report.alert.config.BaseRuleHelper; +import com.dianping.cat.report.alert.business.BusinessDecorator; import com.dianping.cat.report.alert.business.BusinessRuleConfigManager; import com.dianping.cat.report.alert.event.EventDecorator; import com.dianping.cat.report.alert.event.EventRuleConfigManager; +import com.dianping.cat.report.alert.exception.ExceptionDecorator; import com.dianping.cat.report.alert.heartbeat.HeartbeatDecorator; import com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager; import com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager; @@ -676,15 +678,35 @@ public DecoratorManager decoratorManager(@Qualifier("alertDecorators") Map alertDecorators(@Qualifier("eventDecorator") Decorator eventDecorator, @Qualifier("heartbeatDecorator") Decorator heartbeatDecorator, - @Qualifier("transactionDecorator") Decorator transactionDecorator) { + @Qualifier("transactionDecorator") Decorator transactionDecorator, + @Qualifier("businessDecorator") Decorator businessDecorator, + @Qualifier("exceptionDecorator") Decorator exceptionDecorator) { Map decorators = new LinkedHashMap(); decorators.put(EventDecorator.ID, eventDecorator); decorators.put(HeartbeatDecorator.ID, heartbeatDecorator); decorators.put(TransactionDecorator.ID, transactionDecorator); + decorators.put(BusinessDecorator.ID, businessDecorator); + decorators.put(ExceptionDecorator.ID, exceptionDecorator); return decorators; } + @Bean + public Decorator businessDecorator(ProjectService projectService) { + BusinessDecorator decorator = new BusinessDecorator(); + + decorator.setProjectService(projectService); + return decorator; + } + + @Bean(initMethod = "initialize") + public Decorator exceptionDecorator(ProjectService projectService) { + ExceptionDecorator decorator = new ExceptionDecorator(); + + decorator.setProjectService(projectService); + return decorator; + } + @Bean(initMethod = "initialize") public Decorator eventDecorator() { return new EventDecorator(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessDecorator.java b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessDecorator.java index 7ac755c63d..1fd8e09b59 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessDecorator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessDecorator.java @@ -21,14 +21,18 @@ import java.util.Calendar; import java.util.Date; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import com.dianping.cat.alarm.spi.AlertEntity; import com.dianping.cat.alarm.spi.AlertType; import com.dianping.cat.alarm.spi.decorator.ProjectDecorator; import com.dianping.cat.report.alert.summary.AlertSummaryExecutor; +import com.dianping.cat.spring.CatSpringContext; public class BusinessDecorator extends ProjectDecorator { + private static final Logger LOGGER = LoggerFactory.getLogger(BusinessDecorator.class); public static final String ID = AlertType.Business.getName(); @@ -39,6 +43,18 @@ public void setExecutor(AlertSummaryExecutor executor) { m_executor = executor; } + private AlertSummaryExecutor getExecutor() { + if (m_executor == null) { + AlertSummaryExecutor executor = CatSpringContext.getBeanIfAvailable(AlertSummaryExecutor.class); + + if (executor != null) { + m_executor = executor; + LOGGER.info("BusinessDecorator refreshed Spring AlertSummaryExecutor dependency."); + } + } + return m_executor; + } + @Override public String generateContent(AlertEntity alert) { Calendar cal = Calendar.getInstance(); @@ -51,7 +67,8 @@ public String generateContent(AlertEntity alert) { sb.append(alert.getContent()); sb.append(buildContactInfo(alert.getDomain())); - String summaryContext = m_executor.execute(alert.getDomain(), alertDate); + AlertSummaryExecutor executor = getExecutor(); + String summaryContext = executor == null ? null : executor.execute(alert.getDomain(), alertDate); if (summaryContext != null) { sb.append("
").append(summaryContext); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java index 11d27ca8b1..d96c8a5619 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java @@ -37,6 +37,7 @@ import com.dianping.cat.alarm.spi.AlertType; import com.dianping.cat.alarm.spi.decorator.ProjectDecorator; import com.dianping.cat.report.alert.summary.AlertSummaryExecutor; +import com.dianping.cat.spring.CatSpringContext; public class ExceptionDecorator extends ProjectDecorator implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionDecorator.class); @@ -54,6 +55,18 @@ public void setExecutor(AlertSummaryExecutor executor) { m_executor = executor; } + private AlertSummaryExecutor getExecutor() { + if (m_executor == null) { + AlertSummaryExecutor executor = CatSpringContext.getBeanIfAvailable(AlertSummaryExecutor.class); + + if (executor != null) { + m_executor = executor; + LOGGER.info("ExceptionDecorator refreshed Spring AlertSummaryExecutor dependency."); + } + } + return m_executor; + } + @Override public String generateContent(AlertEntity alert) { Map dataMap = generateExceptionMap(alert); @@ -72,7 +85,9 @@ public String generateContent(AlertEntity alert) { String summaryContext = ""; try { - summaryContext = m_executor.execute(alert.getGroup(), alert.getDate()); + AlertSummaryExecutor executor = getExecutor(); + + summaryContext = executor == null ? null : executor.execute(alert.getGroup(), alert.getDate()); } catch (Exception e) { LOGGER.error("Unable to append exception alert summary, group={}, date={}.", alert.getGroup(), alert.getDate(), e); From 7d12dddac11c1cd2d3d313fd119beddc98d76d24 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 9 Jun 2026 22:05:02 +0800 Subject: [PATCH 009/231] Migrate alert contactors to Spring-backed registration --- .../alarm/spi/receiver/ContactorManager.java | 56 +++++++++++-- .../alarm/spi/receiver/ProjectContactor.java | 47 +++++++++-- .../spring/CatHomeSpringConfiguration.java | 78 +++++++++++++++++++ 3 files changed, 168 insertions(+), 13 deletions(-) diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ContactorManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ContactorManager.java index 8f5257c762..829d046c26 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ContactorManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ContactorManager.java @@ -18,29 +18,61 @@ */ package com.dianping.cat.alarm.spi.receiver; -import com.dianping.cat.alarm.spi.AlertChannel; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.ContainerHolder; import org.unidal.lookup.annotation.Named; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import com.dianping.cat.alarm.spi.AlertChannel; +import com.dianping.cat.spring.CatSpringContext; @Named public class ContactorManager extends ContainerHolder implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(ContactorManager.class); private Map m_contactors = new HashMap(); @Override + @SuppressWarnings("unchecked") public void initialize() throws InitializationException { - m_contactors = lookupMap(Contactor.class); + if (m_contactors.isEmpty()) { + Map springContactors = CatSpringContext.getBeanIfAvailable("alertContactors", Map.class); + + if (springContactors != null && !springContactors.isEmpty()) { + setContactors(springContactors); + LOGGER.info("Initialized alert contactor manager from Spring context bridge, contactorCount={}.", + m_contactors.size()); + return; + } + try { + m_contactors = lookupMap(Contactor.class); + LOGGER.warn("Initialized alert contactor manager from Plexus fallback, contactorCount={}.", + m_contactors.size()); + } catch (RuntimeException e) { + LOGGER.warn("Unable to initialize alert contactor manager from Plexus fallback, keep empty contactors.", + e); + } + } else { + LOGGER.info("Initialized alert contactor manager from Spring injection, contactorCount={}.", + m_contactors.size()); + } } public List queryReceivers(String group, AlertChannel channel, String type) { Contactor contactor = m_contactors.get(type); + if (contactor == null) { + LOGGER.error("Alert contactor is not configured, type={}, channel={}, group={}, availableContactors={}.", type, + channel, group, m_contactors.keySet()); + throw new IllegalStateException("Alert contactor is not configured for type: " + type); + } if (AlertChannel.MAIL == channel) { return contactor.queryEmailContactors(group); } else if (AlertChannel.SMS == channel) { @@ -50,8 +82,22 @@ public List queryReceivers(String group, AlertChannel channel, String ty } else if (AlertChannel.DX == channel) { return contactor.queryDXContactors(group); } else { + LOGGER.error("Unsupported alert receiver channel, type={}, channel={}, group={}.", type, channel, group); throw new RuntimeException("unsupported channel"); } } + public void setContactors(Map contactors) { + if (contactors == null || contactors.isEmpty()) { + m_contactors = new HashMap(); + } else { + m_contactors = new HashMap(contactors); + } + LOGGER.info("Configured alert contactors from Spring, contactorKeys={}.", m_contactors.keySet()); + } + + public Map getContactors() { + return Collections.unmodifiableMap(m_contactors); + } + } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ProjectContactor.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ProjectContactor.java index e361199715..a839a93a2e 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ProjectContactor.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ProjectContactor.java @@ -28,6 +28,7 @@ import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.core.dal.Project; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.spring.CatSpringContext; public abstract class ProjectContactor extends DefaultContactor implements Contactor { @@ -37,10 +38,25 @@ public abstract class ProjectContactor extends DefaultContactor implements Conta @Inject protected AlertConfigManager m_configManager; + private AlertConfigManager getConfigManager() { + if (m_configManager == null) { + m_configManager = CatSpringContext.getBeanIfAvailable(AlertConfigManager.class); + } + return m_configManager; + } + + private ProjectService getProjectService() { + if (m_projectService == null) { + m_projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + } + return m_projectService; + } + @Override public List queryEmailContactors(String id) { List mailReceivers = new ArrayList(); - Receiver receiver = m_configManager.queryReceiverById(getId()); + AlertConfigManager configManager = getConfigManager(); + Receiver receiver = configManager == null ? null : configManager.queryReceiverById(getId()); if (receiver != null && !receiver.isEnable()) { return mailReceivers; @@ -48,7 +64,8 @@ public List queryEmailContactors(String id) { mailReceivers.addAll(buildDefaultMailReceivers(receiver)); if (StringUtils.isNotEmpty(id)) { - Project project = m_projectService.findByDomain(id); + ProjectService projectService = getProjectService(); + Project project = projectService == null ? null : projectService.findByDomain(id); if (project != null) { mailReceivers.addAll(split(project.getEmail())); @@ -61,7 +78,8 @@ public List queryEmailContactors(String id) { @Override public List querySmsContactors(String id) { List smsReceivers = new ArrayList(); - Receiver receiver = m_configManager.queryReceiverById(getId()); + AlertConfigManager configManager = getConfigManager(); + Receiver receiver = configManager == null ? null : configManager.queryReceiverById(getId()); if (receiver != null && !receiver.isEnable()) { return smsReceivers; @@ -69,7 +87,8 @@ public List querySmsContactors(String id) { smsReceivers.addAll(buildDefaultSMSReceivers(receiver)); if (StringUtils.isNotEmpty(id)) { - Project project = m_projectService.findByDomain(id); + ProjectService projectService = getProjectService(); + Project project = projectService == null ? null : projectService.findByDomain(id); if (project != null) { smsReceivers.addAll(split(project.getPhone())); @@ -82,7 +101,8 @@ public List querySmsContactors(String id) { @Override public List queryWeiXinContactors(String id) { List weixinReceivers = new ArrayList(); - Receiver receiver = m_configManager.queryReceiverById(getId()); + AlertConfigManager configManager = getConfigManager(); + Receiver receiver = configManager == null ? null : configManager.queryReceiverById(getId()); if (receiver != null && !receiver.isEnable()) { return weixinReceivers; @@ -90,7 +110,8 @@ public List queryWeiXinContactors(String id) { weixinReceivers.addAll(buildDefaultWeixinReceivers(receiver)); if (StringUtils.isNotEmpty(id)) { - Project project = m_projectService.findByDomain(id); + ProjectService projectService = getProjectService(); + Project project = projectService == null ? null : projectService.findByDomain(id); if (project != null) { weixinReceivers.addAll(split(project.getEmail())); @@ -103,7 +124,8 @@ public List queryWeiXinContactors(String id) { @Override public List queryDXContactors(String id) { List receivers = new ArrayList(); - Receiver receiver = m_configManager.queryReceiverById(getId()); + AlertConfigManager configManager = getConfigManager(); + Receiver receiver = configManager == null ? null : configManager.queryReceiverById(getId()); if (receiver != null && !receiver.isEnable()) { return receivers; @@ -111,7 +133,8 @@ public List queryDXContactors(String id) { receivers.addAll(buildDefaultDXReceivers(receiver)); if (StringUtils.isNotEmpty(id)) { - Project project = m_projectService.findByDomain(id); + ProjectService projectService = getProjectService(); + Project project = projectService == null ? null : projectService.findByDomain(id); if (project != null) { receivers.addAll(split(project.getEmail())); @@ -121,4 +144,12 @@ public List queryDXContactors(String id) { } } + public void setConfigManager(AlertConfigManager configManager) { + m_configManager = configManager; + } + + public void setProjectService(ProjectService projectService) { + m_projectService = projectService; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 85f9c70310..0e7e9cc062 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -34,6 +34,9 @@ import com.dianping.cat.alarm.spi.config.SenderConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.decorator.DecoratorManager; +import com.dianping.cat.alarm.spi.receiver.Contactor; +import com.dianping.cat.alarm.spi.receiver.ContactorManager; +import com.dianping.cat.alarm.spi.receiver.ProjectContactor; import com.dianping.cat.alarm.spi.sender.MailSender; import com.dianping.cat.alarm.spi.sender.Sender; import com.dianping.cat.alarm.spi.sender.SenderManager; @@ -70,15 +73,20 @@ import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager; import com.dianping.cat.report.alert.config.BaseRuleHelper; +import com.dianping.cat.report.alert.business.BusinessContactor; import com.dianping.cat.report.alert.business.BusinessDecorator; import com.dianping.cat.report.alert.business.BusinessRuleConfigManager; +import com.dianping.cat.report.alert.event.EventContactor; import com.dianping.cat.report.alert.event.EventDecorator; import com.dianping.cat.report.alert.event.EventRuleConfigManager; +import com.dianping.cat.report.alert.exception.ExceptionContactor; import com.dianping.cat.report.alert.exception.ExceptionDecorator; +import com.dianping.cat.report.alert.heartbeat.HeartbeatContactor; import com.dianping.cat.report.alert.heartbeat.HeartbeatDecorator; import com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager; import com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager; import com.dianping.cat.report.alert.summary.AlertSummaryService; +import com.dianping.cat.report.alert.transaction.TransactionContactor; import com.dianping.cat.report.alert.transaction.TransactionDecorator; import com.dianping.cat.report.alert.transaction.TransactionRuleConfigManager; import com.dianping.cat.report.DomainValidator; @@ -659,6 +667,70 @@ public Map alertSpliters(@Qualifier("mailSpliter") Spliter mail return spliters; } + @Bean(initMethod = "initialize") + public ContactorManager contactorManager(@Qualifier("alertContactors") Map alertContactors) { + ContactorManager manager = new ContactorManager(); + + manager.setContactors(alertContactors); + return manager; + } + + @Bean + public Map alertContactors(@Qualifier("eventContactor") Contactor eventContactor, + @Qualifier("heartbeatContactor") Contactor heartbeatContactor, + @Qualifier("transactionContactor") Contactor transactionContactor, + @Qualifier("businessContactor") Contactor businessContactor, + @Qualifier("exceptionContactor") Contactor exceptionContactor) { + Map contactors = new LinkedHashMap(); + + contactors.put(EventContactor.ID, eventContactor); + contactors.put(HeartbeatContactor.ID, heartbeatContactor); + contactors.put(TransactionContactor.ID, transactionContactor); + contactors.put(BusinessContactor.ID, businessContactor); + contactors.put(ExceptionContactor.ID, exceptionContactor); + return contactors; + } + + @Bean + public Contactor businessContactor(ProjectService projectService, AlertConfigManager alertConfigManager) { + BusinessContactor contactor = new BusinessContactor(); + + configureProjectContactor(contactor, projectService, alertConfigManager); + return contactor; + } + + @Bean + public Contactor eventContactor(ProjectService projectService, AlertConfigManager alertConfigManager) { + EventContactor contactor = new EventContactor(); + + configureProjectContactor(contactor, projectService, alertConfigManager); + return contactor; + } + + @Bean + public Contactor exceptionContactor(ProjectService projectService, AlertConfigManager alertConfigManager) { + ExceptionContactor contactor = new ExceptionContactor(); + + configureProjectContactor(contactor, projectService, alertConfigManager); + return contactor; + } + + @Bean + public Contactor heartbeatContactor(ProjectService projectService, AlertConfigManager alertConfigManager) { + HeartbeatContactor contactor = new HeartbeatContactor(); + + configureProjectContactor(contactor, projectService, alertConfigManager); + return contactor; + } + + @Bean + public Contactor transactionContactor(ProjectService projectService, AlertConfigManager alertConfigManager) { + TransactionContactor contactor = new TransactionContactor(); + + configureProjectContactor(contactor, projectService, alertConfigManager); + return contactor; + } + @Bean(initMethod = "initialize") public SpliterManager spliterManager(@Qualifier("alertSpliters") Map alertSpliters) { SpliterManager manager = new SpliterManager(); @@ -764,6 +836,12 @@ public DataSource catDataSource() { return CatHomeSpringDataSourceFactory.createCatDataSource(); } + private void configureProjectContactor(ProjectContactor contactor, ProjectService projectService, + AlertConfigManager alertConfigManager) { + contactor.setProjectService(projectService); + contactor.setConfigManager(alertConfigManager); + } + @Bean public SqlSessionFactory sqlSessionFactory(DataSource catDataSource) throws Exception { SqlSessionFactoryBean factory = new SqlSessionFactoryBean(); From 054a11e871cc7208c0883fbfeecdcf37e616d9af Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 9 Jun 2026 22:14:37 +0800 Subject: [PATCH 010/231] Register alert summary executor with Spring --- .../spring/CatHomeSpringConfiguration.java | 57 ++++++++++++++++++- .../alert/summary/AlertSummaryExecutor.java | 56 ++++++++++++++++-- .../alert/summary/build/AlertInfoBuilder.java | 45 ++++++++++++++- .../build/AlterationSummaryBuilder.java | 21 ++++++- .../summary/build/FailureSummaryBuilder.java | 25 +++++++- .../summary/build/RelatedSummaryBuilder.java | 12 ++++ 6 files changed, 203 insertions(+), 13 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 0e7e9cc062..14262c2e26 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -85,7 +85,13 @@ import com.dianping.cat.report.alert.heartbeat.HeartbeatDecorator; import com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager; import com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager; +import com.dianping.cat.report.alert.summary.AlertSummaryExecutor; import com.dianping.cat.report.alert.summary.AlertSummaryService; +import com.dianping.cat.report.alert.summary.build.AlertInfoBuilder; +import com.dianping.cat.report.alert.summary.build.AlterationSummaryBuilder; +import com.dianping.cat.report.alert.summary.build.FailureSummaryBuilder; +import com.dianping.cat.report.alert.summary.build.RelatedSummaryBuilder; +import com.dianping.cat.report.alert.summary.build.SummaryBuilder; import com.dianping.cat.report.alert.transaction.TransactionContactor; import com.dianping.cat.report.alert.transaction.TransactionDecorator; import com.dianping.cat.report.alert.transaction.TransactionRuleConfigManager; @@ -360,6 +366,51 @@ public AlertSummaryService alertSummaryService() { return new AlertSummaryService(); } + @Bean + public AlertInfoBuilder alertInfoBuilder(AlertRepository alertRepository) { + AlertInfoBuilder builder = new AlertInfoBuilder(); + + builder.setAlertDao(alertRepository); + return builder; + } + + @Bean(initMethod = "initialize", name = RelatedSummaryBuilder.ID) + public SummaryBuilder relatedSummaryBuilder(AlertInfoBuilder alertInfoBuilder, + AlertSummaryService alertSummaryService) { + RelatedSummaryBuilder builder = new RelatedSummaryBuilder(); + + builder.setAlertSummaryManager(alertInfoBuilder); + builder.setAlertSummaryService(alertSummaryService); + return builder; + } + + @Bean(initMethod = "initialize", name = FailureSummaryBuilder.ID) + public SummaryBuilder failureSummaryBuilder() { + return new FailureSummaryBuilder(); + } + + @Bean(initMethod = "initialize", name = AlterationSummaryBuilder.ID) + public SummaryBuilder alterationSummaryBuilder(AlterationRepository alterationRepository) { + AlterationSummaryBuilder builder = new AlterationSummaryBuilder(); + + builder.setAlterationDao(alterationRepository); + return builder; + } + + @Bean + public AlertSummaryExecutor alertSummaryExecutor(@Qualifier(RelatedSummaryBuilder.ID) SummaryBuilder relatedBuilder, + @Qualifier(FailureSummaryBuilder.ID) SummaryBuilder failureBuilder, + @Qualifier(AlterationSummaryBuilder.ID) SummaryBuilder alterationBuilder, + SenderManager senderManager) { + AlertSummaryExecutor executor = new AlertSummaryExecutor(); + + executor.setRelatedBuilder(relatedBuilder); + executor.setFailureBuilder(failureBuilder); + executor.setAlterationBuilder(alterationBuilder); + executor.setSendManager(senderManager); + return executor; + } + @Bean public UserDefinedRuleManager userDefinedRuleManager() { return new UserDefinedRuleManager(); @@ -764,18 +815,20 @@ public Map alertDecorators(@Qualifier("eventDecorator") Decor } @Bean - public Decorator businessDecorator(ProjectService projectService) { + public Decorator businessDecorator(ProjectService projectService, AlertSummaryExecutor alertSummaryExecutor) { BusinessDecorator decorator = new BusinessDecorator(); decorator.setProjectService(projectService); + decorator.setExecutor(alertSummaryExecutor); return decorator; } @Bean(initMethod = "initialize") - public Decorator exceptionDecorator(ProjectService projectService) { + public Decorator exceptionDecorator(ProjectService projectService, AlertSummaryExecutor alertSummaryExecutor) { ExceptionDecorator decorator = new ExceptionDecorator(); decorator.setProjectService(projectService); + decorator.setExecutor(alertSummaryExecutor); return decorator; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java index 6948035984..b9e3303153 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java @@ -40,6 +40,7 @@ import com.dianping.cat.report.alert.summary.build.FailureSummaryBuilder; import com.dianping.cat.report.alert.summary.build.RelatedSummaryBuilder; import com.dianping.cat.report.alert.summary.build.SummaryBuilder; +import com.dianping.cat.spring.CatSpringContext; @Named public class AlertSummaryExecutor { @@ -61,6 +62,21 @@ public class AlertSummaryExecutor { @Inject private SenderManager m_sendManager; + private void refreshSpringBeans() { + if (m_relatedBuilder == null) { + m_relatedBuilder = CatSpringContext.getBeanIfAvailable(RelatedSummaryBuilder.ID, SummaryBuilder.class); + } + if (m_failureBuilder == null) { + m_failureBuilder = CatSpringContext.getBeanIfAvailable(FailureSummaryBuilder.ID, SummaryBuilder.class); + } + if (m_alterationBuilder == null) { + m_alterationBuilder = CatSpringContext.getBeanIfAvailable(AlterationSummaryBuilder.ID, SummaryBuilder.class); + } + if (m_sendManager == null) { + m_sendManager = CatSpringContext.getBeanIfAvailable(SenderManager.class); + } + } + private List builderReceivers(String str) { List result = new ArrayList(); @@ -85,12 +101,13 @@ public String execute(String domain, Date date) { date = normalizeDate(date); try { + refreshSpringBeans(); LOGGER.info("Generating alert summary, domain={}, date={}.", domain, date); StringBuilder builder = new StringBuilder(); - builder.append(m_relatedBuilder.generateHtml(domain, date)); - builder.append(m_failureBuilder.generateHtml(domain, date)); - builder.append(m_alterationBuilder.generateHtml(domain, date)); + appendSummary(builder, m_relatedBuilder, domain, date); + appendSummary(builder, m_failureBuilder, domain, date); + appendSummary(builder, m_alterationBuilder, domain, date); t.setStatus(Transaction.SUCCESS); return builder.toString(); @@ -104,6 +121,14 @@ public String execute(String domain, Date date) { return null; } + private void appendSummary(StringBuilder builder, SummaryBuilder summaryBuilder, String domain, Date date) { + if (summaryBuilder == null) { + LOGGER.warn("Alert summary builder is not configured, domain={}, date={}.", domain, date); + return; + } + builder.append(summaryBuilder.generateHtml(domain, date)); + } + public String execute(String domain, Date date, String receiverStr) { String content = execute(domain, date); @@ -117,7 +142,14 @@ public String execute(String domain, Date date, String receiverStr) { if (receivers.size() > 0) { LOGGER.info("Sending alert summary mail, domain={}, date={}, receiverCount={}.", domain, date, receivers.size()); - m_sendManager.sendAlert(AlertChannel.MAIL, message); + refreshSpringBeans(); + + if (m_sendManager == null) { + LOGGER.warn("Alert summary sender manager is not configured, skip summary mail, domain={}, date={}.", + domain, date); + } else { + m_sendManager.sendAlert(AlertChannel.MAIL, message); + } } } @@ -133,4 +165,20 @@ private Date normalizeDate(Date date) { return cal.getTime(); } + public void setAlterationBuilder(SummaryBuilder alterationBuilder) { + m_alterationBuilder = alterationBuilder; + } + + public void setFailureBuilder(SummaryBuilder failureBuilder) { + m_failureBuilder = failureBuilder; + } + + public void setRelatedBuilder(SummaryBuilder relatedBuilder) { + m_relatedBuilder = relatedBuilder; + } + + public void setSendManager(SenderManager sendManager) { + m_sendManager = sendManager; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java index 8ee41fe0c4..f3dc45f13e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java @@ -43,6 +43,7 @@ import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; import com.dianping.cat.report.alert.summary.AlertSummaryExecutor; import com.dianping.cat.report.page.dependency.graph.TopologyGraphManager; +import com.dianping.cat.spring.CatSpringContext; @Named public class AlertInfoBuilder { @@ -58,6 +59,20 @@ public class AlertInfoBuilder { @Inject private TopologyGraphManager m_topologyManager; + private AlertRepository getAlertDao() { + if (m_alertDao == null) { + m_alertDao = CatSpringContext.getBeanIfAvailable(AlertRepository.class); + } + return m_alertDao; + } + + private TopologyGraphManager getTopologyManager() { + if (m_topologyManager == null) { + m_topologyManager = CatSpringContext.getBeanIfAvailable(TopologyGraphManager.class); + } + return m_topologyManager; + } + private Collection convertToAlert(List edges, Date date) { Map alerts = new LinkedHashMap(); @@ -124,7 +139,9 @@ public AlertSummary generateAlertSummary(String domain, Date date) { alertSummary.addCategory(generateCategoryByTimeCateDomain(date, AlertType.Business.getName(), domain)); alertSummary.addCategory(generateCategoryByTimeCateDomain(date, AlertType.Exception.getName(), domain)); - TopologyGraph topology = m_topologyManager.buildTopologyGraph(domain, date.getTime()); + TopologyGraphManager topologyManager = getTopologyManager(); + TopologyGraph topology = topologyManager == null ? new TopologyGraph() : topologyManager.buildTopologyGraph(domain, + date.getTime()); int statusThreshold = 2; alertSummary.addCategory(generateLongCallCategory(date, topology, statusThreshold)); @@ -142,7 +159,14 @@ private Category generateCategoryByTimeCateDomain(Date date, String cate, String Date startTime = new Date(date.getTime() - AlertSummaryExecutor.SUMMARY_DURATION); try { - List dbAlerts = m_alertDao + AlertRepository alertDao = getAlertDao(); + + if (alertDao == null) { + LOGGER.warn("Alert repository is not configured for alert summary category, category={}, domain={}, start={}, end={}.", + cate, domain, startTime, date); + return category; + } + List dbAlerts = alertDao .queryAlertsByTimeCategoryDomain(startTime, date, dbCategoryName, domain, AlertEntity.READSET_FULL); LOGGER.info("Loaded alert summary category alerts, category={}, domain={}, start={}, end={}, alertCount={}.", cate, domain, startTime, date, dbAlerts.size()); @@ -164,7 +188,14 @@ private Category generateDependCategoryByTimeCateDomain(Date date, String cate, for (String domain : dependencyDomains) { try { - List dbAlerts = m_alertDao + AlertRepository alertDao = getAlertDao(); + + if (alertDao == null) { + LOGGER.warn("Alert repository is not configured for dependency alert summary, category={}, domain={}, start={}, end={}.", + cate, domain, startTime, date); + continue; + } + List dbAlerts = alertDao .queryAlertsByTimeCategoryDomain(startTime, date, dbCategoryName, domain, AlertEntity.READSET_FULL); LOGGER.info("Loaded dependency alert summary alerts, category={}, domain={}, start={}, end={}, alertCount={}.", @@ -217,4 +248,12 @@ private void setDBAlertsToCategory(Category category, List dbAlerts) { category.addAlert(it.next()); } } + + public void setAlertDao(AlertRepository alertDao) { + m_alertDao = alertDao; + } + + public void setTopologyManager(TopologyGraphManager topologyManager) { + m_topologyManager = topologyManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java index 11b5a7f6f5..0abc18ecdc 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java @@ -34,6 +34,7 @@ import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; import com.dianping.cat.home.dal.report.AlterationEntity; import com.dianping.cat.report.alert.summary.AlertSummaryExecutor; +import com.dianping.cat.spring.CatSpringContext; @Named(type = SummaryBuilder.class, value = AlterationSummaryBuilder.ID) public class AlterationSummaryBuilder extends SummaryBuilder { @@ -44,12 +45,26 @@ public class AlterationSummaryBuilder extends SummaryBuilder { @Inject private AlterationRepository m_alterationDao; + private AlterationRepository getAlterationDao() { + if (m_alterationDao == null) { + m_alterationDao = CatSpringContext.getBeanIfAvailable(AlterationRepository.class); + } + return m_alterationDao; + } + @Override public Map generateModel(String domain, Date date) { Map dataMap = new HashMap(); try { - List alterations = m_alterationDao + AlterationRepository alterationDao = getAlterationDao(); + + if (alterationDao == null) { + LOGGER.warn("Alteration repository is not configured for alert alteration summary, domain={}, date={}.", + domain, date); + return dataMap; + } + List alterations = alterationDao .findByDomainAndTime(getStartDate(date), date, domain, AlterationEntity.READSET_FULL); dataMap.put("count", alterations.size()); @@ -75,4 +90,8 @@ protected String getTemplateAddress() { return "alterationInfo.ftl"; } + public void setAlterationDao(AlterationRepository alterationDao) { + m_alterationDao = alterationDao; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java index e395051ef0..e303194ab9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java @@ -39,6 +39,7 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.spring.CatSpringContext; @Named(type = SummaryBuilder.class, value = FailureSummaryBuilder.ID) public class FailureSummaryBuilder extends SummaryBuilder { @@ -49,6 +50,14 @@ public class FailureSummaryBuilder extends SummaryBuilder { @Inject(type = ModelService.class, value = ProblemAnalyzer.ID) private ModelService m_service; + @SuppressWarnings("unchecked") + private ModelService getService() { + if (m_service == null) { + m_service = CatSpringContext.getBeanIfAvailable(ProblemAnalyzer.ID, ModelService.class); + } + return m_service; + } + private void addDistributeInfo(Map resultMap, ProblemReport report) { PieGraphChartVisitor pieChart = new PieGraphChartVisitor("error", null); Map distributes = new HashMap(); @@ -84,10 +93,16 @@ public Map generateModel(String domain, Date endTime) { ModelRequest request = new ModelRequest(domain, getCurrentHour()).setProperty("queryType", "view"); request.setProperty("type", "error"); ProblemReport report = null; + ModelService service = getService(); - if (m_service.isEligable(request)) { - ModelResponse response = m_service.invoke(request); - report = response.getModel(); + if (service == null) { + LOGGER.warn("Problem report service is not configured for alert failure summary, domain={}, date={}.", domain, + endTime); + return result; + } + if (service.isEligable(request)) { + ModelResponse response = service.invoke(request); + report = response == null ? null : response.getModel(); } else { LOGGER.warn("Problem report service is not eligible for alert failure summary, domain={}, date={}.", domain, endTime); @@ -122,4 +137,8 @@ protected String getTemplateAddress() { return "errorInfo.ftl"; } + public void setService(ModelService service) { + m_service = service; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java index a5f6e5cfe5..5c8be3a493 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java @@ -98,11 +98,23 @@ protected String getTemplateAddress() { } private void refreshSpringBeans() { + AlertInfoBuilder alertSummaryManager = CatSpringContext.getBeanIfAvailable(AlertInfoBuilder.class); AlertSummaryService alertSummaryService = CatSpringContext.getBeanIfAvailable(AlertSummaryService.class); + if (alertSummaryManager != null) { + m_alertSummaryManager = alertSummaryManager; + } if (alertSummaryService != null) { m_alertSummaryService = alertSummaryService; } } + public void setAlertSummaryManager(AlertInfoBuilder alertSummaryManager) { + m_alertSummaryManager = alertSummaryManager; + } + + public void setAlertSummaryService(AlertSummaryService alertSummaryService) { + m_alertSummaryService = alertSummaryService; + } + } From e8d02e926676c9826dbbdc04ae51fef59c4eca4d Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 9 Jun 2026 22:25:45 +0800 Subject: [PATCH 011/231] Register problem model service with Spring --- .../service/BaseCompositeModelService.java | 18 +++++++- .../service/BaseHistoricalModelService.java | 4 ++ .../spring/CatHomeSpringConfiguration.java | 43 ++++++++++++++++++- .../service/HistoricalProblemService.java | 17 +++++++- 4 files changed, 78 insertions(+), 4 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java b/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java index 3c5987c0b8..0a27adf280 100755 --- a/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java @@ -76,7 +76,11 @@ public void initialize() throws InitializationException { if (serverManager != null) { m_serverManager = serverManager; } - m_allServices.addAll(m_services); + m_allServices.clear(); + + if (m_services != null) { + m_allServices.addAll(m_services); + } String remoteServers = m_configManager.getConsoleRemoteServers(); List endpoints = Splitters.by(',').noEmptyItem().trim().split(remoteServers); @@ -198,4 +202,16 @@ public String toString() { return sb.toString(); } + + public void setServices(List> services) { + m_services = services; + } + + public void setConfigManager(ServerConfigManager configManager) { + m_configManager = configManager; + } + + public void setServerManager(RemoteServersManager serverManager) { + m_serverManager = serverManager; + } } diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/BaseHistoricalModelService.java b/cat-core/src/main/java/com/dianping/cat/report/service/BaseHistoricalModelService.java index bdc28edc4f..3c729aa9d5 100755 --- a/cat-core/src/main/java/com/dianping/cat/report/service/BaseHistoricalModelService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/BaseHistoricalModelService.java @@ -89,6 +89,10 @@ protected boolean isLocalMode() { return m_localMode; } + public void setConfigManager(ServerConfigManager configManager) { + m_configManager = configManager; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(64); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 14262c2e26..8aa275f9f3 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -1,6 +1,8 @@ package com.dianping.cat.home.spring; +import java.util.Collections; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import javax.sql.DataSource; @@ -28,6 +30,8 @@ import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; +import com.dianping.cat.consumer.problem.ProblemAnalyzer; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.config.AlertPolicyManager; @@ -110,8 +114,12 @@ import com.dianping.cat.report.page.metric.task.BaselineConfigManager; import com.dianping.cat.report.page.metric.task.BaselineCreator; import com.dianping.cat.report.page.metric.task.DefaultBaselineCreator; +import com.dianping.cat.report.page.problem.service.CompositeProblemService; +import com.dianping.cat.report.page.problem.service.HistoricalProblemService; +import com.dianping.cat.report.page.problem.service.ProblemReportService; import com.dianping.cat.report.page.storage.config.StorageGroupConfigManager; import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.report.service.ModelService; import com.dianping.cat.service.ProjectService; import com.dianping.cat.statistic.ServerStatisticManager; import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; @@ -366,6 +374,34 @@ public AlertSummaryService alertSummaryService() { return new AlertSummaryService(); } + @Bean + public ProblemReportService problemReportService() { + return new ProblemReportService(); + } + + @Bean(initMethod = "initialize", name = "problem-historical") + public ModelService historicalProblemService(ProblemReportService problemReportService, + ServerConfigManager serverConfigManager) { + HistoricalProblemService service = new HistoricalProblemService(); + + service.setReportService(problemReportService); + service.setConfigManager(serverConfigManager); + return service; + } + + @Bean(initMethod = "initialize", name = ProblemAnalyzer.ID) + public ModelService problemModelService( + @Qualifier("problem-historical") ModelService historicalProblemService, + ServerConfigManager serverConfigManager, RemoteServersManager remoteServersManager) { + CompositeProblemService service = new CompositeProblemService(); + List> services = Collections.singletonList(historicalProblemService); + + service.setServices(services); + service.setConfigManager(serverConfigManager); + service.setServerManager(remoteServersManager); + return service; + } + @Bean public AlertInfoBuilder alertInfoBuilder(AlertRepository alertRepository) { AlertInfoBuilder builder = new AlertInfoBuilder(); @@ -385,8 +421,11 @@ public SummaryBuilder relatedSummaryBuilder(AlertInfoBuilder alertInfoBuilder, } @Bean(initMethod = "initialize", name = FailureSummaryBuilder.ID) - public SummaryBuilder failureSummaryBuilder() { - return new FailureSummaryBuilder(); + public SummaryBuilder failureSummaryBuilder(@Qualifier(ProblemAnalyzer.ID) ModelService problemModelService) { + FailureSummaryBuilder builder = new FailureSummaryBuilder(); + + builder.setService(problemModelService); + return builder; } @Bean(initMethod = "initialize", name = AlterationSummaryBuilder.ID) diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/HistoricalProblemService.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/HistoricalProblemService.java index 189c01c875..ea1f87d0d7 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/HistoricalProblemService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/HistoricalProblemService.java @@ -27,6 +27,7 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.BaseHistoricalModelService; import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.spring.CatSpringContext; public class HistoricalProblemService extends BaseHistoricalModelService { @@ -48,7 +49,21 @@ protected ProblemReport buildModel(ModelRequest request) throws Exception { } private ProblemReport getReportFromDatabase(long timestamp, String domain) throws Exception { - return m_reportService.queryReport(domain, new Date(timestamp), new Date(timestamp + TimeHelper.ONE_HOUR)); + ProblemReportService reportService = getReportService(); + + return reportService == null ? new ProblemReport(domain) + : reportService.queryReport(domain, new Date(timestamp), new Date(timestamp + TimeHelper.ONE_HOUR)); + } + + private ProblemReportService getReportService() { + if (m_reportService == null) { + m_reportService = CatSpringContext.getBeanIfAvailable(ProblemReportService.class); + } + return m_reportService; + } + + public void setReportService(ProblemReportService reportService) { + m_reportService = reportService; } } From c3ec7e6025ae6bc6019e9fbd3a9cf108eb50e1f6 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 9 Jun 2026 22:42:32 +0800 Subject: [PATCH 012/231] Register local problem model service with Spring --- .../cat/report/service/LocalModelService.java | 20 +++++++++ .../spring/CatHomeSpringConfiguration.java | 19 ++++++++ .../cat/report/page/model/Handler.java | 45 ++++++++++++++++++- .../problem/service/LocalProblemService.java | 25 ++++++++++- 4 files changed, 105 insertions(+), 4 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/LocalModelService.java b/cat-core/src/main/java/com/dianping/cat/report/service/LocalModelService.java index ef978c31fc..a853de13a5 100755 --- a/cat-core/src/main/java/com/dianping/cat/report/service/LocalModelService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/LocalModelService.java @@ -24,6 +24,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Constants; @@ -35,6 +37,7 @@ import com.dianping.cat.spring.CatSpringContext; public abstract class LocalModelService implements Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(LocalModelService.class); public static final int DEFAULT_SIZE = 32 * 1024; @@ -73,6 +76,11 @@ protected List getReport(ModelPeriod period, String domain) throws Exception domain = m_defaultDomain; } + if (m_consumer == null) { + LOGGER.warn("Message consumer is not configured for local model service, service={}, period={}, domain={}.", + m_name, period, domain); + return null; + } if (period.isCurrent()) { analyzers = m_consumer.getCurrentAnalyzer(m_name); } else if (period.isLast()) { @@ -102,14 +110,26 @@ public String getReport(ModelRequest request, ModelPeriod period, String domain, @Override public void initialize() throws InitializationException { ServerConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + MessageConsumer consumer = CatSpringContext.getBeanIfAvailable(MessageConsumer.class); if (configManager != null) { m_configManager = configManager; } + if (consumer != null) { + m_consumer = consumer; + } m_defaultDomain = m_configManager.getConsoleDefaultDomain(); m_analyzerCount = m_configManager.getThreadsOfRealtimeAnalyzer(m_name); } + public void setConfigManager(ServerConfigManager configManager) { + m_configManager = configManager; + } + + public void setConsumer(MessageConsumer consumer) { + m_consumer = consumer; + } + public boolean isEligable(ModelRequest request) { ModelPeriod period = request.getPeriod(); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 8aa275f9f3..fbf74f9296 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -116,9 +116,11 @@ import com.dianping.cat.report.page.metric.task.DefaultBaselineCreator; import com.dianping.cat.report.page.problem.service.CompositeProblemService; import com.dianping.cat.report.page.problem.service.HistoricalProblemService; +import com.dianping.cat.report.page.problem.service.LocalProblemService; import com.dianping.cat.report.page.problem.service.ProblemReportService; import com.dianping.cat.report.page.storage.config.StorageGroupConfigManager; import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.service.ProjectService; import com.dianping.cat.statistic.ServerStatisticManager; @@ -402,6 +404,23 @@ public ModelService problemModelService( return service; } + @Bean(initMethod = "initialize") + public LocalModelService localProblemService(ServerConfigManager serverConfigManager) { + LocalProblemService service = new LocalProblemService(); + + service.setConfigManager(serverConfigManager); + return service; + } + + @Bean + public Map localModelServices( + @Qualifier("localProblemService") LocalModelService localProblemService) { + Map services = new LinkedHashMap(); + + services.put(LocalProblemService.ID, localProblemService); + return services; + } + @Bean public AlertInfoBuilder alertInfoBuilder(AlertRepository alertRepository) { AlertInfoBuilder builder = new AlertInfoBuilder(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java index 7aa4a01da7..d4fab45589 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java @@ -24,6 +24,8 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.zip.GZIPOutputStream; @@ -43,6 +45,7 @@ import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.spring.CatSpringContext; @SuppressWarnings("rawtypes") public class Handler extends ContainerHolder implements Initializable, PageHandler { @@ -112,8 +115,46 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { @Override public void initialize() throws InitializationException { - m_localServices = lookupMap(LocalModelService.class); - LOGGER.info("Initialized model page handler, localServiceCount={}.", m_localServices.size()); + if (m_localServices == null || m_localServices.isEmpty()) { + initializeFromSpringOrPlexus(); + } else { + LOGGER.info("Initialized model page handler from Spring injection, localServiceCount={}.", + m_localServices.size()); + } + } + + @SuppressWarnings("unchecked") + private void initializeFromSpringOrPlexus() { + Map springLocalServices = CatSpringContext.getBeanIfAvailable("localModelServices", + Map.class); + + if (springLocalServices != null && !springLocalServices.isEmpty()) { + setLocalServices(springLocalServices); + LOGGER.info("Initialized model page handler from Spring context bridge, localServiceCount={}.", + m_localServices.size()); + return; + } + try { + m_localServices = lookupMap(LocalModelService.class); + LOGGER.warn("Initialized model page handler from Plexus fallback, localServiceCount={}.", + m_localServices.size()); + } catch (RuntimeException e) { + m_localServices = new HashMap(); + LOGGER.warn("Unable to initialize model page handler from Plexus fallback, keep empty local services.", e); + } + } + + public void setLocalServices(Map localServices) { + if (localServices == null || localServices.isEmpty()) { + m_localServices = new HashMap(); + } else { + m_localServices = new HashMap(localServices); + } + LOGGER.info("Configured local model services from Spring, localServiceKeys={}.", m_localServices.keySet()); + } + + public Map getLocalServices() { + return Collections.unmodifiableMap(m_localServices); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/LocalProblemService.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/LocalProblemService.java index 3be7979ee4..3bc4dda318 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/LocalProblemService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/LocalProblemService.java @@ -39,6 +39,7 @@ import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.spring.CatSpringContext; @Named(type = LocalModelService.class, value = LocalProblemService.ID) public class LocalProblemService extends LocalModelService { @@ -81,20 +82,29 @@ public String buildReport(ModelRequest request, ModelPeriod period, String domai long startTime = request.getStartTime(); report = getReportFromLocalDisk(startTime, domain); } + if (report == null) { + report = new ProblemReport(domain); + report.setStartTime(new Date(request.getStartTime())); + report.setEndTime(new Date(request.getStartTime() + TimeHelper.ONE_HOUR - 1)); + } return filterReport(payload, report); } private ProblemReport getReportFromLocalDisk(long timestamp, String domain) throws Exception { ProblemReport report = new ProblemReport(domain); ProblemReportMerger merger = new ProblemReportMerger(report); + ReportBucketManager bucketManager = getBucketManager(); report.setStartTime(new Date(timestamp)); report.setEndTime(new Date(timestamp + TimeHelper.ONE_HOUR - 1)); + if (bucketManager == null) { + return report; + } for (int i = 0; i < getAnalyzerCount(); i++) { ReportBucket bucket = null; try { - bucket = m_bucketManager.getReportBucket(timestamp, ProblemAnalyzer.ID, i); + bucket = bucketManager.getReportBucket(timestamp, ProblemAnalyzer.ID, i); String xml = bucket.findById(domain); if (xml != null) { @@ -104,13 +114,24 @@ private ProblemReport getReportFromLocalDisk(long timestamp, String domain) thro } } finally { if (bucket != null) { - m_bucketManager.closeBucket(bucket); + bucketManager.closeBucket(bucket); } } } return report; } + private ReportBucketManager getBucketManager() { + if (m_bucketManager == null) { + m_bucketManager = CatSpringContext.getBeanIfAvailable(ReportBucketManager.class); + } + return m_bucketManager; + } + + public void setBucketManager(ReportBucketManager bucketManager) { + m_bucketManager = bucketManager; + } + public static class ProblemReportFilter extends com.dianping.cat.consumer.problem.model.transform.DefaultXmlBuilder { private String m_ipAddress; From 0252ea6d207c96fafd94a123051e7f870b0e5180 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 9 Jun 2026 22:49:06 +0800 Subject: [PATCH 013/231] Register core local model services with Spring --- .../spring/CatHomeSpringConfiguration.java | 38 ++++++++++++++++++- .../page/event/service/LocalEventService.java | 25 +++++++++++- .../service/LocalHeartbeatService.java | 25 +++++++++++- .../service/LocalTransactionService.java | 25 +++++++++++- 4 files changed, 106 insertions(+), 7 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index fbf74f9296..ae7c31d2bf 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -30,8 +30,11 @@ import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.config.AlertPolicyManager; @@ -109,11 +112,13 @@ import com.dianping.cat.report.page.business.task.BusinessKeyHelper; import com.dianping.cat.report.page.business.task.BusinessPointParser; import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; +import com.dianping.cat.report.page.heartbeat.service.LocalHeartbeatService; import com.dianping.cat.report.page.metric.service.BaselineService; import com.dianping.cat.report.page.metric.service.DefaultBaselineService; import com.dianping.cat.report.page.metric.task.BaselineConfigManager; import com.dianping.cat.report.page.metric.task.BaselineCreator; import com.dianping.cat.report.page.metric.task.DefaultBaselineCreator; +import com.dianping.cat.report.page.event.service.LocalEventService; import com.dianping.cat.report.page.problem.service.CompositeProblemService; import com.dianping.cat.report.page.problem.service.HistoricalProblemService; import com.dianping.cat.report.page.problem.service.LocalProblemService; @@ -122,6 +127,7 @@ import com.dianping.cat.report.server.RemoteServersManager; import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.report.page.transaction.service.LocalTransactionService; import com.dianping.cat.service.ProjectService; import com.dianping.cat.statistic.ServerStatisticManager; import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; @@ -412,12 +418,42 @@ public LocalModelService localProblemService(ServerConfigManager return service; } + @Bean(initMethod = "initialize") + public LocalModelService localEventService(ServerConfigManager serverConfigManager) { + LocalEventService service = new LocalEventService(); + + service.setConfigManager(serverConfigManager); + return service; + } + + @Bean(initMethod = "initialize") + public LocalModelService localTransactionService(ServerConfigManager serverConfigManager) { + LocalTransactionService service = new LocalTransactionService(); + + service.setConfigManager(serverConfigManager); + return service; + } + + @Bean(initMethod = "initialize") + public LocalModelService localHeartbeatService(ServerConfigManager serverConfigManager) { + LocalHeartbeatService service = new LocalHeartbeatService(); + + service.setConfigManager(serverConfigManager); + return service; + } + @Bean public Map localModelServices( - @Qualifier("localProblemService") LocalModelService localProblemService) { + @Qualifier("localProblemService") LocalModelService localProblemService, + @Qualifier("localEventService") LocalModelService localEventService, + @Qualifier("localTransactionService") LocalModelService localTransactionService, + @Qualifier("localHeartbeatService") LocalModelService localHeartbeatService) { Map services = new LinkedHashMap(); services.put(LocalProblemService.ID, localProblemService); + services.put(LocalEventService.ID, localEventService); + services.put(LocalTransactionService.ID, localTransactionService); + services.put(LocalHeartbeatService.ID, localHeartbeatService); return services; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/LocalEventService.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/LocalEventService.java index 4b8be1da34..fac2768030 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/LocalEventService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/LocalEventService.java @@ -38,6 +38,7 @@ import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.spring.CatSpringContext; @Named(type = LocalModelService.class, value = LocalEventService.ID) public class LocalEventService extends LocalModelService { @@ -79,20 +80,29 @@ public String buildReport(ModelRequest request, ModelPeriod period, String domai long startTime = request.getStartTime(); report = getReportFromLocalDisk(startTime, domain); } + if (report == null) { + report = new EventReport(domain); + report.setStartTime(new Date(request.getStartTime())); + report.setEndTime(new Date(request.getStartTime() + TimeHelper.ONE_HOUR - 1)); + } return filterReport(payload, report); } private EventReport getReportFromLocalDisk(long timestamp, String domain) throws Exception { EventReport report = new EventReport(domain); EventReportMerger merger = new EventReportMerger(report); + ReportBucketManager bucketManager = getBucketManager(); report.setStartTime(new Date(timestamp)); report.setEndTime(new Date(timestamp + TimeHelper.ONE_HOUR - 1)); + if (bucketManager == null) { + return report; + } for (int i = 0; i < getAnalyzerCount(); i++) { ReportBucket bucket = null; try { - bucket = m_bucketManager.getReportBucket(timestamp, EventAnalyzer.ID, i); + bucket = bucketManager.getReportBucket(timestamp, EventAnalyzer.ID, i); String xml = bucket.findById(domain); if (xml != null) { @@ -102,13 +112,24 @@ private EventReport getReportFromLocalDisk(long timestamp, String domain) throws } } finally { if (bucket != null) { - m_bucketManager.closeBucket(bucket); + bucketManager.closeBucket(bucket); } } } return report; } + private ReportBucketManager getBucketManager() { + if (m_bucketManager == null) { + m_bucketManager = CatSpringContext.getBeanIfAvailable(ReportBucketManager.class); + } + return m_bucketManager; + } + + public void setBucketManager(ReportBucketManager bucketManager) { + m_bucketManager = bucketManager; + } + public static class EventReportFilter extends com.dianping.cat.consumer.event.model.transform.DefaultXmlBuilder { private String m_ipAddress; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/LocalHeartbeatService.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/LocalHeartbeatService.java index cb19554952..a94bdff58c 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/LocalHeartbeatService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/LocalHeartbeatService.java @@ -40,6 +40,7 @@ import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.spring.CatSpringContext; @Named(type = LocalModelService.class, value = LocalHeartbeatService.ID) public class LocalHeartbeatService extends LocalModelService { @@ -86,6 +87,11 @@ public String buildReport(ModelRequest request, ModelPeriod period, String domai long startTime = request.getStartTime(); report = getReportFromLocalDisk(startTime, domain); } + if (report == null) { + report = new HeartbeatReport(domain); + report.setStartTime(new Date(request.getStartTime())); + report.setEndTime(new Date(request.getStartTime() + TimeHelper.ONE_HOUR - 1)); + } return filterReport(payload, report); } @@ -93,14 +99,18 @@ public String buildReport(ModelRequest request, ModelPeriod period, String domai private HeartbeatReport getReportFromLocalDisk(long timestamp, String domain) throws Exception { HeartbeatReport report = new HeartbeatReport(domain); HeartbeatReportMerger merger = new HeartbeatReportMerger(report); + ReportBucketManager bucketManager = getBucketManager(); report.setStartTime(new Date(timestamp)); report.setEndTime(new Date(timestamp + TimeHelper.ONE_HOUR - 1)); + if (bucketManager == null) { + return report; + } for (int i = 0; i < getAnalyzerCount(); i++) { ReportBucket bucket = null; try { - bucket = m_bucketManager.getReportBucket(timestamp, HeartbeatAnalyzer.ID, i); + bucket = bucketManager.getReportBucket(timestamp, HeartbeatAnalyzer.ID, i); String xml = bucket.findById(domain); if (xml != null) { @@ -110,13 +120,24 @@ private HeartbeatReport getReportFromLocalDisk(long timestamp, String domain) th } } finally { if (bucket != null) { - m_bucketManager.closeBucket(bucket); + bucketManager.closeBucket(bucket); } } } return report; } + private ReportBucketManager getBucketManager() { + if (m_bucketManager == null) { + m_bucketManager = CatSpringContext.getBeanIfAvailable(ReportBucketManager.class); + } + return m_bucketManager; + } + + public void setBucketManager(ReportBucketManager bucketManager) { + m_bucketManager = bucketManager; + } + public static class HeartBeatReportFilter extends com.dianping.cat.consumer.heartbeat.model.transform.DefaultXmlBuilder { private String m_ip; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/LocalTransactionService.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/LocalTransactionService.java index 6b60b8ed0b..25d88f0431 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/LocalTransactionService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/LocalTransactionService.java @@ -30,6 +30,7 @@ import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.spring.CatSpringContext; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -67,6 +68,11 @@ public String buildReport(ModelRequest request, ModelPeriod period, String domai long startTime = request.getStartTime(); report = getReportFromLocalDisk(startTime, domain); } + if (report == null) { + report = new TransactionReport(domain); + report.setStartTime(new Date(request.getStartTime())); + report.setEndTime(new Date(request.getStartTime() + TimeHelper.ONE_HOUR - 1)); + } return filterReport(payload, report); } @@ -93,14 +99,18 @@ private String filterReport(ApiPayload payload, TransactionReport report) { private TransactionReport getReportFromLocalDisk(long timestamp, String domain) throws Exception { TransactionReport report = new TransactionReport(domain); TransactionReportMerger merger = new TransactionReportMerger(report); + ReportBucketManager bucketManager = getBucketManager(); report.setStartTime(new Date(timestamp)); report.setEndTime(new Date(timestamp + TimeHelper.ONE_HOUR - 1)); + if (bucketManager == null) { + return report; + } for (int i = 0; i < getAnalyzerCount(); i++) { ReportBucket bucket = null; try { - bucket = m_bucketManager.getReportBucket(timestamp, TransactionAnalyzer.ID, i); + bucket = bucketManager.getReportBucket(timestamp, TransactionAnalyzer.ID, i); String xml = bucket.findById(domain); if (xml != null) { @@ -110,13 +120,24 @@ private TransactionReport getReportFromLocalDisk(long timestamp, String domain) } } finally { if (bucket != null) { - m_bucketManager.closeBucket(bucket); + bucketManager.closeBucket(bucket); } } } return report; } + private ReportBucketManager getBucketManager() { + if (m_bucketManager == null) { + m_bucketManager = CatSpringContext.getBeanIfAvailable(ReportBucketManager.class); + } + return m_bucketManager; + } + + public void setBucketManager(ReportBucketManager bucketManager) { + m_bucketManager = bucketManager; + } + public static class TransactionReportFilter extends com.dianping.cat.consumer.transaction.model.transform.DefaultXmlBuilder { private String m_ipAddress; From 683a66fe1c65527b7166a865c06e0285b7821727 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 9 Jun 2026 22:54:05 +0800 Subject: [PATCH 014/231] Register dependency local model services with Spring --- .../spring/CatHomeSpringConfiguration.java | 38 ++++++++++++++++++- .../page/cross/service/LocalCrossService.java | 25 +++++++++++- .../service/LocalDependencyService.java | 25 +++++++++++- .../matrix/service/LocalMatrixService.java | 25 +++++++++++- 4 files changed, 106 insertions(+), 7 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index ae7c31d2bf..83c7f7b8da 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -30,8 +30,11 @@ import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; +import com.dianping.cat.consumer.cross.model.entity.CrossReport; +import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; import com.dianping.cat.consumer.event.model.entity.EventReport; import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; +import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; @@ -111,8 +114,11 @@ import com.dianping.cat.report.page.business.service.BusinessReportService; import com.dianping.cat.report.page.business.task.BusinessKeyHelper; import com.dianping.cat.report.page.business.task.BusinessPointParser; +import com.dianping.cat.report.page.cross.service.LocalCrossService; +import com.dianping.cat.report.page.dependency.service.LocalDependencyService; import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; import com.dianping.cat.report.page.heartbeat.service.LocalHeartbeatService; +import com.dianping.cat.report.page.matrix.service.LocalMatrixService; import com.dianping.cat.report.page.metric.service.BaselineService; import com.dianping.cat.report.page.metric.service.DefaultBaselineService; import com.dianping.cat.report.page.metric.task.BaselineConfigManager; @@ -442,18 +448,48 @@ public LocalModelService localHeartbeatService(ServerConfigMana return service; } + @Bean(initMethod = "initialize") + public LocalModelService localCrossService(ServerConfigManager serverConfigManager) { + LocalCrossService service = new LocalCrossService(); + + service.setConfigManager(serverConfigManager); + return service; + } + + @Bean(initMethod = "initialize") + public LocalModelService localMatrixService(ServerConfigManager serverConfigManager) { + LocalMatrixService service = new LocalMatrixService(); + + service.setConfigManager(serverConfigManager); + return service; + } + + @Bean(initMethod = "initialize") + public LocalModelService localDependencyService(ServerConfigManager serverConfigManager) { + LocalDependencyService service = new LocalDependencyService(); + + service.setConfigManager(serverConfigManager); + return service; + } + @Bean public Map localModelServices( @Qualifier("localProblemService") LocalModelService localProblemService, @Qualifier("localEventService") LocalModelService localEventService, @Qualifier("localTransactionService") LocalModelService localTransactionService, - @Qualifier("localHeartbeatService") LocalModelService localHeartbeatService) { + @Qualifier("localHeartbeatService") LocalModelService localHeartbeatService, + @Qualifier("localCrossService") LocalModelService localCrossService, + @Qualifier("localMatrixService") LocalModelService localMatrixService, + @Qualifier("localDependencyService") LocalModelService localDependencyService) { Map services = new LinkedHashMap(); services.put(LocalProblemService.ID, localProblemService); services.put(LocalEventService.ID, localEventService); services.put(LocalTransactionService.ID, localTransactionService); services.put(LocalHeartbeatService.ID, localHeartbeatService); + services.put(LocalCrossService.ID, localCrossService); + services.put(LocalMatrixService.ID, localMatrixService); + services.put(LocalDependencyService.ID, localDependencyService); return services; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/LocalCrossService.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/LocalCrossService.java index 62a792ca47..564529e866 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/LocalCrossService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/LocalCrossService.java @@ -35,6 +35,7 @@ import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.spring.CatSpringContext; @Named(type = LocalModelService.class, value = LocalCrossService.ID) public class LocalCrossService extends LocalModelService { @@ -68,20 +69,29 @@ public String buildReport(ModelRequest request, ModelPeriod period, String domai report = getReportFromLocalDisk(startTime, domain); } + if (report == null) { + report = new CrossReport(domain); + report.setStartTime(new Date(request.getStartTime())); + report.setEndTime(new Date(request.getStartTime() + TimeHelper.ONE_HOUR - 1)); + } return new CrossReportFilter().buildXml(report); } private CrossReport getReportFromLocalDisk(long timestamp, String domain) throws Exception { CrossReport report = new CrossReport(domain); CrossReportMerger merger = new CrossReportMerger(report); + ReportBucketManager bucketManager = getBucketManager(); report.setStartTime(new Date(timestamp)); report.setEndTime(new Date(timestamp + TimeHelper.ONE_HOUR - 1)); + if (bucketManager == null) { + return report; + } for (int i = 0; i < getAnalyzerCount(); i++) { ReportBucket bucket = null; try { - bucket = m_bucketManager.getReportBucket(timestamp, CrossAnalyzer.ID, i); + bucket = bucketManager.getReportBucket(timestamp, CrossAnalyzer.ID, i); String xml = bucket.findById(domain); if (xml != null) { @@ -91,13 +101,24 @@ private CrossReport getReportFromLocalDisk(long timestamp, String domain) throws } } finally { if (bucket != null) { - m_bucketManager.closeBucket(bucket); + bucketManager.closeBucket(bucket); } } } return report; } + private ReportBucketManager getBucketManager() { + if (m_bucketManager == null) { + m_bucketManager = CatSpringContext.getBeanIfAvailable(ReportBucketManager.class); + } + return m_bucketManager; + } + + public void setBucketManager(ReportBucketManager bucketManager) { + m_bucketManager = bucketManager; + } + public static class CrossReportFilter extends com.dianping.cat.consumer.cross.model.transform.DefaultXmlBuilder { public CrossReportFilter() { super(true, new StringBuilder(DEFAULT_SIZE)); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/LocalDependencyService.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/LocalDependencyService.java index 038486b3f6..5ff64d501d 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/LocalDependencyService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/LocalDependencyService.java @@ -35,6 +35,7 @@ import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.spring.CatSpringContext; @Named(type = LocalModelService.class, value = LocalDependencyService.ID) public class LocalDependencyService extends LocalModelService { @@ -67,20 +68,29 @@ public String buildReport(ModelRequest request, ModelPeriod period, String domai long startTime = request.getStartTime(); report = getReportFromLocalDisk(startTime, domain); } + if (report == null) { + report = new DependencyReport(domain); + report.setStartTime(new Date(request.getStartTime())); + report.setEndTime(new Date(request.getStartTime() + TimeHelper.ONE_HOUR - 1)); + } return new DependencyReportFilter().buildXml(report); } private DependencyReport getReportFromLocalDisk(long timestamp, String domain) throws Exception { DependencyReport report = new DependencyReport(domain); DependencyReportMerger merger = new DependencyReportMerger(report); + ReportBucketManager bucketManager = getBucketManager(); report.setStartTime(new Date(timestamp)); report.setEndTime(new Date(timestamp + TimeHelper.ONE_HOUR - 1)); + if (bucketManager == null) { + return report; + } for (int i = 0; i < getAnalyzerCount(); i++) { ReportBucket bucket = null; try { - bucket = m_bucketManager.getReportBucket(timestamp, DependencyAnalyzer.ID, i); + bucket = bucketManager.getReportBucket(timestamp, DependencyAnalyzer.ID, i); String xml = bucket.findById(domain); if (xml != null) { @@ -90,13 +100,24 @@ private DependencyReport getReportFromLocalDisk(long timestamp, String domain) t } } finally { if (bucket != null) { - m_bucketManager.closeBucket(bucket); + bucketManager.closeBucket(bucket); } } } return report; } + private ReportBucketManager getBucketManager() { + if (m_bucketManager == null) { + m_bucketManager = CatSpringContext.getBeanIfAvailable(ReportBucketManager.class); + } + return m_bucketManager; + } + + public void setBucketManager(ReportBucketManager bucketManager) { + m_bucketManager = bucketManager; + } + public static class DependencyReportFilter extends com.dianping.cat.consumer.dependency.model.transform.DefaultXmlBuilder { public DependencyReportFilter() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/LocalMatrixService.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/LocalMatrixService.java index a6933b3815..c7d0211b01 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/LocalMatrixService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/LocalMatrixService.java @@ -35,6 +35,7 @@ import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.spring.CatSpringContext; @Named(type = LocalModelService.class, value = LocalMatrixService.ID) public class LocalMatrixService extends LocalModelService { @@ -67,20 +68,29 @@ public String buildReport(ModelRequest request, ModelPeriod period, String domai long startTime = request.getStartTime(); report = getReportFromLocalDisk(startTime, domain); } + if (report == null) { + report = new MatrixReport(domain); + report.setStartTime(new Date(request.getStartTime())); + report.setEndTime(new Date(request.getStartTime() + TimeHelper.ONE_HOUR - 1)); + } return new MatrixReportFilter().buildXml(report); } private MatrixReport getReportFromLocalDisk(long timestamp, String domain) throws Exception { MatrixReport report = new MatrixReport(domain); MatrixReportMerger merger = new MatrixReportMerger(report); + ReportBucketManager bucketManager = getBucketManager(); report.setStartTime(new Date(timestamp)); report.setEndTime(new Date(timestamp + TimeHelper.ONE_HOUR - 1)); + if (bucketManager == null) { + return report; + } for (int i = 0; i < getAnalyzerCount(); i++) { ReportBucket bucket = null; try { - bucket = m_bucketManager.getReportBucket(timestamp, MatrixAnalyzer.ID, i); + bucket = bucketManager.getReportBucket(timestamp, MatrixAnalyzer.ID, i); String xml = bucket.findById(domain); if (xml != null) { @@ -90,13 +100,24 @@ private MatrixReport getReportFromLocalDisk(long timestamp, String domain) throw } } finally { if (bucket != null) { - m_bucketManager.closeBucket(bucket); + bucketManager.closeBucket(bucket); } } } return report; } + private ReportBucketManager getBucketManager() { + if (m_bucketManager == null) { + m_bucketManager = CatSpringContext.getBeanIfAvailable(ReportBucketManager.class); + } + return m_bucketManager; + } + + public void setBucketManager(ReportBucketManager bucketManager) { + m_bucketManager = bucketManager; + } + public static class MatrixReportFilter extends com.dianping.cat.consumer.matrix.model.transform.DefaultXmlBuilder { public MatrixReportFilter() { super(true, new StringBuilder(DEFAULT_SIZE)); From ecb72aa62d4960d02664cb033cd2ec77a06365f1 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 9 Jun 2026 22:59:07 +0800 Subject: [PATCH 015/231] Register aggregate local model services with Spring --- .../spring/CatHomeSpringConfiguration.java | 38 ++++++++++++++++++- .../page/state/service/LocalStateService.java | 25 +++++++++++- .../storage/service/LocalStorageService.java | 25 +++++++++++- .../page/top/service/LocalTopService.java | 25 +++++++++++- 4 files changed, 106 insertions(+), 7 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 83c7f7b8da..1675ac34fe 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -37,6 +37,9 @@ import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.state.model.entity.StateReport; +import com.dianping.cat.consumer.storage.model.entity.StorageReport; +import com.dianping.cat.consumer.top.model.entity.TopReport; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.alarm.spi.config.AlertConfigManager; @@ -130,9 +133,12 @@ import com.dianping.cat.report.page.problem.service.LocalProblemService; import com.dianping.cat.report.page.problem.service.ProblemReportService; import com.dianping.cat.report.page.storage.config.StorageGroupConfigManager; +import com.dianping.cat.report.page.storage.service.LocalStorageService; import com.dianping.cat.report.server.RemoteServersManager; import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.report.page.state.service.LocalStateService; +import com.dianping.cat.report.page.top.service.LocalTopService; import com.dianping.cat.report.page.transaction.service.LocalTransactionService; import com.dianping.cat.service.ProjectService; import com.dianping.cat.statistic.ServerStatisticManager; @@ -472,6 +478,30 @@ public LocalModelService localDependencyService(ServerConfigMa return service; } + @Bean(initMethod = "initialize") + public LocalModelService localTopService(ServerConfigManager serverConfigManager) { + LocalTopService service = new LocalTopService(); + + service.setConfigManager(serverConfigManager); + return service; + } + + @Bean(initMethod = "initialize") + public LocalModelService localStateService(ServerConfigManager serverConfigManager) { + LocalStateService service = new LocalStateService(); + + service.setConfigManager(serverConfigManager); + return service; + } + + @Bean(initMethod = "initialize") + public LocalModelService localStorageService(ServerConfigManager serverConfigManager) { + LocalStorageService service = new LocalStorageService(); + + service.setConfigManager(serverConfigManager); + return service; + } + @Bean public Map localModelServices( @Qualifier("localProblemService") LocalModelService localProblemService, @@ -480,7 +510,10 @@ public Map localModelServices( @Qualifier("localHeartbeatService") LocalModelService localHeartbeatService, @Qualifier("localCrossService") LocalModelService localCrossService, @Qualifier("localMatrixService") LocalModelService localMatrixService, - @Qualifier("localDependencyService") LocalModelService localDependencyService) { + @Qualifier("localDependencyService") LocalModelService localDependencyService, + @Qualifier("localTopService") LocalModelService localTopService, + @Qualifier("localStateService") LocalModelService localStateService, + @Qualifier("localStorageService") LocalModelService localStorageService) { Map services = new LinkedHashMap(); services.put(LocalProblemService.ID, localProblemService); @@ -490,6 +523,9 @@ public Map localModelServices( services.put(LocalCrossService.ID, localCrossService); services.put(LocalMatrixService.ID, localMatrixService); services.put(LocalDependencyService.ID, localDependencyService); + services.put(LocalTopService.ID, localTopService); + services.put(LocalStateService.ID, localStateService); + services.put(LocalStorageService.ID, localStorageService); return services; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/LocalStateService.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/LocalStateService.java index ef430ce2cc..9f409833da 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/LocalStateService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/LocalStateService.java @@ -35,6 +35,7 @@ import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.spring.CatSpringContext; @Named(type = LocalModelService.class, value = LocalStateService.ID) public class LocalStateService extends LocalModelService { @@ -72,20 +73,29 @@ public String buildReport(ModelRequest request, ModelPeriod period, String domai report.setEndTime(new Date(startTime + TimeHelper.ONE_HOUR - 1)); } } + if (report == null) { + report = new StateReport(domain); + report.setStartTime(new Date(request.getStartTime())); + report.setEndTime(new Date(request.getStartTime() + TimeHelper.ONE_HOUR - 1)); + } return new StateReportFilter().buildXml(report); } private StateReport getReportFromLocalDisk(long timestamp, String domain) throws Exception { StateReport report = new StateReport(domain); StateReportMerger merger = new StateReportMerger(report); + ReportBucketManager bucketManager = getBucketManager(); report.setStartTime(new Date(timestamp)); report.setEndTime(new Date(timestamp + TimeHelper.ONE_HOUR - 1)); + if (bucketManager == null) { + return report; + } for (int i = 0; i < getAnalyzerCount(); i++) { ReportBucket bucket = null; try { - bucket = m_bucketManager.getReportBucket(timestamp, StateAnalyzer.ID, i); + bucket = bucketManager.getReportBucket(timestamp, StateAnalyzer.ID, i); String xml = bucket.findById(domain); if (xml != null) { @@ -95,13 +105,24 @@ private StateReport getReportFromLocalDisk(long timestamp, String domain) throws } } finally { if (bucket != null) { - m_bucketManager.closeBucket(bucket); + bucketManager.closeBucket(bucket); } } } return report; } + private ReportBucketManager getBucketManager() { + if (m_bucketManager == null) { + m_bucketManager = CatSpringContext.getBeanIfAvailable(ReportBucketManager.class); + } + return m_bucketManager; + } + + public void setBucketManager(ReportBucketManager bucketManager) { + m_bucketManager = bucketManager; + } + public static class StateReportFilter extends com.dianping.cat.consumer.state.model.transform.DefaultXmlBuilder { public StateReportFilter() { super(true, new StringBuilder(DEFAULT_SIZE)); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/LocalStorageService.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/LocalStorageService.java index 2142f2fcab..73a89fd112 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/LocalStorageService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/LocalStorageService.java @@ -39,6 +39,7 @@ import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.spring.CatSpringContext; @Named(type = LocalModelService.class, value = LocalStorageService.ID) public class LocalStorageService extends LocalModelService { @@ -70,6 +71,11 @@ public String buildReport(ModelRequest request, ModelPeriod period, String id, A long startTime = request.getStartTime(); report = getReportFromLocalDisk(startTime, id); } + if (report == null) { + report = new StorageReport(id); + report.setStartTime(new Date(request.getStartTime())); + report.setEndTime(new Date(request.getStartTime() + TimeHelper.ONE_HOUR - 1)); + } String ipAddress = payload.getIpAddress(); @@ -79,14 +85,18 @@ public String buildReport(ModelRequest request, ModelPeriod period, String id, A private StorageReport getReportFromLocalDisk(long timestamp, String id) throws Exception { StorageReport report = new StorageReport(id); StorageReportMerger merger = new StorageReportMerger(report); + ReportBucketManager bucketManager = getBucketManager(); report.setStartTime(new Date(timestamp)); report.setEndTime(new Date(timestamp + TimeHelper.ONE_HOUR - 1)); + if (bucketManager == null) { + return report; + } for (int i = 0; i < getAnalyzerCount(); i++) { ReportBucket bucket = null; try { - bucket = m_bucketManager.getReportBucket(timestamp, StorageAnalyzer.ID, i); + bucket = bucketManager.getReportBucket(timestamp, StorageAnalyzer.ID, i); String xml = bucket.findById(id); if (xml != null) { @@ -108,13 +118,24 @@ private StorageReport getReportFromLocalDisk(long timestamp, String id) throws E } } finally { if (bucket != null) { - m_bucketManager.closeBucket(bucket); + bucketManager.closeBucket(bucket); } } } return report; } + private ReportBucketManager getBucketManager() { + if (m_bucketManager == null) { + m_bucketManager = CatSpringContext.getBeanIfAvailable(ReportBucketManager.class); + } + return m_bucketManager; + } + + public void setBucketManager(ReportBucketManager bucketManager) { + m_bucketManager = bucketManager; + } + public static class StorageReportFilter extends com.dianping.cat.consumer.storage.model.transform.DefaultXmlBuilder { private String m_ipAddress; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/LocalTopService.java b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/LocalTopService.java index 4f615297d1..eb6eaacf91 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/LocalTopService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/LocalTopService.java @@ -35,6 +35,7 @@ import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.spring.CatSpringContext; @Named(type = LocalModelService.class, value = LocalTopService.ID) public class LocalTopService extends LocalModelService { @@ -73,20 +74,29 @@ public String buildReport(ModelRequest request, ModelPeriod period, String domai report.setEndTime(new Date(startTime + TimeHelper.ONE_HOUR - 1)); } } + if (report == null) { + report = new TopReport(domain); + report.setStartTime(new Date(request.getStartTime())); + report.setEndTime(new Date(request.getStartTime() + TimeHelper.ONE_HOUR - 1)); + } return new TopReportFilter().buildXml(report); } private TopReport getReportFromLocalDisk(long timestamp, String domain) throws Exception { TopReport report = new TopReport(domain); TopReportMerger merger = new TopReportMerger(report); + ReportBucketManager bucketManager = getBucketManager(); report.setStartTime(new Date(timestamp)); report.setEndTime(new Date(timestamp + TimeHelper.ONE_HOUR - 1)); + if (bucketManager == null) { + return report; + } for (int i = 0; i < getAnalyzerCount(); i++) { ReportBucket bucket = null; try { - bucket = m_bucketManager.getReportBucket(timestamp, TopAnalyzer.ID, i); + bucket = bucketManager.getReportBucket(timestamp, TopAnalyzer.ID, i); String xml = bucket.findById(domain); if (xml != null) { @@ -96,13 +106,24 @@ private TopReport getReportFromLocalDisk(long timestamp, String domain) throws E } } finally { if (bucket != null) { - m_bucketManager.closeBucket(bucket); + bucketManager.closeBucket(bucket); } } } return report; } + private ReportBucketManager getBucketManager() { + if (m_bucketManager == null) { + m_bucketManager = CatSpringContext.getBeanIfAvailable(ReportBucketManager.class); + } + return m_bucketManager; + } + + public void setBucketManager(ReportBucketManager bucketManager) { + m_bucketManager = bucketManager; + } + public static class TopReportFilter extends com.dianping.cat.consumer.top.model.transform.DefaultXmlBuilder { public TopReportFilter() { super(true, new StringBuilder(DEFAULT_SIZE)); From 1aa1a37b73e84c15f03eb00fcad539eb84b5c9cf Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 9 Jun 2026 23:03:51 +0800 Subject: [PATCH 016/231] Register business local model service with Spring --- .../spring/CatHomeSpringConfiguration.java | 14 ++++++++++- .../service/LocalBusinessService.java | 25 +++++++++++++++++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 1675ac34fe..144b095c6a 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -30,6 +30,7 @@ import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; +import com.dianping.cat.consumer.business.model.entity.BusinessReport; import com.dianping.cat.consumer.cross.model.entity.CrossReport; import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; import com.dianping.cat.consumer.event.model.entity.EventReport; @@ -114,6 +115,7 @@ import com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager; import com.dianping.cat.report.page.business.graph.BusinessDataFetcher; import com.dianping.cat.report.page.business.graph.CustomDataCalculator; +import com.dianping.cat.report.page.business.service.LocalBusinessService; import com.dianping.cat.report.page.business.service.BusinessReportService; import com.dianping.cat.report.page.business.task.BusinessKeyHelper; import com.dianping.cat.report.page.business.task.BusinessPointParser; @@ -502,6 +504,14 @@ public LocalModelService localStorageService(ServerConfigManager return service; } + @Bean(initMethod = "initialize") + public LocalModelService localBusinessService(ServerConfigManager serverConfigManager) { + LocalBusinessService service = new LocalBusinessService(); + + service.setConfigManager(serverConfigManager); + return service; + } + @Bean public Map localModelServices( @Qualifier("localProblemService") LocalModelService localProblemService, @@ -513,7 +523,8 @@ public Map localModelServices( @Qualifier("localDependencyService") LocalModelService localDependencyService, @Qualifier("localTopService") LocalModelService localTopService, @Qualifier("localStateService") LocalModelService localStateService, - @Qualifier("localStorageService") LocalModelService localStorageService) { + @Qualifier("localStorageService") LocalModelService localStorageService, + @Qualifier("localBusinessService") LocalModelService localBusinessService) { Map services = new LinkedHashMap(); services.put(LocalProblemService.ID, localProblemService); @@ -526,6 +537,7 @@ public Map localModelServices( services.put(LocalTopService.ID, localTopService); services.put(LocalStateService.ID, localStateService); services.put(LocalStorageService.ID, localStorageService); + services.put(LocalBusinessService.ID, localBusinessService); return services; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/LocalBusinessService.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/LocalBusinessService.java index 8de0ed9a95..ce31ca9605 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/LocalBusinessService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/LocalBusinessService.java @@ -36,6 +36,7 @@ import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.spring.CatSpringContext; @Named(type = LocalModelService.class, value = LocalBusinessService.ID) public class LocalBusinessService extends LocalModelService { @@ -74,6 +75,11 @@ public String buildReport(ModelRequest request, ModelPeriod period, String domai report.setEndTime(new Date(startTime + TimeHelper.ONE_HOUR - 1)); } } + if (report == null) { + report = new BusinessReport(domain); + report.setStartTime(new Date(request.getStartTime())); + report.setEndTime(new Date(request.getStartTime() + TimeHelper.ONE_HOUR - 1)); + } BusinessReportFilter filter = new BusinessReportFilter(payload.getMin(), payload.getMax()); return filter.buildXml(report); } @@ -81,14 +87,18 @@ public String buildReport(ModelRequest request, ModelPeriod period, String domai private BusinessReport getReportFromLocalDisk(long timestamp, String domain) throws Exception { BusinessReport report = new BusinessReport(domain); BusinessReportMerger merger = new BusinessReportMerger(report); + ReportBucketManager bucketManager = getBucketManager(); report.setStartTime(new Date(timestamp)); report.setEndTime(new Date(timestamp + TimeHelper.ONE_HOUR - 1)); + if (bucketManager == null) { + return report; + } for (int i = 0; i < getAnalyzerCount(); i++) { ReportBucket bucket = null; try { - bucket = m_bucketManager.getReportBucket(timestamp, BusinessAnalyzer.ID, i); + bucket = bucketManager.getReportBucket(timestamp, BusinessAnalyzer.ID, i); String xml = bucket.findById(domain); if (xml != null) { @@ -98,13 +108,24 @@ private BusinessReport getReportFromLocalDisk(long timestamp, String domain) thr } } finally { if (bucket != null) { - m_bucketManager.closeBucket(bucket); + bucketManager.closeBucket(bucket); } } } return report; } + private ReportBucketManager getBucketManager() { + if (m_bucketManager == null) { + m_bucketManager = CatSpringContext.getBeanIfAvailable(ReportBucketManager.class); + } + return m_bucketManager; + } + + public void setBucketManager(ReportBucketManager bucketManager) { + m_bucketManager = bucketManager; + } + public static class BusinessReportFilter extends com.dianping.cat.consumer.business.model.transform.DefaultXmlBuilder { private int m_min; From fa6b15a61d40f1ea694997da72181fcf6130f3a2 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 9 Jun 2026 23:10:57 +0800 Subject: [PATCH 017/231] Wire realtime consumer into Spring local model services --- .../dianping/cat/report/page/model/Handler.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java index d4fab45589..1f7276c1fd 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java @@ -40,6 +40,7 @@ import org.unidal.web.mvc.annotation.PayloadMeta; import com.dianping.cat.Cat; +import com.dianping.cat.analysis.MessageConsumer; import com.dianping.cat.message.tree.MessageId; import com.dianping.cat.report.ReportPage; import com.dianping.cat.report.service.LocalModelService; @@ -130,6 +131,7 @@ private void initializeFromSpringOrPlexus() { if (springLocalServices != null && !springLocalServices.isEmpty()) { setLocalServices(springLocalServices); + configureMessageConsumerFromPlexus(); LOGGER.info("Initialized model page handler from Spring context bridge, localServiceCount={}.", m_localServices.size()); return; @@ -144,6 +146,20 @@ private void initializeFromSpringOrPlexus() { } } + private void configureMessageConsumerFromPlexus() { + try { + MessageConsumer consumer = lookup(MessageConsumer.class); + + for (LocalModelService service : m_localServices.values()) { + service.setConsumer(consumer); + } + LOGGER.info("Configured message consumer for Spring local model services, localServiceCount={}.", + m_localServices.size()); + } catch (RuntimeException e) { + LOGGER.warn("Unable to configure message consumer for Spring local model services from Plexus.", e); + } + } + public void setLocalServices(Map localServices) { if (localServices == null || localServices.isEmpty()) { m_localServices = new HashMap(); From 162d187848ae8715fe3070e16bd103d18a908eb1 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 9 Jun 2026 23:17:22 +0800 Subject: [PATCH 018/231] Merge Plexus local model fallbacks into Spring bridge --- .../cat/report/page/model/Handler.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java index 1f7276c1fd..61bc8745da 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java @@ -131,6 +131,7 @@ private void initializeFromSpringOrPlexus() { if (springLocalServices != null && !springLocalServices.isEmpty()) { setLocalServices(springLocalServices); + mergePlexusLocalServices(); configureMessageConsumerFromPlexus(); LOGGER.info("Initialized model page handler from Spring context bridge, localServiceCount={}.", m_localServices.size()); @@ -146,6 +147,23 @@ private void initializeFromSpringOrPlexus() { } } + private void mergePlexusLocalServices() { + try { + Map plexusLocalServices = lookupMap(LocalModelService.class); + int originalCount = m_localServices.size(); + + for (Map.Entry entry : plexusLocalServices.entrySet()) { + if (!m_localServices.containsKey(entry.getKey())) { + m_localServices.put(entry.getKey(), entry.getValue()); + } + } + LOGGER.info("Merged Plexus local model service fallback, springServiceCount={}, mergedServiceCount={}, keys={}.", + originalCount, m_localServices.size(), m_localServices.keySet()); + } catch (RuntimeException e) { + LOGGER.warn("Unable to merge Plexus local model service fallback.", e); + } + } + private void configureMessageConsumerFromPlexus() { try { MessageConsumer consumer = lookup(MessageConsumer.class); From 52501483550e5dd6561a9aaa5d82780ae9031337 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 08:10:29 +0800 Subject: [PATCH 019/231] Register local logview service with Spring --- .../spring/CatHomeSpringConfiguration.java | 13 +++++++++- .../logview/service/LocalMessageService.java | 25 ++++++++++++++++--- .../cat/report/page/model/Handler.java | 23 +++++++++++++++++ 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 144b095c6a..f623451e3f 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -123,6 +123,7 @@ import com.dianping.cat.report.page.dependency.service.LocalDependencyService; import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; import com.dianping.cat.report.page.heartbeat.service.LocalHeartbeatService; +import com.dianping.cat.report.page.logview.service.LocalMessageService; import com.dianping.cat.report.page.matrix.service.LocalMatrixService; import com.dianping.cat.report.page.metric.service.BaselineService; import com.dianping.cat.report.page.metric.service.DefaultBaselineService; @@ -512,6 +513,14 @@ public LocalModelService localBusinessService(ServerConfigManage return service; } + @Bean(initMethod = "initialize") + public LocalModelService localMessageService(ServerConfigManager serverConfigManager) { + LocalMessageService service = new LocalMessageService(); + + service.setConfigManager(serverConfigManager); + return service; + } + @Bean public Map localModelServices( @Qualifier("localProblemService") LocalModelService localProblemService, @@ -524,7 +533,8 @@ public Map localModelServices( @Qualifier("localTopService") LocalModelService localTopService, @Qualifier("localStateService") LocalModelService localStateService, @Qualifier("localStorageService") LocalModelService localStorageService, - @Qualifier("localBusinessService") LocalModelService localBusinessService) { + @Qualifier("localBusinessService") LocalModelService localBusinessService, + @Qualifier("localMessageService") LocalModelService localMessageService) { Map services = new LinkedHashMap(); services.put(LocalProblemService.ID, localProblemService); @@ -538,6 +548,7 @@ public Map localModelServices( services.put(LocalStateService.ID, localStateService); services.put(LocalStorageService.ID, localStorageService); services.put(LocalBusinessService.ID, localBusinessService); + services.put("logview", localMessageService); return services; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java index 2782ce949e..3630915c6c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java @@ -88,14 +88,17 @@ private String buildNewReport(ModelRequest request, ModelPeriod period, String d String messageId = payload.getMessageId(); boolean waterfall = payload.isWaterfall(); MessageId id = MessageId.parse(messageId); - ByteBuf buf = m_finderManager.find(id); + ByteBuf buf = null; MessageTree tree = null; + if (m_finderManager != null) { + buf = m_finderManager.find(id); + } if (buf != null) { tree = CodecHandler.decode(changeBuf(buf)); } - if (tree == null) { + if (tree == null && m_bucketManager != null) { Bucket bucket = m_bucketManager.getBucket(id.getDomain(), NetworkInterfaceManager.INSTANCE.getLocalHostAddress(), id.getHour(), false); @@ -146,7 +149,11 @@ public String buildOldReport(ModelRequest request, ModelPeriod period, String do throws Exception { String messageId = payload.getMessageId(); boolean waterfall = payload.isWaterfall(); - MessageTree tree = m_messageBucketManager.loadMessage(messageId); + MessageTree tree = null; + + if (m_messageBucketManager != null) { + tree = m_messageBucketManager.loadMessage(messageId); + } if (tree != null) { ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(8192); @@ -168,6 +175,18 @@ public String buildOldReport(ModelRequest request, ModelPeriod period, String do return null; } + public void setBucketManager(BucketManager bucketManager) { + m_bucketManager = bucketManager; + } + + public void setFinderManager(MessageFinderManager finderManager) { + m_finderManager = finderManager; + } + + public void setMessageBucketManager(MessageBucketManager messageBucketManager) { + m_messageBucketManager = messageBucketManager; + } + @Override public ModelResponse invoke(ModelRequest request) { ModelResponse response = new ModelResponse(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java index 61bc8745da..696b850a73 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java @@ -33,6 +33,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.unidal.cat.message.storage.BucketManager; +import org.unidal.cat.message.storage.MessageFinderManager; import org.unidal.lookup.ContainerHolder; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -41,8 +43,11 @@ import com.dianping.cat.Cat; import com.dianping.cat.analysis.MessageConsumer; +import com.dianping.cat.consumer.dump.LocalMessageBucketManager; +import com.dianping.cat.message.storage.MessageBucketManager; import com.dianping.cat.message.tree.MessageId; import com.dianping.cat.report.ReportPage; +import com.dianping.cat.report.page.logview.service.LocalMessageService; import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; @@ -132,6 +137,7 @@ private void initializeFromSpringOrPlexus() { if (springLocalServices != null && !springLocalServices.isEmpty()) { setLocalServices(springLocalServices); mergePlexusLocalServices(); + configureLogviewDependenciesFromPlexus(); configureMessageConsumerFromPlexus(); LOGGER.info("Initialized model page handler from Spring context bridge, localServiceCount={}.", m_localServices.size()); @@ -164,6 +170,23 @@ private void mergePlexusLocalServices() { } } + private void configureLogviewDependenciesFromPlexus() { + LocalModelService service = m_localServices.get("logview"); + + if (service instanceof LocalMessageService) { + try { + LocalMessageService localMessageService = (LocalMessageService) service; + + localMessageService.setFinderManager(lookup(MessageFinderManager.class)); + localMessageService.setBucketManager(lookup(BucketManager.class, "local")); + localMessageService.setMessageBucketManager(lookup(MessageBucketManager.class, LocalMessageBucketManager.ID)); + LOGGER.info("Configured Plexus message storage dependencies for Spring local logview service."); + } catch (RuntimeException e) { + LOGGER.warn("Unable to configure Plexus message storage dependencies for Spring local logview service.", e); + } + } + } + private void configureMessageConsumerFromPlexus() { try { MessageConsumer consumer = lookup(MessageConsumer.class); From 99c90dcb7151b7d51584a9c974f3d1f94eccc928 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 08:34:50 +0800 Subject: [PATCH 020/231] Register report bucket manager with Spring --- .../report/DefaultReportBucketManager.java | 31 ++++++- .../cat/report/LocalReportBucket.java | 17 +++- .../cat/report/ReportBucketFactory.java | 9 ++ .../spring/CatHomeSpringConfiguration.java | 82 ++++++++++++++++--- 4 files changed, 125 insertions(+), 14 deletions(-) create mode 100644 cat-core/src/main/java/com/dianping/cat/report/ReportBucketFactory.java diff --git a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportBucketManager.java b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportBucketManager.java index cd84e90667..beade8a1a4 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportBucketManager.java +++ b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportBucketManager.java @@ -29,6 +29,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.helper.Scanners; import org.unidal.helper.Scanners.FileMatcher; import org.unidal.lookup.ContainerHolder; @@ -43,12 +45,17 @@ @Named(type = ReportBucketManager.class) public class DefaultReportBucketManager extends ContainerHolder implements ReportBucketManager, Initializable { + private static final Logger LOGGER = LoggerFactory.getLogger(DefaultReportBucketManager.class); @Inject private ServerConfigManager m_configManager; + private ReportBucketFactory m_bucketFactory; + private File m_reportBaseDir; + private boolean m_plexusFallbackLogged; + @Override public void clearOldReports() { refreshSpringBeans(); @@ -107,9 +114,19 @@ public void closeBucket(ReportBucket bucket) { @Override public ReportBucket getReportBucket(long timestamp, String name, int index) throws IOException { Date date = new Date(timestamp); - ReportBucket bucket = lookup(ReportBucket.class); + ReportBucket bucket = null; + + if (m_bucketFactory != null) { + bucket = m_bucketFactory.createReportBucket(name, date, index); + } else { + bucket = lookup(ReportBucket.class); + bucket.initialize(name, date, index); - bucket.initialize(name, date, index); + if (!m_plexusFallbackLogged) { + LOGGER.info("Created report bucket from Plexus fallback, subsequent fallback bucket creations will be silent."); + m_plexusFallbackLogged = true; + } + } return bucket; } @@ -117,6 +134,8 @@ public ReportBucket getReportBucket(long timestamp, String name, int index) thro public void initialize() throws InitializationException { refreshSpringBeans(); m_reportBaseDir = new File(Cat.getCatHome(), "bucket/report"); + LOGGER.info("Initialized report bucket manager, baseDir={}, springBucketFactoryConfigured={}.", + m_reportBaseDir.getAbsolutePath(), m_bucketFactory != null); } private Set queryValidPath(int day) { @@ -166,4 +185,12 @@ private void refreshSpringBeans() { } } + public void setBucketFactory(ReportBucketFactory bucketFactory) { + m_bucketFactory = bucketFactory; + } + + public void setConfigManager(ServerConfigManager configManager) { + m_configManager = configManager; + } + } diff --git a/cat-core/src/main/java/com/dianping/cat/report/LocalReportBucket.java b/cat-core/src/main/java/com/dianping/cat/report/LocalReportBucket.java index b022b7efb6..65e3618bfd 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/LocalReportBucket.java +++ b/cat-core/src/main/java/com/dianping/cat/report/LocalReportBucket.java @@ -35,6 +35,7 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; +import org.slf4j.LoggerFactory; import org.unidal.helper.Splitters; import org.unidal.helper.Splitters.StringSplitter; import org.unidal.lookup.annotation.Inject; @@ -46,6 +47,8 @@ @Named(type = ReportBucket.class, instantiationStrategy = Named.PER_LOOKUP) public class LocalReportBucket implements ReportBucket, LogEnabled { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(LocalReportBucket.class); + @Inject private PathBuilder m_pathBuilder; @@ -113,7 +116,11 @@ public String findById(String id) throws IOException { return new String(bytes, "utf-8"); } catch (Exception e) { - m_logger.error(String.format("Error when reading file(%s)!", m_readDataFile), e); + if (m_logger != null) { + m_logger.error(String.format("Error when reading file(%s)!", m_readDataFile), e); + } else { + SLF4J_LOGGER.error("Error when reading report bucket file, file={}.", m_readDataFile, e); + } } finally { m_readLock.unlock(); } @@ -147,6 +154,14 @@ public String getLogicalPath() { return m_logicalPath; } + public void setConfigManager(ServerConfigManager configManager) { + m_configManager = configManager; + } + + public void setPathBuilder(PathBuilder pathBuilder) { + m_pathBuilder = pathBuilder; + } + @Override public void initialize(String name, Date timestamp, int index) throws IOException { m_baseDir = new File(Cat.getCatHome(), "bucket/report"); diff --git a/cat-core/src/main/java/com/dianping/cat/report/ReportBucketFactory.java b/cat-core/src/main/java/com/dianping/cat/report/ReportBucketFactory.java new file mode 100644 index 0000000000..1a244fc6a8 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/report/ReportBucketFactory.java @@ -0,0 +1,9 @@ +package com.dianping.cat.report; + +import java.io.IOException; +import java.util.Date; + +public interface ReportBucketFactory { + + public ReportBucket createReportBucket(String name, Date timestamp, int index) throws IOException; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index f623451e3f..9c1d38898c 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -85,6 +85,9 @@ import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; import com.dianping.cat.core.report.daily.repository.DailyReportRepository; +import com.dianping.cat.message.DefaultPathBuilder; +import com.dianping.cat.message.PathBuilder; +import com.dianping.cat.report.DefaultReportBucketManager; import com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager; import com.dianping.cat.report.alert.config.BaseRuleHelper; import com.dianping.cat.report.alert.business.BusinessContactor; @@ -143,6 +146,10 @@ import com.dianping.cat.report.page.state.service.LocalStateService; import com.dianping.cat.report.page.top.service.LocalTopService; import com.dianping.cat.report.page.transaction.service.LocalTransactionService; +import com.dianping.cat.report.LocalReportBucket; +import com.dianping.cat.report.ReportBucket; +import com.dianping.cat.report.ReportBucketFactory; +import com.dianping.cat.report.ReportBucketManager; import com.dianping.cat.service.ProjectService; import com.dianping.cat.statistic.ServerStatisticManager; import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; @@ -212,6 +219,37 @@ public ServerConfigManager serverConfigManager(ConfigRepository configRepository return manager; } + @Bean + public PathBuilder pathBuilder() { + return new DefaultPathBuilder(); + } + + @Bean + public ReportBucketFactory reportBucketFactory(PathBuilder pathBuilder, ServerConfigManager serverConfigManager) { + return new ReportBucketFactory() { + @Override + public ReportBucket createReportBucket(String name, java.util.Date timestamp, int index) + throws java.io.IOException { + LocalReportBucket bucket = new LocalReportBucket(); + + bucket.setPathBuilder(pathBuilder); + bucket.setConfigManager(serverConfigManager); + bucket.initialize(name, timestamp, index); + return bucket; + } + }; + } + + @Bean(initMethod = "initialize") + public ReportBucketManager reportBucketManager(ServerConfigManager serverConfigManager, + ReportBucketFactory reportBucketFactory) { + DefaultReportBucketManager manager = new DefaultReportBucketManager(); + + manager.setConfigManager(serverConfigManager); + manager.setBucketFactory(reportBucketFactory); + return manager; + } + @Bean(initMethod = "initialize") public ServerFilterConfigManager serverFilterConfigManager(ConfigRepository configRepository, ContentFetcher contentFetcher) { @@ -426,90 +464,112 @@ public ModelService problemModelService( } @Bean(initMethod = "initialize") - public LocalModelService localProblemService(ServerConfigManager serverConfigManager) { + public LocalModelService localProblemService(ServerConfigManager serverConfigManager, + ReportBucketManager reportBucketManager) { LocalProblemService service = new LocalProblemService(); service.setConfigManager(serverConfigManager); + service.setBucketManager(reportBucketManager); return service; } @Bean(initMethod = "initialize") - public LocalModelService localEventService(ServerConfigManager serverConfigManager) { + public LocalModelService localEventService(ServerConfigManager serverConfigManager, + ReportBucketManager reportBucketManager) { LocalEventService service = new LocalEventService(); service.setConfigManager(serverConfigManager); + service.setBucketManager(reportBucketManager); return service; } @Bean(initMethod = "initialize") - public LocalModelService localTransactionService(ServerConfigManager serverConfigManager) { + public LocalModelService localTransactionService(ServerConfigManager serverConfigManager, + ReportBucketManager reportBucketManager) { LocalTransactionService service = new LocalTransactionService(); service.setConfigManager(serverConfigManager); + service.setBucketManager(reportBucketManager); return service; } @Bean(initMethod = "initialize") - public LocalModelService localHeartbeatService(ServerConfigManager serverConfigManager) { + public LocalModelService localHeartbeatService(ServerConfigManager serverConfigManager, + ReportBucketManager reportBucketManager) { LocalHeartbeatService service = new LocalHeartbeatService(); service.setConfigManager(serverConfigManager); + service.setBucketManager(reportBucketManager); return service; } @Bean(initMethod = "initialize") - public LocalModelService localCrossService(ServerConfigManager serverConfigManager) { + public LocalModelService localCrossService(ServerConfigManager serverConfigManager, + ReportBucketManager reportBucketManager) { LocalCrossService service = new LocalCrossService(); service.setConfigManager(serverConfigManager); + service.setBucketManager(reportBucketManager); return service; } @Bean(initMethod = "initialize") - public LocalModelService localMatrixService(ServerConfigManager serverConfigManager) { + public LocalModelService localMatrixService(ServerConfigManager serverConfigManager, + ReportBucketManager reportBucketManager) { LocalMatrixService service = new LocalMatrixService(); service.setConfigManager(serverConfigManager); + service.setBucketManager(reportBucketManager); return service; } @Bean(initMethod = "initialize") - public LocalModelService localDependencyService(ServerConfigManager serverConfigManager) { + public LocalModelService localDependencyService(ServerConfigManager serverConfigManager, + ReportBucketManager reportBucketManager) { LocalDependencyService service = new LocalDependencyService(); service.setConfigManager(serverConfigManager); + service.setBucketManager(reportBucketManager); return service; } @Bean(initMethod = "initialize") - public LocalModelService localTopService(ServerConfigManager serverConfigManager) { + public LocalModelService localTopService(ServerConfigManager serverConfigManager, + ReportBucketManager reportBucketManager) { LocalTopService service = new LocalTopService(); service.setConfigManager(serverConfigManager); + service.setBucketManager(reportBucketManager); return service; } @Bean(initMethod = "initialize") - public LocalModelService localStateService(ServerConfigManager serverConfigManager) { + public LocalModelService localStateService(ServerConfigManager serverConfigManager, + ReportBucketManager reportBucketManager) { LocalStateService service = new LocalStateService(); service.setConfigManager(serverConfigManager); + service.setBucketManager(reportBucketManager); return service; } @Bean(initMethod = "initialize") - public LocalModelService localStorageService(ServerConfigManager serverConfigManager) { + public LocalModelService localStorageService(ServerConfigManager serverConfigManager, + ReportBucketManager reportBucketManager) { LocalStorageService service = new LocalStorageService(); service.setConfigManager(serverConfigManager); + service.setBucketManager(reportBucketManager); return service; } @Bean(initMethod = "initialize") - public LocalModelService localBusinessService(ServerConfigManager serverConfigManager) { + public LocalModelService localBusinessService(ServerConfigManager serverConfigManager, + ReportBucketManager reportBucketManager) { LocalBusinessService service = new LocalBusinessService(); service.setConfigManager(serverConfigManager); + service.setBucketManager(reportBucketManager); return service; } From 386047ef82e612320a9aea968eea6b55ba209b67 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 08:40:04 +0800 Subject: [PATCH 021/231] Bridge alarm manager through Spring --- .../java/com/dianping/cat/CatHomeModule.java | 6 +- .../spring/CatHomeSpringConfiguration.java | 6 ++ .../cat/report/alert/AlarmManager.java | 66 +++++++++++++++++-- 3 files changed, 72 insertions(+), 6 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java index 95bee9f043..17c31d8817 100644 --- a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java +++ b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java @@ -57,7 +57,11 @@ protected void execute(ModuleContext ctx) throws Exception { Threads.forGroup("Cat").start(taskConsumer); } - AlarmManager alarmManager = ctx.lookup(AlarmManager.class); + AlarmManager alarmManager = CatSpringContext.getBeanIfAvailable(AlarmManager.class); + + if (alarmManager == null) { + alarmManager = ctx.lookup(AlarmManager.class); + } if (serverConfigManager.isAlertMachine()) { alarmManager.startAlarm(); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 9c1d38898c..69650588f4 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -112,6 +112,7 @@ import com.dianping.cat.report.alert.transaction.TransactionContactor; import com.dianping.cat.report.alert.transaction.TransactionDecorator; import com.dianping.cat.report.alert.transaction.TransactionRuleConfigManager; +import com.dianping.cat.report.alert.AlarmManager; import com.dianping.cat.report.DomainValidator; import com.dianping.cat.report.page.DomainGroupConfigManager; import com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager; @@ -435,6 +436,11 @@ public AlertSummaryService alertSummaryService() { return new AlertSummaryService(); } + @Bean + public AlarmManager alarmManager() { + return new AlarmManager(); + } + @Bean public ProblemReportService problemReportService() { return new ProblemReportService(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/AlarmManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/AlarmManager.java index 5ff92cd938..8dc2fea61d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/AlarmManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/AlarmManager.java @@ -18,7 +18,10 @@ */ package com.dianping.cat.report.alert; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.helper.Threads; +import org.unidal.helper.Threads.Task; import org.unidal.lookup.ContainerHolder; import org.unidal.lookup.annotation.Named; @@ -27,21 +30,74 @@ import com.dianping.cat.report.alert.exception.ExceptionAlert; import com.dianping.cat.report.alert.heartbeat.HeartbeatAlert; import com.dianping.cat.report.alert.transaction.TransactionAlert; +import com.dianping.cat.spring.CatSpringContext; @Named public class AlarmManager extends ContainerHolder { + private static final Logger LOGGER = LoggerFactory.getLogger(AlarmManager.class); + + private BusinessAlert m_businessAlert; + + private EventAlert m_eventAlert; + + private ExceptionAlert m_exceptionAlert; + + private HeartbeatAlert m_heartbeatAlert; + + private TransactionAlert m_transactionAlert; public void startAlarm() { - BusinessAlert businessAlert = lookup(BusinessAlert.class); - ExceptionAlert exceptionAlert = lookup(ExceptionAlert.class); - HeartbeatAlert heartbeatAlert = lookup(HeartbeatAlert.class); - TransactionAlert transactionAlert = lookup(TransactionAlert.class); - EventAlert eventAlert = lookup(EventAlert.class); + BusinessAlert businessAlert = getAlert(BusinessAlert.class, m_businessAlert); + ExceptionAlert exceptionAlert = getAlert(ExceptionAlert.class, m_exceptionAlert); + HeartbeatAlert heartbeatAlert = getAlert(HeartbeatAlert.class, m_heartbeatAlert); + TransactionAlert transactionAlert = getAlert(TransactionAlert.class, m_transactionAlert); + EventAlert eventAlert = getAlert(EventAlert.class, m_eventAlert); Threads.forGroup("cat").start(businessAlert); Threads.forGroup("cat").start(exceptionAlert); Threads.forGroup("cat").start(heartbeatAlert); Threads.forGroup("cat").start(transactionAlert); Threads.forGroup("cat").start(eventAlert); + LOGGER.info("Started alert tasks, springConfigured={}, alerts=[business,exception,heartbeat,transaction,event].", + isSpringConfigured()); + } + + private T getAlert(Class type, T configuredAlert) { + if (configuredAlert != null) { + return configuredAlert; + } + T springAlert = CatSpringContext.getBeanIfAvailable(type); + + if (springAlert != null) { + LOGGER.info("Resolved alert task from Spring context, alertType={}.", type.getName()); + return springAlert; + } + LOGGER.info("Resolved alert task from Plexus fallback, alertType={}.", type.getName()); + return lookup(type); + } + + private boolean isSpringConfigured() { + return m_businessAlert != null || m_exceptionAlert != null || m_heartbeatAlert != null + || m_transactionAlert != null || m_eventAlert != null; + } + + public void setBusinessAlert(BusinessAlert businessAlert) { + m_businessAlert = businessAlert; + } + + public void setEventAlert(EventAlert eventAlert) { + m_eventAlert = eventAlert; + } + + public void setExceptionAlert(ExceptionAlert exceptionAlert) { + m_exceptionAlert = exceptionAlert; + } + + public void setHeartbeatAlert(HeartbeatAlert heartbeatAlert) { + m_heartbeatAlert = heartbeatAlert; + } + + public void setTransactionAlert(TransactionAlert transactionAlert) { + m_transactionAlert = transactionAlert; } } From 2846cd63a80f4075766253f0a687cc4de1c2e468 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 08:44:47 +0800 Subject: [PATCH 022/231] Bridge message handler consumer lookup through Spring --- .../cat/analysis/DefaultMessageHandler.java | 57 ++++++++++++------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageHandler.java b/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageHandler.java index 76beab3d86..3c966f9a09 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageHandler.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageHandler.java @@ -20,16 +20,20 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.ContainerHolder; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; -import com.dianping.cat.message.spi.MessageTree; - -@Named(type = MessageHandler.class) -public class DefaultMessageHandler extends ContainerHolder implements MessageHandler, LogEnabled { - @Inject - private MessageConsumer m_consumer; +import com.dianping.cat.message.spi.MessageTree; +import com.dianping.cat.spring.CatSpringContext; + +@Named(type = MessageHandler.class) +public class DefaultMessageHandler extends ContainerHolder implements MessageHandler, LogEnabled { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(DefaultMessageHandler.class); + + @Inject + private MessageConsumer m_consumer; private Logger m_logger; @@ -38,16 +42,31 @@ public void enableLogging(Logger logger) { m_logger = logger; } - @Override - public void handle(MessageTree tree) { - if (m_consumer == null) { - m_consumer = lookup(MessageConsumer.class); - } - - try { - m_consumer.consume(tree); - } catch (Throwable e) { - m_logger.error("Error when consuming message in " + m_consumer + "! tree: " + tree, e); - } - } -} + @Override + public void handle(MessageTree tree) { + if (m_consumer == null) { + m_consumer = CatSpringContext.getBeanIfAvailable(MessageConsumer.class); + + if (m_consumer == null) { + m_consumer = lookup(MessageConsumer.class); + SLF4J_LOGGER.info("Resolved message consumer from Plexus fallback, consumer={}.", m_consumer); + } else { + SLF4J_LOGGER.info("Resolved message consumer from Spring context, consumer={}.", m_consumer); + } + } + + try { + m_consumer.consume(tree); + } catch (Throwable e) { + if (m_logger != null) { + m_logger.error("Error when consuming message in " + m_consumer + "! tree: " + tree, e); + } else { + SLF4J_LOGGER.error("Error when consuming message, consumer={}, tree={}.", m_consumer, tree, e); + } + } + } + + public void setConsumer(MessageConsumer consumer) { + m_consumer = consumer; + } +} From 37b9d90c61b4b9e395b8ec52aa1d066ca49c1fa0 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 08:55:12 +0800 Subject: [PATCH 023/231] Resolve report model services from Spring --- .../dianping/cat/mvc/AbstractReportModel.java | 25 ++++++++++++------- .../dianping/cat/service/HostinfoService.java | 8 ++++++ .../spring/CatHomeSpringConfiguration.java | 11 ++++++++ 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportModel.java b/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportModel.java index c81837162f..c1dfe0ed4f 100755 --- a/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportModel.java +++ b/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportModel.java @@ -27,6 +27,8 @@ import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.ContainerLoader; import org.unidal.web.mvc.Action; import org.unidal.web.mvc.ActionContext; @@ -44,6 +46,7 @@ public abstract class AbstractReportModel
> extends ViewModel { + private static final Logger LOGGER = LoggerFactory.getLogger(AbstractReportModel.class); private transient Date m_creatTime; @@ -72,20 +75,24 @@ public abstract class AbstractReportModel T resolveService(Class type) throws Exception { + T service = CatSpringContext.getBeanIfAvailable(type); + + if (service != null) { + return service; + } + return ContainerLoader.getDefaultContainer().lookup(type); + } + public double getSample() { Domain domain = m_sampleConfigManager.getConfig().findDomain(getDomain()); diff --git a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java index 918a5ef7bd..73e21a2c74 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java @@ -253,6 +253,14 @@ public boolean updateHostinfo(Hostinfo hostinfo) { } } + public void setHostinfoDao(HostinfoRepository hostinfoDao) { + m_hostinfoDao = hostinfoDao; + } + + public void setServerConfigManager(ServerConfigManager manager) { + m_manager = manager; + } + private boolean validateIp(String str) { Pattern pattern = Pattern.compile( "^((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])$"); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 69650588f4..ba15b19478 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -152,6 +152,7 @@ import com.dianping.cat.report.ReportBucketFactory; import com.dianping.cat.report.ReportBucketManager; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.service.HostinfoService; import com.dianping.cat.statistic.ServerStatisticManager; import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; import com.dianping.cat.system.page.config.ConfigHtmlParser; @@ -1129,6 +1130,16 @@ public ProjectService projectService(ProjectRepository projectRepository, Server return service; } + @Bean + public HostinfoService hostinfoService(HostinfoRepository hostinfoRepository, + ServerConfigManager serverConfigManager) { + HostinfoService service = new HostinfoService(); + + service.setHostinfoDao(hostinfoRepository); + service.setServerConfigManager(serverConfigManager); + return service; + } + @Bean(initMethod = "initialize") public BusinessConfigManager businessConfigManager(BusinessConfigRepository businessConfigRepository, ServerConfigManager serverConfigManager) { From e51972b4a4b7e1b9c7805e6645c2fe29867e2dd9 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 09:02:41 +0800 Subject: [PATCH 024/231] Bridge permission filter dependencies through Spring --- .../spring/CatHomeSpringConfiguration.java | 22 +++++++++++++ .../page/login/service/TokenManager.java | 20 +++++++---- .../page/permission/PermissionFilter.java | 33 ++++++++++++++++--- 3 files changed, 64 insertions(+), 11 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index ba15b19478..17ff2c5cd3 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -156,6 +156,9 @@ import com.dianping.cat.statistic.ServerStatisticManager; import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; import com.dianping.cat.system.page.config.ConfigHtmlParser; +import com.dianping.cat.system.page.login.service.CookieManager; +import com.dianping.cat.system.page.login.service.TokenBuilder; +import com.dianping.cat.system.page.login.service.TokenManager; import com.dianping.cat.system.page.permission.ResourceConfigManager; import com.dianping.cat.system.page.permission.UserConfigManager; import com.dianping.cat.system.page.router.config.RouterConfigManager; @@ -1121,6 +1124,25 @@ public ResourceConfigManager resourceConfigManager(ConfigRepository configReposi return manager; } + @Bean + public CookieManager cookieManager() { + return new CookieManager(); + } + + @Bean + public TokenBuilder tokenBuilder() { + return new TokenBuilder(); + } + + @Bean + public TokenManager tokenManager(CookieManager cookieManager, TokenBuilder tokenBuilder) { + TokenManager manager = new TokenManager(); + + manager.setCookieManager(cookieManager); + manager.setTokenBuilder(tokenBuilder); + return manager; + } + @Bean(initMethod = "initialize") public ProjectService projectService(ProjectRepository projectRepository, ServerConfigManager serverConfigManager) { ProjectService service = new ProjectService(); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/login/service/TokenManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/login/service/TokenManager.java index e168c8acf5..2296149fdf 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/login/service/TokenManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/login/service/TokenManager.java @@ -26,12 +26,20 @@ public class TokenManager implements ITokenManager { @Inject private CookieManager m_cookieManager; - @Inject - private TokenBuilder m_tokenBuilder; - - @Override - public Token getToken(SigninContext ctx, String name) { - String value = m_cookieManager.getCookie(ctx, name); + @Inject + private TokenBuilder m_tokenBuilder; + + public void setCookieManager(CookieManager cookieManager) { + m_cookieManager = cookieManager; + } + + public void setTokenBuilder(TokenBuilder tokenBuilder) { + m_tokenBuilder = tokenBuilder; + } + + @Override + public Token getToken(SigninContext ctx, String name) { + String value = m_cookieManager.getCookie(ctx, name); if (value != null) { return m_tokenBuilder.parse(ctx, value); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/PermissionFilter.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/PermissionFilter.java index 3dfbd70950..f455fe1b25 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/PermissionFilter.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/PermissionFilter.java @@ -29,6 +29,8 @@ import java.io.IOException; import org.codehaus.plexus.PlexusContainer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.initialization.DefaultModuleContext; import org.unidal.initialization.ModuleContext; import org.unidal.lookup.ContainerLoader; @@ -40,6 +42,8 @@ public class PermissionFilter implements Filter { + private static final Logger LOGGER = LoggerFactory.getLogger(PermissionFilter.class); + private static final String LOG_IN_URL = "/cat/s/login"; private static final String LOGIN = "login"; @@ -60,12 +64,27 @@ public class PermissionFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { - PlexusContainer container = ContainerLoader.getDefaultContainer(); - ModuleContext ctx = new DefaultModuleContext(container); - m_userConfigManager = ctx.lookup(UserConfigManager.class); - m_resourceConfigManager = ctx.lookup(ResourceConfigManager.class); refreshSpringBeans(); - m_tokenManager = ctx.lookup(TokenManager.class); + + if (m_userConfigManager == null || m_resourceConfigManager == null || m_tokenManager == null) { + LOGGER.info("PermissionFilter dependencies are incomplete in Spring, falling back to Plexus. userConfig={}, resourceConfig={}, tokenManager={}", + m_userConfigManager != null, m_resourceConfigManager != null, m_tokenManager != null); + PlexusContainer container = ContainerLoader.getDefaultContainer(); + ModuleContext ctx = new DefaultModuleContext(container); + + if (m_userConfigManager == null) { + m_userConfigManager = ctx.lookup(UserConfigManager.class); + } + if (m_resourceConfigManager == null) { + m_resourceConfigManager = ctx.lookup(ResourceConfigManager.class); + } + if (m_tokenManager == null) { + m_tokenManager = ctx.lookup(TokenManager.class); + } + } else { + LOGGER.info("PermissionFilter dependencies resolved from Spring."); + } + m_errorPage = filterConfig.getInitParameter("errorPage"); m_loginPage = filterConfig.getInitParameter(LOGIN); } @@ -120,6 +139,7 @@ public void destroy() { private void refreshSpringBeans() { UserConfigManager userConfigManager = CatSpringContext.getBeanIfAvailable(UserConfigManager.class); ResourceConfigManager resourceConfigManager = CatSpringContext.getBeanIfAvailable(ResourceConfigManager.class); + TokenManager tokenManager = CatSpringContext.getBeanIfAvailable(TokenManager.class); if (userConfigManager != null) { m_userConfigManager = userConfigManager; @@ -127,6 +147,9 @@ private void refreshSpringBeans() { if (resourceConfigManager != null) { m_resourceConfigManager = resourceConfigManager; } + if (tokenManager != null) { + m_tokenManager = tokenManager; + } } } From 38832cde865b4dbfe2f8b12881751636197f3570 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 09:09:01 +0800 Subject: [PATCH 025/231] Prefer Spring maps for report task registries --- .../dianping/cat/spring/CatSpringContext.java | 16 ++++++++++++ .../cat/report/task/ReportFacade.java | 25 ++++++++++++------- .../report/task/reload/ReportReloadTask.java | 12 ++++++--- 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java b/cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java index 4f757829e2..c938185ebe 100644 --- a/cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java +++ b/cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java @@ -1,5 +1,8 @@ package com.dianping.cat.spring; +import java.util.Collections; +import java.util.Map; + import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; @@ -41,6 +44,19 @@ public static T getBeanIfAvailable(String name, Class type) { } } + public static Map getBeansIfAvailable(Class type) { + ApplicationContext context = s_context; + + if (context == null) { + return Collections.emptyMap(); + } + try { + return context.getBeansOfType(type); + } catch (BeansException e) { + return Collections.emptyMap(); + } + } + public static void setContext(ApplicationContext context) { s_context = context; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java b/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java index 1fdb992d23..34d373e6c9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java @@ -29,10 +29,11 @@ import org.slf4j.LoggerFactory; import org.unidal.lookup.ContainerHolder; import org.unidal.lookup.annotation.Named; - -import com.dianping.cat.Cat; -import com.dianping.cat.core.dal.Task; -import com.dianping.cat.task.TaskManager; + +import com.dianping.cat.Cat; +import com.dianping.cat.core.dal.Task; +import com.dianping.cat.spring.CatSpringContext; +import com.dianping.cat.task.TaskManager; @Named public class ReportFacade extends ContainerHolder implements LogEnabled, Initializable { @@ -101,9 +102,15 @@ private TaskBuilder getReportBuilder(String reportName) { @Override public void initialize() throws InitializationException { - m_reportBuilders = lookupMap(TaskBuilder.class); - SLF4J_LOGGER.info("Initialized report facade, builderCount={}, builders={}.", m_reportBuilders.size(), - m_reportBuilders.keySet()); + m_reportBuilders = CatSpringContext.getBeansIfAvailable(TaskBuilder.class); + if (m_reportBuilders.isEmpty()) { + m_reportBuilders = lookupMap(TaskBuilder.class); + SLF4J_LOGGER.info("Initialized report facade from Plexus, builderCount={}, builders={}.", + m_reportBuilders.size(), m_reportBuilders.keySet()); + } else { + SLF4J_LOGGER.info("Initialized report facade from Spring, builderCount={}, builders={}.", + m_reportBuilders.size(), m_reportBuilders.keySet()); + } } - -} + +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java index 818b32030c..bbb0804436 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java @@ -60,9 +60,15 @@ public void initialize() throws InitializationException { if (configManager != null) { m_configManager = configManager; } - m_reloaders = lookupMap(ReportReloader.class); - LOGGER.info("Initialized report reload task, reloaderCount={}, reloaders={}.", m_reloaders.size(), - m_reloaders.keySet()); + m_reloaders = CatSpringContext.getBeansIfAvailable(ReportReloader.class); + if (m_reloaders.isEmpty()) { + m_reloaders = lookupMap(ReportReloader.class); + LOGGER.info("Initialized report reload task from Plexus, reloaderCount={}, reloaders={}.", m_reloaders.size(), + m_reloaders.keySet()); + } else { + LOGGER.info("Initialized report reload task from Spring, reloaderCount={}, reloaders={}.", m_reloaders.size(), + m_reloaders.keySet()); + } } @Override From e4eca005a845e5840b9e238df626a16981530105 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 09:13:51 +0800 Subject: [PATCH 026/231] Prefer Spring lookups in CatHomeModule --- .../java/com/dianping/cat/CatHomeModule.java | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java index 17c31d8817..38c0bbddb4 100644 --- a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java +++ b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java @@ -23,6 +23,8 @@ import org.unidal.initialization.Module; import org.unidal.initialization.ModuleContext; import org.unidal.lookup.annotation.Named; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.dianping.cat.analysis.MessageConsumer; import com.dianping.cat.analysis.TcpSocketReceiver; @@ -36,6 +38,8 @@ @Named(type = Module.class, value = CatHomeModule.ID) public class CatHomeModule extends AbstractModule { + private static final Logger LOGGER = LoggerFactory.getLogger(CatHomeModule.class); + public static final String ID = "cat-home"; @Override @@ -44,15 +48,18 @@ protected void execute(ModuleContext ctx) throws Exception { if (serverConfigManager == null) { serverConfigManager = ctx.lookup(ServerConfigManager.class); + LOGGER.info("Resolved ServerConfigManager from Plexus for CatHomeModule."); + } else { + LOGGER.info("Resolved ServerConfigManager from Spring for CatHomeModule."); } - ReportReloadTask reportReloadTask = ctx.lookup(ReportReloadTask.class); + ReportReloadTask reportReloadTask = lookup(ctx, ReportReloadTask.class); Threads.forGroup("Cat").start(reportReloadTask); - ctx.lookup(MessageConsumer.class); + lookup(ctx, MessageConsumer.class); if (serverConfigManager.isJobMachine()) { - DefaultTaskConsumer taskConsumer = ctx.lookup(DefaultTaskConsumer.class); + DefaultTaskConsumer taskConsumer = lookup(ctx, DefaultTaskConsumer.class); Threads.forGroup("Cat").start(taskConsumer); } @@ -61,13 +68,16 @@ protected void execute(ModuleContext ctx) throws Exception { if (alarmManager == null) { alarmManager = ctx.lookup(AlarmManager.class); + LOGGER.info("Resolved AlarmManager from Plexus for CatHomeModule."); + } else { + LOGGER.info("Resolved AlarmManager from Spring for CatHomeModule."); } if (serverConfigManager.isAlertMachine()) { alarmManager.startAlarm(); } - final MessageConsumer consumer = ctx.lookup(MessageConsumer.class); + final MessageConsumer consumer = lookup(ctx, MessageConsumer.class); Runtime.getRuntime().addShutdownHook(new Thread() { @Override @@ -84,7 +94,7 @@ public Module[] getDependencies(ModuleContext ctx) { @Override protected void setup(ModuleContext ctx) throws Exception { - final TcpSocketReceiver messageReceiver = ctx.lookup(TcpSocketReceiver.class); + final TcpSocketReceiver messageReceiver = lookup(ctx, TcpSocketReceiver.class); messageReceiver.init(); @@ -96,4 +106,18 @@ public void run() { } }); } + + private T lookup(ModuleContext ctx, Class type) { + T bean = CatSpringContext.getBeanIfAvailable(type); + + if (bean != null) { + LOGGER.info("Resolved {} from Spring for CatHomeModule.", type.getSimpleName()); + return bean; + } + + T component = ctx.lookup(type); + + LOGGER.info("Resolved {} from Plexus for CatHomeModule.", type.getSimpleName()); + return component; + } } From 7b5fb5ef0460d86731a7bb06dde1abae043e517a Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 09:20:07 +0800 Subject: [PATCH 027/231] Prefer Spring lookups in model page handler --- .../cat/report/page/model/Handler.java | 48 +++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java index 696b850a73..793ea58b11 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java @@ -176,20 +176,24 @@ private void configureLogviewDependenciesFromPlexus() { if (service instanceof LocalMessageService) { try { LocalMessageService localMessageService = (LocalMessageService) service; - - localMessageService.setFinderManager(lookup(MessageFinderManager.class)); - localMessageService.setBucketManager(lookup(BucketManager.class, "local")); - localMessageService.setMessageBucketManager(lookup(MessageBucketManager.class, LocalMessageBucketManager.ID)); - LOGGER.info("Configured Plexus message storage dependencies for Spring local logview service."); + MessageFinderManager finderManager = lookupSpringOrPlexus(MessageFinderManager.class); + BucketManager bucketManager = lookupSpringOrPlexus("local", BucketManager.class); + MessageBucketManager messageBucketManager = lookupSpringOrPlexus(LocalMessageBucketManager.ID, + MessageBucketManager.class); + + localMessageService.setFinderManager(finderManager); + localMessageService.setBucketManager(bucketManager); + localMessageService.setMessageBucketManager(messageBucketManager); + LOGGER.info("Configured message storage dependencies for Spring local logview service."); } catch (RuntimeException e) { - LOGGER.warn("Unable to configure Plexus message storage dependencies for Spring local logview service.", e); + LOGGER.warn("Unable to configure message storage dependencies for Spring local logview service.", e); } } } private void configureMessageConsumerFromPlexus() { try { - MessageConsumer consumer = lookup(MessageConsumer.class); + MessageConsumer consumer = lookupSpringOrPlexus(MessageConsumer.class); for (LocalModelService service : m_localServices.values()) { service.setConsumer(consumer); @@ -197,10 +201,38 @@ private void configureMessageConsumerFromPlexus() { LOGGER.info("Configured message consumer for Spring local model services, localServiceCount={}.", m_localServices.size()); } catch (RuntimeException e) { - LOGGER.warn("Unable to configure message consumer for Spring local model services from Plexus.", e); + LOGGER.warn("Unable to configure message consumer for Spring local model services.", e); } } + private T lookupSpringOrPlexus(Class type) { + T bean = CatSpringContext.getBeanIfAvailable(type); + + if (bean != null) { + LOGGER.info("Resolved {} from Spring for model page handler.", type.getSimpleName()); + return bean; + } + + T component = lookup(type); + + LOGGER.info("Resolved {} from Plexus for model page handler.", type.getSimpleName()); + return component; + } + + private T lookupSpringOrPlexus(String name, Class type) { + T bean = CatSpringContext.getBeanIfAvailable(name, type); + + if (bean != null) { + LOGGER.info("Resolved {}:{} from Spring for model page handler.", type.getSimpleName(), name); + return bean; + } + + T component = lookup(type, name); + + LOGGER.info("Resolved {}:{} from Plexus for model page handler.", type.getSimpleName(), name); + return component; + } + public void setLocalServices(Map localServices) { if (localServices == null || localServices.isEmpty()) { m_localServices = new HashMap(); From 39b53b23ae3dca85c17c216d5e7a504e88b87581 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 09:27:44 +0800 Subject: [PATCH 028/231] Avoid Plexus release for Spring report buckets --- .../cat/report/DefaultReportBucketManager.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportBucketManager.java b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportBucketManager.java index beade8a1a4..e2602a4b19 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportBucketManager.java +++ b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportBucketManager.java @@ -22,8 +22,10 @@ import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.HashSet; +import java.util.IdentityHashMap; import java.util.List; import java.util.Set; @@ -52,6 +54,9 @@ public class DefaultReportBucketManager extends ContainerHolder implements Repor private ReportBucketFactory m_bucketFactory; + private Set m_factoryBuckets = Collections.synchronizedSet( + Collections.newSetFromMap(new IdentityHashMap())); + private File m_reportBaseDir; private boolean m_plexusFallbackLogged; @@ -105,9 +110,15 @@ public void closeBucket(ReportBucket bucket) { try { bucket.close(); } catch (Exception e) { - // ignore it + LOGGER.warn("Unable to close report bucket, bucket={}.", bucket, e); } finally { - release(bucket); + if (m_factoryBuckets.remove(bucket)) { + LOGGER.debug("Closed Spring-created report bucket without Plexus release, bucket={}.", bucket); + } else if (getContainer() != null) { + release(bucket); + } else { + LOGGER.warn("Skip Plexus release for report bucket because container is unavailable, bucket={}.", bucket); + } } } @@ -118,6 +129,7 @@ public ReportBucket getReportBucket(long timestamp, String name, int index) thro if (m_bucketFactory != null) { bucket = m_bucketFactory.createReportBucket(name, date, index); + m_factoryBuckets.add(bucket); } else { bucket = lookup(ReportBucket.class); bucket.initialize(name, date, index); From 2837b776deb049920fe63a08640044197b339615 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 09:37:21 +0800 Subject: [PATCH 029/231] Register message finder manager with Spring --- .../cat/home/spring/CatHomeSpringConfiguration.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 17ff2c5cd3..69a9555cad 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -13,6 +13,8 @@ import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; +import org.unidal.cat.message.storage.MessageFinderManager; +import org.unidal.cat.message.storage.internals.DefaultMessageFinderManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.beans.factory.annotation.Qualifier; @@ -229,6 +231,11 @@ public PathBuilder pathBuilder() { return new DefaultPathBuilder(); } + @Bean + public MessageFinderManager messageFinderManager() { + return new DefaultMessageFinderManager(); + } + @Bean public ReportBucketFactory reportBucketFactory(PathBuilder pathBuilder, ServerConfigManager serverConfigManager) { return new ReportBucketFactory() { From fae32c5d76675dc5440399ffc265dfed37277215 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 09:43:55 +0800 Subject: [PATCH 030/231] Register local bucket manager with Spring --- .../cat/message/storage/BucketFactory.java | 8 +++ .../message/storage/local/LocalBucket.java | 12 ++++ .../storage/local/LocalBucketManager.java | 51 ++++++++++++++++- .../storage/local/LocalFileBuilder.java | 4 ++ .../spring/CatHomeSpringConfiguration.java | 57 +++++++++++++++++++ 5 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 cat-hadoop/src/main/java/org/unidal/cat/message/storage/BucketFactory.java diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/BucketFactory.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/BucketFactory.java new file mode 100644 index 0000000000..41dc0405ae --- /dev/null +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/BucketFactory.java @@ -0,0 +1,8 @@ +package org.unidal.cat.message.storage; + +import java.io.IOException; + +public interface BucketFactory { + + public Bucket createBucket(String domain, String ip, int hour, boolean writeMode) throws IOException; +} diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucket.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucket.java index fd60374b00..0d9e541560 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucket.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucket.java @@ -140,6 +140,18 @@ public synchronized void puts(ByteBuf data, Map mappings) th } } + public void setBufCache(ByteBufCache bufCache) { + m_bufCache = bufCache; + } + + public void setConfig(ServerConfigManager config) { + m_config = config; + } + + public void setPathBuilder(PathBuilder builder) { + m_builder = builder; + } + @Override public String toString() { return String.format("%s[%s]", getClass().getSimpleName(), m_data.getPath()); diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucketManager.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucketManager.java index badbe2f32d..fd82be3932 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucketManager.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucketManager.java @@ -21,7 +21,9 @@ import java.io.File; import java.io.IOException; import java.util.Date; +import java.util.Collections; import java.util.HashSet; +import java.util.IdentityHashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; @@ -30,25 +32,35 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; import org.unidal.cat.message.storage.Bucket; +import org.unidal.cat.message.storage.BucketFactory; import org.unidal.cat.message.storage.BucketManager; import org.unidal.cat.message.storage.FileType; import org.unidal.cat.message.storage.PathBuilder; import org.unidal.lookup.ContainerHolder; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; @Named(type = BucketManager.class, value = "local") public class LocalBucketManager extends ContainerHolder implements BucketManager, LogEnabled { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(LocalBucketManager.class); protected Logger m_logger; @Inject("local") private PathBuilder m_builder; + private BucketFactory m_bucketFactory; + + private Set m_factoryBuckets = Collections.synchronizedSet( + Collections.newSetFromMap(new IdentityHashMap())); + private Map> m_buckets = new LinkedHashMap>(); + private boolean m_plexusFallbackLogged; + private boolean bucketFilesExists(String domain, String ip, int hour) { long timestamp = hour * 3600 * 1000L; Date startTime = new Date(timestamp); @@ -80,7 +92,7 @@ public synchronized void closeBuckets(int hour) { } catch (Exception e) { Cat.logError(e); } finally { - super.release(bucket); + releaseBucket(bucket); } } } @@ -127,7 +139,7 @@ public Bucket getBucket(String domain, String ip, int hour, boolean createIfNotE bucket = map.get(domain); if (bucket == null) { - bucket = lookup(Bucket.class, "local"); + bucket = createBucket(domain, ip, hour, createIfNotExists); bucket.initialize(domain, ip, hour, createIfNotExists); map.put(domain, bucket); } @@ -138,4 +150,39 @@ public Bucket getBucket(String domain, String ip, int hour, boolean createIfNotE return bucket; } + private Bucket createBucket(String domain, String ip, int hour, boolean createIfNotExists) throws IOException { + if (m_bucketFactory != null) { + Bucket bucket = m_bucketFactory.createBucket(domain, ip, hour, createIfNotExists); + + m_factoryBuckets.add(bucket); + return bucket; + } + + Bucket bucket = lookup(Bucket.class, "local"); + + if (!m_plexusFallbackLogged) { + SLF4J_LOGGER.info("Created local message bucket from Plexus fallback, subsequent fallback bucket creations will be silent."); + m_plexusFallbackLogged = true; + } + return bucket; + } + + private void releaseBucket(Bucket bucket) { + if (m_factoryBuckets.remove(bucket)) { + SLF4J_LOGGER.debug("Closed Spring-created local message bucket without Plexus release, bucket={}.", bucket); + } else if (getContainer() != null) { + super.release(bucket); + } else { + SLF4J_LOGGER.warn("Skip Plexus release for local message bucket because container is unavailable, bucket={}.", bucket); + } + } + + public void setBucketFactory(BucketFactory bucketFactory) { + m_bucketFactory = bucketFactory; + } + + public void setPathBuilder(PathBuilder builder) { + m_builder = builder; + } + } diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalFileBuilder.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalFileBuilder.java index f5ff66959a..0ef51cc646 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalFileBuilder.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalFileBuilder.java @@ -52,4 +52,8 @@ public String getPath(String domain, Date startTime, String consumerId, FileType return baseDir + path; } + + public void setConfig(StorageConfiguration config) { + m_config = config; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 69a9555cad..a72fc5b3a7 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -13,8 +13,18 @@ import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; +import org.unidal.cat.message.storage.Bucket; +import org.unidal.cat.message.storage.BucketFactory; +import org.unidal.cat.message.storage.BucketManager; import org.unidal.cat.message.storage.MessageFinderManager; +import org.unidal.cat.message.storage.StorageConfiguration; +import org.unidal.cat.message.storage.internals.ByteBufCache; import org.unidal.cat.message.storage.internals.DefaultMessageFinderManager; +import org.unidal.cat.message.storage.internals.DefaultByteBufCache; +import org.unidal.cat.message.storage.internals.DefaultStorageConfiguration; +import org.unidal.cat.message.storage.local.LocalBucket; +import org.unidal.cat.message.storage.local.LocalBucketManager; +import org.unidal.cat.message.storage.local.LocalFileBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.beans.factory.annotation.Qualifier; @@ -236,6 +246,53 @@ public MessageFinderManager messageFinderManager() { return new DefaultMessageFinderManager(); } + @Bean(initMethod = "initialize") + public StorageConfiguration storageConfiguration() { + return new DefaultStorageConfiguration(); + } + + @Bean + public org.unidal.cat.message.storage.PathBuilder localMessagePathBuilder(StorageConfiguration storageConfiguration) { + LocalFileBuilder builder = new LocalFileBuilder(); + + builder.setConfig(storageConfiguration); + return builder; + } + + @Bean(initMethod = "initialize") + public ByteBufCache byteBufCache(Logger plexusConsoleLogger) { + DefaultByteBufCache cache = new DefaultByteBufCache(); + + cache.enableLogging(plexusConsoleLogger.getChildLogger(DefaultByteBufCache.class.getName())); + return cache; + } + + @Bean + public BucketFactory localMessageBucketFactory(org.unidal.cat.message.storage.PathBuilder localMessagePathBuilder, + ByteBufCache byteBufCache, ServerConfigManager serverConfigManager) { + return new BucketFactory() { + @Override + public Bucket createBucket(String domain, String ip, int hour, boolean writeMode) { + LocalBucket bucket = new LocalBucket(); + + bucket.setPathBuilder(localMessagePathBuilder); + bucket.setBufCache(byteBufCache); + bucket.setConfig(serverConfigManager); + return bucket; + } + }; + } + + @Bean("local") + public BucketManager localBucketManager(org.unidal.cat.message.storage.PathBuilder localMessagePathBuilder, + BucketFactory localMessageBucketFactory) { + LocalBucketManager manager = new LocalBucketManager(); + + manager.setPathBuilder(localMessagePathBuilder); + manager.setBucketFactory(localMessageBucketFactory); + return manager; + } + @Bean public ReportBucketFactory reportBucketFactory(PathBuilder pathBuilder, ServerConfigManager serverConfigManager) { return new ReportBucketFactory() { From 2e9dff2cf1ad2d96b76335c26aa0ddcc2c4f4c6a Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 09:54:09 +0800 Subject: [PATCH 031/231] Register local message bucket manager with Spring --- .../dump/LocalMessageBucketManager.java | 74 ++++++++++++++++--- .../message/storage/MessageBucketFactory.java | 9 +++ .../spring/CatHomeSpringConfiguration.java | 30 ++++++++ .../cat/report/page/model/Handler.java | 9 +++ 4 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 cat-core/src/main/java/com/dianping/cat/message/storage/MessageBucketFactory.java diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dump/LocalMessageBucketManager.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dump/LocalMessageBucketManager.java index 0d9248847d..612f2feb34 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/dump/LocalMessageBucketManager.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dump/LocalMessageBucketManager.java @@ -21,8 +21,10 @@ import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.HashSet; +import java.util.IdentityHashMap; import java.util.List; import java.util.Set; import java.util.concurrent.BlockingQueue; @@ -41,6 +43,7 @@ import org.unidal.helper.Threads.Task; import org.unidal.lookup.ContainerHolder; import org.unidal.lookup.annotation.Inject; +import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.CatConstants; @@ -55,6 +58,7 @@ import com.dianping.cat.message.storage.LocalMessageBucket; import com.dianping.cat.message.storage.MessageBlock; import com.dianping.cat.message.storage.MessageBucket; +import com.dianping.cat.message.storage.MessageBucketFactory; import com.dianping.cat.message.storage.MessageBucketManager; import com.dianping.cat.message.tree.MessageId; import com.dianping.cat.statistic.ServerStatisticManager; @@ -63,6 +67,7 @@ public class LocalMessageBucketManager extends ContainerHolder implements MessageBucketManager, Initializable, LogEnabled { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(LocalMessageBucketManager.class); public static final String ID = "local"; @@ -77,8 +82,13 @@ public class LocalMessageBucketManager extends ContainerHolder @Inject private PathBuilder m_pathBuilder; + private MessageBucketFactory m_bucketFactory; + private ConcurrentHashMap m_buckets = new ConcurrentHashMap(); + private Set m_factoryBuckets = Collections.synchronizedSet( + Collections.newSetFromMap(new IdentityHashMap())); + private File m_baseDir; private String m_localIp = NetworkInterfaceManager.INSTANCE.getLocalHostAddress(); @@ -97,6 +107,8 @@ public class LocalMessageBucketManager extends ContainerHolder private BlockingQueue m_last; + private boolean m_plexusFallbackLogged; + @Override public void archive(long startTime) { String path = m_pathBuilder.getLogviewPath(new Date(startTime), ""); @@ -226,9 +238,7 @@ public Direction matches(File base, String name) { if (file.exists()) { try { - bucket = (LocalMessageBucket) lookup(MessageBucket.class, LocalMessageBucket.ID); - bucket.setBaseDir(m_baseDir); - bucket.initialize(dataFile); + bucket = createBucket(dataFile); MessageTree tree = bucket.findById(messageId); @@ -239,8 +249,10 @@ public Direction matches(File base, String name) { } catch (Exception e) { Cat.logError(e); } finally { - bucket.close(); - release(bucket); + if (bucket != null) { + bucket.close(); + releaseBucket(bucket); + } } } } @@ -269,10 +281,26 @@ public void setBaseDir(File baseDir) { m_baseDir = baseDir; } + public void setBucketFactory(MessageBucketFactory bucketFactory) { + m_bucketFactory = bucketFactory; + } + + public void setConfigManager(ServerConfigManager configManager) { + m_configManager = configManager; + } + public void setLocalIp(String localIp) { m_localIp = localIp; } + public void setPathBuilder(PathBuilder pathBuilder) { + m_pathBuilder = pathBuilder; + } + + public void setServerStateManager(ServerStatisticManager serverStateManager) { + m_serverStateManager = serverStateManager; + } + private boolean shouldUpload(String path) { long current = System.currentTimeMillis(); long currentHour = current - current % TimeHelper.ONE_HOUR; @@ -332,7 +360,7 @@ private void closeBuckets(final List paths) { Cat.logError(e); } finally { m_buckets.remove(path); - release(bucket); + releaseBucket(bucket); } } } @@ -396,9 +424,7 @@ private void gzipMessage(MessageItem item) { synchronized (m_buckets) { bucket = m_buckets.get(path); if (bucket == null) { - bucket = (LocalMessageBucket) lookup(MessageBucket.class, LocalMessageBucket.ID); - bucket.setBaseDir(m_baseDir); - bucket.initialize(path); + bucket = createBucket(path); m_buckets.put(path, bucket); } @@ -453,4 +479,34 @@ public void shutdown() { } } + private LocalMessageBucket createBucket(String dataFile) throws Exception { + if (m_bucketFactory != null) { + LocalMessageBucket bucket = m_bucketFactory.createBucket(m_baseDir, dataFile); + + m_factoryBuckets.add(bucket); + return bucket; + } + + LocalMessageBucket bucket = (LocalMessageBucket) lookup(MessageBucket.class, LocalMessageBucket.ID); + + bucket.setBaseDir(m_baseDir); + bucket.initialize(dataFile); + if (!m_plexusFallbackLogged) { + SLF4J_LOGGER.info("Created local message storage bucket from Plexus fallback, subsequent fallback bucket creations will be silent."); + m_plexusFallbackLogged = true; + } + return bucket; + } + + private void releaseBucket(LocalMessageBucket bucket) { + if (m_factoryBuckets.remove(bucket)) { + SLF4J_LOGGER.debug("Closed Spring-created local message storage bucket without Plexus release, bucket={}.", bucket); + } else if (getContainer() != null) { + release(bucket); + } else { + SLF4J_LOGGER.warn("Skip Plexus release for local message storage bucket because container is unavailable, bucket={}.", + bucket); + } + } + } diff --git a/cat-core/src/main/java/com/dianping/cat/message/storage/MessageBucketFactory.java b/cat-core/src/main/java/com/dianping/cat/message/storage/MessageBucketFactory.java new file mode 100644 index 0000000000..0af4d2813b --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/message/storage/MessageBucketFactory.java @@ -0,0 +1,9 @@ +package com.dianping.cat.message.storage; + +import java.io.File; +import java.io.IOException; + +public interface MessageBucketFactory { + + public LocalMessageBucket createBucket(File baseDir, String dataFile) throws IOException; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index a72fc5b3a7..aaf9dac7a8 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -45,6 +45,7 @@ import com.dianping.cat.consumer.business.model.entity.BusinessReport; import com.dianping.cat.consumer.cross.model.entity.CrossReport; import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; +import com.dianping.cat.consumer.dump.LocalMessageBucketManager; import com.dianping.cat.consumer.event.model.entity.EventReport; import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; @@ -98,6 +99,9 @@ import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.message.DefaultPathBuilder; +import com.dianping.cat.message.storage.LocalMessageBucket; +import com.dianping.cat.message.storage.MessageBucketFactory; +import com.dianping.cat.message.storage.MessageBucketManager; import com.dianping.cat.message.PathBuilder; import com.dianping.cat.report.DefaultReportBucketManager; import com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager; @@ -293,6 +297,32 @@ public BucketManager localBucketManager(org.unidal.cat.message.storage.PathBuild return manager; } + @Bean + public MessageBucketFactory localStorageMessageBucketFactory() { + return new MessageBucketFactory() { + @Override + public LocalMessageBucket createBucket(java.io.File baseDir, String dataFile) throws java.io.IOException { + LocalMessageBucket bucket = new LocalMessageBucket(); + + bucket.setBaseDir(baseDir); + bucket.initialize(dataFile); + return bucket; + } + }; + } + + @Bean(initMethod = "initialize") + public MessageBucketManager localMessageBucketManager(ServerConfigManager serverConfigManager, PathBuilder pathBuilder, + ServerStatisticManager serverStatisticManager, MessageBucketFactory localStorageMessageBucketFactory) { + LocalMessageBucketManager manager = new LocalMessageBucketManager(); + + manager.setConfigManager(serverConfigManager); + manager.setPathBuilder(pathBuilder); + manager.setServerStateManager(serverStatisticManager); + manager.setBucketFactory(localStorageMessageBucketFactory); + return manager; + } + @Bean public ReportBucketFactory reportBucketFactory(PathBuilder pathBuilder, ServerConfigManager serverConfigManager) { return new ReportBucketFactory() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java index 793ea58b11..a76d7b7f59 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java @@ -226,6 +226,15 @@ private T lookupSpringOrPlexus(String name, Class type) { LOGGER.info("Resolved {}:{} from Spring for model page handler.", type.getSimpleName(), name); return bean; } + Map beans = CatSpringContext.getBeansIfAvailable(type); + + if (beans.size() == 1) { + Map.Entry entry = beans.entrySet().iterator().next(); + + LOGGER.info("Resolved {}:{} from Spring unique bean for model page handler, beanName={}.", + type.getSimpleName(), name, entry.getKey()); + return entry.getValue(); + } T component = lookup(type, name); From f290f780f9ca1355987cf1d62428c613eaaa7fc6 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 10:11:40 +0800 Subject: [PATCH 032/231] Fix local logview lookup in composite service --- .../report/ReportComponentConfigurator.java | 13 +++++++- .../spring/CatHomeSpringConfiguration.java | 30 ------------------- .../cat/report/page/model/Handler.java | 9 ------ .../resources/META-INF/plexus/components.xml | 25 ++++++++++++++++ 4 files changed, 37 insertions(+), 40 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java index 1a0e983822..ff0c15e326 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java @@ -21,12 +21,16 @@ import java.util.ArrayList; import java.util.List; +import org.unidal.cat.message.storage.BucketManager; +import org.unidal.cat.message.storage.MessageFinderManager; import org.unidal.cat.message.storage.hdfs.HdfsBucketManager; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; +import com.dianping.cat.analysis.MessageConsumer; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.consumer.cross.CrossAnalyzer; +import com.dianping.cat.consumer.dump.LocalMessageBucketManager; import com.dianping.cat.consumer.matrix.MatrixAnalyzer; import com.dianping.cat.consumer.state.StateAnalyzer; import com.dianping.cat.consumer.top.TopAnalyzer; @@ -147,12 +151,19 @@ public List defineComponents() { // message service all.add(A(LocalMessageService.class)); + all.add(C(ModelService.class, "logview-local", LocalMessageService.class) // + .req(MessageFinderManager.class) // + .req(BucketManager.class, "local") // + .req(MessageBucketManager.class, LocalMessageBucketManager.ID) // + .req(ServerConfigManager.class) // + .req(MessageConsumer.class)); all.add(C(ModelService.class, "logview-historical", HistoricalMessageService.class) // .req(MessageBucketManager.class, HdfsMessageBucketManager.ID) // .req(HdfsBucketManager.class).req(ServerConfigManager.class)); all.add(C(ModelService.class, "logview", CompositeLogViewService.class) // .req(ServerConfigManager.class, RemoteServersManager.class) // - .req(ModelService.class, new String[] { "logview-historical" }, "m_services")); + .req(ModelService.class, new String[] { "logview-local", "logview-historical" }, + "m_services")); return all; } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index aaf9dac7a8..a72fc5b3a7 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -45,7 +45,6 @@ import com.dianping.cat.consumer.business.model.entity.BusinessReport; import com.dianping.cat.consumer.cross.model.entity.CrossReport; import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; -import com.dianping.cat.consumer.dump.LocalMessageBucketManager; import com.dianping.cat.consumer.event.model.entity.EventReport; import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; @@ -99,9 +98,6 @@ import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.message.DefaultPathBuilder; -import com.dianping.cat.message.storage.LocalMessageBucket; -import com.dianping.cat.message.storage.MessageBucketFactory; -import com.dianping.cat.message.storage.MessageBucketManager; import com.dianping.cat.message.PathBuilder; import com.dianping.cat.report.DefaultReportBucketManager; import com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager; @@ -297,32 +293,6 @@ public BucketManager localBucketManager(org.unidal.cat.message.storage.PathBuild return manager; } - @Bean - public MessageBucketFactory localStorageMessageBucketFactory() { - return new MessageBucketFactory() { - @Override - public LocalMessageBucket createBucket(java.io.File baseDir, String dataFile) throws java.io.IOException { - LocalMessageBucket bucket = new LocalMessageBucket(); - - bucket.setBaseDir(baseDir); - bucket.initialize(dataFile); - return bucket; - } - }; - } - - @Bean(initMethod = "initialize") - public MessageBucketManager localMessageBucketManager(ServerConfigManager serverConfigManager, PathBuilder pathBuilder, - ServerStatisticManager serverStatisticManager, MessageBucketFactory localStorageMessageBucketFactory) { - LocalMessageBucketManager manager = new LocalMessageBucketManager(); - - manager.setConfigManager(serverConfigManager); - manager.setPathBuilder(pathBuilder); - manager.setServerStateManager(serverStatisticManager); - manager.setBucketFactory(localStorageMessageBucketFactory); - return manager; - } - @Bean public ReportBucketFactory reportBucketFactory(PathBuilder pathBuilder, ServerConfigManager serverConfigManager) { return new ReportBucketFactory() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java index a76d7b7f59..793ea58b11 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/model/Handler.java @@ -226,15 +226,6 @@ private T lookupSpringOrPlexus(String name, Class type) { LOGGER.info("Resolved {}:{} from Spring for model page handler.", type.getSimpleName(), name); return bean; } - Map beans = CatSpringContext.getBeansIfAvailable(type); - - if (beans.size() == 1) { - Map.Entry entry = beans.entrySet().iterator().next(); - - LOGGER.info("Resolved {}:{} from Spring unique bean for model page handler, beanName={}.", - type.getSimpleName(), name, entry.getKey()); - return entry.getValue(); - } T component = lookup(type, name); diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index b7525d3c41..5e7a68f0ee 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -2311,6 +2311,30 @@ + + com.dianping.cat.report.service.ModelService + logview-local + com.dianping.cat.report.page.logview.service.LocalMessageService + + + org.unidal.cat.message.storage.MessageFinderManager + + + org.unidal.cat.message.storage.BucketManager + local + + + com.dianping.cat.message.storage.MessageBucketManager + local + + + com.dianping.cat.config.server.ServerConfigManager + + + com.dianping.cat.analysis.MessageConsumer + + + com.dianping.cat.report.service.ModelService logview-historical @@ -2343,6 +2367,7 @@ com.dianping.cat.report.service.ModelService m_services + logview-local logview-historical From 2835bced5b38c7cd734d4490dfde7222b82d1529 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 21:22:11 +0800 Subject: [PATCH 033/231] Introduce message analyzer factory --- .../DefaultMessageAnalyzerManager.java | 32 +++++++++++++++++-- .../cat/analysis/MessageAnalyzerFactory.java | 10 ++++++ .../PlexusMessageAnalyzerFactory.java | 20 ++++++++++++ .../cat/build/ComponentsConfigurator.java | 14 ++++---- .../resources/META-INF/plexus/components.xml | 9 ++++++ 5 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 cat-core/src/main/java/com/dianping/cat/analysis/MessageAnalyzerFactory.java create mode 100644 cat-core/src/main/java/com/dianping/cat/analysis/PlexusMessageAnalyzerFactory.java diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java b/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java index f94785905f..100c5a2cf1 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java @@ -30,6 +30,7 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.lookup.ContainerHolder; +import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; @@ -49,6 +50,9 @@ public class DefaultMessageAnalyzerManager extends ContainerHolder private List m_analyzerNames; + @Inject + private MessageAnalyzerFactory m_analyzerFactory; + private final Map>> m_analyzers = new HashMap>>(); @Override @@ -90,7 +94,7 @@ public List getAnalyzer(String name, long startTime) { if (analyzers == null) { analyzers = new ArrayList(); - MessageAnalyzer analyzer = lookup(MessageAnalyzer.class, name); + MessageAnalyzer analyzer = createAnalyzer(name); analyzer.setIndex(0); analyzer.initialize(startTime, m_duration, m_extraTime); @@ -99,7 +103,7 @@ public List getAnalyzer(String name, long startTime) { int count = analyzer.getAnanlyzerCount(name); for (int i = 1; i < count; i++) { - MessageAnalyzer tempAnalyzer = lookup(MessageAnalyzer.class, name); + MessageAnalyzer tempAnalyzer = createAnalyzer(name); tempAnalyzer.setIndex(i); tempAnalyzer.initialize(startTime, m_duration, m_extraTime); @@ -120,7 +124,7 @@ public List getAnalyzerNames() { @Override public void initialize() throws InitializationException { - Map map = lookupMap(MessageAnalyzer.class); + Map map = getAnalyzerMap(); for (MessageAnalyzer analyzer : map.values()) { analyzer.destroy(); @@ -170,4 +174,26 @@ public int compare(String str1, String str2) { public void enableLogging(Logger logger) { m_logger = logger; } + + private MessageAnalyzer createAnalyzer(String name) { + MessageAnalyzerFactory factory = getAnalyzerFactory(); + + return factory == null ? lookup(MessageAnalyzer.class, name) : factory.createAnalyzer(name); + } + + private MessageAnalyzerFactory getAnalyzerFactory() { + MessageAnalyzerFactory factory = CatSpringContext.getBeanIfAvailable(MessageAnalyzerFactory.class); + + return factory == null ? m_analyzerFactory : factory; + } + + private Map getAnalyzerMap() { + MessageAnalyzerFactory factory = getAnalyzerFactory(); + + return factory == null ? lookupMap(MessageAnalyzer.class) : factory.getAnalyzerMap(); + } + + public void setAnalyzerFactory(MessageAnalyzerFactory analyzerFactory) { + m_analyzerFactory = analyzerFactory; + } } diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/MessageAnalyzerFactory.java b/cat-core/src/main/java/com/dianping/cat/analysis/MessageAnalyzerFactory.java new file mode 100644 index 0000000000..288db07fe7 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/analysis/MessageAnalyzerFactory.java @@ -0,0 +1,10 @@ +package com.dianping.cat.analysis; + +import java.util.Map; + +public interface MessageAnalyzerFactory { + + public MessageAnalyzer createAnalyzer(String name); + + public Map getAnalyzerMap(); +} diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/PlexusMessageAnalyzerFactory.java b/cat-core/src/main/java/com/dianping/cat/analysis/PlexusMessageAnalyzerFactory.java new file mode 100644 index 0000000000..5443726eaf --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/analysis/PlexusMessageAnalyzerFactory.java @@ -0,0 +1,20 @@ +package com.dianping.cat.analysis; + +import java.util.Map; + +import org.unidal.lookup.ContainerHolder; +import org.unidal.lookup.annotation.Named; + +@Named(type = MessageAnalyzerFactory.class) +public class PlexusMessageAnalyzerFactory extends ContainerHolder implements MessageAnalyzerFactory { + + @Override + public MessageAnalyzer createAnalyzer(String name) { + return lookup(MessageAnalyzer.class, name); + } + + @Override + public Map getAnalyzerMap() { + return lookupMap(MessageAnalyzer.class); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 6f83d87e6a..9be0ea7626 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -26,9 +26,10 @@ import org.unidal.lookup.configuration.Component; import com.dianping.cat.CatConstants; import com.dianping.cat.CatCoreModule; -import com.dianping.cat.analysis.DefaultMessageAnalyzerManager; -import com.dianping.cat.analysis.DefaultMessageHandler; -import com.dianping.cat.analysis.RealtimeConsumer; +import com.dianping.cat.analysis.DefaultMessageAnalyzerManager; +import com.dianping.cat.analysis.DefaultMessageHandler; +import com.dianping.cat.analysis.PlexusMessageAnalyzerFactory; +import com.dianping.cat.analysis.RealtimeConsumer; import com.dianping.cat.analysis.TcpSocketReceiver; import com.dianping.cat.config.AtomicMessageConfigManager; import com.dianping.cat.config.ReportReloadConfigManager; @@ -72,9 +73,10 @@ public List defineComponents() { all.add(A(LocalResourceContentFetcher.class)); all.add(A(ServerFilterConfigManager.class)); - all.add(A(DefaultPathBuilder.class)); - - all.add(A(DefaultMessageAnalyzerManager.class)); + all.add(A(DefaultPathBuilder.class)); + + all.add(A(PlexusMessageAnalyzerFactory.class)); + all.add(A(DefaultMessageAnalyzerManager.class)); all.add(A(TcpSocketReceiver.class)); diff --git a/cat-core/src/main/resources/META-INF/plexus/components.xml b/cat-core/src/main/resources/META-INF/plexus/components.xml index 67d22aace3..4d4fe73f0b 100644 --- a/cat-core/src/main/resources/META-INF/plexus/components.xml +++ b/cat-core/src/main/resources/META-INF/plexus/components.xml @@ -82,9 +82,18 @@ com.dianping.cat.message.PathBuilder com.dianping.cat.message.DefaultPathBuilder + + com.dianping.cat.analysis.MessageAnalyzerFactory + com.dianping.cat.analysis.PlexusMessageAnalyzerFactory + com.dianping.cat.analysis.MessageAnalyzerManager com.dianping.cat.analysis.DefaultMessageAnalyzerManager + + + com.dianping.cat.analysis.MessageAnalyzerFactory + + com.dianping.cat.analysis.TcpSocketReceiver From 1e0b34a8174c2703f9130522557821f2072f5f55 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 21:47:00 +0800 Subject: [PATCH 034/231] Prepare realtime analysis chain for Spring wiring --- .../ContainerMessageAnalyzerFactory.java | 37 ++++++++++ .../DefaultMessageAnalyzerManager.java | 24 +++++-- .../cat/analysis/RealtimeConsumer.java | 54 +++++++++++--- .../cat/analysis/TcpSocketReceiver.java | 70 ++++++++++++++++--- .../spring/CatHomeSpringConfiguration.java | 7 ++ 5 files changed, 169 insertions(+), 23 deletions(-) create mode 100644 cat-core/src/main/java/com/dianping/cat/analysis/ContainerMessageAnalyzerFactory.java diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/ContainerMessageAnalyzerFactory.java b/cat-core/src/main/java/com/dianping/cat/analysis/ContainerMessageAnalyzerFactory.java new file mode 100644 index 0000000000..e474ca93c6 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/analysis/ContainerMessageAnalyzerFactory.java @@ -0,0 +1,37 @@ +package com.dianping.cat.analysis; + +import java.util.Map; + +import org.codehaus.plexus.PlexusContainer; +import org.codehaus.plexus.component.repository.exception.ComponentLookupException; +import org.unidal.lookup.ContainerLoader; + +public class ContainerMessageAnalyzerFactory implements MessageAnalyzerFactory { + + @Override + public MessageAnalyzer createAnalyzer(String name) { + try { + return getContainer().lookup(MessageAnalyzer.class, name); + } catch (ComponentLookupException e) { + throw new IllegalStateException("Unable to lookup message analyzer: " + name, e); + } + } + + @Override + public Map getAnalyzerMap() { + try { + return getContainer().lookupMap(MessageAnalyzer.class); + } catch (ComponentLookupException e) { + throw new IllegalStateException("Unable to lookup message analyzer map.", e); + } + } + + private PlexusContainer getContainer() { + PlexusContainer container = ContainerLoader.getDefaultContainer(); + + if (container == null) { + throw new IllegalStateException("Plexus container is not available for message analyzer factory."); + } + return container; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java b/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java index 100c5a2cf1..d2822223e4 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java @@ -53,6 +53,8 @@ public class DefaultMessageAnalyzerManager extends ContainerHolder @Inject private MessageAnalyzerFactory m_analyzerFactory; + private ServerConfigManager m_configManager; + private final Map>> m_analyzers = new HashMap>>(); @Override @@ -152,11 +154,7 @@ public int compare(String str1, String str2) { } }); - ServerConfigManager manager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); - - if (manager == null) { - manager = lookup(ServerConfigManager.class); - } + ServerConfigManager manager = getConfigManager(); List disables = new ArrayList(); for (String name : m_analyzerNames) { @@ -187,6 +185,18 @@ private MessageAnalyzerFactory getAnalyzerFactory() { return factory == null ? m_analyzerFactory : factory; } + private ServerConfigManager getConfigManager() { + ServerConfigManager manager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + + if (manager != null) { + return manager; + } + if (m_configManager != null) { + return m_configManager; + } + return lookup(ServerConfigManager.class); + } + private Map getAnalyzerMap() { MessageAnalyzerFactory factory = getAnalyzerFactory(); @@ -196,4 +206,8 @@ private Map getAnalyzerMap() { public void setAnalyzerFactory(MessageAnalyzerFactory analyzerFactory) { m_analyzerFactory = analyzerFactory; } + + public void setConfigManager(ServerConfigManager configManager) { + m_configManager = configManager; + } } diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/RealtimeConsumer.java b/cat-core/src/main/java/com/dianping/cat/analysis/RealtimeConsumer.java index dd67c7a181..dd8197e002 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/RealtimeConsumer.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/RealtimeConsumer.java @@ -22,6 +22,7 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; +import org.slf4j.LoggerFactory; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.helper.Threads; @@ -37,6 +38,8 @@ @Named(type = MessageConsumer.class) public class RealtimeConsumer extends ContainerHolder implements MessageConsumer, Initializable, LogEnabled { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(RealtimeConsumer.class); + public static final long MINUTE = 60 * 1000L; public static final long HOUR = 60 * MINUTE; @@ -53,29 +56,40 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer @Override public void consume(MessageTree tree) { + if (m_periodManager == null) { + SLF4J_LOGGER.error("Realtime consumer is not initialized, tree={}.", tree); + return; + } + long timestamp = getTimestamp(tree); Period period = m_periodManager.findPeriod(timestamp); if (period != null) { period.distribute(tree); } else { + SLF4J_LOGGER.warn("No realtime period found for message tree, timestamp={}, tree={}.", timestamp, tree); m_serverStateManager.addNetworkTimeError(1); } } public void doCheckpoint() { - m_logger.info("starting do checkpoint."); + info("starting do checkpoint."); Transaction t = Cat.newTransaction("Checkpoint", getClass().getSimpleName()); try { long currentStartTime = getCurrentStartTime(); Period period = m_periodManager.findPeriod(currentStartTime); - for (MessageAnalyzer analyzer : period.getAnalyzers()) { - try { - analyzer.doCheckpoint(false); - } catch (Exception e) { - Cat.logError(e); + if (period == null) { + SLF4J_LOGGER.warn("No current realtime period found when doing checkpoint, startTime={}.", currentStartTime); + } else { + for (MessageAnalyzer analyzer : period.getAnalyzers()) { + try { + analyzer.doCheckpoint(false); + } catch (Exception e) { + Cat.logError(e); + SLF4J_LOGGER.error("Failed to checkpoint realtime analyzer, analyzer={}.", analyzer, e); + } } } @@ -88,11 +102,12 @@ public void doCheckpoint() { t.setStatus(Message.SUCCESS); } catch (RuntimeException e) { Cat.logError(e); + SLF4J_LOGGER.error("Failed to do realtime checkpoint.", e); t.setStatus(e); } finally { t.complete(); } - m_logger.info("end do checkpoint."); + info("end do checkpoint."); } @Override @@ -140,10 +155,33 @@ private long getTimestamp(MessageTree tree) { @Override public void initialize() throws InitializationException { + if (m_analyzerManager == null) { + throw new InitializationException("MessageAnalyzerManager is required for RealtimeConsumer."); + } + if (m_serverStateManager == null) { + throw new InitializationException("ServerStatisticManager is required for RealtimeConsumer."); + } + m_periodManager = new PeriodManager(HOUR, m_analyzerManager, m_serverStateManager, m_logger); m_periodManager.init(); Threads.forGroup("Cat").start(m_periodManager); } -} \ No newline at end of file + private void info(String message) { + if (m_logger != null) { + m_logger.info(message); + } else { + SLF4J_LOGGER.info(message); + } + } + + public void setAnalyzerManager(MessageAnalyzerManager analyzerManager) { + m_analyzerManager = analyzerManager; + } + + public void setServerStateManager(ServerStatisticManager serverStateManager) { + m_serverStateManager = serverStateManager; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/TcpSocketReceiver.java b/cat-core/src/main/java/com/dianping/cat/analysis/TcpSocketReceiver.java index fe8bfc6785..3a82caa65b 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/TcpSocketReceiver.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/TcpSocketReceiver.java @@ -22,6 +22,7 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -50,6 +51,7 @@ @Named(type = TcpSocketReceiver.class) public final class TcpSocketReceiver implements LogEnabled { + private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(TcpSocketReceiver.class); @Inject protected ServerConfigManager m_serverConfigManager; @@ -72,13 +74,19 @@ public final class TcpSocketReceiver implements LogEnabled { public synchronized void destory() { try { - m_logger.info("start shutdown socket, port " + m_port); - m_future.channel().closeFuture(); - m_bossGroup.shutdownGracefully(); - m_workerGroup.shutdownGracefully(); - m_logger.info("shutdown socket success"); + info("start shutdown socket, port " + m_port); + if (m_future != null) { + m_future.channel().closeFuture(); + } + if (m_bossGroup != null) { + m_bossGroup.shutdownGracefully(); + } + if (m_workerGroup != null) { + m_workerGroup.shutdownGracefully(); + } + info("shutdown socket success"); } catch (Exception e) { - m_logger.warn(e.getMessage(), e); + warn(e.getMessage(), e); } } @@ -98,9 +106,15 @@ protected boolean getOSMatches(String osNamePrefix) { public void init() { try { + if (m_handler == null) { + throw new IllegalStateException("MessageHandler is required for TcpSocketReceiver."); + } + if (m_serverStateManager == null) { + throw new IllegalStateException("ServerStatisticManager is required for TcpSocketReceiver."); + } startServer(m_port); } catch (Exception e) { - m_logger.error(e.getMessage(), e); + error(e.getMessage(), e); } } @@ -130,9 +144,45 @@ protected void initChannel(SocketChannel ch) throws Exception { try { m_future = bootstrap.bind(port).sync(); - m_logger.info("start netty server!"); + info("start netty server!"); } catch (Exception e) { - m_logger.error("Started Netty Server Failed:" + port, e); + error("Started Netty Server Failed:" + port, e); + } + } + + public void setHandler(MessageHandler handler) { + m_handler = handler; + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + m_serverConfigManager = serverConfigManager; + } + + public void setServerStateManager(ServerStatisticManager serverStateManager) { + m_serverStateManager = serverStateManager; + } + + private void error(String message, Throwable cause) { + if (m_logger != null) { + m_logger.error(message, cause); + } else { + SLF4J_LOGGER.error(message, cause); + } + } + + private void info(String message) { + if (m_logger != null) { + m_logger.info(message); + } else { + SLF4J_LOGGER.info(message); + } + } + + private void warn(String message, Throwable cause) { + if (m_logger != null) { + m_logger.warn(message, cause); + } else { + SLF4J_LOGGER.warn(message, cause); } } @@ -180,7 +230,7 @@ protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List ou } } catch (Exception e) { m_serverStateManager.addMessageTotalLoss(1); - m_logger.error(e.getMessage(), e); + error(e.getMessage(), e); } } } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index a72fc5b3a7..6c10f25144 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -33,6 +33,8 @@ import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.support.TransactionTemplate; +import com.dianping.cat.analysis.ContainerMessageAnalyzerFactory; +import com.dianping.cat.analysis.MessageAnalyzerFactory; import com.dianping.cat.config.AtomicMessageConfigManager; import com.dianping.cat.config.ReportReloadConfigManager; import com.dianping.cat.config.business.BusinessConfigManager; @@ -208,6 +210,11 @@ public Logger plexusConsoleLogger() { return new ConsoleLogger(Logger.LEVEL_INFO, "spring-managed"); } + @Bean + public MessageAnalyzerFactory messageAnalyzerFactory() { + return new ContainerMessageAnalyzerFactory(); + } + @Bean public ContentFetcher contentFetcher(Logger plexusConsoleLogger) { LocalResourceContentFetcher fetcher = new LocalResourceContentFetcher(); From f5048eae523bbb9106a8f208e1ec1dbe5ce8df09 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 22:34:12 +0800 Subject: [PATCH 035/231] =?UTF-8?q?=E9=80=90=E6=AD=A5=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=9E=84=E5=BB=BA=E9=93=BE=E8=B7=AF=E5=88=B0?= =?UTF-8?q?=20Spring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/service/AbstractReportService.java | 32 ++++ .../spring/CatHomeSpringConfiguration.java | 137 ++++++++++++++++++ .../task/HeartbeatReportBuilder.java | 15 ++ .../cat/report/task/ReportFacade.java | 23 ++- .../task/current/CurrentReportBuilder.java | 8 + .../report/task/reload/ReportReloadTask.java | 23 ++- .../router/config/RouterConfigAdjustor.java | 20 +++ .../router/config/RouterConfigHandler.java | 16 ++ .../router/service/RouterConfigService.java | 4 + .../page/router/task/RouterConfigBuilder.java | 16 ++ 10 files changed, 282 insertions(+), 12 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java index fe4ae868a0..c4d5b96e6f 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java @@ -361,4 +361,36 @@ protected void refreshSpringRepositories() { } } + public void setDailyReportContentDao(DailyReportContentRepository dailyReportContentDao) { + m_dailyReportContentDao = dailyReportContentDao; + } + + public void setDailyReportDao(DailyReportRepository dailyReportDao) { + m_dailyReportDao = dailyReportDao; + } + + public void setHourlyReportContentDao(HourlyReportContentRepository hourlyReportContentDao) { + m_hourlyReportContentDao = hourlyReportContentDao; + } + + public void setHourlyReportDao(HourlyReportRepository hourlyReportDao) { + m_hourlyReportDao = hourlyReportDao; + } + + public void setMonthlyReportContentDao(MonthlyReportContentRepository monthlyReportContentDao) { + m_monthlyReportContentDao = monthlyReportContentDao; + } + + public void setMonthlyReportDao(MonthlyReportRepository monthlyReportDao) { + m_monthlyReportDao = monthlyReportDao; + } + + public void setWeeklyReportContentDao(WeeklyReportContentRepository weeklyReportContentDao) { + m_weeklyReportContentDao = weeklyReportContentDao; + } + + public void setWeeklyReportDao(WeeklyReportRepository weeklyReportDao) { + m_weeklyReportDao = weeklyReportDao; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 6c10f25144..34f6dbc758 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -34,7 +34,9 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.analysis.ContainerMessageAnalyzerFactory; +import com.dianping.cat.analysis.DefaultMessageAnalyzerManager; import com.dianping.cat.analysis.MessageAnalyzerFactory; +import com.dianping.cat.analysis.MessageAnalyzerManager; import com.dianping.cat.config.AtomicMessageConfigManager; import com.dianping.cat.config.ReportReloadConfigManager; import com.dianping.cat.config.business.BusinessConfigManager; @@ -140,7 +142,9 @@ import com.dianping.cat.report.page.cross.service.LocalCrossService; import com.dianping.cat.report.page.dependency.service.LocalDependencyService; import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; +import com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService; import com.dianping.cat.report.page.heartbeat.service.LocalHeartbeatService; +import com.dianping.cat.report.page.heartbeat.task.HeartbeatReportBuilder; import com.dianping.cat.report.page.logview.service.LocalMessageService; import com.dianping.cat.report.page.matrix.service.LocalMatrixService; import com.dianping.cat.report.page.metric.service.BaselineService; @@ -156,9 +160,13 @@ import com.dianping.cat.report.page.storage.config.StorageGroupConfigManager; import com.dianping.cat.report.page.storage.service.LocalStorageService; import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.report.service.AbstractReportService; import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.report.task.TaskBuilder; +import com.dianping.cat.report.task.current.CurrentReportBuilder; import com.dianping.cat.report.page.state.service.LocalStateService; +import com.dianping.cat.report.page.state.service.StateReportService; import com.dianping.cat.report.page.top.service.LocalTopService; import com.dianping.cat.report.page.transaction.service.LocalTransactionService; import com.dianping.cat.report.LocalReportBucket; @@ -175,7 +183,11 @@ import com.dianping.cat.system.page.login.service.TokenManager; import com.dianping.cat.system.page.permission.ResourceConfigManager; import com.dianping.cat.system.page.permission.UserConfigManager; +import com.dianping.cat.system.page.router.config.RouterConfigAdjustor; +import com.dianping.cat.system.page.router.config.RouterConfigHandler; import com.dianping.cat.system.page.router.config.RouterConfigManager; +import com.dianping.cat.system.page.router.service.RouterConfigService; +import com.dianping.cat.system.page.router.task.RouterConfigBuilder; @Configuration @MapperScan(basePackages = { @@ -215,6 +227,116 @@ public MessageAnalyzerFactory messageAnalyzerFactory() { return new ContainerMessageAnalyzerFactory(); } + @Bean(initMethod = "initialize") + public MessageAnalyzerManager messageAnalyzerManager(MessageAnalyzerFactory messageAnalyzerFactory, + ServerConfigManager serverConfigManager) { + DefaultMessageAnalyzerManager manager = new DefaultMessageAnalyzerManager(); + + manager.setAnalyzerFactory(messageAnalyzerFactory); + manager.setConfigManager(serverConfigManager); + return manager; + } + + @Bean(name = CurrentReportBuilder.ID) + public TaskBuilder currentReportBuilder(ProjectService projectService, + ServerFilterConfigManager serverFilterConfigManager) { + CurrentReportBuilder builder = new CurrentReportBuilder(); + + builder.setProjectService(projectService); + builder.setServerFilterConfigManager(serverFilterConfigManager); + return builder; + } + + @Bean + public StateReportService stateReportService(HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + StateReportService service = new StateReportService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + return service; + } + + @Bean + public RouterConfigService routerConfigService(RouterConfigManager routerConfigManager, + HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, + DailyReportRepository dailyReportRepository, DailyReportContentRepository dailyReportContentRepository, + WeeklyReportRepository weeklyReportRepository, WeeklyReportContentRepository weeklyReportContentRepository, + MonthlyReportRepository monthlyReportRepository, MonthlyReportContentRepository monthlyReportContentRepository) { + RouterConfigService service = new RouterConfigService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + service.setRouterConfigManager(routerConfigManager); + return service; + } + + @Bean + public HeartbeatReportService heartbeatReportService(HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + HeartbeatReportService service = new HeartbeatReportService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + return service; + } + + @Bean(name = HeartbeatReportBuilder.ID) + public TaskBuilder heartbeatReportBuilder(HeartbeatReportService heartbeatReportService) { + HeartbeatReportBuilder builder = new HeartbeatReportBuilder(); + + builder.setReportService(heartbeatReportService); + return builder; + } + + @Bean + public RouterConfigHandler routerConfigHandler(StateReportService stateReportService, + RouterConfigManager routerConfigManager, RouterConfigService routerConfigService, + DailyReportRepository dailyReportRepository) { + RouterConfigHandler handler = new RouterConfigHandler(); + + handler.setStateReportService(stateReportService); + handler.setRouterConfigManager(routerConfigManager); + handler.setReportService(routerConfigService); + handler.setDailyReportDao(dailyReportRepository); + return handler; + } + + @Bean + public RouterConfigAdjustor routerConfigAdjustor(StateReportService stateReportService, + RouterConfigManager routerConfigManager, RouterConfigService routerConfigService, + ServerConfigManager serverConfigManager, DailyReportRepository dailyReportRepository) { + RouterConfigAdjustor adjustor = new RouterConfigAdjustor(); + + adjustor.setStateReportService(stateReportService); + adjustor.setRouterConfigManager(routerConfigManager); + adjustor.setRouterService(routerConfigService); + adjustor.setServerConfigManager(serverConfigManager); + adjustor.setDailyReportDao(dailyReportRepository); + return adjustor; + } + + @Bean(name = RouterConfigBuilder.ID) + public TaskBuilder routerConfigBuilder(RouterConfigHandler routerConfigHandler, RouterConfigAdjustor routerConfigAdjustor, + RouterConfigService routerConfigService, ServerConfigManager serverConfigManager) { + RouterConfigBuilder builder = new RouterConfigBuilder(); + + builder.setRouterConfigHandler(routerConfigHandler); + builder.setRouterAdjustor(routerConfigAdjustor); + builder.setReportService(routerConfigService); + builder.setServerConfigManager(serverConfigManager); + return builder; + } + @Bean public ContentFetcher contentFetcher(Logger plexusConsoleLogger) { LocalResourceContentFetcher fetcher = new LocalResourceContentFetcher(); @@ -1254,6 +1376,21 @@ private void configureProjectContactor(ProjectContactor contactor, ProjectServic contactor.setConfigManager(alertConfigManager); } + private void configureReportService(AbstractReportService service, HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + service.setHourlyReportDao(hourlyReportRepository); + service.setHourlyReportContentDao(hourlyReportContentRepository); + service.setDailyReportDao(dailyReportRepository); + service.setDailyReportContentDao(dailyReportContentRepository); + service.setWeeklyReportDao(weeklyReportRepository); + service.setWeeklyReportContentDao(weeklyReportContentRepository); + service.setMonthlyReportDao(monthlyReportRepository); + service.setMonthlyReportContentDao(monthlyReportContentRepository); + } + @Bean public SqlSessionFactory sqlSessionFactory(DataSource catDataSource) throws Exception { SqlSessionFactoryBean factory = new SqlSessionFactoryBean(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/task/HeartbeatReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/task/HeartbeatReportBuilder.java index c01b4bc637..ebd1c88443 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/task/HeartbeatReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/task/HeartbeatReportBuilder.java @@ -35,6 +35,7 @@ import com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService; import com.dianping.cat.report.task.TaskBuilder; import com.dianping.cat.report.task.TaskHelper; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = HeartbeatReportBuilder.ID) public class HeartbeatReportBuilder implements TaskBuilder { @@ -47,6 +48,8 @@ public class HeartbeatReportBuilder implements TaskBuilder { @Override public boolean buildDailyTask(String name, String domain, Date period) { + refreshSpringBeans(); + try { Date end = TaskHelper.tomorrowZero(period); HeartbeatReport heartbeatReport = queryDailyHeartbeatReport(name, domain, period, end); @@ -105,4 +108,16 @@ private HeartbeatReport queryDailyHeartbeatReport(String name, String domain, Da return heartbeatReport; } + + private void refreshSpringBeans() { + HeartbeatReportService reportService = CatSpringContext.getBeanIfAvailable(HeartbeatReportService.class); + + if (reportService != null) { + m_reportService = reportService; + } + } + + public void setReportService(HeartbeatReportService reportService) { + m_reportService = reportService; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java b/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java index 34d373e6c9..4617d099b1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java @@ -39,6 +39,8 @@ public class ReportFacade extends ContainerHolder implements LogEnabled, Initializable { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(ReportFacade.class); + private static final int EXPECTED_REPORT_BUILDER_COUNT = 19; + private Logger m_logger; private Map m_reportBuilders = new HashMap(); @@ -102,15 +104,24 @@ private TaskBuilder getReportBuilder(String reportName) { @Override public void initialize() throws InitializationException { - m_reportBuilders = CatSpringContext.getBeansIfAvailable(TaskBuilder.class); - if (m_reportBuilders.isEmpty()) { - m_reportBuilders = lookupMap(TaskBuilder.class); - SLF4J_LOGGER.info("Initialized report facade from Plexus, builderCount={}, builders={}.", - m_reportBuilders.size(), m_reportBuilders.keySet()); - } else { + Map springBuilders = CatSpringContext.getBeansIfAvailable(TaskBuilder.class); + + if (springBuilders.size() >= EXPECTED_REPORT_BUILDER_COUNT) { + m_reportBuilders = new HashMap(springBuilders); SLF4J_LOGGER.info("Initialized report facade from Spring, builderCount={}, builders={}.", m_reportBuilders.size(), m_reportBuilders.keySet()); + return; } + + Map plexusBuilders = lookupMap(TaskBuilder.class); + Map builders = new HashMap(); + + builders.putAll(plexusBuilders); + builders.putAll(springBuilders); + m_reportBuilders = builders; + SLF4J_LOGGER.info( + "Initialized report facade, builderCount={}, springBuilderCount={}, plexusBuilderCount={}, builders={}.", + m_reportBuilders.size(), springBuilders.size(), plexusBuilders.size(), m_reportBuilders.keySet()); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java index 82e6bcd58d..5f64219aef 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java @@ -104,4 +104,12 @@ private void refreshSpringBeans() { m_serverFilterConfigManager = serverFilterConfigManager; } } + + public void setProjectService(ProjectService projectService) { + m_projectService = projectService; + } + + public void setServerFilterConfigManager(ServerFilterConfigManager serverFilterConfigManager) { + m_serverFilterConfigManager = serverFilterConfigManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java index bbb0804436..5b9ca3a75c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java @@ -43,6 +43,8 @@ public class ReportReloadTask extends ContainerHolder implements Initializable, private static final long DURATION = TimeHelper.ONE_HOUR; + private static final int EXPECTED_RELOADER_COUNT = 11; + @Inject private ReportReloadConfigManager m_configManager; @@ -56,19 +58,28 @@ public String getName() { @Override public void initialize() throws InitializationException { ReportReloadConfigManager configManager = CatSpringContext.getBeanIfAvailable(ReportReloadConfigManager.class); + Map springReloaders = CatSpringContext.getBeansIfAvailable(ReportReloader.class); if (configManager != null) { m_configManager = configManager; } - m_reloaders = CatSpringContext.getBeansIfAvailable(ReportReloader.class); - if (m_reloaders.isEmpty()) { - m_reloaders = lookupMap(ReportReloader.class); - LOGGER.info("Initialized report reload task from Plexus, reloaderCount={}, reloaders={}.", m_reloaders.size(), - m_reloaders.keySet()); - } else { + + if (springReloaders.size() >= EXPECTED_RELOADER_COUNT) { + m_reloaders = new java.util.LinkedHashMap(springReloaders); LOGGER.info("Initialized report reload task from Spring, reloaderCount={}, reloaders={}.", m_reloaders.size(), m_reloaders.keySet()); + return; } + + Map plexusReloaders = lookupMap(ReportReloader.class); + Map reloaders = new java.util.LinkedHashMap(); + + reloaders.putAll(plexusReloaders); + reloaders.putAll(springReloaders); + m_reloaders = reloaders; + LOGGER.info( + "Initialized report reload task, reloaderCount={}, springReloaderCount={}, plexusReloaderCount={}, reloaders={}.", + m_reloaders.size(), springReloaders.size(), plexusReloaders.size(), m_reloaders.keySet()); } @Override diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java index 5624782702..cf3244ef02 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java @@ -313,4 +313,24 @@ private void refreshSpringBeans() { m_serverConfigManager = serverConfigManager; } } + + public void setDailyReportDao(DailyReportRepository dailyReportDao) { + m_dailyReportDao = dailyReportDao; + } + + public void setRouterConfigManager(RouterConfigManager configManager) { + m_configManager = configManager; + } + + public void setRouterService(RouterConfigService routerService) { + m_routerService = routerService; + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + m_serverConfigManager = serverConfigManager; + } + + public void setStateReportService(StateReportService stateReportService) { + m_stateReportService = stateReportService; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java index 4c2d4810a6..cf922a28b7 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java @@ -294,4 +294,20 @@ public boolean updateRouterConfig(Date period) { } } + public void setDailyReportDao(DailyReportRepository dailyReportDao) { + m_dailyReportDao = dailyReportDao; + } + + public void setReportService(RouterConfigService reportService) { + m_reportService = reportService; + } + + public void setRouterConfigManager(RouterConfigManager configManager) { + m_configManager = configManager; + } + + public void setStateReportService(StateReportService stateReportService) { + m_stateReportService = stateReportService; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java index 7de4a6e4f7..f221a5bee8 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java @@ -128,4 +128,8 @@ public RouterConfig queryWeeklyReport(String domain, Date start) { throw new RuntimeException("router report don't support weekly report"); } + public void setRouterConfigManager(RouterConfigManager routerConfigManager) { + m_routerConfigManager = routerConfigManager; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/task/RouterConfigBuilder.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/task/RouterConfigBuilder.java index 395e6a4a0e..22d7268a99 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/task/RouterConfigBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/task/RouterConfigBuilder.java @@ -98,4 +98,20 @@ private void refreshSpringBeans() { m_serverConfigManager = serverConfigManager; } } + + public void setReportService(RouterConfigService reportService) { + m_reportService = reportService; + } + + public void setRouterAdjustor(RouterConfigAdjustor routerAdjustor) { + m_routerAdjustor = routerAdjustor; + } + + public void setRouterConfigHandler(RouterConfigHandler routerConfigHandler) { + m_routerConfigHandler = routerConfigHandler; + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + m_serverConfigManager = serverConfigManager; + } } From 120ea0e1c1697453f738b705aa8a13b80aec736a Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 10 Jun 2026 23:08:45 +0800 Subject: [PATCH 036/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=20dependency=20?= =?UTF-8?q?=E5=92=8C=E7=BB=9F=E8=AE=A1=E6=8A=A5=E8=A1=A8=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E9=93=BE=E8=B7=AF=E5=88=B0=20Spring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/CatHomeSpringConfiguration.java | 239 ++++++++++++++++++ .../graph/DependencyItemBuilder.java | 4 + .../task/DependencyReportBuilder.java | 20 ++ .../task/heavy/HeavyReportBuilder.java | 20 ++ .../statistics/task/jar/JarReportBuilder.java | 20 ++ .../task/service/ClientReportBuilder.java | 32 +++ .../task/service/ServiceReportBuilder.java | 20 ++ .../utilization/UtilizationReportBuilder.java | 44 ++++ 8 files changed, 399 insertions(+) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 34f6dbc758..d74921e5cf 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -132,20 +132,26 @@ import com.dianping.cat.report.DomainValidator; import com.dianping.cat.report.page.DomainGroupConfigManager; import com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager; +import com.dianping.cat.report.page.dependency.graph.DependencyItemBuilder; import com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager; +import com.dianping.cat.report.page.dependency.graph.TopologyGraphBuilder; import com.dianping.cat.report.page.business.graph.BusinessDataFetcher; import com.dianping.cat.report.page.business.graph.CustomDataCalculator; import com.dianping.cat.report.page.business.service.LocalBusinessService; import com.dianping.cat.report.page.business.service.BusinessReportService; import com.dianping.cat.report.page.business.task.BusinessKeyHelper; import com.dianping.cat.report.page.business.task.BusinessPointParser; +import com.dianping.cat.report.page.cross.service.CrossReportService; import com.dianping.cat.report.page.cross.service.LocalCrossService; +import com.dianping.cat.report.page.dependency.service.DependencyReportService; import com.dianping.cat.report.page.dependency.service.LocalDependencyService; +import com.dianping.cat.report.page.dependency.task.DependencyReportBuilder; import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; import com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService; import com.dianping.cat.report.page.heartbeat.service.LocalHeartbeatService; import com.dianping.cat.report.page.heartbeat.task.HeartbeatReportBuilder; import com.dianping.cat.report.page.logview.service.LocalMessageService; +import com.dianping.cat.report.page.matrix.service.MatrixReportService; import com.dianping.cat.report.page.matrix.service.LocalMatrixService; import com.dianping.cat.report.page.metric.service.BaselineService; import com.dianping.cat.report.page.metric.service.DefaultBaselineService; @@ -157,6 +163,16 @@ import com.dianping.cat.report.page.problem.service.HistoricalProblemService; import com.dianping.cat.report.page.problem.service.LocalProblemService; import com.dianping.cat.report.page.problem.service.ProblemReportService; +import com.dianping.cat.report.page.statistics.service.ClientReportService; +import com.dianping.cat.report.page.statistics.service.HeavyReportService; +import com.dianping.cat.report.page.statistics.service.JarReportService; +import com.dianping.cat.report.page.statistics.service.ServiceReportService; +import com.dianping.cat.report.page.statistics.service.UtilizationReportService; +import com.dianping.cat.report.page.statistics.task.heavy.HeavyReportBuilder; +import com.dianping.cat.report.page.statistics.task.jar.JarReportBuilder; +import com.dianping.cat.report.page.statistics.task.service.ClientReportBuilder; +import com.dianping.cat.report.page.statistics.task.service.ServiceReportBuilder; +import com.dianping.cat.report.page.statistics.task.utilization.UtilizationReportBuilder; import com.dianping.cat.report.page.storage.config.StorageGroupConfigManager; import com.dianping.cat.report.page.storage.service.LocalStorageService; import com.dianping.cat.report.server.RemoteServersManager; @@ -168,7 +184,9 @@ import com.dianping.cat.report.page.state.service.LocalStateService; import com.dianping.cat.report.page.state.service.StateReportService; import com.dianping.cat.report.page.top.service.LocalTopService; +import com.dianping.cat.report.page.transaction.service.TransactionReportService; import com.dianping.cat.report.page.transaction.service.LocalTransactionService; +import com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper; import com.dianping.cat.report.LocalReportBucket; import com.dianping.cat.report.ReportBucket; import com.dianping.cat.report.ReportBucketFactory; @@ -298,6 +316,227 @@ public TaskBuilder heartbeatReportBuilder(HeartbeatReportService heartbeatReport return builder; } + @Bean + public DependencyReportService dependencyReportService(HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + DependencyReportService service = new DependencyReportService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + return service; + } + + @Bean + public DependencyItemBuilder dependencyItemBuilder(TopologyGraphConfigManager topologyGraphConfigManager) { + DependencyItemBuilder builder = new DependencyItemBuilder(); + + builder.setGraphConfigManager(topologyGraphConfigManager); + return builder; + } + + @Bean + public TopologyGraphBuilder topologyGraphBuilder(DependencyItemBuilder dependencyItemBuilder) { + TopologyGraphBuilder builder = new TopologyGraphBuilder(); + + builder.setItemBuilder(dependencyItemBuilder); + return builder; + } + + @Bean(name = DependencyReportBuilder.ID) + public TaskBuilder dependencyReportBuilder(DependencyReportService dependencyReportService, + TopologyGraphBuilder topologyGraphBuilder, TopologyGraphRepository topologyGraphRepository) { + DependencyReportBuilder builder = new DependencyReportBuilder(); + + builder.setReportService(dependencyReportService); + builder.setGraphBuilder(topologyGraphBuilder); + builder.setTopologyGraphDao(topologyGraphRepository); + return builder; + } + + @Bean + public JarReportService jarReportService(HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + JarReportService service = new JarReportService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + return service; + } + + @Bean(name = JarReportBuilder.ID) + public TaskBuilder jarReportBuilder(JarReportService jarReportService, HeartbeatReportService heartbeatReportService, + ServerFilterConfigManager serverFilterConfigManager) { + JarReportBuilder builder = new JarReportBuilder(); + + builder.setReportService(jarReportService); + builder.setHeartbeatReportService(heartbeatReportService); + builder.setConfigManager(serverFilterConfigManager); + return builder; + } + + @Bean + public MatrixReportService matrixReportService(HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + MatrixReportService service = new MatrixReportService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + return service; + } + + @Bean + public HeavyReportService heavyReportService(HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + HeavyReportService service = new HeavyReportService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + return service; + } + + @Bean(name = HeavyReportBuilder.ID) + public TaskBuilder heavyReportBuilder(HeavyReportService heavyReportService, MatrixReportService matrixReportService, + ServerFilterConfigManager serverFilterConfigManager) { + HeavyReportBuilder builder = new HeavyReportBuilder(); + + builder.setReportService(heavyReportService); + builder.setMatrixReportService(matrixReportService); + builder.setConfigManager(serverFilterConfigManager); + return builder; + } + + @Bean + public TransactionReportService transactionReportService(HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + TransactionReportService service = new TransactionReportService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + return service; + } + + @Bean + public CrossReportService crossReportService(HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + CrossReportService service = new CrossReportService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + return service; + } + + @Bean + public TransactionMergeHelper transactionMergeHelper() { + return new TransactionMergeHelper(); + } + + @Bean + public ClientReportService clientReportService(HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + ClientReportService service = new ClientReportService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + return service; + } + + @Bean + public ServiceReportService serviceReportService(HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + ServiceReportService service = new ServiceReportService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + return service; + } + + @Bean(name = ClientReportBuilder.ID) + public TaskBuilder clientReportBuilder(ClientReportService clientReportService, + TransactionReportService transactionReportService, ServerFilterConfigManager serverFilterConfigManager, + ProjectService projectService, TransactionMergeHelper transactionMergeHelper) { + ClientReportBuilder builder = new ClientReportBuilder(); + + builder.setReportService(clientReportService); + builder.setTransactionReportService(transactionReportService); + builder.setConfigManager(serverFilterConfigManager); + builder.setProjectService(projectService); + builder.setMergeHelper(transactionMergeHelper); + return builder; + } + + @Bean(name = ServiceReportBuilder.ID) + public TaskBuilder serviceReportBuilder(ServiceReportService serviceReportService, CrossReportService crossReportService, + ServerFilterConfigManager serverFilterConfigManager) { + ServiceReportBuilder builder = new ServiceReportBuilder(); + + builder.setReportService(serviceReportService); + builder.setCrossReportService(crossReportService); + builder.setConfigManager(serverFilterConfigManager); + return builder; + } + + @Bean + public UtilizationReportService utilizationReportService(HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + UtilizationReportService service = new UtilizationReportService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + return service; + } + + @Bean(name = UtilizationReportBuilder.ID) + public TaskBuilder utilizationReportBuilder(UtilizationReportService utilizationReportService, + TransactionReportService transactionReportService, HeartbeatReportService heartbeatReportService, + CrossReportService crossReportService, TransactionMergeHelper transactionMergeHelper, + ServerFilterConfigManager serverFilterConfigManager) { + UtilizationReportBuilder builder = new UtilizationReportBuilder(); + + builder.setReportService(utilizationReportService); + builder.setTransactionReportService(transactionReportService); + builder.setHeartbeatReportService(heartbeatReportService); + builder.setCrossReportService(crossReportService); + builder.setMergeHelper(transactionMergeHelper); + builder.setConfigManager(serverFilterConfigManager); + return builder; + } + @Bean public RouterConfigHandler routerConfigHandler(StateReportService stateReportService, RouterConfigManager routerConfigManager, RouterConfigService routerConfigService, diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/DependencyItemBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/DependencyItemBuilder.java index 75389ef448..0195de712c 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/DependencyItemBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/DependencyItemBuilder.java @@ -98,4 +98,8 @@ public TopologyNode createNode(String domain) { return node; } + public void setGraphConfigManager(TopologyGraphConfigManager graphConfigManager) { + m_graphConfigManager = graphConfigManager; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java index 806a0a1208..5b425f46b7 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java @@ -116,11 +116,31 @@ public boolean buildWeeklyTask(String name, String reportDomain, Date reportPeri } private void refreshSpringBeans() { + DependencyReportService reportService = CatSpringContext.getBeanIfAvailable(DependencyReportService.class); TopologyGraphRepository topologyGraphDao = CatSpringContext.getBeanIfAvailable(TopologyGraphRepository.class); + TopologyGraphBuilder graphBuilder = CatSpringContext.getBeanIfAvailable(TopologyGraphBuilder.class); + if (reportService != null) { + m_reportService = reportService; + } if (topologyGraphDao != null) { m_topologyGraphDao = topologyGraphDao; } + if (graphBuilder != null) { + m_graphBuilder = graphBuilder; + } + } + + public void setGraphBuilder(TopologyGraphBuilder graphBuilder) { + m_graphBuilder = graphBuilder; + } + + public void setReportService(DependencyReportService reportService) { + m_reportService = reportService; + } + + public void setTopologyGraphDao(TopologyGraphRepository topologyGraphDao) { + m_topologyGraphDao = topologyGraphDao; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java index fbfa471bd6..f130568c2c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java @@ -190,11 +190,31 @@ private HeavyReport queryHourlyReportsByDuration(String name, String domain, Dat } private void refreshSpringBeans() { + HeavyReportService reportService = CatSpringContext.getBeanIfAvailable(HeavyReportService.class); + MatrixReportService matrixReportService = CatSpringContext.getBeanIfAvailable(MatrixReportService.class); ServerFilterConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + if (reportService != null) { + m_reportService = reportService; + } + if (matrixReportService != null) { + m_matrixReportService = matrixReportService; + } if (configManager != null) { m_configManager = configManager; } } + public void setConfigManager(ServerFilterConfigManager configManager) { + m_configManager = configManager; + } + + public void setMatrixReportService(MatrixReportService matrixReportService) { + m_matrixReportService = matrixReportService; + } + + public void setReportService(HeavyReportService reportService) { + m_reportService = reportService; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java index a642c88f80..173b9cf5f6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java @@ -118,13 +118,33 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { } private void refreshSpringBeans() { + JarReportService reportService = CatSpringContext.getBeanIfAvailable(JarReportService.class); + HeartbeatReportService heartbeatReportService = CatSpringContext.getBeanIfAvailable(HeartbeatReportService.class); ServerFilterConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + if (reportService != null) { + m_reportService = reportService; + } + if (heartbeatReportService != null) { + m_heartbeatReportService = heartbeatReportService; + } if (configManager != null) { m_configManager = configManager; } } + public void setConfigManager(ServerFilterConfigManager configManager) { + m_configManager = configManager; + } + + public void setHeartbeatReportService(HeartbeatReportService heartbeatReportService) { + m_heartbeatReportService = heartbeatReportService; + } + + public void setReportService(JarReportService reportService) { + m_reportService = reportService; + } + public class HeartbeatReportVisitor extends BaseVisitor { private String m_currentDomain; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java index 2e801d08cf..64c16aa072 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java @@ -124,15 +124,47 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { } private void refreshSpringBeans() { + ClientReportService reportService = CatSpringContext.getBeanIfAvailable(ClientReportService.class); + TransactionReportService transactionReportService = CatSpringContext.getBeanIfAvailable(TransactionReportService.class); ServerFilterConfigManager configManger = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + TransactionMergeHelper mergeHelper = CatSpringContext.getBeanIfAvailable(TransactionMergeHelper.class); + if (reportService != null) { + m_reportService = reportService; + } + if (transactionReportService != null) { + m_transactionReportService = transactionReportService; + } if (configManger != null) { m_configManger = configManger; } if (projectService != null) { m_projectService = projectService; } + if (mergeHelper != null) { + m_mergeHelper = mergeHelper; + } + } + + public void setConfigManager(ServerFilterConfigManager configManger) { + m_configManger = configManger; + } + + public void setMergeHelper(TransactionMergeHelper mergeHelper) { + m_mergeHelper = mergeHelper; + } + + public void setProjectService(ProjectService projectService) { + m_projectService = projectService; + } + + public void setReportService(ClientReportService reportService) { + m_reportService = reportService; + } + + public void setTransactionReportService(TransactionReportService transactionReportService) { + m_transactionReportService = transactionReportService; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java index dd447caf01..8392ae9114 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java @@ -223,11 +223,31 @@ private boolean validataService(TypeDetailInfo typeInfo) { } private void refreshSpringBeans() { + ServiceReportService reportService = CatSpringContext.getBeanIfAvailable(ServiceReportService.class); + CrossReportService crossReportService = CatSpringContext.getBeanIfAvailable(CrossReportService.class); ServerFilterConfigManager configManger = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + if (reportService != null) { + m_reportService = reportService; + } + if (crossReportService != null) { + m_crossReportService = crossReportService; + } if (configManger != null) { m_configManger = configManger; } } + public void setConfigManager(ServerFilterConfigManager configManger) { + m_configManger = configManger; + } + + public void setCrossReportService(CrossReportService crossReportService) { + m_crossReportService = crossReportService; + } + + public void setReportService(ServiceReportService reportService) { + m_reportService = reportService; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java index 36488cb42d..2f3964b3c3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java @@ -265,11 +265,55 @@ private boolean validataService(String projectName) { } private void refreshSpringBeans() { + UtilizationReportService reportService = CatSpringContext.getBeanIfAvailable(UtilizationReportService.class); + TransactionReportService transactionReportService = CatSpringContext.getBeanIfAvailable(TransactionReportService.class); + HeartbeatReportService heartbeatReportService = CatSpringContext.getBeanIfAvailable(HeartbeatReportService.class); + CrossReportService crossReportService = CatSpringContext.getBeanIfAvailable(CrossReportService.class); + TransactionMergeHelper mergeHelper = CatSpringContext.getBeanIfAvailable(TransactionMergeHelper.class); ServerFilterConfigManager configManger = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + if (reportService != null) { + m_reportService = reportService; + } + if (transactionReportService != null) { + m_transactionReportService = transactionReportService; + } + if (heartbeatReportService != null) { + m_heartbeatReportService = heartbeatReportService; + } + if (crossReportService != null) { + m_crossReportService = crossReportService; + } + if (mergeHelper != null) { + m_mergeHelper = mergeHelper; + } if (configManger != null) { m_configManger = configManger; } } + public void setConfigManager(ServerFilterConfigManager configManger) { + m_configManger = configManger; + } + + public void setCrossReportService(CrossReportService crossReportService) { + m_crossReportService = crossReportService; + } + + public void setHeartbeatReportService(HeartbeatReportService heartbeatReportService) { + m_heartbeatReportService = heartbeatReportService; + } + + public void setMergeHelper(TransactionMergeHelper mergeHelper) { + m_mergeHelper = mergeHelper; + } + + public void setReportService(UtilizationReportService reportService) { + m_reportService = reportService; + } + + public void setTransactionReportService(TransactionReportService transactionReportService) { + m_transactionReportService = transactionReportService; + } + } From 1192c3ed551720a7f72c8b9a777cd359ea8a2481 Mon Sep 17 00:00:00 2001 From: Shang Date: Thu, 11 Jun 2026 08:25:27 +0800 Subject: [PATCH 037/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=20StateReportBuilder?= =?UTF-8?q?=20=E5=88=B0=20Spring=20=E5=B9=B6=E9=98=B2=E6=AD=A2=20current?= =?UTF-8?q?=20=E4=BB=BB=E5=8A=A1=E9=87=8D=E5=A4=8D=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/CatHomeSpringConfiguration.java | 15 ++++++++++ .../cat/report/page/state/Handler.java | 21 ++++++++++++++ .../page/state/task/StateReportBuilder.java | 28 +++++++++++++++++++ .../CurrentWeeklyMonthlyReportTask.java | 14 +++++++++- 4 files changed, 77 insertions(+), 1 deletion(-) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index d74921e5cf..fbca4cea92 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -183,6 +183,7 @@ import com.dianping.cat.report.task.current.CurrentReportBuilder; import com.dianping.cat.report.page.state.service.LocalStateService; import com.dianping.cat.report.page.state.service.StateReportService; +import com.dianping.cat.report.page.state.task.StateReportBuilder; import com.dianping.cat.report.page.top.service.LocalTopService; import com.dianping.cat.report.page.transaction.service.TransactionReportService; import com.dianping.cat.report.page.transaction.service.LocalTransactionService; @@ -279,6 +280,20 @@ public StateReportService stateReportService(HourlyReportRepository hourlyReport return service; } + @Bean(name = StateReportBuilder.ID, initMethod = "initialize") + public TaskBuilder stateReportBuilder(StateReportService stateReportService, ServerConfigManager serverConfigManager, + ServerFilterConfigManager serverFilterConfigManager, ProjectService projectService, + HostinfoService hostinfoService) { + StateReportBuilder builder = new StateReportBuilder(); + + builder.setReportService(stateReportService); + builder.setServerConfigManager(serverConfigManager); + builder.setServerFilterConfigManager(serverFilterConfigManager); + builder.setProjectService(projectService); + builder.setHostinfoService(hostinfoService); + return builder; + } + @Bean public RouterConfigService routerConfigService(RouterConfigManager routerConfigManager, HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java index 7e4d7e3426..163798ca28 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java @@ -22,6 +22,8 @@ import java.io.IOException; import java.util.Date; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.tuple.Pair; @@ -34,6 +36,7 @@ import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.consumer.state.StateAnalyzer; import com.dianping.cat.consumer.state.model.entity.StateReport; +import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.mvc.PayloadNormalizer; import com.dianping.cat.report.ReportPage; @@ -46,6 +49,8 @@ import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); + @Inject private JspViewer m_jspViewer; @@ -70,6 +75,7 @@ public class Handler implements PageHandler { private void buildDisplayInfo(Model model, Payload payload, StateReport report) { refreshSpringBeans(); + report = ensureReport(report, payload); StateDisplay display = new StateDisplay(payload.getIpAddress(), m_serverFilterConfigManager.getUnusedDomains()); display.setSortType(payload.getSort()); @@ -101,6 +107,21 @@ private StateReport getHourlyReport(Payload payload) { } } + private StateReport ensureReport(StateReport report, Payload payload) { + if (report != null) { + return report; + } + + long startTime = payload.getDate(); + StateReport empty = new StateReport(Constants.CAT); + + empty.setStartTime(new Date(startTime)); + empty.setEndTime(new Date(startTime + TimeHelper.ONE_HOUR - 1)); + LOGGER.warn("State report is missing, using empty report, action={}, period={}, ip={}.", payload.getAction(), + empty.getStartTime(), payload.getIpAddress()); + return empty; + } + @Override @PayloadMeta(Payload.class) @InboundActionMeta(name = StateAnalyzer.ID) diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java index e318e2a632..21fe051e1c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java @@ -241,11 +241,16 @@ private void updateProjectAndHost(String domain, String ip) { } private void refreshSpringBeans() { + StateReportService reportService = CatSpringContext.getBeanIfAvailable(StateReportService.class); ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); ServerFilterConfigManager serverFilterConfigManager = CatSpringContext .getBeanIfAvailable(ServerFilterConfigManager.class); ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + HostinfoService hostinfoService = CatSpringContext.getBeanIfAvailable(HostinfoService.class); + if (reportService != null) { + m_reportService = reportService; + } if (serverConfigManager != null) { m_serverConfigManager = serverConfigManager; } @@ -255,6 +260,29 @@ private void refreshSpringBeans() { if (projectService != null) { m_projectService = projectService; } + if (hostinfoService != null) { + m_hostinfoService = hostinfoService; + } + } + + public void setHostinfoService(HostinfoService hostinfoService) { + m_hostinfoService = hostinfoService; + } + + public void setProjectService(ProjectService projectService) { + m_projectService = projectService; + } + + public void setReportService(StateReportService reportService) { + m_reportService = reportService; + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + m_serverConfigManager = serverConfigManager; + } + + public void setServerFilterConfigManager(ServerFilterConfigManager serverFilterConfigManager) { + m_serverFilterConfigManager = serverFilterConfigManager; } public static class ClearDetailInfo extends BaseVisitor { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentWeeklyMonthlyReportTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentWeeklyMonthlyReportTask.java index 1ca4efecc6..6858d0b129 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentWeeklyMonthlyReportTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentWeeklyMonthlyReportTask.java @@ -20,7 +20,9 @@ import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,6 +39,8 @@ public class CurrentWeeklyMonthlyReportTask implements Task { private List m_tasks = new ArrayList(); + private Set m_registeredReports = new HashSet(); + private List m_domains; public static CurrentWeeklyMonthlyReportTask getInstance() { @@ -50,9 +54,17 @@ public String getName() { public void register(CurrentWeeklyMonthlyTask handler) { synchronized (this) { + String reportName = handler.getReportName(); + + if (m_registeredReports.contains(reportName)) { + LOGGER.warn("Skipped duplicate current weekly/monthly report task, reportName={}, taskCount={}.", + reportName, m_tasks.size()); + return; + } + m_registeredReports.add(reportName); m_tasks.add(handler); LOGGER.info("Registered current weekly/monthly report task, reportName={}, taskCount={}.", - handler.getReportName(), m_tasks.size()); + reportName, m_tasks.size()); } } From 2f8dcaa49894c6ed8cec69a562c2868632a39263 Mon Sep 17 00:00:00 2001 From: Shang Date: Thu, 11 Jun 2026 08:54:47 +0800 Subject: [PATCH 038/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=A4=9A=E7=B1=BB?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=20Builder=20=E5=88=B0=20Spring=20=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/CatHomeSpringConfiguration.java | 85 +++++++++++++++++++ .../page/cross/task/CrossReportBuilder.java | 17 ++++ .../page/event/task/EventReportBuilder.java | 16 ++++ .../page/matrix/task/MatrixReportBuilder.java | 17 ++++ .../problem/task/ProblemReportBuilder.java | 17 ++++ .../storage/task/StorageReportBuilder.java | 25 ++++++ 6 files changed, 177 insertions(+) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index fbca4cea92..bcde0050dd 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -143,9 +143,12 @@ import com.dianping.cat.report.page.business.task.BusinessPointParser; import com.dianping.cat.report.page.cross.service.CrossReportService; import com.dianping.cat.report.page.cross.service.LocalCrossService; +import com.dianping.cat.report.page.cross.task.CrossReportBuilder; import com.dianping.cat.report.page.dependency.service.DependencyReportService; import com.dianping.cat.report.page.dependency.service.LocalDependencyService; import com.dianping.cat.report.page.dependency.task.DependencyReportBuilder; +import com.dianping.cat.report.page.event.service.EventReportService; +import com.dianping.cat.report.page.event.task.EventReportBuilder; import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; import com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService; import com.dianping.cat.report.page.heartbeat.service.LocalHeartbeatService; @@ -153,6 +156,7 @@ import com.dianping.cat.report.page.logview.service.LocalMessageService; import com.dianping.cat.report.page.matrix.service.MatrixReportService; import com.dianping.cat.report.page.matrix.service.LocalMatrixService; +import com.dianping.cat.report.page.matrix.task.MatrixReportBuilder; import com.dianping.cat.report.page.metric.service.BaselineService; import com.dianping.cat.report.page.metric.service.DefaultBaselineService; import com.dianping.cat.report.page.metric.task.BaselineConfigManager; @@ -163,6 +167,7 @@ import com.dianping.cat.report.page.problem.service.HistoricalProblemService; import com.dianping.cat.report.page.problem.service.LocalProblemService; import com.dianping.cat.report.page.problem.service.ProblemReportService; +import com.dianping.cat.report.page.problem.task.ProblemReportBuilder; import com.dianping.cat.report.page.statistics.service.ClientReportService; import com.dianping.cat.report.page.statistics.service.HeavyReportService; import com.dianping.cat.report.page.statistics.service.JarReportService; @@ -175,6 +180,9 @@ import com.dianping.cat.report.page.statistics.task.utilization.UtilizationReportBuilder; import com.dianping.cat.report.page.storage.config.StorageGroupConfigManager; import com.dianping.cat.report.page.storage.service.LocalStorageService; +import com.dianping.cat.report.page.storage.task.StorageReportBuilder; +import com.dianping.cat.report.page.storage.task.StorageReportService; +import com.dianping.cat.report.page.storage.transform.StorageMergeHelper; import com.dianping.cat.report.server.RemoteServersManager; import com.dianping.cat.report.service.AbstractReportService; import com.dianping.cat.report.service.LocalModelService; @@ -294,6 +302,31 @@ public TaskBuilder stateReportBuilder(StateReportService stateReportService, Ser return builder; } + @Bean + public EventReportService eventReportService(HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + EventReportService service = new EventReportService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + return service; + } + + @Bean(name = EventReportBuilder.ID, initMethod = "initialize") + public TaskBuilder eventReportBuilder(EventReportService eventReportService, ServerConfigManager serverConfigManager, + AtomicMessageConfigManager atomicMessageConfigManager) { + EventReportBuilder builder = new EventReportBuilder(); + + builder.setReportService(eventReportService); + builder.setServerConfigManager(serverConfigManager); + builder.setAtomicMessageConfigManager(atomicMessageConfigManager); + return builder; + } + @Bean public RouterConfigService routerConfigService(RouterConfigManager routerConfigManager, HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, @@ -411,6 +444,14 @@ public MatrixReportService matrixReportService(HourlyReportRepository hourlyRepo return service; } + @Bean(name = MatrixReportBuilder.ID, initMethod = "initialize") + public TaskBuilder matrixReportBuilder(MatrixReportService matrixReportService) { + MatrixReportBuilder builder = new MatrixReportBuilder(); + + builder.setReportService(matrixReportService); + return builder; + } + @Bean public HeavyReportService heavyReportService(HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, @@ -464,6 +505,14 @@ public CrossReportService crossReportService(HourlyReportRepository hourlyReport return service; } + @Bean(name = CrossReportBuilder.ID, initMethod = "initialize") + public TaskBuilder crossReportBuilder(CrossReportService crossReportService) { + CrossReportBuilder builder = new CrossReportBuilder(); + + builder.setReportService(crossReportService); + return builder; + } + @Bean public TransactionMergeHelper transactionMergeHelper() { return new TransactionMergeHelper(); @@ -897,6 +946,42 @@ public ProblemReportService problemReportService() { return new ProblemReportService(); } + @Bean(initMethod = "initialize") + public TaskBuilder problemReportBuilder(ProblemReportService problemReportService) { + ProblemReportBuilder builder = new ProblemReportBuilder(); + + builder.setReportService(problemReportService); + return builder; + } + + @Bean + public StorageReportService storageReportService(HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + StorageReportService service = new StorageReportService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + return service; + } + + @Bean + public StorageMergeHelper storageMergeHelper() { + return new StorageMergeHelper(); + } + + @Bean(initMethod = "initialize") + public TaskBuilder storageReportBuilder(StorageReportService storageReportService, StorageMergeHelper storageMergeHelper) { + StorageReportBuilder builder = new StorageReportBuilder(); + + builder.setReportService(storageReportService); + builder.setStorageMergerHelper(storageMergeHelper); + return builder; + } + @Bean(initMethod = "initialize", name = "problem-historical") public ModelService historicalProblemService(ProblemReportService problemReportService, ServerConfigManager serverConfigManager) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java index bf5d91e2ac..e434467037 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java @@ -42,6 +42,7 @@ import com.dianping.cat.report.task.TaskHelper; import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask; import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = CrossReportBuilder.ID) public class CrossReportBuilder implements TaskBuilder, Initializable { @@ -54,6 +55,7 @@ public class CrossReportBuilder implements TaskBuilder, Initializable { @Override public boolean buildDailyTask(String name, String domain, Date period) { + refreshSpringBeans(); LOGGER.info("Building cross daily report, name={}, domain={}, period={}.", name, domain, period); CrossReport crossReport = queryHourlyReportsByDuration(name, domain, period, TaskHelper.tomorrowZero(period)); DailyReport report = new DailyReport(); @@ -75,6 +77,7 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { + refreshSpringBeans(); LOGGER.info("Building cross monthly report, name={}, domain={}, period={}.", name, domain, period); CrossReport crossReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); MonthlyReport report = new MonthlyReport(); @@ -91,6 +94,7 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { + refreshSpringBeans(); LOGGER.info("Building cross weekly report, name={}, domain={}, period={}.", name, domain, period); CrossReport crossReport = queryDailyReportsByDuration(domain, period, new Date(period.getTime() + TimeHelper.ONE_WEEK)); @@ -108,6 +112,7 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); CurrentWeeklyMonthlyReportTask.getInstance().register(new CurrentWeeklyMonthlyTask() { @Override @@ -166,4 +171,16 @@ private CrossReport queryHourlyReportsByDuration(String name, String domain, Dat return crossReport; } + + private void refreshSpringBeans() { + CrossReportService reportService = CatSpringContext.getBeanIfAvailable(CrossReportService.class); + + if (reportService != null) { + m_reportService = reportService; + } + } + + public void setReportService(CrossReportService reportService) { + m_reportService = reportService; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java index 0236cb613a..a2816af497 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java @@ -231,10 +231,14 @@ private EventReport queryHourlyReportsByDuration(String name, String domain, Dat } private void refreshSpringBeans() { + EventReportService reportService = CatSpringContext.getBeanIfAvailable(EventReportService.class); ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); AtomicMessageConfigManager atomicMessageConfigManager = CatSpringContext .getBeanIfAvailable(AtomicMessageConfigManager.class); + if (reportService != null) { + m_reportService = reportService; + } if (serverConfigManager != null) { m_serverConfigManager = serverConfigManager; } @@ -243,4 +247,16 @@ private void refreshSpringBeans() { } } + public void setAtomicMessageConfigManager(AtomicMessageConfigManager atomicMessageConfigManager) { + m_atomicMessageConfigManager = atomicMessageConfigManager; + } + + public void setReportService(EventReportService reportService) { + m_reportService = reportService; + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + m_serverConfigManager = serverConfigManager; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java index beed5fb334..ef8f53f6a9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java @@ -43,6 +43,7 @@ import com.dianping.cat.report.task.TaskHelper; import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask; import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = MatrixReportBuilder.ID) public class MatrixReportBuilder implements TaskBuilder, Initializable { @@ -55,6 +56,7 @@ public class MatrixReportBuilder implements TaskBuilder, Initializable { @Override public boolean buildDailyTask(String name, String domain, Date period) { + refreshSpringBeans(); LOGGER.info("Building matrix daily report, name={}, domain={}, period={}.", name, domain, period); MatrixReport matrixReport = queryHourlyReportByDuration(name, domain, period, TaskHelper.tomorrowZero(period)); DailyReport report = new DailyReport(); @@ -76,6 +78,7 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { + refreshSpringBeans(); LOGGER.info("Building matrix monthly report, name={}, domain={}, period={}.", name, domain, period); MatrixReport matrixReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); MonthlyReport report = new MonthlyReport(); @@ -92,6 +95,7 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { + refreshSpringBeans(); LOGGER.info("Building matrix weekly report, name={}, domain={}, period={}.", name, domain, period); MatrixReport matrixReport = queryDailyReportsByDuration(domain, period, new Date(period.getTime() + TimeHelper.ONE_WEEK)); @@ -109,6 +113,7 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); CurrentWeeklyMonthlyReportTask.getInstance().register(new CurrentWeeklyMonthlyTask() { @Override @@ -172,4 +177,16 @@ private MatrixReport queryHourlyReportByDuration(String name, String domain, Dat return matrixReport; } + private void refreshSpringBeans() { + MatrixReportService reportService = CatSpringContext.getBeanIfAvailable(MatrixReportService.class); + + if (reportService != null) { + m_reportService = reportService; + } + } + + public void setReportService(MatrixReportService reportService) { + m_reportService = reportService; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java index f28362e316..73d43ae28b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java @@ -44,6 +44,7 @@ import com.dianping.cat.report.task.TaskHelper; import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask; import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = ProblemReportBuilder.ID) public class ProblemReportBuilder implements TaskBuilder, Initializable { @@ -56,6 +57,7 @@ public class ProblemReportBuilder implements TaskBuilder, Initializable { @Override public boolean buildDailyTask(String name, String domain, Date period) { + refreshSpringBeans(); try { ProblemReport problemReport = queryHourlyReportsByDuration(name, domain, period, TaskHelper.tomorrowZero(period)); @@ -84,6 +86,7 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String domain, Date period) { + refreshSpringBeans(); LOGGER.info("Building problem monthly report, name={}, domain={}, period={}.", name, domain, period); ProblemReport problemReport = queryDailyReportsByDuration(domain, period, TaskHelper.nextMonthStart(period)); @@ -103,6 +106,7 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { @Override public boolean buildWeeklyTask(String name, String domain, Date period) { + refreshSpringBeans(); LOGGER.info("Building problem weekly report, name={}, domain={}, period={}.", name, domain, period); ProblemReport problemReport = queryDailyReportsByDuration(domain, period, new Date(period.getTime() + TimeHelper.ONE_WEEK)); @@ -120,6 +124,7 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); CurrentWeeklyMonthlyReportTask.getInstance().register(new CurrentWeeklyMonthlyTask() { @Override @@ -192,4 +197,16 @@ private ProblemReport queryHourlyReportsByDuration(String name, String domain, D dailyReport.setEndTime(end); return dailyReport; } + + private void refreshSpringBeans() { + ProblemReportService reportService = CatSpringContext.getBeanIfAvailable(ProblemReportService.class); + + if (reportService != null) { + m_reportService = reportService; + } + } + + public void setReportService(ProblemReportService reportService) { + m_reportService = reportService; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java index 21a6143d1c..aba2ae0adc 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java @@ -45,6 +45,7 @@ import com.dianping.cat.report.task.TaskHelper; import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask; import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = StorageReportBuilder.ID) public class StorageReportBuilder implements TaskBuilder, Initializable { @@ -60,6 +61,7 @@ public class StorageReportBuilder implements TaskBuilder, Initializable { @Override public boolean buildDailyTask(String name, String reportId, Date period) { + refreshSpringBeans(); LOGGER.info("Building storage daily report, name={}, reportId={}, period={}.", name, reportId, period); try { StorageReport storageReport = queryHourlyReportsByDuration(reportId, period, TaskHelper.tomorrowZero(period)); @@ -89,6 +91,7 @@ public boolean buildHourlyTask(String name, String domain, Date period) { @Override public boolean buildMonthlyTask(String name, String reportId, Date period) { + refreshSpringBeans(); LOGGER.info("Building storage monthly report, name={}, reportId={}, period={}.", name, reportId, period); Date end = null; @@ -113,6 +116,7 @@ public boolean buildMonthlyTask(String name, String reportId, Date period) { @Override public boolean buildWeeklyTask(String name, String reportId, Date period) { + refreshSpringBeans(); LOGGER.info("Building storage weekly report, name={}, reportId={}, period={}.", name, reportId, period); Date end = null; @@ -186,6 +190,7 @@ private StorageReport queryHourlyReportsByDuration(String reportId, Date start, @Override public void initialize() throws InitializationException { + refreshSpringBeans(); CurrentWeeklyMonthlyReportTask.getInstance().register(new CurrentWeeklyMonthlyTask() { @Override @@ -217,4 +222,24 @@ public String getReportName() { }); } + private void refreshSpringBeans() { + StorageReportService reportService = CatSpringContext.getBeanIfAvailable(StorageReportService.class); + StorageMergeHelper storageMergerHelper = CatSpringContext.getBeanIfAvailable(StorageMergeHelper.class); + + if (reportService != null) { + m_reportService = reportService; + } + if (storageMergerHelper != null) { + m_storageMergerHelper = storageMergerHelper; + } + } + + public void setReportService(StorageReportService reportService) { + m_reportService = reportService; + } + + public void setStorageMergerHelper(StorageMergeHelper storageMergerHelper) { + m_storageMergerHelper = storageMergerHelper; + } + } From 9fef9ecbd9dfbd43a8067d7fcc2cbc9b570f1fe2 Mon Sep 17 00:00:00 2001 From: Shang Date: Thu, 11 Jun 2026 10:08:30 +0800 Subject: [PATCH 039/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E7=A6=BB=E7=BA=BF?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E9=93=BE=E5=88=B0=20Spring=20=E5=B9=B6?= =?UTF-8?q?=E8=A1=A5=E5=BC=BA=20MyBatis=20Repository=20=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SpringBackedRepositorySupport.java | 24 ++ .../spring/CatHomeSpringConfiguration.java | 240 ++++++++++++++++-- .../graph/metric/AbstractGraphCreator.java | 12 + .../business/graph/BusinessGraphCreator.java | 28 ++ .../service/CachedBusinessReportService.java | 13 +- .../service/HistoricalBusinessService.java | 4 + .../task/BusinessBaselineReportBuilder.java | 28 ++ .../overload/task/DailyCapacityUpdater.java | 20 ++ .../overload/task/HourlyCapacityUpdater.java | 20 ++ .../overload/task/MonthlyCapacityUpdater.java | 20 ++ .../overload/task/WeeklyCapacityUpdater.java | 20 ++ .../task/TransactionReportBuilder.java | 20 +- .../cat/report/task/ReportFacade.java | 46 +++- .../task/cmdb/CmdbInfoReloadBuilder.java | 14 + .../report/task/cmdb/ProjectUpdateTask.java | 16 ++ .../cat/report/task/ReportFacadeTest.java | 71 ++++++ 16 files changed, 565 insertions(+), 31 deletions(-) create mode 100644 cat-home/src/test/java/com/dianping/cat/report/task/ReportFacadeTest.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java index 485c9eef37..52f6fb0ce2 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java @@ -4,6 +4,7 @@ import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; @@ -26,6 +27,10 @@ public abstract class SpringBackedRepositorySupport { private volatile SqlSessionFactory m_sqlSessionFactory; + private SqlSessionTemplate m_sqlSessionTemplate; + + private TransactionTemplate m_transactionTemplate; + protected SpringBackedRepositorySupport(Class mapperClass, String mapperResource, String springMapperMessage) { m_mapperClass = mapperClass; @@ -38,14 +43,33 @@ protected SqlSession openSession() { } protected T springMapper(Logger logger) { + SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; + + if (sqlSessionTemplate != null) { + if (m_springMapperLogged.compareAndSet(false, true)) { + logger.info(m_springMapperMessage); + } + return sqlSessionTemplate.getMapper(m_mapperClass); + } return SupportingMyBatisRepository.springMapper(m_mapperClass, logger, m_springMapperLogged, m_springMapperMessage); } protected TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate != null) { + return m_transactionTemplate; + } return SupportingMyBatisRepository.springTransactionTemplate(); } + public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { + m_sqlSessionTemplate = sqlSessionTemplate; + } + + public void setTransactionTemplate(TransactionTemplate transactionTemplate) { + m_transactionTemplate = transactionTemplate; + } + private SqlSessionFactory getSqlSessionFactory() { SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index bcde0050dd..9d35309975 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -59,6 +59,7 @@ import com.dianping.cat.consumer.top.model.entity.TopReport; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.config.AlertPolicyManager; import com.dianping.cat.alarm.spi.config.SenderConfigManager; @@ -130,6 +131,8 @@ import com.dianping.cat.report.alert.transaction.TransactionRuleConfigManager; import com.dianping.cat.report.alert.AlarmManager; import com.dianping.cat.report.DomainValidator; +import com.dianping.cat.report.graph.metric.DataExtractor; +import com.dianping.cat.report.graph.metric.impl.DataExtractorImpl; import com.dianping.cat.report.page.DomainGroupConfigManager; import com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager; import com.dianping.cat.report.page.dependency.graph.DependencyItemBuilder; @@ -137,8 +140,12 @@ import com.dianping.cat.report.page.dependency.graph.TopologyGraphBuilder; import com.dianping.cat.report.page.business.graph.BusinessDataFetcher; import com.dianping.cat.report.page.business.graph.CustomDataCalculator; +import com.dianping.cat.report.page.business.service.CachedBusinessReportService; +import com.dianping.cat.report.page.business.service.CompositeBusinessService; +import com.dianping.cat.report.page.business.service.HistoricalBusinessService; import com.dianping.cat.report.page.business.service.LocalBusinessService; import com.dianping.cat.report.page.business.service.BusinessReportService; +import com.dianping.cat.report.page.business.task.BusinessBaselineReportBuilder; import com.dianping.cat.report.page.business.task.BusinessKeyHelper; import com.dianping.cat.report.page.business.task.BusinessPointParser; import com.dianping.cat.report.page.cross.service.CrossReportService; @@ -162,6 +169,13 @@ import com.dianping.cat.report.page.metric.task.BaselineConfigManager; import com.dianping.cat.report.page.metric.task.BaselineCreator; import com.dianping.cat.report.page.metric.task.DefaultBaselineCreator; +import com.dianping.cat.report.page.overload.task.CapacityUpdateStatusManager; +import com.dianping.cat.report.page.overload.task.CapacityUpdateTask; +import com.dianping.cat.report.page.overload.task.CapacityUpdater; +import com.dianping.cat.report.page.overload.task.DailyCapacityUpdater; +import com.dianping.cat.report.page.overload.task.HourlyCapacityUpdater; +import com.dianping.cat.report.page.overload.task.MonthlyCapacityUpdater; +import com.dianping.cat.report.page.overload.task.WeeklyCapacityUpdater; import com.dianping.cat.report.page.event.service.LocalEventService; import com.dianping.cat.report.page.problem.service.CompositeProblemService; import com.dianping.cat.report.page.problem.service.HistoricalProblemService; @@ -189,12 +203,15 @@ import com.dianping.cat.report.service.ModelService; import com.dianping.cat.report.task.TaskBuilder; import com.dianping.cat.report.task.current.CurrentReportBuilder; +import com.dianping.cat.report.task.cmdb.CmdbInfoReloadBuilder; +import com.dianping.cat.report.task.cmdb.ProjectUpdateTask; import com.dianping.cat.report.page.state.service.LocalStateService; import com.dianping.cat.report.page.state.service.StateReportService; import com.dianping.cat.report.page.state.task.StateReportBuilder; import com.dianping.cat.report.page.top.service.LocalTopService; import com.dianping.cat.report.page.transaction.service.TransactionReportService; import com.dianping.cat.report.page.transaction.service.LocalTransactionService; +import com.dianping.cat.report.page.transaction.task.TransactionReportBuilder; import com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper; import com.dianping.cat.report.LocalReportBucket; import com.dianping.cat.report.ReportBucket; @@ -274,6 +291,25 @@ public TaskBuilder currentReportBuilder(ProjectService projectService, return builder; } + @Bean + public ProjectUpdateTask projectUpdateTask(HostinfoService hostinfoService, ProjectService projectService, + TransactionReportService transactionReportService) { + ProjectUpdateTask task = new ProjectUpdateTask(); + + task.setHostInfoService(hostinfoService); + task.setProjectService(projectService); + task.setReportService(transactionReportService); + return task; + } + + @Bean(name = CmdbInfoReloadBuilder.ID) + public TaskBuilder cmdbInfoReloadBuilder(ProjectUpdateTask projectUpdateTask) { + CmdbInfoReloadBuilder builder = new CmdbInfoReloadBuilder(); + + builder.setProjectUpdateTask(projectUpdateTask); + return builder; + } + @Bean public StateReportService stateReportService(HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, @@ -491,6 +527,110 @@ public TransactionReportService transactionReportService(HourlyReportRepository return service; } + @Bean(name = TransactionReportBuilder.ID, initMethod = "initialize") + public TaskBuilder transactionReportBuilder(TransactionReportService transactionReportService, + ServerConfigManager serverConfigManager, AtomicMessageConfigManager atomicMessageConfigManager) { + TransactionReportBuilder builder = new TransactionReportBuilder(); + + builder.setReportService(transactionReportService); + builder.setServerConfigManager(serverConfigManager); + builder.setAtomicMessageConfigManager(atomicMessageConfigManager); + return builder; + } + + @Bean(name = BusinessBaselineReportBuilder.ID) + public TaskBuilder businessBaselineReportBuilder(BusinessReportService businessReportService, + BusinessConfigManager businessConfigManager, BaselineConfigManager baselineConfigManager, + BusinessPointParser businessPointParser, BaselineCreator baselineCreator, BaselineService baselineService, + BusinessKeyHelper businessKeyHelper) { + BusinessBaselineReportBuilder builder = new BusinessBaselineReportBuilder(); + + builder.setReportService(businessReportService); + builder.setConfigManager(businessConfigManager); + builder.setBaselineConfigManager(baselineConfigManager); + builder.setParser(businessPointParser); + builder.setBaselineCreator(baselineCreator); + builder.setBaselineService(baselineService); + builder.setKeyHelper(businessKeyHelper); + return builder; + } + + @Bean(initMethod = "initialize") + public CapacityUpdateStatusManager capacityUpdateStatusManager(ConfigRepository configRepository, + OverloadRepository overloadRepository) { + CapacityUpdateStatusManager manager = new CapacityUpdateStatusManager(); + + manager.setConfigDao(configRepository); + manager.setOverloadDao(overloadRepository); + return manager; + } + + @Bean(name = HourlyCapacityUpdater.ID) + public CapacityUpdater hourlyCapacityUpdater(HourlyReportContentRepository hourlyReportContentRepository, + HourlyReportRepository hourlyReportRepository, OverloadRepository overloadRepository, + CapacityUpdateStatusManager capacityUpdateStatusManager) { + HourlyCapacityUpdater updater = new HourlyCapacityUpdater(); + + updater.setHourlyReportContentDao(hourlyReportContentRepository); + updater.setHourlyReportDao(hourlyReportRepository); + updater.setOverloadDao(overloadRepository); + updater.setManager(capacityUpdateStatusManager); + return updater; + } + + @Bean(name = DailyCapacityUpdater.ID) + public CapacityUpdater dailyCapacityUpdater(DailyReportContentRepository dailyReportContentRepository, + DailyReportRepository dailyReportRepository, OverloadRepository overloadRepository, + CapacityUpdateStatusManager capacityUpdateStatusManager) { + DailyCapacityUpdater updater = new DailyCapacityUpdater(); + + updater.setDailyReportContentDao(dailyReportContentRepository); + updater.setDailyReportDao(dailyReportRepository); + updater.setOverloadDao(overloadRepository); + updater.setManager(capacityUpdateStatusManager); + return updater; + } + + @Bean(name = WeeklyCapacityUpdater.ID) + public CapacityUpdater weeklyCapacityUpdater(WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, OverloadRepository overloadRepository, + CapacityUpdateStatusManager capacityUpdateStatusManager) { + WeeklyCapacityUpdater updater = new WeeklyCapacityUpdater(); + + updater.setWeeklyReportDao(weeklyReportRepository); + updater.setWeeklyReportContentDao(weeklyReportContentRepository); + updater.setOverloadDao(overloadRepository); + updater.setManager(capacityUpdateStatusManager); + return updater; + } + + @Bean(name = MonthlyCapacityUpdater.ID) + public CapacityUpdater monthlyCapacityUpdater(MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository, OverloadRepository overloadRepository, + CapacityUpdateStatusManager capacityUpdateStatusManager) { + MonthlyCapacityUpdater updater = new MonthlyCapacityUpdater(); + + updater.setMonthlyReportDao(monthlyReportRepository); + updater.setMonthlyReportContentDao(monthlyReportContentRepository); + updater.setOverloadDao(overloadRepository); + updater.setManager(capacityUpdateStatusManager); + return updater; + } + + @Bean(name = CapacityUpdateTask.ID) + public TaskBuilder capacityUpdateTask(@Qualifier(HourlyCapacityUpdater.ID) CapacityUpdater hourlyCapacityUpdater, + @Qualifier(DailyCapacityUpdater.ID) CapacityUpdater dailyCapacityUpdater, + @Qualifier(WeeklyCapacityUpdater.ID) CapacityUpdater weeklyCapacityUpdater, + @Qualifier(MonthlyCapacityUpdater.ID) CapacityUpdater monthlyCapacityUpdater) { + CapacityUpdateTask task = new CapacityUpdateTask(); + + task.setHourlyUpdater(hourlyCapacityUpdater); + task.setDailyUpdater(dailyCapacityUpdater); + task.setWeeklyUpdater(weeklyCapacityUpdater); + task.setMonthlyUpdater(monthlyCapacityUpdater); + return task; + } + @Bean public CrossReportService crossReportService(HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, @@ -872,28 +1012,33 @@ public MonthlyReportContentRepository monthlyReportContentRepository() { } @Bean - public OverloadRepository overloadRepository() { - return new OverloadRepository(); + public OverloadRepository overloadRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + return configureSpringBackedRepository(new OverloadRepository(), sqlSessionTemplate, transactionTemplate); } @Bean - public AlertRepository alertRepository() { - return new AlertRepository(); + public AlertRepository alertRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + return configureSpringBackedRepository(new AlertRepository(), sqlSessionTemplate, transactionTemplate); } @Bean - public AlterationRepository alterationRepository() { - return new AlterationRepository(); + public AlterationRepository alterationRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + return configureSpringBackedRepository(new AlterationRepository(), sqlSessionTemplate, transactionTemplate); } @Bean - public BaselineRepository baselineRepository() { - return new BaselineRepository(); + public BaselineRepository baselineRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + return configureSpringBackedRepository(new BaselineRepository(), sqlSessionTemplate, transactionTemplate); } @Bean - public TopologyGraphRepository topologyGraphRepository() { - return new TopologyGraphRepository(); + public TopologyGraphRepository topologyGraphRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + return configureSpringBackedRepository(new TopologyGraphRepository(), sqlSessionTemplate, transactionTemplate); } @Bean @@ -902,33 +1047,39 @@ public TaskRepository taskRepository() { } @Bean - public AlertSummaryRepository alertSummaryRepository() { - return new AlertSummaryRepository(); + public AlertSummaryRepository alertSummaryRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + return configureSpringBackedRepository(new AlertSummaryRepository(), sqlSessionTemplate, transactionTemplate); } @Bean - public ConfigModificationRepository configModificationRepository() { - return new ConfigModificationRepository(); + public ConfigModificationRepository configModificationRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + return configureSpringBackedRepository(new ConfigModificationRepository(), sqlSessionTemplate, transactionTemplate); } @Bean - public MetricGraphRepository metricGraphRepository() { - return new MetricGraphRepository(); + public MetricGraphRepository metricGraphRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + return configureSpringBackedRepository(new MetricGraphRepository(), sqlSessionTemplate, transactionTemplate); } @Bean - public MetricScreenRepository metricScreenRepository() { - return new MetricScreenRepository(); + public MetricScreenRepository metricScreenRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + return configureSpringBackedRepository(new MetricScreenRepository(), sqlSessionTemplate, transactionTemplate); } @Bean - public ServerAlarmRuleRepository serverAlarmRuleRepository() { - return new ServerAlarmRuleRepository(); + public ServerAlarmRuleRepository serverAlarmRuleRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + return configureSpringBackedRepository(new ServerAlarmRuleRepository(), sqlSessionTemplate, transactionTemplate); } @Bean - public UserDefineRuleRepository userDefineRuleRepository() { - return new UserDefineRuleRepository(); + public UserDefineRuleRepository userDefineRuleRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + return configureSpringBackedRepository(new UserDefineRuleRepository(), sqlSessionTemplate, transactionTemplate); } @Bean @@ -941,6 +1092,11 @@ public AlarmManager alarmManager() { return new AlarmManager(); } + @Bean + public DataExtractor dataExtractor() { + return new DataExtractorImpl(); + } + @Bean public ProblemReportService problemReportService() { return new ProblemReportService(); @@ -992,6 +1148,16 @@ public ModelService historicalProblemService(ProblemReportService return service; } + @Bean(initMethod = "initialize", name = "business-historical") + public ModelService historicalBusinessService(BusinessReportService businessReportService, + ServerConfigManager serverConfigManager) { + HistoricalBusinessService service = new HistoricalBusinessService(); + + service.setReportService(businessReportService); + service.setConfigManager(serverConfigManager); + return service; + } + @Bean(initMethod = "initialize", name = ProblemAnalyzer.ID) public ModelService problemModelService( @Qualifier("problem-historical") ModelService historicalProblemService, @@ -1005,6 +1171,19 @@ public ModelService problemModelService( return service; } + @Bean(initMethod = "initialize", name = "businessModelService") + public ModelService businessModelService( + @Qualifier("business-historical") ModelService historicalBusinessService, + ServerConfigManager serverConfigManager, RemoteServersManager remoteServersManager) { + CompositeBusinessService service = new CompositeBusinessService(); + List> services = Collections.singletonList(historicalBusinessService); + + service.setServices(services); + service.setConfigManager(serverConfigManager); + service.setServerManager(remoteServersManager); + return service; + } + @Bean(initMethod = "initialize") public LocalModelService localProblemService(ServerConfigManager serverConfigManager, ReportBucketManager reportBucketManager) { @@ -1394,6 +1573,16 @@ public BusinessDataFetcher businessDataFetcher(BusinessKeyHelper businessKeyHelp return fetcher; } + @Bean + public CachedBusinessReportService cachedBusinessReportService(BusinessReportService businessReportService, + @Qualifier("businessModelService") ModelService businessModelService) { + CachedBusinessReportService service = new CachedBusinessReportService(); + + service.setReportService(businessReportService); + service.setModelService(businessModelService); + return service; + } + @Bean public CustomDataCalculator customDataCalculator(BusinessKeyHelper businessKeyHelper) { CustomDataCalculator calculator = new CustomDataCalculator(); @@ -1715,6 +1904,13 @@ private void configureProjectContactor(ProjectContactor contactor, ProjectServic contactor.setConfigManager(alertConfigManager); } + private > T configureSpringBackedRepository(T repository, + SqlSessionTemplate sqlSessionTemplate, TransactionTemplate transactionTemplate) { + repository.setSqlSessionTemplate(sqlSessionTemplate); + repository.setTransactionTemplate(transactionTemplate); + return repository; + } + private void configureReportService(AbstractReportService service, HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, diff --git a/cat-home/src/main/java/com/dianping/cat/report/graph/metric/AbstractGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/graph/metric/AbstractGraphCreator.java index a1a088e504..87d8b06b70 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/graph/metric/AbstractGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/graph/metric/AbstractGraphCreator.java @@ -255,4 +255,16 @@ public Map removeFutureData(Date endDate, final Map response = m_service.invoke(request); BusinessReport report = response.getModel(); - return report; + return report == null ? new BusinessReport(domain) : report; } else { throw new RuntimeException("Internal error: no eligable business service registered for " + request + "!"); } @@ -83,6 +83,9 @@ private BusinessReport getReportFromCache(String domain, long time) { Date end = new Date(time + TimeHelper.ONE_HOUR); result = m_reportService.queryReport(domain, start, end); + if (result == null) { + result = new BusinessReport(domain); + } m_businessReports.put(key, result); } return result; @@ -95,4 +98,12 @@ private void refreshSpringBeans() { m_reportService = reportService; } } + + public void setModelService(ModelService service) { + m_service = service; + } + + public void setReportService(BusinessReportService reportService) { + m_reportService = reportService; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/HistoricalBusinessService.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/HistoricalBusinessService.java index a791ee40be..d0c46849e0 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/HistoricalBusinessService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/HistoricalBusinessService.java @@ -61,4 +61,8 @@ private void refreshSpringBeans() { } } + public void setReportService(BusinessReportService reportService) { + m_reportService = reportService; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java index d1cd1160a1..049a910ae7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java @@ -197,4 +197,32 @@ private void refreshSpringBeans() { } } + public void setBaselineConfigManager(BaselineConfigManager baselineConfigManager) { + m_baselineConfigManager = baselineConfigManager; + } + + public void setBaselineCreator(BaselineCreator baselineCreator) { + m_baselineCreator = baselineCreator; + } + + public void setBaselineService(BaselineService baselineService) { + m_baselineService = baselineService; + } + + public void setConfigManager(BusinessConfigManager configManager) { + m_configManager = configManager; + } + + public void setKeyHelper(BusinessKeyHelper keyHelper) { + m_keyHelper = keyHelper; + } + + public void setParser(BusinessPointParser parser) { + m_parser = parser; + } + + public void setReportService(BusinessReportService reportService) { + m_reportService = reportService; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java index 251e1143d9..2741230e0c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java @@ -118,6 +118,7 @@ private void refreshSpringBeans() { .getBeanIfAvailable(DailyReportContentRepository.class); DailyReportRepository dailyReportDao = CatSpringContext.getBeanIfAvailable(DailyReportRepository.class); OverloadRepository overloadDao = CatSpringContext.getBeanIfAvailable(OverloadRepository.class); + CapacityUpdateStatusManager manager = CatSpringContext.getBeanIfAvailable(CapacityUpdateStatusManager.class); if (dailyReportContentDao != null) { m_dailyReportContentDao = dailyReportContentDao; @@ -128,6 +129,25 @@ private void refreshSpringBeans() { if (overloadDao != null) { m_overloadDao = overloadDao; } + if (manager != null) { + m_manager = manager; + } + } + + public void setDailyReportContentDao(DailyReportContentRepository dailyReportContentDao) { + m_dailyReportContentDao = dailyReportContentDao; + } + + public void setDailyReportDao(DailyReportRepository dailyReportDao) { + m_dailyReportDao = dailyReportDao; + } + + public void setOverloadDao(OverloadRepository overloadDao) { + m_overloadDao = overloadDao; + } + + public void setManager(CapacityUpdateStatusManager manager) { + m_manager = manager; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java index ec44e2c2b4..9776aabcc1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java @@ -120,6 +120,7 @@ private void refreshSpringBeans() { .getBeanIfAvailable(HourlyReportContentRepository.class); HourlyReportRepository hourlyReportDao = CatSpringContext.getBeanIfAvailable(HourlyReportRepository.class); OverloadRepository overloadDao = CatSpringContext.getBeanIfAvailable(OverloadRepository.class); + CapacityUpdateStatusManager manager = CatSpringContext.getBeanIfAvailable(CapacityUpdateStatusManager.class); if (hourlyReportContentDao != null) { m_hourlyReportContentDao = hourlyReportContentDao; @@ -130,6 +131,25 @@ private void refreshSpringBeans() { if (overloadDao != null) { m_overloadDao = overloadDao; } + if (manager != null) { + m_manager = manager; + } + } + + public void setHourlyReportContentDao(HourlyReportContentRepository hourlyReportContentDao) { + m_hourlyReportContentDao = hourlyReportContentDao; + } + + public void setHourlyReportDao(HourlyReportRepository hourlyReportDao) { + m_hourlyReportDao = hourlyReportDao; + } + + public void setOverloadDao(OverloadRepository overloadDao) { + m_overloadDao = overloadDao; + } + + public void setManager(CapacityUpdateStatusManager manager) { + m_manager = manager; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java index 0af22c30e7..0c38162f42 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java @@ -118,6 +118,7 @@ private void refreshSpringBeans() { MonthlyReportContentRepository monthlyReportContentDao = CatSpringContext .getBeanIfAvailable(MonthlyReportContentRepository.class); OverloadRepository overloadDao = CatSpringContext.getBeanIfAvailable(OverloadRepository.class); + CapacityUpdateStatusManager manager = CatSpringContext.getBeanIfAvailable(CapacityUpdateStatusManager.class); if (monthlyReportDao != null) { m_monthlyReportDao = monthlyReportDao; @@ -128,6 +129,25 @@ private void refreshSpringBeans() { if (overloadDao != null) { m_overloadDao = overloadDao; } + if (manager != null) { + m_manager = manager; + } + } + + public void setMonthlyReportDao(MonthlyReportRepository monthlyReportDao) { + m_monthlyReportDao = monthlyReportDao; + } + + public void setMonthlyReportContentDao(MonthlyReportContentRepository monthlyReportContentDao) { + m_monthlyReportContentDao = monthlyReportContentDao; + } + + public void setOverloadDao(OverloadRepository overloadDao) { + m_overloadDao = overloadDao; + } + + public void setManager(CapacityUpdateStatusManager manager) { + m_manager = manager; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java index 7f35b3f26d..66cc591992 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java @@ -118,6 +118,7 @@ private void refreshSpringBeans() { WeeklyReportContentRepository weeklyReportContentDao = CatSpringContext .getBeanIfAvailable(WeeklyReportContentRepository.class); OverloadRepository overloadDao = CatSpringContext.getBeanIfAvailable(OverloadRepository.class); + CapacityUpdateStatusManager manager = CatSpringContext.getBeanIfAvailable(CapacityUpdateStatusManager.class); if (weeklyReportDao != null) { m_weeklyReportDao = weeklyReportDao; @@ -128,6 +129,25 @@ private void refreshSpringBeans() { if (overloadDao != null) { m_overloadDao = overloadDao; } + if (manager != null) { + m_manager = manager; + } + } + + public void setWeeklyReportDao(WeeklyReportRepository weeklyReportDao) { + m_weeklyReportDao = weeklyReportDao; + } + + public void setWeeklyReportContentDao(WeeklyReportContentRepository weeklyReportContentDao) { + m_weeklyReportContentDao = weeklyReportContentDao; + } + + public void setOverloadDao(OverloadRepository overloadDao) { + m_overloadDao = overloadDao; + } + + public void setManager(CapacityUpdateStatusManager manager) { + m_manager = manager; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java index a5518b3a99..358c2cd4b3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java @@ -86,7 +86,9 @@ public boolean buildDailyTask(String name, String domain, Date period) { } catch (Exception e) { SLF4J_LOGGER.error("Unable to build transaction daily report, name={}, domain={}, period={}.", name, domain, period, e); - m_logger.error(e.getMessage(), e); + if (m_logger != null) { + m_logger.error(e.getMessage(), e); + } Cat.logError(e); return false; } @@ -246,10 +248,14 @@ private TransactionReport queryHourlyReportsByDuration(String name, String domai } private void refreshSpringBeans() { + TransactionReportService reportService = CatSpringContext.getBeanIfAvailable(TransactionReportService.class); ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); AtomicMessageConfigManager atomicMessageConfigManager = CatSpringContext .getBeanIfAvailable(AtomicMessageConfigManager.class); + if (reportService != null) { + m_reportService = reportService; + } if (serverConfigManager != null) { m_serverConfigManager = serverConfigManager; } @@ -258,4 +264,16 @@ private void refreshSpringBeans() { } } + public void setAtomicMessageConfigManager(AtomicMessageConfigManager atomicMessageConfigManager) { + m_atomicMessageConfigManager = atomicMessageConfigManager; + } + + public void setReportService(TransactionReportService reportService) { + m_reportService = reportService; + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + m_serverConfigManager = serverConfigManager; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java b/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java index 4617d099b1..041af3c688 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java @@ -16,11 +16,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.dianping.cat.report.task; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; +package com.dianping.cat.report.task; + +import java.lang.reflect.Field; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; @@ -105,9 +106,10 @@ private TaskBuilder getReportBuilder(String reportName) { @Override public void initialize() throws InitializationException { Map springBuilders = CatSpringContext.getBeansIfAvailable(TaskBuilder.class); + Map springReportBuilders = buildReportBuilderMap(springBuilders); if (springBuilders.size() >= EXPECTED_REPORT_BUILDER_COUNT) { - m_reportBuilders = new HashMap(springBuilders); + m_reportBuilders = springReportBuilders; SLF4J_LOGGER.info("Initialized report facade from Spring, builderCount={}, builders={}.", m_reportBuilders.size(), m_reportBuilders.keySet()); return; @@ -117,11 +119,41 @@ public void initialize() throws InitializationException { Map builders = new HashMap(); builders.putAll(plexusBuilders); - builders.putAll(springBuilders); + builders.putAll(springReportBuilders); m_reportBuilders = builders; SLF4J_LOGGER.info( "Initialized report facade, builderCount={}, springBuilderCount={}, plexusBuilderCount={}, builders={}.", m_reportBuilders.size(), springBuilders.size(), plexusBuilders.size(), m_reportBuilders.keySet()); } + private Map buildReportBuilderMap(Map springBuilders) { + Map reportBuilders = new HashMap(); + + for (Map.Entry entry : springBuilders.entrySet()) { + String beanName = entry.getKey(); + TaskBuilder builder = entry.getValue(); + String reportName = getReportName(builder); + + reportBuilders.put(beanName, builder); + if (reportName != null && reportName.length() > 0) { + reportBuilders.put(reportName, builder); + } + } + return reportBuilders; + } + + private String getReportName(TaskBuilder builder) { + if (builder == null) { + return null; + } + try { + Field field = builder.getClass().getField("ID"); + Object value = field.get(null); + + return value instanceof String ? (String) value : null; + } catch (Exception e) { + return null; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/CmdbInfoReloadBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/CmdbInfoReloadBuilder.java index 71c7a20e95..e491bf4cde 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/CmdbInfoReloadBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/CmdbInfoReloadBuilder.java @@ -26,6 +26,7 @@ import com.dianping.cat.Constants; import com.dianping.cat.report.task.TaskBuilder; +import com.dianping.cat.spring.CatSpringContext; @Named(type = TaskBuilder.class, value = CmdbInfoReloadBuilder.ID) public class CmdbInfoReloadBuilder implements TaskBuilder { @@ -42,6 +43,7 @@ public boolean buildDailyTask(String name, String domain, Date period) { @Override public boolean buildHourlyTask(String name, String domain, Date period) { + refreshSpringBeans(); Threads.forGroup(Constants.CAT).start(m_projectUpdateTask); return true; } @@ -56,4 +58,16 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { throw new RuntimeException("project builder don't support weekly task"); } + private void refreshSpringBeans() { + ProjectUpdateTask projectUpdateTask = CatSpringContext.getBeanIfAvailable(ProjectUpdateTask.class); + + if (projectUpdateTask != null) { + m_projectUpdateTask = projectUpdateTask; + } + } + + public void setProjectUpdateTask(ProjectUpdateTask projectUpdateTask) { + m_projectUpdateTask = projectUpdateTask; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java index e044c8bad0..bb7cb4258f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java @@ -474,6 +474,7 @@ private void updateProjectInfo() { private void refreshSpringBeans() { HostinfoService hostinfoService = CatSpringContext.getBeanIfAvailable(HostinfoService.class); ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + TransactionReportService reportService = CatSpringContext.getBeanIfAvailable(TransactionReportService.class); if (hostinfoService != null) { m_hostInfoService = hostinfoService; @@ -481,6 +482,21 @@ private void refreshSpringBeans() { if (projectService != null) { m_projectService = projectService; } + if (reportService != null) { + m_reportService = reportService; + } + } + + public void setHostInfoService(HostinfoService hostInfoService) { + m_hostInfoService = hostInfoService; + } + + public void setProjectService(ProjectService projectService) { + m_projectService = projectService; + } + + public void setReportService(TransactionReportService reportService) { + m_reportService = reportService; } } diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/ReportFacadeTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/ReportFacadeTest.java new file mode 100644 index 0000000000..23404dda2b --- /dev/null +++ b/cat-home/src/test/java/com/dianping/cat/report/task/ReportFacadeTest.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.dianping.cat.report.task; + +import java.lang.reflect.Method; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class ReportFacadeTest { + + @Test + @SuppressWarnings("unchecked") + public void testSpringBuilderMapUsesBuilderIdAlias() throws Exception { + ReportFacade facade = new ReportFacade(); + TaskBuilder builder = new AliasTaskBuilder(); + Map springBuilders = new HashMap(); + + springBuilders.put("aliasTaskBuilder", builder); + + Method method = ReportFacade.class.getDeclaredMethod("buildReportBuilderMap", Map.class); + method.setAccessible(true); + Map reportBuilders = (Map) method.invoke(facade, springBuilders); + + Assert.assertSame(builder, reportBuilders.get("aliasTaskBuilder")); + Assert.assertSame(builder, reportBuilders.get(AliasTaskBuilder.ID)); + } + + public static class AliasTaskBuilder implements TaskBuilder { + public static final String ID = "alias-report"; + + @Override + public boolean buildDailyTask(String name, String domain, Date period) { + return true; + } + + @Override + public boolean buildHourlyTask(String name, String domain, Date period) { + return true; + } + + @Override + public boolean buildMonthlyTask(String name, String domain, Date period) { + return true; + } + + @Override + public boolean buildWeeklyTask(String name, String domain, Date period) { + return true; + } + } +} From e37edae7bb14d2fb2ca59651f3c7d79e62ec0dcd Mon Sep 17 00:00:00 2001 From: Shang Date: Thu, 11 Jun 2026 20:27:29 +0800 Subject: [PATCH 040/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E9=83=A8=E5=88=86=20?= =?UTF-8?q?ReportReloader=20=E5=88=B0=20Spring=20=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/AllReportConfigManager.java | 25 ++ .../cat/consumer/event/EventDelegate.java | 52 ++++ .../consumer/heartbeat/HeartbeatDelegate.java | 23 ++ .../cat/consumer/matrix/MatrixDelegate.java | 23 ++ .../cat/consumer/state/StateDelegate.java | 23 ++ .../transaction/TransactionDelegate.java | 50 ++++ .../com/dianping/cat/task/TaskManager.java | 4 + .../spring/CatHomeSpringConfiguration.java | 260 ++++++++++++++++++ .../report/task/reload/ReportReloadTask.java | 22 +- .../task/reload/impl/EventReportReloader.java | 16 ++ .../reload/impl/HeartbeatReportReloader.java | 16 ++ .../reload/impl/MatrixReportReloader.java | 16 ++ .../task/reload/impl/StateReportReloader.java | 16 ++ .../task/reload/impl/TopReportReloader.java | 16 ++ .../impl/TransactionReportReloader.java | 16 ++ 15 files changed, 573 insertions(+), 5 deletions(-) diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java index 7a8b9d4ab0..f5eda78f5f 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java @@ -43,6 +43,7 @@ import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -76,6 +77,8 @@ public AllConfig getConfig() { @Override public void initialize() throws InitializationException { + refreshSpringBeans(); + try { Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); String content = config.getContent(); @@ -151,6 +154,8 @@ private void refreshConfig() throws DalException, SAXException, IOException { private boolean storeConfig() { synchronized (this) { + refreshSpringBeans(); + try { Config config = m_configDao.createLocal(); @@ -201,4 +206,24 @@ public boolean validate(String reportName, String type, String name) { return false; } + private void refreshSpringBeans() { + ConfigRepository configDao = CatSpringContext.getBeanIfAvailable(ConfigRepository.class); + ContentFetcher fetcher = CatSpringContext.getBeanIfAvailable(ContentFetcher.class); + + if (configDao != null) { + m_configDao = configDao; + } + if (fetcher != null) { + m_fetcher = fetcher; + } + } + + public void setConfigDao(ConfigRepository configDao) { + m_configDao = configDao; + } + + public void setFetcher(ContentFetcher fetcher) { + m_fetcher = fetcher; + } + } diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/EventDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/EventDelegate.java index 84fd4fe589..6f536cab83 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/EventDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/EventDelegate.java @@ -29,6 +29,7 @@ import com.dianping.cat.consumer.event.model.transform.DefaultNativeParser; import com.dianping.cat.consumer.event.model.transform.DefaultSaxParser; import com.dianping.cat.report.ReportDelegate; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; import org.unidal.lookup.annotation.Inject; @@ -77,6 +78,8 @@ public byte[] buildBinary(EventReport report) { @Override public String buildXml(EventReport report) { + refreshSpringBeans(); + report.accept(m_computer); new EventReportCountFilter(m_serverConfigManager.getMaxTypeThreshold(), @@ -87,6 +90,8 @@ public String buildXml(EventReport report) { } public EventReport createAggregatedReport(Map reports) { + refreshSpringBeans(); + if (reports.size() > 0) { EventReport first = reports.values().iterator().next(); EventReport all = makeReport(Constants.ALL, first.getStartTime().getTime(), Constants.HOUR); @@ -113,6 +118,8 @@ public EventReport createAggregatedReport(Map reports) { @Override public boolean createHourlyTask(EventReport report) { + refreshSpringBeans(); + String domain = report.getDomain(); if (domain.equals(Constants.ALL) || m_configManager.validateDomain(domain)) { @@ -154,4 +161,49 @@ public EventReport parseBinary(byte[] bytes) { public EventReport parseXml(String xml) throws Exception { return DefaultSaxParser.parse(xml); } + + private void refreshSpringBeans() { + TaskManager taskManager = CatSpringContext.getBeanIfAvailable(TaskManager.class); + ServerFilterConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + AllReportConfigManager allManager = CatSpringContext.getBeanIfAvailable(AllReportConfigManager.class); + ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + AtomicMessageConfigManager atomicMessageConfigManager = CatSpringContext + .getBeanIfAvailable(AtomicMessageConfigManager.class); + + if (taskManager != null) { + m_taskManager = taskManager; + } + if (configManager != null) { + m_configManager = configManager; + } + if (allManager != null) { + m_allManager = allManager; + } + if (serverConfigManager != null) { + m_serverConfigManager = serverConfigManager; + } + if (atomicMessageConfigManager != null) { + m_atomicMessageConfigManager = atomicMessageConfigManager; + } + } + + public void setTaskManager(TaskManager taskManager) { + m_taskManager = taskManager; + } + + public void setConfigManager(ServerFilterConfigManager configManager) { + m_configManager = configManager; + } + + public void setAllManager(AllReportConfigManager allManager) { + m_allManager = allManager; + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + m_serverConfigManager = serverConfigManager; + } + + public void setAtomicMessageConfigManager(AtomicMessageConfigManager atomicMessageConfigManager) { + m_atomicMessageConfigManager = atomicMessageConfigManager; + } } diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatDelegate.java index edcfd8982a..b61a6731a8 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatDelegate.java @@ -24,6 +24,7 @@ import com.dianping.cat.consumer.heartbeat.model.transform.DefaultNativeParser; import com.dianping.cat.consumer.heartbeat.model.transform.DefaultSaxParser; import com.dianping.cat.report.ReportDelegate; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; import org.unidal.lookup.annotation.Inject; @@ -61,6 +62,8 @@ public String buildXml(HeartbeatReport report) { @Override public boolean createHourlyTask(HeartbeatReport report) { + refreshSpringBeans(); + String domain = report.getDomain(); if (m_manager.validateDomain(domain)) { @@ -102,4 +105,24 @@ public HeartbeatReport parseBinary(byte[] bytes) { public HeartbeatReport parseXml(String xml) throws Exception { return DefaultSaxParser.parse(xml); } + + private void refreshSpringBeans() { + TaskManager taskManager = CatSpringContext.getBeanIfAvailable(TaskManager.class); + ServerFilterConfigManager manager = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + + if (taskManager != null) { + m_taskManager = taskManager; + } + if (manager != null) { + m_manager = manager; + } + } + + public void setTaskManager(TaskManager taskManager) { + m_taskManager = taskManager; + } + + public void setConfigManager(ServerFilterConfigManager manager) { + m_manager = manager; + } } diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/MatrixDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/MatrixDelegate.java index 2373382f49..b6befaef85 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/MatrixDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/MatrixDelegate.java @@ -30,6 +30,7 @@ import com.dianping.cat.consumer.matrix.model.transform.DefaultNativeParser; import com.dianping.cat.consumer.matrix.model.transform.DefaultSaxParser; import com.dianping.cat.report.ReportDelegate; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; @@ -62,6 +63,8 @@ public String buildXml(MatrixReport report) { @Override public boolean createHourlyTask(MatrixReport report) { + refreshSpringBeans(); + String domain = report.getDomain(); if (m_configManager.validateDomain(domain)) { @@ -105,4 +108,24 @@ public MatrixReport parseXml(String xml) throws Exception { return report; } + + private void refreshSpringBeans() { + TaskManager taskManager = CatSpringContext.getBeanIfAvailable(TaskManager.class); + ServerFilterConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + + if (taskManager != null) { + m_taskManager = taskManager; + } + if (configManager != null) { + m_configManager = configManager; + } + } + + public void setTaskManager(TaskManager taskManager) { + m_taskManager = taskManager; + } + + public void setConfigManager(ServerFilterConfigManager configManager) { + m_configManager = configManager; + } } diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateDelegate.java index dfa729463c..be04809199 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateDelegate.java @@ -25,6 +25,7 @@ import com.dianping.cat.consumer.state.model.transform.DefaultSaxParser; import com.dianping.cat.report.ReportBucketManager; import com.dianping.cat.report.ReportDelegate; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; import org.unidal.lookup.annotation.Inject; @@ -63,6 +64,8 @@ public String buildXml(StateReport report) { @Override public boolean createHourlyTask(StateReport report) { + refreshSpringBeans(); + Date startTime = report.getStartTime(); String domain = report.getDomain(); @@ -123,4 +126,24 @@ public StateReport parseBinary(byte[] bytes) { public StateReport parseXml(String xml) throws Exception { return DefaultSaxParser.parse(xml); } + + private void refreshSpringBeans() { + TaskManager taskManager = CatSpringContext.getBeanIfAvailable(TaskManager.class); + ReportBucketManager bucketManager = CatSpringContext.getBeanIfAvailable(ReportBucketManager.class); + + if (taskManager != null) { + m_taskManager = taskManager; + } + if (bucketManager != null) { + m_bucketManager = bucketManager; + } + } + + public void setTaskManager(TaskManager taskManager) { + m_taskManager = taskManager; + } + + public void setBucketManager(ReportBucketManager bucketManager) { + m_bucketManager = bucketManager; + } } diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/TransactionDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/TransactionDelegate.java index 529bb8dfb7..9e39f2583e 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/TransactionDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/TransactionDelegate.java @@ -28,6 +28,7 @@ import com.dianping.cat.consumer.transaction.model.transform.DefaultNativeParser; import com.dianping.cat.consumer.transaction.model.transform.DefaultSaxParser; import com.dianping.cat.report.ReportDelegate; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; import org.unidal.lookup.annotation.Inject; @@ -71,6 +72,8 @@ public byte[] buildBinary(TransactionReport report) { @Override public String buildXml(TransactionReport report) { + refreshSpringBeans(); + report.accept(m_computer); new TransactionReportCountFilter(m_serverConfigManager.getMaxTypeThreshold(), @@ -82,6 +85,8 @@ public String buildXml(TransactionReport report) { @Override public boolean createHourlyTask(TransactionReport report) { + refreshSpringBeans(); + String domain = report.getDomain(); if (domain.equals(Constants.ALL) || m_configManager.validateDomain(domain)) { @@ -124,4 +129,49 @@ public TransactionReport parseBinary(byte[] bytes) { public TransactionReport parseXml(String xml) throws Exception { return DefaultSaxParser.parse(xml); } + + private void refreshSpringBeans() { + TaskManager taskManager = CatSpringContext.getBeanIfAvailable(TaskManager.class); + ServerFilterConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + AllReportConfigManager transactionManager = CatSpringContext.getBeanIfAvailable(AllReportConfigManager.class); + ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + AtomicMessageConfigManager atomicMessageConfigManager = CatSpringContext + .getBeanIfAvailable(AtomicMessageConfigManager.class); + + if (taskManager != null) { + m_taskManager = taskManager; + } + if (configManager != null) { + m_configManager = configManager; + } + if (transactionManager != null) { + m_transactionManager = transactionManager; + } + if (serverConfigManager != null) { + m_serverConfigManager = serverConfigManager; + } + if (atomicMessageConfigManager != null) { + m_atomicMessageConfigManager = atomicMessageConfigManager; + } + } + + public void setTaskManager(TaskManager taskManager) { + m_taskManager = taskManager; + } + + public void setConfigManager(ServerFilterConfigManager configManager) { + m_configManager = configManager; + } + + public void setTransactionManager(AllReportConfigManager transactionManager) { + m_transactionManager = transactionManager; + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + m_serverConfigManager = serverConfigManager; + } + + public void setAtomicMessageConfigManager(AtomicMessageConfigManager atomicMessageConfigManager) { + m_atomicMessageConfigManager = atomicMessageConfigManager; + } } diff --git a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java index 4498e0d97a..72e410bb8a 100644 --- a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java +++ b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java @@ -111,6 +111,10 @@ private void refreshSpringBeans() { } } + public void setTaskDao(TaskRepository taskDao) { + m_taskDao = taskDao; + } + public enum TaskProlicy implements TaskCreationPolicy { ALL { diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 9d35309975..846e88160b 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -49,14 +49,27 @@ import com.dianping.cat.consumer.business.model.entity.BusinessReport; import com.dianping.cat.consumer.cross.model.entity.CrossReport; import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; +import com.dianping.cat.consumer.event.EventAnalyzer; +import com.dianping.cat.consumer.event.EventDelegate; import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; +import com.dianping.cat.consumer.heartbeat.HeartbeatDelegate; import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; +import com.dianping.cat.consumer.matrix.MatrixAnalyzer; +import com.dianping.cat.consumer.matrix.MatrixDelegate; import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.state.StateAnalyzer; +import com.dianping.cat.consumer.state.StateDelegate; import com.dianping.cat.consumer.state.model.entity.StateReport; import com.dianping.cat.consumer.storage.model.entity.StorageReport; +import com.dianping.cat.consumer.top.TopAnalyzer; +import com.dianping.cat.consumer.top.TopDelegate; import com.dianping.cat.consumer.top.model.entity.TopReport; +import com.dianping.cat.consumer.config.AllReportConfigManager; +import com.dianping.cat.consumer.transaction.TransactionAnalyzer; +import com.dianping.cat.consumer.transaction.TransactionDelegate; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; @@ -105,6 +118,7 @@ import com.dianping.cat.message.DefaultPathBuilder; import com.dianping.cat.message.PathBuilder; import com.dianping.cat.report.DefaultReportBucketManager; +import com.dianping.cat.report.DefaultReportManager; import com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager; import com.dianping.cat.report.alert.config.BaseRuleHelper; import com.dianping.cat.report.alert.business.BusinessContactor; @@ -217,9 +231,19 @@ import com.dianping.cat.report.ReportBucket; import com.dianping.cat.report.ReportBucketFactory; import com.dianping.cat.report.ReportBucketManager; +import com.dianping.cat.report.ReportDelegate; +import com.dianping.cat.report.ReportManager; +import com.dianping.cat.report.task.reload.ReportReloader; +import com.dianping.cat.report.task.reload.impl.EventReportReloader; +import com.dianping.cat.report.task.reload.impl.HeartbeatReportReloader; +import com.dianping.cat.report.task.reload.impl.MatrixReportReloader; +import com.dianping.cat.report.task.reload.impl.StateReportReloader; +import com.dianping.cat.report.task.reload.impl.TopReportReloader; +import com.dianping.cat.report.task.reload.impl.TransactionReportReloader; import com.dianping.cat.service.ProjectService; import com.dianping.cat.service.HostinfoService; import com.dianping.cat.statistic.ServerStatisticManager; +import com.dianping.cat.task.TaskManager; import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; import com.dianping.cat.system.page.config.ConfigHtmlParser; import com.dianping.cat.system.page.login.service.CookieManager; @@ -281,6 +305,242 @@ public MessageAnalyzerManager messageAnalyzerManager(MessageAnalyzerFactory mess return manager; } + @Bean + public TaskManager taskManager(TaskRepository taskRepository) { + TaskManager manager = new TaskManager(); + + manager.setTaskDao(taskRepository); + return manager; + } + + @Bean(initMethod = "initialize") + public AllReportConfigManager allReportConfigManager(ConfigRepository configRepository, + ContentFetcher contentFetcher) { + AllReportConfigManager manager = new AllReportConfigManager(); + + manager.setConfigDao(configRepository); + manager.setFetcher(contentFetcher); + return manager; + } + + @Bean + public ReportDelegate transactionDelegate(TaskManager taskManager, + ServerFilterConfigManager serverFilterConfigManager, AllReportConfigManager allReportConfigManager, + ServerConfigManager serverConfigManager, AtomicMessageConfigManager atomicMessageConfigManager) { + TransactionDelegate delegate = new TransactionDelegate(); + + delegate.setTaskManager(taskManager); + delegate.setConfigManager(serverFilterConfigManager); + delegate.setTransactionManager(allReportConfigManager); + delegate.setServerConfigManager(serverConfigManager); + delegate.setAtomicMessageConfigManager(atomicMessageConfigManager); + return delegate; + } + + @Bean + public ReportDelegate eventDelegate(TaskManager taskManager, + ServerFilterConfigManager serverFilterConfigManager, AllReportConfigManager allReportConfigManager, + ServerConfigManager serverConfigManager, AtomicMessageConfigManager atomicMessageConfigManager) { + EventDelegate delegate = new EventDelegate(); + + delegate.setTaskManager(taskManager); + delegate.setConfigManager(serverFilterConfigManager); + delegate.setAllManager(allReportConfigManager); + delegate.setServerConfigManager(serverConfigManager); + delegate.setAtomicMessageConfigManager(atomicMessageConfigManager); + return delegate; + } + + @Bean + public ReportDelegate heartbeatDelegate(TaskManager taskManager, + ServerFilterConfigManager serverFilterConfigManager) { + HeartbeatDelegate delegate = new HeartbeatDelegate(); + + delegate.setTaskManager(taskManager); + delegate.setConfigManager(serverFilterConfigManager); + return delegate; + } + + @Bean + public ReportDelegate matrixDelegate(TaskManager taskManager, + ServerFilterConfigManager serverFilterConfigManager) { + MatrixDelegate delegate = new MatrixDelegate(); + + delegate.setTaskManager(taskManager); + delegate.setConfigManager(serverFilterConfigManager); + return delegate; + } + + @Bean + public ReportDelegate topDelegate() { + return new TopDelegate(); + } + + @Bean + public ReportDelegate stateDelegate(TaskManager taskManager, ReportBucketManager reportBucketManager) { + StateDelegate delegate = new StateDelegate(); + + delegate.setTaskManager(taskManager); + delegate.setBucketManager(reportBucketManager); + return delegate; + } + + @Bean(name = TransactionAnalyzer.ID + "ReportManager", initMethod = "initialize") + public ReportManager transactionReportManager( + ReportDelegate transactionDelegate, ReportBucketManager reportBucketManager, + HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, + DomainValidator domainValidator, Logger plexusConsoleLogger) { + DefaultReportManager manager = new DefaultReportManager(); + + manager.setReportDelegate(transactionDelegate); + manager.setBucketManager(reportBucketManager); + manager.setReportDao(hourlyReportRepository); + manager.setReportContentDao(hourlyReportContentRepository); + manager.setValidator(domainValidator); + manager.setName(TransactionAnalyzer.ID); + manager.enableLogging(plexusConsoleLogger); + return manager; + } + + @Bean(name = EventAnalyzer.ID + "ReportManager", initMethod = "initialize") + public ReportManager eventReportManager(ReportDelegate eventDelegate, + ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator, + Logger plexusConsoleLogger) { + DefaultReportManager manager = new DefaultReportManager(); + + manager.setReportDelegate(eventDelegate); + manager.setBucketManager(reportBucketManager); + manager.setReportDao(hourlyReportRepository); + manager.setReportContentDao(hourlyReportContentRepository); + manager.setValidator(domainValidator); + manager.setName(EventAnalyzer.ID); + manager.enableLogging(plexusConsoleLogger); + return manager; + } + + @Bean(name = HeartbeatAnalyzer.ID + "ReportManager", initMethod = "initialize") + public ReportManager heartbeatReportManager(ReportDelegate heartbeatDelegate, + ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator, + Logger plexusConsoleLogger) { + DefaultReportManager manager = new DefaultReportManager(); + + manager.setReportDelegate(heartbeatDelegate); + manager.setBucketManager(reportBucketManager); + manager.setReportDao(hourlyReportRepository); + manager.setReportContentDao(hourlyReportContentRepository); + manager.setValidator(domainValidator); + manager.setName(HeartbeatAnalyzer.ID); + manager.enableLogging(plexusConsoleLogger); + return manager; + } + + @Bean(name = MatrixAnalyzer.ID + "ReportManager", initMethod = "initialize") + public ReportManager matrixReportManager(ReportDelegate matrixDelegate, + ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator, + Logger plexusConsoleLogger) { + DefaultReportManager manager = new DefaultReportManager(); + + manager.setReportDelegate(matrixDelegate); + manager.setBucketManager(reportBucketManager); + manager.setReportDao(hourlyReportRepository); + manager.setReportContentDao(hourlyReportContentRepository); + manager.setValidator(domainValidator); + manager.setName(MatrixAnalyzer.ID); + manager.enableLogging(plexusConsoleLogger); + return manager; + } + + @Bean(name = TopAnalyzer.ID + "ReportManager", initMethod = "initialize") + public ReportManager topReportManager(ReportDelegate topDelegate, + ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator, + Logger plexusConsoleLogger) { + DefaultReportManager manager = new DefaultReportManager(); + + manager.setReportDelegate(topDelegate); + manager.setBucketManager(reportBucketManager); + manager.setReportDao(hourlyReportRepository); + manager.setReportContentDao(hourlyReportContentRepository); + manager.setValidator(domainValidator); + manager.setName(TopAnalyzer.ID); + manager.enableLogging(plexusConsoleLogger); + return manager; + } + + @Bean(name = StateAnalyzer.ID + "ReportManager", initMethod = "initialize") + public ReportManager stateReportManager(ReportDelegate stateDelegate, + ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator, + Logger plexusConsoleLogger) { + DefaultReportManager manager = new DefaultReportManager(); + + manager.setReportDelegate(stateDelegate); + manager.setBucketManager(reportBucketManager); + manager.setReportDao(hourlyReportRepository); + manager.setReportContentDao(hourlyReportContentRepository); + manager.setValidator(domainValidator); + manager.setName(StateAnalyzer.ID); + manager.enableLogging(plexusConsoleLogger); + return manager; + } + + @Bean + public ReportReloader transactionReportReloader( + @Qualifier(TransactionAnalyzer.ID + "ReportManager") ReportManager transactionReportManager) { + TransactionReportReloader reloader = new TransactionReportReloader(); + + reloader.setReportManager(transactionReportManager); + return reloader; + } + + @Bean + public ReportReloader eventReportReloader( + @Qualifier(EventAnalyzer.ID + "ReportManager") ReportManager eventReportManager) { + EventReportReloader reloader = new EventReportReloader(); + + reloader.setReportManager(eventReportManager); + return reloader; + } + + @Bean + public ReportReloader heartbeatReportReloader( + @Qualifier(HeartbeatAnalyzer.ID + "ReportManager") ReportManager heartbeatReportManager) { + HeartbeatReportReloader reloader = new HeartbeatReportReloader(); + + reloader.setReportManager(heartbeatReportManager); + return reloader; + } + + @Bean + public ReportReloader matrixReportReloader( + @Qualifier(MatrixAnalyzer.ID + "ReportManager") ReportManager matrixReportManager) { + MatrixReportReloader reloader = new MatrixReportReloader(); + + reloader.setReportManager(matrixReportManager); + return reloader; + } + + @Bean + public ReportReloader topReportReloader( + @Qualifier(TopAnalyzer.ID + "ReportManager") ReportManager topReportManager) { + TopReportReloader reloader = new TopReportReloader(); + + reloader.setReportManager(topReportManager); + return reloader; + } + + @Bean + public ReportReloader stateReportReloader( + @Qualifier(StateAnalyzer.ID + "ReportManager") ReportManager stateReportManager) { + StateReportReloader reloader = new StateReportReloader(); + + reloader.setReportManager(stateReportManager); + return reloader; + } + @Bean(name = CurrentReportBuilder.ID) public TaskBuilder currentReportBuilder(ProjectService projectService, ServerFilterConfigManager serverFilterConfigManager) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java index 5b9ca3a75c..883a378635 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java @@ -64,8 +64,10 @@ public void initialize() throws InitializationException { m_configManager = configManager; } - if (springReloaders.size() >= EXPECTED_RELOADER_COUNT) { - m_reloaders = new java.util.LinkedHashMap(springReloaders); + Map indexedSpringReloaders = indexSpringReloaders(springReloaders); + + if (indexedSpringReloaders.size() >= EXPECTED_RELOADER_COUNT) { + m_reloaders = indexedSpringReloaders; LOGGER.info("Initialized report reload task from Spring, reloaderCount={}, reloaders={}.", m_reloaders.size(), m_reloaders.keySet()); return; @@ -75,11 +77,21 @@ public void initialize() throws InitializationException { Map reloaders = new java.util.LinkedHashMap(); reloaders.putAll(plexusReloaders); - reloaders.putAll(springReloaders); + reloaders.putAll(indexedSpringReloaders); m_reloaders = reloaders; LOGGER.info( - "Initialized report reload task, reloaderCount={}, springReloaderCount={}, plexusReloaderCount={}, reloaders={}.", - m_reloaders.size(), springReloaders.size(), plexusReloaders.size(), m_reloaders.keySet()); + "Initialized report reload task, reloaderCount={}, springReloaderCount={}, springBeanCount={}, plexusReloaderCount={}, reloaders={}.", + m_reloaders.size(), indexedSpringReloaders.size(), springReloaders.size(), plexusReloaders.size(), + m_reloaders.keySet()); + } + + private Map indexSpringReloaders(Map springReloaders) { + Map reloaders = new java.util.LinkedHashMap(); + + for (ReportReloader reloader : springReloaders.values()) { + reloaders.put(reloader.getId(), reloader); + } + return reloaders; } @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/EventReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/EventReportReloader.java index b75eed0130..a5975e8a60 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/EventReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/EventReportReloader.java @@ -35,6 +35,7 @@ import com.dianping.cat.consumer.event.model.transform.DefaultNativeBuilder; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.report.ReportManager; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.report.task.reload.AbstractReportReloader; import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; @@ -72,6 +73,8 @@ public String getId() { @Override public List loadReport(long time) { + refreshSpringBeans(); + List results = new ArrayList(); Map> mergedReports = new HashMap>(); @@ -111,4 +114,17 @@ public List loadReport(long time) { } return results; } + + private void refreshSpringBeans() { + ReportManager reportManager = CatSpringContext.getBeanIfAvailable( + EventAnalyzer.ID + "ReportManager", ReportManager.class); + + if (reportManager != null) { + m_reportManager = reportManager; + } + } + + public void setReportManager(ReportManager reportManager) { + m_reportManager = reportManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/HeartbeatReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/HeartbeatReportReloader.java index ec2b92947c..76f9b1ce9d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/HeartbeatReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/HeartbeatReportReloader.java @@ -35,6 +35,7 @@ import com.dianping.cat.consumer.heartbeat.model.transform.DefaultNativeBuilder; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.report.ReportManager; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.report.task.reload.AbstractReportReloader; import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; @@ -72,6 +73,8 @@ public String getId() { @Override public List loadReport(long time) { + refreshSpringBeans(); + List results = new ArrayList(); Map> mergedReports = new HashMap>(); @@ -111,4 +114,17 @@ public List loadReport(long time) { } return results; } + + private void refreshSpringBeans() { + ReportManager reportManager = CatSpringContext.getBeanIfAvailable( + HeartbeatAnalyzer.ID + "ReportManager", ReportManager.class); + + if (reportManager != null) { + m_reportManager = reportManager; + } + } + + public void setReportManager(ReportManager reportManager) { + m_reportManager = reportManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/MatrixReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/MatrixReportReloader.java index e1104888b0..edfcf73a26 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/MatrixReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/MatrixReportReloader.java @@ -35,6 +35,7 @@ import com.dianping.cat.consumer.matrix.model.transform.DefaultNativeBuilder; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.report.ReportManager; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.report.task.reload.AbstractReportReloader; import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; @@ -72,6 +73,8 @@ public String getId() { @Override public List loadReport(long time) { + refreshSpringBeans(); + List results = new ArrayList(); Map> mergedReports = new HashMap>(); @@ -111,4 +114,17 @@ public List loadReport(long time) { } return results; } + + private void refreshSpringBeans() { + ReportManager reportManager = CatSpringContext.getBeanIfAvailable( + MatrixAnalyzer.ID + "ReportManager", ReportManager.class); + + if (reportManager != null) { + m_reportManager = reportManager; + } + } + + public void setReportManager(ReportManager reportManager) { + m_reportManager = reportManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StateReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StateReportReloader.java index 60a52a17bf..4b6e79bc9c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StateReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StateReportReloader.java @@ -35,6 +35,7 @@ import com.dianping.cat.consumer.state.model.transform.DefaultNativeBuilder; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.report.ReportManager; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.report.task.reload.AbstractReportReloader; import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; @@ -72,6 +73,8 @@ public String getId() { @Override public List loadReport(long time) { + refreshSpringBeans(); + List results = new ArrayList(); Map> mergedReports = new HashMap>(); @@ -111,4 +114,17 @@ public List loadReport(long time) { } return results; } + + private void refreshSpringBeans() { + ReportManager reportManager = CatSpringContext.getBeanIfAvailable( + StateAnalyzer.ID + "ReportManager", ReportManager.class); + + if (reportManager != null) { + m_reportManager = reportManager; + } + } + + public void setReportManager(ReportManager reportManager) { + m_reportManager = reportManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TopReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TopReportReloader.java index 34c7030b88..67d4cd7ac2 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TopReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TopReportReloader.java @@ -35,6 +35,7 @@ import com.dianping.cat.consumer.top.model.transform.DefaultNativeBuilder; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.report.ReportManager; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.report.task.reload.AbstractReportReloader; import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; @@ -72,6 +73,8 @@ public String getId() { @Override public List loadReport(long time) { + refreshSpringBeans(); + List results = new ArrayList(); Map> mergedReports = new HashMap>(); @@ -111,4 +114,17 @@ public List loadReport(long time) { } return results; } + + private void refreshSpringBeans() { + ReportManager reportManager = CatSpringContext.getBeanIfAvailable( + TopAnalyzer.ID + "ReportManager", ReportManager.class); + + if (reportManager != null) { + m_reportManager = reportManager; + } + } + + public void setReportManager(ReportManager reportManager) { + m_reportManager = reportManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TransactionReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TransactionReportReloader.java index f5bba56458..15050a7653 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TransactionReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TransactionReportReloader.java @@ -35,6 +35,7 @@ import com.dianping.cat.consumer.transaction.model.transform.DefaultNativeBuilder; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.report.ReportManager; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.report.task.reload.AbstractReportReloader; import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; @@ -72,6 +73,8 @@ public String getId() { @Override public List loadReport(long time) { + refreshSpringBeans(); + List results = new ArrayList(); Map> mergedReports = new HashMap>(); @@ -111,4 +114,17 @@ public List loadReport(long time) { } return results; } + + private void refreshSpringBeans() { + ReportManager reportManager = CatSpringContext.getBeanIfAvailable( + TransactionAnalyzer.ID + "ReportManager", ReportManager.class); + + if (reportManager != null) { + m_reportManager = reportManager; + } + } + + public void setReportManager(ReportManager reportManager) { + m_reportManager = reportManager; + } } From 705eb4c0d5850a98fe2dd6f4324c63fa3f997dc7 Mon Sep 17 00:00:00 2001 From: Shang Date: Thu, 11 Jun 2026 21:07:16 +0800 Subject: [PATCH 041/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=89=A9=E4=BD=99?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E9=87=8D=E8=BD=BD=E5=99=A8=E5=88=B0=20Spring?= =?UTF-8?q?=20=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../consumer/business/BusinessDelegate.java | 15 ++ .../cat/consumer/cross/CrossDelegate.java | 24 +++ .../dependency/DependencyDelegate.java | 15 ++ .../cat/consumer/problem/ProblemDelegate.java | 23 ++ .../cat/consumer/storage/StorageDelegate.java | 49 ++++- .../spring/CatHomeSpringConfiguration.java | 197 ++++++++++++++++++ .../reload/impl/BusinessReportReloader.java | 17 ++ .../task/reload/impl/CrossReportReloader.java | 17 ++ .../reload/impl/DependencyReportReloader.java | 17 ++ .../reload/impl/ProblemReportReloader.java | 16 ++ .../reload/impl/StorageReportReloader.java | 16 ++ 11 files changed, 403 insertions(+), 3 deletions(-) diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/BusinessDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/BusinessDelegate.java index 06b730e9ef..eab9f543c8 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/BusinessDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/BusinessDelegate.java @@ -29,6 +29,7 @@ import com.dianping.cat.consumer.business.model.transform.DefaultNativeParser; import com.dianping.cat.consumer.business.model.transform.DefaultSaxParser; import com.dianping.cat.report.ReportDelegate; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; @@ -91,7 +92,21 @@ public BusinessReport parseXml(String xml) throws Exception { @Override public boolean createHourlyTask(BusinessReport report) { + refreshSpringBeans(); + return m_taskManager.createTask(report.getStartTime(), report.getDomain(), BusinessAnalyzer.ID, TaskProlicy.DAILY); } + private void refreshSpringBeans() { + TaskManager taskManager = CatSpringContext.getBeanIfAvailable(TaskManager.class); + + if (taskManager != null) { + m_taskManager = taskManager; + } + } + + public void setTaskManager(TaskManager taskManager) { + m_taskManager = taskManager; + } + } diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossDelegate.java index bd30c20e0f..2bf7d559f2 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossDelegate.java @@ -24,6 +24,7 @@ import com.dianping.cat.consumer.cross.model.transform.DefaultNativeParser; import com.dianping.cat.consumer.cross.model.transform.DefaultSaxParser; import com.dianping.cat.report.ReportDelegate; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; import org.unidal.lookup.annotation.Inject; @@ -61,6 +62,8 @@ public String buildXml(CrossReport report) { @Override public boolean createHourlyTask(CrossReport report) { + refreshSpringBeans(); + String domain = report.getDomain(); if (m_serverFilterConfigManager.validateDomain(domain)) { @@ -102,4 +105,25 @@ public CrossReport parseBinary(byte[] bytes) { public CrossReport parseXml(String xml) throws Exception { return DefaultSaxParser.parse(xml); } + + private void refreshSpringBeans() { + TaskManager taskManager = CatSpringContext.getBeanIfAvailable(TaskManager.class); + ServerFilterConfigManager serverFilterConfigManager = CatSpringContext.getBeanIfAvailable( + ServerFilterConfigManager.class); + + if (taskManager != null) { + m_taskManager = taskManager; + } + if (serverFilterConfigManager != null) { + m_serverFilterConfigManager = serverFilterConfigManager; + } + } + + public void setTaskManager(TaskManager taskManager) { + m_taskManager = taskManager; + } + + public void setServerFilterConfigManager(ServerFilterConfigManager serverFilterConfigManager) { + m_serverFilterConfigManager = serverFilterConfigManager; + } } diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/DependencyDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/DependencyDelegate.java index c912c64734..ec18ffbfad 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/DependencyDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/DependencyDelegate.java @@ -24,6 +24,7 @@ import com.dianping.cat.consumer.dependency.model.transform.DefaultNativeParser; import com.dianping.cat.consumer.dependency.model.transform.DefaultSaxParser; import com.dianping.cat.report.ReportDelegate; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; import org.unidal.lookup.annotation.Inject; @@ -58,6 +59,8 @@ public String buildXml(DependencyReport report) { @Override public boolean createHourlyTask(DependencyReport report) { + refreshSpringBeans(); + return m_taskManager.createTask(report.getStartTime(), Constants.CAT, DependencyAnalyzer.ID, TaskProlicy.HOULY); } @@ -93,4 +96,16 @@ public DependencyReport parseBinary(byte[] bytes) { public DependencyReport parseXml(String xml) throws Exception { return DefaultSaxParser.parse(xml); } + + private void refreshSpringBeans() { + TaskManager taskManager = CatSpringContext.getBeanIfAvailable(TaskManager.class); + + if (taskManager != null) { + m_taskManager = taskManager; + } + } + + public void setTaskManager(TaskManager taskManager) { + m_taskManager = taskManager; + } } diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemDelegate.java index cae4f462cf..a5882d60c6 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemDelegate.java @@ -25,6 +25,7 @@ import com.dianping.cat.consumer.problem.model.transform.DefaultNativeParser; import com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser; import com.dianping.cat.report.ReportDelegate; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; import org.unidal.lookup.annotation.Inject; @@ -74,6 +75,8 @@ public String buildXml(ProblemReport report) { @Override public boolean createHourlyTask(ProblemReport report) { + refreshSpringBeans(); + String domain = report.getDomain(); if (m_configManager.validateDomain(domain)) { @@ -115,4 +118,24 @@ public ProblemReport parseBinary(byte[] bytes) { public ProblemReport parseXml(String xml) throws Exception { return DefaultSaxParser.parse(xml); } + + private void refreshSpringBeans() { + TaskManager taskManager = CatSpringContext.getBeanIfAvailable(TaskManager.class); + ServerFilterConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + + if (taskManager != null) { + m_taskManager = taskManager; + } + if (configManager != null) { + m_configManager = configManager; + } + } + + public void setTaskManager(TaskManager taskManager) { + m_taskManager = taskManager; + } + + public void setConfigManager(ServerFilterConfigManager configManager) { + m_configManager = configManager; + } } diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageDelegate.java index 6b70aac95e..0e52ab2928 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageDelegate.java @@ -24,16 +24,20 @@ import com.dianping.cat.consumer.storage.model.transform.DefaultNativeParser; import com.dianping.cat.consumer.storage.model.transform.DefaultSaxParser; import com.dianping.cat.report.ReportDelegate; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.Date; import java.util.Map; @Named(type = ReportDelegate.class, value = StorageAnalyzer.ID) public class StorageDelegate implements ReportDelegate { + private static final Logger LOGGER = LoggerFactory.getLogger(StorageDelegate.class); @Inject private TaskManager m_taskManager; @@ -50,6 +54,8 @@ public void afterLoad(Map reports) { @Override public void beforeSave(Map reports) { + refreshSpringBeans(); + for (StorageReport report : reports.values()) { m_reportUpdater.updateStorageIds(report.getId(), reports.keySet(), report); @@ -68,6 +74,8 @@ public String buildXml(StorageReport report) { @Override public boolean createHourlyTask(StorageReport report) { + refreshSpringBeans(); + String id = report.getId(); if (m_configManager.validateDomain(id)) { @@ -86,10 +94,17 @@ public String getDomain(StorageReport report) { public StorageReport makeReport(String id, long startTime, long duration) { StorageReport report = new StorageReport(id); int index = id.lastIndexOf("-"); - String name = id.substring(0, index); - String type = id.substring(index + 1); - report.setName(name).setType(type); + if (index <= 0 || index >= id.length() - 1) { + LOGGER.warn("Invalid storage report id, id={}, expectedFormat=-, startTime={}, duration={}.", + id, startTime, duration); + report.setName(id); + } else { + String name = id.substring(0, index); + String type = id.substring(index + 1); + + report.setName(name).setType(type); + } report.setStartTime(new Date(startTime)).setEndTime(new Date(startTime + duration - 1)); return report; @@ -113,4 +128,32 @@ public StorageReport parseXml(String xml) throws Exception { return DefaultSaxParser.parse(xml); } + private void refreshSpringBeans() { + TaskManager taskManager = CatSpringContext.getBeanIfAvailable(TaskManager.class); + ServerFilterConfigManager configManager = CatSpringContext.getBeanIfAvailable(ServerFilterConfigManager.class); + StorageReportUpdater reportUpdater = CatSpringContext.getBeanIfAvailable(StorageReportUpdater.class); + + if (taskManager != null) { + m_taskManager = taskManager; + } + if (configManager != null) { + m_configManager = configManager; + } + if (reportUpdater != null) { + m_reportUpdater = reportUpdater; + } + } + + public void setTaskManager(TaskManager taskManager) { + m_taskManager = taskManager; + } + + public void setConfigManager(ServerFilterConfigManager configManager) { + m_configManager = configManager; + } + + public void setReportUpdater(StorageReportUpdater reportUpdater) { + m_reportUpdater = reportUpdater; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 846e88160b..635f86521e 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -46,8 +46,14 @@ import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; +import com.dianping.cat.consumer.business.BusinessAnalyzer; +import com.dianping.cat.consumer.business.BusinessDelegate; import com.dianping.cat.consumer.business.model.entity.BusinessReport; +import com.dianping.cat.consumer.cross.CrossAnalyzer; +import com.dianping.cat.consumer.cross.CrossDelegate; import com.dianping.cat.consumer.cross.model.entity.CrossReport; +import com.dianping.cat.consumer.dependency.DependencyAnalyzer; +import com.dianping.cat.consumer.dependency.DependencyDelegate; import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; import com.dianping.cat.consumer.event.EventAnalyzer; import com.dianping.cat.consumer.event.EventDelegate; @@ -59,10 +65,14 @@ import com.dianping.cat.consumer.matrix.MatrixDelegate; import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; import com.dianping.cat.consumer.problem.ProblemAnalyzer; +import com.dianping.cat.consumer.problem.ProblemDelegate; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; import com.dianping.cat.consumer.state.StateAnalyzer; import com.dianping.cat.consumer.state.StateDelegate; import com.dianping.cat.consumer.state.model.entity.StateReport; +import com.dianping.cat.consumer.storage.StorageAnalyzer; +import com.dianping.cat.consumer.storage.StorageDelegate; +import com.dianping.cat.consumer.storage.StorageReportUpdater; import com.dianping.cat.consumer.storage.model.entity.StorageReport; import com.dianping.cat.consumer.top.TopAnalyzer; import com.dianping.cat.consumer.top.TopDelegate; @@ -234,10 +244,15 @@ import com.dianping.cat.report.ReportDelegate; import com.dianping.cat.report.ReportManager; import com.dianping.cat.report.task.reload.ReportReloader; +import com.dianping.cat.report.task.reload.impl.BusinessReportReloader; +import com.dianping.cat.report.task.reload.impl.CrossReportReloader; +import com.dianping.cat.report.task.reload.impl.DependencyReportReloader; import com.dianping.cat.report.task.reload.impl.EventReportReloader; import com.dianping.cat.report.task.reload.impl.HeartbeatReportReloader; import com.dianping.cat.report.task.reload.impl.MatrixReportReloader; +import com.dianping.cat.report.task.reload.impl.ProblemReportReloader; import com.dianping.cat.report.task.reload.impl.StateReportReloader; +import com.dianping.cat.report.task.reload.impl.StorageReportReloader; import com.dianping.cat.report.task.reload.impl.TopReportReloader; import com.dianping.cat.report.task.reload.impl.TransactionReportReloader; import com.dianping.cat.service.ProjectService; @@ -323,6 +338,14 @@ public AllReportConfigManager allReportConfigManager(ConfigRepository configRepo return manager; } + @Bean + public ReportDelegate businessDelegate(TaskManager taskManager) { + BusinessDelegate delegate = new BusinessDelegate(); + + delegate.setTaskManager(taskManager); + return delegate; + } + @Bean public ReportDelegate transactionDelegate(TaskManager taskManager, ServerFilterConfigManager serverFilterConfigManager, AllReportConfigManager allReportConfigManager, @@ -337,6 +360,24 @@ public ReportDelegate transactionDelegate(TaskManager taskMan return delegate; } + @Bean + public ReportDelegate crossDelegate(TaskManager taskManager, + ServerFilterConfigManager serverFilterConfigManager) { + CrossDelegate delegate = new CrossDelegate(); + + delegate.setTaskManager(taskManager); + delegate.setServerFilterConfigManager(serverFilterConfigManager); + return delegate; + } + + @Bean + public ReportDelegate dependencyDelegate(TaskManager taskManager) { + DependencyDelegate delegate = new DependencyDelegate(); + + delegate.setTaskManager(taskManager); + return delegate; + } + @Bean public ReportDelegate eventDelegate(TaskManager taskManager, ServerFilterConfigManager serverFilterConfigManager, AllReportConfigManager allReportConfigManager, @@ -371,6 +412,32 @@ public ReportDelegate matrixDelegate(TaskManager taskManager, return delegate; } + @Bean + public ReportDelegate problemDelegate(TaskManager taskManager, + ServerFilterConfigManager serverFilterConfigManager) { + ProblemDelegate delegate = new ProblemDelegate(); + + delegate.setTaskManager(taskManager); + delegate.setConfigManager(serverFilterConfigManager); + return delegate; + } + + @Bean + public StorageReportUpdater storageReportUpdater() { + return new StorageReportUpdater(); + } + + @Bean + public ReportDelegate storageDelegate(TaskManager taskManager, + ServerFilterConfigManager serverFilterConfigManager, StorageReportUpdater storageReportUpdater) { + StorageDelegate delegate = new StorageDelegate(); + + delegate.setTaskManager(taskManager); + delegate.setConfigManager(serverFilterConfigManager); + delegate.setReportUpdater(storageReportUpdater); + return delegate; + } + @Bean public ReportDelegate topDelegate() { return new TopDelegate(); @@ -385,6 +452,23 @@ public ReportDelegate stateDelegate(TaskManager taskManager, Report return delegate; } + @Bean(name = BusinessAnalyzer.ID + "ReportManager", initMethod = "initialize") + public ReportManager businessReportManager(ReportDelegate businessDelegate, + ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator, + Logger plexusConsoleLogger) { + DefaultReportManager manager = new DefaultReportManager(); + + manager.setReportDelegate(businessDelegate); + manager.setBucketManager(reportBucketManager); + manager.setReportDao(hourlyReportRepository); + manager.setReportContentDao(hourlyReportContentRepository); + manager.setValidator(domainValidator); + manager.setName(BusinessAnalyzer.ID); + manager.enableLogging(plexusConsoleLogger); + return manager; + } + @Bean(name = TransactionAnalyzer.ID + "ReportManager", initMethod = "initialize") public ReportManager transactionReportManager( ReportDelegate transactionDelegate, ReportBucketManager reportBucketManager, @@ -402,6 +486,40 @@ public ReportManager transactionReportManager( return manager; } + @Bean(name = CrossAnalyzer.ID + "ReportManager", initMethod = "initialize") + public ReportManager crossReportManager(ReportDelegate crossDelegate, + ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator, + Logger plexusConsoleLogger) { + DefaultReportManager manager = new DefaultReportManager(); + + manager.setReportDelegate(crossDelegate); + manager.setBucketManager(reportBucketManager); + manager.setReportDao(hourlyReportRepository); + manager.setReportContentDao(hourlyReportContentRepository); + manager.setValidator(domainValidator); + manager.setName(CrossAnalyzer.ID); + manager.enableLogging(plexusConsoleLogger); + return manager; + } + + @Bean(name = DependencyAnalyzer.ID + "ReportManager", initMethod = "initialize") + public ReportManager dependencyReportManager( + ReportDelegate dependencyDelegate, ReportBucketManager reportBucketManager, + HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, + DomainValidator domainValidator, Logger plexusConsoleLogger) { + DefaultReportManager manager = new DefaultReportManager(); + + manager.setReportDelegate(dependencyDelegate); + manager.setBucketManager(reportBucketManager); + manager.setReportDao(hourlyReportRepository); + manager.setReportContentDao(hourlyReportContentRepository); + manager.setValidator(domainValidator); + manager.setName(DependencyAnalyzer.ID); + manager.enableLogging(plexusConsoleLogger); + return manager; + } + @Bean(name = EventAnalyzer.ID + "ReportManager", initMethod = "initialize") public ReportManager eventReportManager(ReportDelegate eventDelegate, ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, @@ -453,6 +571,40 @@ public ReportManager matrixReportManager(ReportDelegate problemReportManager(ReportDelegate problemDelegate, + ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator, + Logger plexusConsoleLogger) { + DefaultReportManager manager = new DefaultReportManager(); + + manager.setReportDelegate(problemDelegate); + manager.setBucketManager(reportBucketManager); + manager.setReportDao(hourlyReportRepository); + manager.setReportContentDao(hourlyReportContentRepository); + manager.setValidator(domainValidator); + manager.setName(ProblemAnalyzer.ID); + manager.enableLogging(plexusConsoleLogger); + return manager; + } + + @Bean(name = StorageAnalyzer.ID + "ReportManager", initMethod = "initialize") + public ReportManager storageReportManager(ReportDelegate storageDelegate, + ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator, + Logger plexusConsoleLogger) { + DefaultReportManager manager = new DefaultReportManager(); + + manager.setReportDelegate(storageDelegate); + manager.setBucketManager(reportBucketManager); + manager.setReportDao(hourlyReportRepository); + manager.setReportContentDao(hourlyReportContentRepository); + manager.setValidator(domainValidator); + manager.setName(StorageAnalyzer.ID); + manager.enableLogging(plexusConsoleLogger); + return manager; + } + @Bean(name = TopAnalyzer.ID + "ReportManager", initMethod = "initialize") public ReportManager topReportManager(ReportDelegate topDelegate, ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, @@ -487,6 +639,15 @@ public ReportManager stateReportManager(ReportDelegate return manager; } + @Bean + public ReportReloader businessReportReloader( + @Qualifier(BusinessAnalyzer.ID + "ReportManager") ReportManager businessReportManager) { + BusinessReportReloader reloader = new BusinessReportReloader(); + + reloader.setReportManager(businessReportManager); + return reloader; + } + @Bean public ReportReloader transactionReportReloader( @Qualifier(TransactionAnalyzer.ID + "ReportManager") ReportManager transactionReportManager) { @@ -496,6 +657,24 @@ public ReportReloader transactionReportReloader( return reloader; } + @Bean + public ReportReloader crossReportReloader( + @Qualifier(CrossAnalyzer.ID + "ReportManager") ReportManager crossReportManager) { + CrossReportReloader reloader = new CrossReportReloader(); + + reloader.setReportManager(crossReportManager); + return reloader; + } + + @Bean + public ReportReloader dependencyReportReloader( + @Qualifier(DependencyAnalyzer.ID + "ReportManager") ReportManager dependencyReportManager) { + DependencyReportReloader reloader = new DependencyReportReloader(); + + reloader.setReportManager(dependencyReportManager); + return reloader; + } + @Bean public ReportReloader eventReportReloader( @Qualifier(EventAnalyzer.ID + "ReportManager") ReportManager eventReportManager) { @@ -523,6 +702,24 @@ public ReportReloader matrixReportReloader( return reloader; } + @Bean + public ReportReloader problemReportReloader( + @Qualifier(ProblemAnalyzer.ID + "ReportManager") ReportManager problemReportManager) { + ProblemReportReloader reloader = new ProblemReportReloader(); + + reloader.setReportManager(problemReportManager); + return reloader; + } + + @Bean + public ReportReloader storageReportReloader( + @Qualifier(StorageAnalyzer.ID + "ReportManager") ReportManager storageReportManager) { + StorageReportReloader reloader = new StorageReportReloader(); + + reloader.setReportManager(storageReportManager); + return reloader; + } + @Bean public ReportReloader topReportReloader( @Qualifier(TopAnalyzer.ID + "ReportManager") ReportManager topReportManager) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/BusinessReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/BusinessReportReloader.java index 040cee66bd..02d8967f66 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/BusinessReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/BusinessReportReloader.java @@ -38,6 +38,7 @@ import com.dianping.cat.report.task.reload.AbstractReportReloader; import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; +import com.dianping.cat.spring.CatSpringContext; @Named(type = ReportReloader.class, value = BusinessAnalyzer.ID) public class BusinessReportReloader extends AbstractReportReloader { @@ -72,6 +73,8 @@ public String getId() { @Override public List loadReport(long time) { + refreshSpringBeans(); + List results = new ArrayList(); Map> mergedReports = new HashMap>(); @@ -111,4 +114,18 @@ public List loadReport(long time) { } return results; } + + @SuppressWarnings("unchecked") + private void refreshSpringBeans() { + ReportManager reportManager = CatSpringContext.getBeanIfAvailable( + BusinessAnalyzer.ID + "ReportManager", ReportManager.class); + + if (reportManager != null) { + m_reportManager = reportManager; + } + } + + public void setReportManager(ReportManager reportManager) { + m_reportManager = reportManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/CrossReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/CrossReportReloader.java index f6d23745ce..f1e7949f65 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/CrossReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/CrossReportReloader.java @@ -38,6 +38,7 @@ import com.dianping.cat.report.task.reload.AbstractReportReloader; import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; +import com.dianping.cat.spring.CatSpringContext; @Named(type = ReportReloader.class, value = CrossAnalyzer.ID) public class CrossReportReloader extends AbstractReportReloader { @@ -72,6 +73,8 @@ public String getId() { @Override public List loadReport(long time) { + refreshSpringBeans(); + List results = new ArrayList(); Map> mergedReports = new HashMap>(); @@ -111,4 +114,18 @@ public List loadReport(long time) { } return results; } + + @SuppressWarnings("unchecked") + private void refreshSpringBeans() { + ReportManager reportManager = CatSpringContext.getBeanIfAvailable( + CrossAnalyzer.ID + "ReportManager", ReportManager.class); + + if (reportManager != null) { + m_reportManager = reportManager; + } + } + + public void setReportManager(ReportManager reportManager) { + m_reportManager = reportManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/DependencyReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/DependencyReportReloader.java index 3f60c9ec04..a3fdb89a63 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/DependencyReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/DependencyReportReloader.java @@ -38,6 +38,7 @@ import com.dianping.cat.report.task.reload.AbstractReportReloader; import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; +import com.dianping.cat.spring.CatSpringContext; @Named(type = ReportReloader.class, value = DependencyAnalyzer.ID) public class DependencyReportReloader extends AbstractReportReloader { @@ -72,6 +73,8 @@ public String getId() { @Override public List loadReport(long time) { + refreshSpringBeans(); + List results = new ArrayList(); Map> mergedReports = new HashMap>(); @@ -111,4 +114,18 @@ public List loadReport(long time) { } return results; } + + @SuppressWarnings("unchecked") + private void refreshSpringBeans() { + ReportManager reportManager = CatSpringContext.getBeanIfAvailable( + DependencyAnalyzer.ID + "ReportManager", ReportManager.class); + + if (reportManager != null) { + m_reportManager = reportManager; + } + } + + public void setReportManager(ReportManager reportManager) { + m_reportManager = reportManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/ProblemReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/ProblemReportReloader.java index e526a37ec6..e45e2c6754 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/ProblemReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/ProblemReportReloader.java @@ -35,6 +35,7 @@ import com.dianping.cat.consumer.problem.model.transform.DefaultNativeBuilder; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.report.ReportManager; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.report.task.reload.AbstractReportReloader; import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; @@ -72,6 +73,8 @@ public String getId() { @Override public List loadReport(long time) { + refreshSpringBeans(); + List results = new ArrayList(); Map> mergedReports = new HashMap>(); @@ -111,4 +114,17 @@ public List loadReport(long time) { } return results; } + + private void refreshSpringBeans() { + ReportManager reportManager = CatSpringContext.getBeanIfAvailable( + ProblemAnalyzer.ID + "ReportManager", ReportManager.class); + + if (reportManager != null) { + m_reportManager = reportManager; + } + } + + public void setReportManager(ReportManager reportManager) { + m_reportManager = reportManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StorageReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StorageReportReloader.java index dff444379e..379daf62ce 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StorageReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StorageReportReloader.java @@ -35,6 +35,7 @@ import com.dianping.cat.consumer.storage.model.transform.DefaultNativeBuilder; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.report.ReportManager; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.report.task.reload.AbstractReportReloader; import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; @@ -72,6 +73,8 @@ public String getId() { @Override public List loadReport(long time) { + refreshSpringBeans(); + List results = new ArrayList(); Map> mergedReports = new HashMap>(); @@ -111,4 +114,17 @@ public List loadReport(long time) { } return results; } + + private void refreshSpringBeans() { + ReportManager reportManager = CatSpringContext.getBeanIfAvailable( + StorageAnalyzer.ID + "ReportManager", ReportManager.class); + + if (reportManager != null) { + m_reportManager = reportManager; + } + } + + public void setReportManager(ReportManager reportManager) { + m_reportManager = reportManager; + } } From 1956380c7a5ab160e9a30de0c9d17735cf13de40 Mon Sep 17 00:00:00 2001 From: Shang Date: Thu, 11 Jun 2026 21:17:59 +0800 Subject: [PATCH 042/231] =?UTF-8?q?ReportReloader=20=E6=AD=A3=E5=BC=8F?= =?UTF-8?q?=E8=84=B1=E7=A6=BB=20Plexus=20fallback=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=20Spring-only=20=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/ComponentsConfigurator.java | 50 ++-- .../report/task/reload/ReportReloadTask.java | 26 +-- .../resources/META-INF/plexus/components.xml | 220 ------------------ 3 files changed, 24 insertions(+), 272 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 5ce849344a..c21a27db21 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -59,24 +59,13 @@ import com.dianping.cat.report.graph.svg.DefaultValueTranslater; import com.dianping.cat.report.page.DomainGroupConfigManager; import com.dianping.cat.report.server.RemoteServersManager; -import com.dianping.cat.report.task.DefaultRemoteServersUpdater; -import com.dianping.cat.report.task.DefaultTaskConsumer; -import com.dianping.cat.report.task.ReportFacade; -import com.dianping.cat.report.task.cmdb.ProjectUpdateTask; -import com.dianping.cat.report.task.reload.ReportReloadTask; -import com.dianping.cat.report.task.reload.impl.BusinessReportReloader; -import com.dianping.cat.report.task.reload.impl.CrossReportReloader; -import com.dianping.cat.report.task.reload.impl.DependencyReportReloader; -import com.dianping.cat.report.task.reload.impl.EventReportReloader; -import com.dianping.cat.report.task.reload.impl.HeartbeatReportReloader; -import com.dianping.cat.report.task.reload.impl.MatrixReportReloader; -import com.dianping.cat.report.task.reload.impl.ProblemReportReloader; -import com.dianping.cat.report.task.reload.impl.StateReportReloader; -import com.dianping.cat.report.task.reload.impl.StorageReportReloader; -import com.dianping.cat.report.task.reload.impl.TopReportReloader; -import com.dianping.cat.report.task.reload.impl.TransactionReportReloader; -import com.dianping.cat.system.page.permission.ResourceConfigManager; -import com.dianping.cat.system.page.permission.UserConfigManager; +import com.dianping.cat.report.task.DefaultRemoteServersUpdater; +import com.dianping.cat.report.task.DefaultTaskConsumer; +import com.dianping.cat.report.task.ReportFacade; +import com.dianping.cat.report.task.cmdb.ProjectUpdateTask; +import com.dianping.cat.report.task.reload.ReportReloadTask; +import com.dianping.cat.system.page.permission.ResourceConfigManager; +import com.dianping.cat.system.page.permission.UserConfigManager; public class ComponentsConfigurator extends AbstractJdbcResourceConfigurator { private static final String[] CORE_REPLACED_DAO_ROLES = { "com.dianping.cat.core.config.ConfigDao", @@ -189,24 +178,13 @@ private void addCoreRepositoryComponents(List components) { private List defineConfigComponents() { List all = new ArrayList(); - - all.add(A(DomainGroupConfigManager.class)); - - all.add(A(ReportReloadTask.class)); - all.add(A(BusinessReportReloader.class)); - all.add(A(CrossReportReloader.class)); - all.add(A(DependencyReportReloader.class)); - all.add(A(EventReportReloader.class)); - all.add(A(HeartbeatReportReloader.class)); - all.add(A(MatrixReportReloader.class)); - all.add(A(ProblemReportReloader.class)); - all.add(A(StateReportReloader.class)); - all.add(A(StorageReportReloader.class)); - all.add(A(TopReportReloader.class)); - all.add(A(TransactionReportReloader.class)); - - return all; - } + + all.add(A(DomainGroupConfigManager.class)); + + all.add(A(ReportReloadTask.class)); + + return all; + } private List defineTableProviderComponents() { List all = new ArrayList(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java index 883a378635..bc48c90878 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java @@ -28,7 +28,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.helper.Threads.Task; -import org.unidal.lookup.ContainerHolder; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; @@ -38,7 +37,7 @@ import com.dianping.cat.spring.CatSpringContext; @Named -public class ReportReloadTask extends ContainerHolder implements Initializable, Task { +public class ReportReloadTask implements Initializable, Task { private static final Logger LOGGER = LoggerFactory.getLogger(ReportReloadTask.class); private static final long DURATION = TimeHelper.ONE_HOUR; @@ -66,22 +65,17 @@ public void initialize() throws InitializationException { Map indexedSpringReloaders = indexSpringReloaders(springReloaders); - if (indexedSpringReloaders.size() >= EXPECTED_RELOADER_COUNT) { - m_reloaders = indexedSpringReloaders; - LOGGER.info("Initialized report reload task from Spring, reloaderCount={}, reloaders={}.", m_reloaders.size(), - m_reloaders.keySet()); - return; - } + if (indexedSpringReloaders.size() < EXPECTED_RELOADER_COUNT) { + String message = String.format( + "Report reload task requires %s Spring reloaders but found %s, springBeanCount=%s, reloaders=%s.", + EXPECTED_RELOADER_COUNT, indexedSpringReloaders.size(), springReloaders.size(), indexedSpringReloaders.keySet()); - Map plexusReloaders = lookupMap(ReportReloader.class); - Map reloaders = new java.util.LinkedHashMap(); + LOGGER.error(message); + throw new InitializationException(message); + } - reloaders.putAll(plexusReloaders); - reloaders.putAll(indexedSpringReloaders); - m_reloaders = reloaders; - LOGGER.info( - "Initialized report reload task, reloaderCount={}, springReloaderCount={}, springBeanCount={}, plexusReloaderCount={}, reloaders={}.", - m_reloaders.size(), indexedSpringReloaders.size(), springReloaders.size(), plexusReloaders.size(), + m_reloaders = indexedSpringReloaders; + LOGGER.info("Initialized report reload task from Spring, reloaderCount={}, reloaders={}.", m_reloaders.size(), m_reloaders.keySet()); } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 5e7a68f0ee..9003e2346d 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -93,226 +93,6 @@ - - com.dianping.cat.report.task.reload.ReportReloader - business - com.dianping.cat.report.task.reload.impl.BusinessReportReloader - - - com.dianping.cat.report.ReportManager - business - - - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - - - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - - - com.dianping.cat.config.server.ServerConfigManager - - - - - com.dianping.cat.report.task.reload.ReportReloader - cross - com.dianping.cat.report.task.reload.impl.CrossReportReloader - - - com.dianping.cat.report.ReportManager - cross - - - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - - - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - - - com.dianping.cat.config.server.ServerConfigManager - - - - - com.dianping.cat.report.task.reload.ReportReloader - dependency - com.dianping.cat.report.task.reload.impl.DependencyReportReloader - - - com.dianping.cat.report.ReportManager - dependency - - - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - - - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - - - com.dianping.cat.config.server.ServerConfigManager - - - - - com.dianping.cat.report.task.reload.ReportReloader - event - com.dianping.cat.report.task.reload.impl.EventReportReloader - - - com.dianping.cat.report.ReportManager - event - - - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - - - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - - - com.dianping.cat.config.server.ServerConfigManager - - - - - com.dianping.cat.report.task.reload.ReportReloader - heartbeat - com.dianping.cat.report.task.reload.impl.HeartbeatReportReloader - - - com.dianping.cat.report.ReportManager - heartbeat - - - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - - - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - - - com.dianping.cat.config.server.ServerConfigManager - - - - - com.dianping.cat.report.task.reload.ReportReloader - matrix - com.dianping.cat.report.task.reload.impl.MatrixReportReloader - - - com.dianping.cat.report.ReportManager - matrix - - - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - - - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - - - com.dianping.cat.config.server.ServerConfigManager - - - - - com.dianping.cat.report.task.reload.ReportReloader - problem - com.dianping.cat.report.task.reload.impl.ProblemReportReloader - - - com.dianping.cat.report.ReportManager - problem - - - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - - - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - - - com.dianping.cat.config.server.ServerConfigManager - - - - - com.dianping.cat.report.task.reload.ReportReloader - state - com.dianping.cat.report.task.reload.impl.StateReportReloader - - - com.dianping.cat.report.ReportManager - state - - - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - - - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - - - com.dianping.cat.config.server.ServerConfigManager - - - - - com.dianping.cat.report.task.reload.ReportReloader - storage - com.dianping.cat.report.task.reload.impl.StorageReportReloader - - - com.dianping.cat.report.ReportManager - storage - - - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - - - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - - - com.dianping.cat.config.server.ServerConfigManager - - - - - com.dianping.cat.report.task.reload.ReportReloader - top - com.dianping.cat.report.task.reload.impl.TopReportReloader - - - com.dianping.cat.report.ReportManager - top - - - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - - - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - - - com.dianping.cat.config.server.ServerConfigManager - - - - - com.dianping.cat.report.task.reload.ReportReloader - transaction - com.dianping.cat.report.task.reload.impl.TransactionReportReloader - - - com.dianping.cat.report.ReportManager - transaction - - - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - - - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - - - com.dianping.cat.config.server.ServerConfigManager - - - org.unidal.dal.jdbc.mapping.TableProvider report From 9f6cfa690d8114c5ef4778633f55ce2c607dd244 Mon Sep 17 00:00:00 2001 From: Shang Date: Thu, 11 Jun 2026 21:47:18 +0800 Subject: [PATCH 043/231] =?UTF-8?q?=E5=B0=86=E6=8A=A5=E8=A1=A8=E9=87=8D?= =?UTF-8?q?=E8=BD=BD=E4=B8=8E=E4=BB=BB=E5=8A=A1=E6=B6=88=E8=B4=B9=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E8=BF=81=E7=A7=BB=E5=88=B0=20Spring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dianping/cat/CatHomeModule.java | 13 +++- .../cat/build/ComponentsConfigurator.java | 13 +--- .../spring/CatHomeSpringConfiguration.java | 59 +++++++++++++++++++ .../cat/report/task/DefaultTaskConsumer.java | 8 +++ .../cat/report/task/ReportFacade.java | 28 ++++----- .../report/task/reload/ReportReloadTask.java | 35 ++++------- .../resources/META-INF/plexus/components.xml | 25 -------- 7 files changed, 103 insertions(+), 78 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java index 38c0bbddb4..373fccb413 100644 --- a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java +++ b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java @@ -52,15 +52,24 @@ protected void execute(ModuleContext ctx) throws Exception { } else { LOGGER.info("Resolved ServerConfigManager from Spring for CatHomeModule."); } - ReportReloadTask reportReloadTask = lookup(ctx, ReportReloadTask.class); + ReportReloadTask reportReloadTask = CatSpringContext.getBeanIfAvailable(ReportReloadTask.class); + + if (reportReloadTask == null) { + throw new IllegalStateException("ReportReloadTask must be configured by Spring for CatHomeModule."); + } + LOGGER.info("Resolved ReportReloadTask from Spring for CatHomeModule."); Threads.forGroup("Cat").start(reportReloadTask); lookup(ctx, MessageConsumer.class); if (serverConfigManager.isJobMachine()) { - DefaultTaskConsumer taskConsumer = lookup(ctx, DefaultTaskConsumer.class); + DefaultTaskConsumer taskConsumer = CatSpringContext.getBeanIfAvailable(DefaultTaskConsumer.class); + if (taskConsumer == null) { + throw new IllegalStateException("DefaultTaskConsumer must be configured by Spring for CatHomeModule."); + } + LOGGER.info("Resolved DefaultTaskConsumer from Spring for CatHomeModule."); Threads.forGroup("Cat").start(taskConsumer); } diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index c21a27db21..ef2939eff9 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -60,10 +60,7 @@ import com.dianping.cat.report.page.DomainGroupConfigManager; import com.dianping.cat.report.server.RemoteServersManager; import com.dianping.cat.report.task.DefaultRemoteServersUpdater; -import com.dianping.cat.report.task.DefaultTaskConsumer; -import com.dianping.cat.report.task.ReportFacade; import com.dianping.cat.report.task.cmdb.ProjectUpdateTask; -import com.dianping.cat.report.task.reload.ReportReloadTask; import com.dianping.cat.system.page.permission.ResourceConfigManager; import com.dianping.cat.system.page.permission.UserConfigManager; @@ -97,12 +94,8 @@ private List defineCommonComponents() { all.add(A(ProjectUpdateTask.class)); - all.add(A(ReportFacade.class)); - - all.add(A(DefaultTaskConsumer.class)); - - return all; - } + return all; + } @Override public List defineComponents() { @@ -181,8 +174,6 @@ private List defineConfigComponents() { all.add(A(DomainGroupConfigManager.class)); - all.add(A(ReportReloadTask.class)); - return all; } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 635f86521e..e3ca789084 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -222,6 +222,8 @@ import com.dianping.cat.report.page.storage.task.StorageReportService; import com.dianping.cat.report.page.storage.transform.StorageMergeHelper; import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.report.task.DefaultTaskConsumer; +import com.dianping.cat.report.task.ReportFacade; import com.dianping.cat.report.service.AbstractReportService; import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; @@ -244,6 +246,7 @@ import com.dianping.cat.report.ReportDelegate; import com.dianping.cat.report.ReportManager; import com.dianping.cat.report.task.reload.ReportReloader; +import com.dianping.cat.report.task.reload.ReportReloadTask; import com.dianping.cat.report.task.reload.impl.BusinessReportReloader; import com.dianping.cat.report.task.reload.impl.CrossReportReloader; import com.dianping.cat.report.task.reload.impl.DependencyReportReloader; @@ -738,6 +741,62 @@ public ReportReloader stateReportReloader( return reloader; } + @Bean + public Map reportReloaders(@Qualifier("businessReportReloader") ReportReloader businessReportReloader, + @Qualifier("transactionReportReloader") ReportReloader transactionReportReloader, + @Qualifier("crossReportReloader") ReportReloader crossReportReloader, + @Qualifier("dependencyReportReloader") ReportReloader dependencyReportReloader, + @Qualifier("eventReportReloader") ReportReloader eventReportReloader, + @Qualifier("heartbeatReportReloader") ReportReloader heartbeatReportReloader, + @Qualifier("matrixReportReloader") ReportReloader matrixReportReloader, + @Qualifier("problemReportReloader") ReportReloader problemReportReloader, + @Qualifier("storageReportReloader") ReportReloader storageReportReloader, + @Qualifier("topReportReloader") ReportReloader topReportReloader, + @Qualifier("stateReportReloader") ReportReloader stateReportReloader) { + Map reloaders = new LinkedHashMap(); + + reloaders.put(businessReportReloader.getId(), businessReportReloader); + reloaders.put(transactionReportReloader.getId(), transactionReportReloader); + reloaders.put(crossReportReloader.getId(), crossReportReloader); + reloaders.put(dependencyReportReloader.getId(), dependencyReportReloader); + reloaders.put(eventReportReloader.getId(), eventReportReloader); + reloaders.put(heartbeatReportReloader.getId(), heartbeatReportReloader); + reloaders.put(matrixReportReloader.getId(), matrixReportReloader); + reloaders.put(problemReportReloader.getId(), problemReportReloader); + reloaders.put(storageReportReloader.getId(), storageReportReloader); + reloaders.put(topReportReloader.getId(), topReportReloader); + reloaders.put(stateReportReloader.getId(), stateReportReloader); + return reloaders; + } + + @Bean(initMethod = "initialize") + public ReportReloadTask reportReloadTask(ReportReloadConfigManager reportReloadConfigManager, + @Qualifier("reportReloaders") Map reportReloaders) { + ReportReloadTask task = new ReportReloadTask(); + + task.setConfigManager(reportReloadConfigManager); + task.setReloaders(reportReloaders); + return task; + } + + @Bean(initMethod = "initialize") + public ReportFacade reportFacade(Logger plexusConsoleLogger, Map taskBuilders) { + ReportFacade facade = new ReportFacade(); + + facade.enableLogging(plexusConsoleLogger.getChildLogger(ReportFacade.class.getName())); + facade.setReportBuilders(taskBuilders); + return facade; + } + + @Bean + public DefaultTaskConsumer defaultTaskConsumer(ReportFacade reportFacade, TaskRepository taskRepository) { + DefaultTaskConsumer consumer = new DefaultTaskConsumer(); + + consumer.setReportFacade(reportFacade); + consumer.setTaskDao(taskRepository); + return consumer; + } + @Bean(name = CurrentReportBuilder.ID) public TaskBuilder currentReportBuilder(ProjectService projectService, ServerFilterConfigManager serverFilterConfigManager) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java index 34fa51f1fc..07adcb3154 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java @@ -176,4 +176,12 @@ private void refreshSpringBeans() { m_taskDao = taskDao; } } + + public void setReportFacade(ReportFacade reportFacade) { + m_reportFacade = reportFacade; + } + + public void setTaskDao(TaskRepository taskDao) { + m_taskDao = taskDao; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java b/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java index 041af3c688..d43f021862 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java @@ -33,7 +33,6 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.Task; -import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; @Named @@ -105,25 +104,16 @@ private TaskBuilder getReportBuilder(String reportName) { @Override public void initialize() throws InitializationException { - Map springBuilders = CatSpringContext.getBeansIfAvailable(TaskBuilder.class); - Map springReportBuilders = buildReportBuilderMap(springBuilders); + if (m_reportBuilders.size() < EXPECTED_REPORT_BUILDER_COUNT) { + String message = String.format("Report facade requires %s Spring task builders but found %s, builders=%s.", + EXPECTED_REPORT_BUILDER_COUNT, m_reportBuilders.size(), m_reportBuilders.keySet()); - if (springBuilders.size() >= EXPECTED_REPORT_BUILDER_COUNT) { - m_reportBuilders = springReportBuilders; - SLF4J_LOGGER.info("Initialized report facade from Spring, builderCount={}, builders={}.", - m_reportBuilders.size(), m_reportBuilders.keySet()); - return; + SLF4J_LOGGER.error(message); + throw new InitializationException(message); } - Map plexusBuilders = lookupMap(TaskBuilder.class); - Map builders = new HashMap(); - - builders.putAll(plexusBuilders); - builders.putAll(springReportBuilders); - m_reportBuilders = builders; - SLF4J_LOGGER.info( - "Initialized report facade, builderCount={}, springBuilderCount={}, plexusBuilderCount={}, builders={}.", - m_reportBuilders.size(), springBuilders.size(), plexusBuilders.size(), m_reportBuilders.keySet()); + SLF4J_LOGGER.info("Initialized report facade from Spring, builderCount={}, builders={}.", + m_reportBuilders.size(), m_reportBuilders.keySet()); } private Map buildReportBuilderMap(Map springBuilders) { @@ -156,4 +146,8 @@ private String getReportName(TaskBuilder builder) { } } + public void setReportBuilders(Map reportBuilders) { + m_reportBuilders = buildReportBuilderMap(reportBuilders); + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java index bc48c90878..6267f9c352 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java @@ -34,7 +34,6 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.ReportReloadConfigManager; import com.dianping.cat.helper.TimeHelper; -import com.dianping.cat.spring.CatSpringContext; @Named public class ReportReloadTask implements Initializable, Task { @@ -56,38 +55,20 @@ public String getName() { @Override public void initialize() throws InitializationException { - ReportReloadConfigManager configManager = CatSpringContext.getBeanIfAvailable(ReportReloadConfigManager.class); - Map springReloaders = CatSpringContext.getBeansIfAvailable(ReportReloader.class); - - if (configManager != null) { - m_configManager = configManager; - } - - Map indexedSpringReloaders = indexSpringReloaders(springReloaders); - - if (indexedSpringReloaders.size() < EXPECTED_RELOADER_COUNT) { + if (m_reloaders == null || m_reloaders.size() < EXPECTED_RELOADER_COUNT) { String message = String.format( - "Report reload task requires %s Spring reloaders but found %s, springBeanCount=%s, reloaders=%s.", - EXPECTED_RELOADER_COUNT, indexedSpringReloaders.size(), springReloaders.size(), indexedSpringReloaders.keySet()); + "Report reload task requires %s Spring reloaders but found %s, reloaders=%s.", + EXPECTED_RELOADER_COUNT, m_reloaders == null ? 0 : m_reloaders.size(), + m_reloaders == null ? java.util.Collections.emptySet() : m_reloaders.keySet()); LOGGER.error(message); throw new InitializationException(message); } - m_reloaders = indexedSpringReloaders; LOGGER.info("Initialized report reload task from Spring, reloaderCount={}, reloaders={}.", m_reloaders.size(), m_reloaders.keySet()); } - private Map indexSpringReloaders(Map springReloaders) { - Map reloaders = new java.util.LinkedHashMap(); - - for (ReportReloader reloader : springReloaders.values()) { - reloaders.put(reloader.getId(), reloader); - } - return reloaders; - } - @Override public void run() { boolean active = TimeHelper.sleepToNextMinute(); @@ -130,4 +111,12 @@ public void run() { public void shutdown() { } + + public void setConfigManager(ReportReloadConfigManager configManager) { + m_configManager = configManager; + } + + public void setReloaders(Map reloaders) { + m_reloaders = reloaders; + } } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 9003e2346d..5f40b785d7 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -56,22 +56,6 @@ - - com.dianping.cat.report.task.ReportFacade - com.dianping.cat.report.task.ReportFacade - - - com.dianping.cat.report.task.DefaultTaskConsumer - com.dianping.cat.report.task.DefaultTaskConsumer - - - com.dianping.cat.report.task.ReportFacade - - - com.dianping.cat.core.mybatis.repository.task.TaskRepository - - - com.dianping.cat.report.page.DomainGroupConfigManager com.dianping.cat.report.page.DomainGroupConfigManager @@ -84,15 +68,6 @@ - - com.dianping.cat.report.task.reload.ReportReloadTask - com.dianping.cat.report.task.reload.ReportReloadTask - - - com.dianping.cat.config.ReportReloadConfigManager - - - org.unidal.dal.jdbc.mapping.TableProvider report From 4fccaddd41b0480f693a35080aab8da84251c985 Mon Sep 17 00:00:00 2001 From: Shang Date: Thu, 11 Jun 2026 22:25:46 +0800 Subject: [PATCH 044/231] =?UTF-8?q?=E5=B0=86=E8=BF=9C=E7=AB=AF=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=E5=88=B7=E6=96=B0=E4=B8=8E=E9=83=A8=E5=88=86?= =?UTF-8?q?=E7=A6=BB=E7=BA=BF=E4=BB=BB=E5=8A=A1=E8=BF=81=E7=A7=BB=E5=88=B0?= =?UTF-8?q?=20Spring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dianping/cat/CatCoreModule.java | 7 ++- .../report/server/ServersUpdaterManager.java | 8 +++ .../cat/build/ComponentsConfigurator.java | 11 +--- .../report/OfflineComponentConfigurator.java | 5 -- .../spring/CatHomeSpringConfiguration.java | 22 ++++++++ .../task/DefaultRemoteServersUpdater.java | 23 +++++++- .../task/cmdb/CmdbInfoReloadBuilder.java | 14 +++-- .../task/current/CurrentReportBuilder.java | 5 -- .../resources/META-INF/plexus/components.xml | 52 ------------------- 9 files changed, 69 insertions(+), 78 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/CatCoreModule.java b/cat-core/src/main/java/com/dianping/cat/CatCoreModule.java index 788723c17a..b90c4e7546 100644 --- a/cat-core/src/main/java/com/dianping/cat/CatCoreModule.java +++ b/cat-core/src/main/java/com/dianping/cat/CatCoreModule.java @@ -24,6 +24,7 @@ import org.unidal.lookup.annotation.Named; import com.dianping.cat.report.server.ServersUpdaterManager; +import com.dianping.cat.spring.CatSpringContext; @Named(type = Module.class, value = CatCoreModule.ID) public class CatCoreModule extends AbstractModule { @@ -32,7 +33,11 @@ public class CatCoreModule extends AbstractModule { @Override protected void execute(final ModuleContext ctx) throws Exception { // bring up ServersUpdaterManager - ctx.lookup(ServersUpdaterManager.class); + ServersUpdaterManager manager = CatSpringContext.getBeanIfAvailable(ServersUpdaterManager.class); + + if (manager == null) { + ctx.lookup(ServersUpdaterManager.class); + } } @Override diff --git a/cat-core/src/main/java/com/dianping/cat/report/server/ServersUpdaterManager.java b/cat-core/src/main/java/com/dianping/cat/report/server/ServersUpdaterManager.java index fe9ca1f3c1..7453e83b81 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/server/ServersUpdaterManager.java +++ b/cat-core/src/main/java/com/dianping/cat/report/server/ServersUpdaterManager.java @@ -68,4 +68,12 @@ public void handle() throws Exception { } }); } + + public void setRemoteServerUpdater(ServersUpdater remoteServerUpdater) { + m_remoteServerUpdater = remoteServerUpdater; + } + + public void setRemoteServersManager(RemoteServersManager remoteServersManager) { + m_remoteServersManager = remoteServersManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index ef2939eff9..61e0b6c5ec 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -58,9 +58,6 @@ import com.dianping.cat.report.graph.svg.DefaultGraphBuilder; import com.dianping.cat.report.graph.svg.DefaultValueTranslater; import com.dianping.cat.report.page.DomainGroupConfigManager; -import com.dianping.cat.report.server.RemoteServersManager; -import com.dianping.cat.report.task.DefaultRemoteServersUpdater; -import com.dianping.cat.report.task.cmdb.ProjectUpdateTask; import com.dianping.cat.system.page.permission.ResourceConfigManager; import com.dianping.cat.system.page.permission.UserConfigManager; @@ -82,18 +79,12 @@ private List defineCommonComponents() { all.add(A(JsonBuilder.class)); - all.add(A(RemoteServersManager.class)); - - all.add(A(DefaultRemoteServersUpdater.class)); - - all.add(A(DefaultValueTranslater.class)); + all.add(A(DefaultValueTranslater.class)); all.add(A(DefaultGraphBuilder.class)); all.add(A(PayloadNormalizer.class)); - all.add(A(ProjectUpdateTask.class)); - return all; } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java index 5b59c7fa65..cd02683313 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java @@ -31,8 +31,6 @@ import com.dianping.cat.report.page.overload.task.MonthlyCapacityUpdater; import com.dianping.cat.report.page.overload.task.TableCapacityService; import com.dianping.cat.report.page.overload.task.WeeklyCapacityUpdater; -import com.dianping.cat.report.task.cmdb.CmdbInfoReloadBuilder; -import com.dianping.cat.report.task.current.CurrentReportBuilder; public class OfflineComponentConfigurator extends AbstractResourceConfigurator { @Override @@ -47,9 +45,6 @@ public List defineComponents() { all.add(A(TableCapacityService.class)); all.add(A(CapacityUpdateTask.class)); - all.add(A(CurrentReportBuilder.class)); - all.add(A(CmdbInfoReloadBuilder.class)); - return all; } } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index e3ca789084..86b26fa50b 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -222,7 +222,10 @@ import com.dianping.cat.report.page.storage.task.StorageReportService; import com.dianping.cat.report.page.storage.transform.StorageMergeHelper; import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.report.server.ServersUpdater; +import com.dianping.cat.report.server.ServersUpdaterManager; import com.dianping.cat.report.task.DefaultTaskConsumer; +import com.dianping.cat.report.task.DefaultRemoteServersUpdater; import com.dianping.cat.report.task.ReportFacade; import com.dianping.cat.report.service.AbstractReportService; import com.dianping.cat.report.service.LocalModelService; @@ -1912,6 +1915,25 @@ public RemoteServersManager remoteServersManager() { return new RemoteServersManager(); } + @Bean + public ServersUpdater remoteServersUpdater( + @Qualifier("localStateService") LocalModelService stateModelService) { + DefaultRemoteServersUpdater updater = new DefaultRemoteServersUpdater(); + + updater.setLocalService(stateModelService); + return updater; + } + + @Bean(initMethod = "initialize") + public ServersUpdaterManager serversUpdaterManager(ServersUpdater remoteServersUpdater, + RemoteServersManager remoteServersManager) { + ServersUpdaterManager manager = new ServersUpdaterManager(); + + manager.setRemoteServerUpdater(remoteServersUpdater); + manager.setRemoteServersManager(remoteServersManager); + return manager; + } + @Bean public DomainValidator domainValidator() { return new DomainValidator(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultRemoteServersUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultRemoteServersUpdater.java index 961a068e10..22ba4a0fd7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultRemoteServersUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultRemoteServersUpdater.java @@ -33,7 +33,10 @@ import com.dianping.cat.consumer.state.model.entity.ProcessDomain; import com.dianping.cat.consumer.state.model.entity.StateReport; import com.dianping.cat.consumer.state.model.transform.BaseVisitor; +import com.dianping.cat.consumer.state.model.transform.DefaultSaxParser; +import com.dianping.cat.mvc.ApiPayload; import com.dianping.cat.report.server.ServersUpdater; +import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; @@ -45,6 +48,8 @@ public class DefaultRemoteServersUpdater implements ServersUpdater { @Inject(type = ModelService.class, value = StateAnalyzer.ID) private ModelService m_service; + private LocalModelService m_localService; + @Override public Map> buildServers(Date hour) { StateReport currentReport = queryStateReport(Constants.CAT, hour.getTime()); @@ -63,7 +68,15 @@ public StateReport queryStateReport(String domain, long time) { if (period == ModelPeriod.CURRENT || period == ModelPeriod.LAST) { ModelRequest request = new ModelRequest(domain, time); - if (m_service.isEligable(request)) { + if (m_localService != null && m_localService.isEligable(request)) { + try { + String xml = m_localService.getReport(request, period, domain, new ApiPayload()); + + return DefaultSaxParser.parse(xml); + } catch (Exception e) { + throw new RuntimeException("Unable to build local state report for " + request + "!", e); + } + } else if (m_service != null && m_service.isEligable(request)) { ModelResponse response = m_service.invoke(request); StateReport report = response.getModel(); @@ -76,6 +89,14 @@ public StateReport queryStateReport(String domain, long time) { } } + public void setService(ModelService service) { + m_service = service; + } + + public void setLocalService(LocalModelService localService) { + m_localService = localService; + } + public static class StateReportVisitor extends BaseVisitor { private Map> m_servers = new ConcurrentHashMap>(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/CmdbInfoReloadBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/CmdbInfoReloadBuilder.java index e491bf4cde..773a9a1365 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/CmdbInfoReloadBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/CmdbInfoReloadBuilder.java @@ -20,20 +20,20 @@ import java.util.Date; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.helper.Threads; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Constants; import com.dianping.cat.report.task.TaskBuilder; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = CmdbInfoReloadBuilder.ID) public class CmdbInfoReloadBuilder implements TaskBuilder { public static final String ID = Constants.CMDB; - @Inject + private static final Logger LOGGER = LoggerFactory.getLogger(CmdbInfoReloadBuilder.class); + private ProjectUpdateTask m_projectUpdateTask; @Override @@ -44,6 +44,12 @@ public boolean buildDailyTask(String name, String domain, Date period) { @Override public boolean buildHourlyTask(String name, String domain, Date period) { refreshSpringBeans(); + + if (m_projectUpdateTask == null) { + LOGGER.warn("Project update task is not available, skip cmdb reload task, name={}, domain={}, period={}.", + name, domain, period); + return false; + } Threads.forGroup(Constants.CAT).start(m_projectUpdateTask); return true; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java index 5f64219aef..41c4f9dbbc 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java @@ -26,8 +26,6 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.helper.Threads; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -37,16 +35,13 @@ import com.dianping.cat.service.ProjectService; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = CurrentReportBuilder.ID) public class CurrentReportBuilder implements TaskBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(CurrentReportBuilder.class); public static final String ID = Constants.CURRENT_REPORT; - @Inject private ProjectService m_projectService; - @Inject private ServerFilterConfigManager m_serverFilterConfigManager; @Override diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 5f40b785d7..10a8228276 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -5,20 +5,6 @@ com.dianping.cat.helper.JsonBuilder com.dianping.cat.helper.JsonBuilder - - com.dianping.cat.report.server.RemoteServersManager - com.dianping.cat.report.server.RemoteServersManager - - - com.dianping.cat.report.server.ServersUpdater - com.dianping.cat.report.task.DefaultRemoteServersUpdater - - - com.dianping.cat.report.service.ModelService - state - - - com.dianping.cat.report.graph.svg.ValueTranslater com.dianping.cat.report.graph.svg.DefaultValueTranslater @@ -41,21 +27,6 @@ - - com.dianping.cat.report.task.cmdb.ProjectUpdateTask - com.dianping.cat.report.task.cmdb.ProjectUpdateTask - - - com.dianping.cat.service.HostinfoService - - - com.dianping.cat.service.ProjectService - - - com.dianping.cat.report.page.transaction.service.TransactionReportService - - - com.dianping.cat.report.page.DomainGroupConfigManager com.dianping.cat.report.page.DomainGroupConfigManager @@ -2264,29 +2235,6 @@ - - com.dianping.cat.report.task.TaskBuilder - currentReport - com.dianping.cat.report.task.current.CurrentReportBuilder - - - com.dianping.cat.service.ProjectService - - - com.dianping.cat.config.server.ServerFilterConfigManager - - - - - com.dianping.cat.report.task.TaskBuilder - cmdb - com.dianping.cat.report.task.cmdb.CmdbInfoReloadBuilder - - - com.dianping.cat.report.task.cmdb.ProjectUpdateTask - - - org.unidal.dal.jdbc.datasource.DataSourceProvider org.unidal.dal.jdbc.datasource.DefaultDataSourceProvider From c677498d1695e20b6a86071e2a1a42627c97b834 Mon Sep 17 00:00:00 2001 From: Shang Date: Thu, 11 Jun 2026 22:54:33 +0800 Subject: [PATCH 045/231] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E4=BB=BB=E5=8A=A1=20Builder=20=E5=88=B0=20Sp?= =?UTF-8?q?ring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DependencyComponentConfigurator.java | 3 - .../report/EventComponentConfigurator.java | 3 - .../HeartbeatComponentConfigurator.java | 3 - .../report/MetricComponentConfigurator.java | 2 - .../report/ReportComponentConfigurator.java | 16 -- .../TransactionComponentConfigurator.java | 3 - .../task/BusinessBaselineReportBuilder.java | 11 - .../page/cross/task/CrossReportBuilder.java | 4 - .../task/DependencyReportBuilder.java | 6 - .../page/event/task/EventReportBuilder.java | 6 - .../task/HeartbeatReportBuilder.java | 4 - .../page/matrix/task/MatrixReportBuilder.java | 4 - .../page/state/task/StateReportBuilder.java | 8 - .../task/heavy/HeavyReportBuilder.java | 6 - .../statistics/task/jar/JarReportBuilder.java | 6 - .../task/service/ClientReportBuilder.java | 8 - .../task/service/ServiceReportBuilder.java | 12 +- .../utilization/UtilizationReportBuilder.java | 31 +-- .../task/TransactionReportBuilder.java | 6 - .../resources/META-INF/plexus/components.xml | 223 ------------------ 20 files changed, 14 insertions(+), 351 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java index c781e0920f..2012e5119b 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java @@ -35,7 +35,6 @@ import com.dianping.cat.report.page.dependency.service.DependencyReportService; import com.dianping.cat.report.page.dependency.service.HistoricalDependencyService; import com.dianping.cat.report.page.dependency.service.LocalDependencyService; -import com.dianping.cat.report.page.dependency.task.DependencyReportBuilder; import com.dianping.cat.report.server.RemoteServersManager; import com.dianping.cat.report.service.ModelService; @@ -63,8 +62,6 @@ public List defineComponents() { .req(ServerConfigManager.class, RemoteServersManager.class) // .req(ModelService.class, new String[] { "dependency-historical" }, "m_services")); - all.add(A(DependencyReportBuilder.class)); - return all; } } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java index 603309245c..b9b68ae047 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java @@ -37,7 +37,6 @@ import com.dianping.cat.report.page.event.service.EventReportService; import com.dianping.cat.report.page.event.service.HistoricalEventService; import com.dianping.cat.report.page.event.service.LocalEventService; -import com.dianping.cat.report.page.event.task.EventReportBuilder; import com.dianping.cat.report.server.RemoteServersManager; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.service.ProjectService; @@ -63,8 +62,6 @@ public List defineComponents() { .req(ServerConfigManager.class, RemoteServersManager.class) // .req(ModelService.class, new String[] { "event-historical" }, "m_services")); - all.add(A(EventReportBuilder.class)); - return all; } } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java index ef53244e51..b9a3a5b402 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java @@ -37,7 +37,6 @@ import com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService; import com.dianping.cat.report.page.heartbeat.service.HistoricalHeartbeatService; import com.dianping.cat.report.page.heartbeat.service.LocalHeartbeatService; -import com.dianping.cat.report.page.heartbeat.task.HeartbeatReportBuilder; import com.dianping.cat.report.server.RemoteServersManager; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.service.ProjectService; @@ -64,8 +63,6 @@ public List defineComponents() { all.add(A(HeartbeatAlert.class)); - all.add(A(HeartbeatReportBuilder.class)); - return all; } } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java index 805d1f3cf0..00ab1e0cb7 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java @@ -40,7 +40,6 @@ import com.dianping.cat.report.page.business.service.CompositeBusinessService; import com.dianping.cat.report.page.business.service.HistoricalBusinessService; import com.dianping.cat.report.page.business.service.LocalBusinessService; -import com.dianping.cat.report.page.business.task.BusinessBaselineReportBuilder; import com.dianping.cat.report.page.business.task.BusinessKeyHelper; import com.dianping.cat.report.page.business.task.BusinessPointParser; import com.dianping.cat.report.page.metric.service.DefaultBaselineService; @@ -75,7 +74,6 @@ public List defineComponents() { all.add(A(BusinessKeyHelper.class)); all.add(A(DefaultBaselineCreator.class)); all.add(A(DefaultBaselineService.class)); - all.add(A(BusinessBaselineReportBuilder.class)); all.add(C(Contactor.class, BusinessContactor.ID, BusinessContactor.class) .req(ProjectService.class, AlertConfigManager.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java index ff0c15e326..e2296ecf52 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java @@ -40,7 +40,6 @@ import com.dianping.cat.report.page.cross.service.CrossReportService; import com.dianping.cat.report.page.cross.service.HistoricalCrossService; import com.dianping.cat.report.page.cross.service.LocalCrossService; -import com.dianping.cat.report.page.cross.task.CrossReportBuilder; import com.dianping.cat.report.page.logview.service.CompositeLogViewService; import com.dianping.cat.report.page.logview.service.HistoricalMessageService; import com.dianping.cat.report.page.logview.service.LocalMessageService; @@ -48,23 +47,16 @@ import com.dianping.cat.report.page.matrix.service.HistoricalMatrixService; import com.dianping.cat.report.page.matrix.service.LocalMatrixService; import com.dianping.cat.report.page.matrix.service.MatrixReportService; -import com.dianping.cat.report.page.matrix.task.MatrixReportBuilder; import com.dianping.cat.report.page.state.StateGraphBuilder; import com.dianping.cat.report.page.state.service.CompositeStateService; import com.dianping.cat.report.page.state.service.HistoricalStateService; import com.dianping.cat.report.page.state.service.LocalStateService; import com.dianping.cat.report.page.state.service.StateReportService; -import com.dianping.cat.report.page.state.task.StateReportBuilder; import com.dianping.cat.report.page.statistics.service.ClientReportService; import com.dianping.cat.report.page.statistics.service.HeavyReportService; import com.dianping.cat.report.page.statistics.service.JarReportService; import com.dianping.cat.report.page.statistics.service.ServiceReportService; import com.dianping.cat.report.page.statistics.service.UtilizationReportService; -import com.dianping.cat.report.page.statistics.task.heavy.HeavyReportBuilder; -import com.dianping.cat.report.page.statistics.task.jar.JarReportBuilder; -import com.dianping.cat.report.page.statistics.task.service.ClientReportBuilder; -import com.dianping.cat.report.page.statistics.task.service.ServiceReportBuilder; -import com.dianping.cat.report.page.statistics.task.utilization.UtilizationReportBuilder; import com.dianping.cat.report.page.top.service.CompositeTopService; import com.dianping.cat.report.page.top.service.HistoricalTopService; import com.dianping.cat.report.page.top.service.LocalTopService; @@ -84,13 +76,10 @@ public List defineComponents() { List all = new ArrayList(); all.add(A(UtilizationReportService.class)); - all.add(A(UtilizationReportBuilder.class)); all.add(A(ServiceReportService.class)); - all.add(A(ServiceReportBuilder.class)); all.add(A(HeavyReportService.class)); - all.add(A(HeavyReportBuilder.class)); all.add(A(RouterConfigManager.class)); all.add(A(RouterConfigHandler.class)); @@ -100,14 +89,11 @@ public List defineComponents() { all.add(A(RouterConfigBuilder.class)); all.add(A(JarReportService.class)); - all.add(A(JarReportBuilder.class)); all.add(A(ClientReportService.class)); - all.add(A(ClientReportBuilder.class)); // cross report all.add(A(CrossReportService.class)); - all.add(A(CrossReportBuilder.class)); all.add(A(LocalCrossService.class)); all.add(C(ModelService.class, "cross-historical", HistoricalCrossService.class) // @@ -118,7 +104,6 @@ public List defineComponents() { // matrix report all.add(A(MatrixReportService.class)); - all.add(A(MatrixReportBuilder.class)); all.add(A(LocalMatrixService.class)); all.add(C(ModelService.class, "matrix-historical", HistoricalMatrixService.class) // @@ -129,7 +114,6 @@ public List defineComponents() { // state report all.add(A(StateReportService.class)); - all.add(A(StateReportBuilder.class)); all.add(A(StateGraphBuilder.class)); all.add(A(LocalStateService.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java index 0850134608..0cacdaeede 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java @@ -37,7 +37,6 @@ import com.dianping.cat.report.page.transaction.service.HistoricalTransactionService; import com.dianping.cat.report.page.transaction.service.LocalTransactionService; import com.dianping.cat.report.page.transaction.service.TransactionReportService; -import com.dianping.cat.report.page.transaction.task.TransactionReportBuilder; import com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper; import com.dianping.cat.report.server.RemoteServersManager; import com.dianping.cat.report.service.ModelService; @@ -64,8 +63,6 @@ public List defineComponents() { .req(ServerConfigManager.class, RemoteServersManager.class) // .req(ModelService.class, new String[] { "transaction-historical" }, "m_services")); - all.add(A(TransactionReportBuilder.class)); - return all; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java index 049a910ae7..c65e171e3a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessBaselineReportBuilder.java @@ -24,9 +24,6 @@ import java.util.List; import java.util.Map; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.config.business.BusinessConfigManager; import com.dianping.cat.configuration.business.entity.BusinessItemConfig; import com.dianping.cat.configuration.business.entity.BusinessReportConfig; @@ -44,32 +41,24 @@ import com.dianping.cat.report.task.TaskBuilder; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = BusinessBaselineReportBuilder.ID) public class BusinessBaselineReportBuilder implements TaskBuilder { public static final String ID = BusinessAnalyzer.ID; private static final int POINT_NUMBER = 60 * 24; - @Inject private BusinessReportService m_reportService; - @Inject private BusinessConfigManager m_configManager; - @Inject private BaselineConfigManager m_baselineConfigManager; - @Inject private BusinessPointParser m_parser; - @Inject private BaselineCreator m_baselineCreator; - @Inject private BaselineService m_baselineService; - @Inject private BusinessKeyHelper m_keyHelper; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java index e434467037..80a8efc1c1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java @@ -24,8 +24,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; @@ -44,13 +42,11 @@ import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = CrossReportBuilder.ID) public class CrossReportBuilder implements TaskBuilder, Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(CrossReportBuilder.class); public static final String ID = CrossAnalyzer.ID; - @Inject protected CrossReportService m_reportService; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java index 5b425f46b7..cdf7136209 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java @@ -25,8 +25,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; @@ -41,19 +39,15 @@ import com.dianping.cat.report.task.TaskBuilder; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = DependencyReportBuilder.ID) public class DependencyReportBuilder implements TaskBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(DependencyReportBuilder.class); public static final String ID = DependencyAnalyzer.ID; - @Inject private DependencyReportService m_reportService; - @Inject private TopologyGraphBuilder m_graphBuilder; - @Inject private TopologyGraphRepository m_topologyGraphDao; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java index a2816af497..7423e73d6a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java @@ -25,8 +25,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.AtomicMessageConfigManager; @@ -47,19 +45,15 @@ import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = EventReportBuilder.ID) public class EventReportBuilder implements TaskBuilder, Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(EventReportBuilder.class); public static final String ID = EventAnalyzer.ID; - @Inject protected EventReportService m_reportService; - @Inject protected ServerConfigManager m_serverConfigManager; - @Inject private AtomicMessageConfigManager m_atomicMessageConfigManager; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/task/HeartbeatReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/task/HeartbeatReportBuilder.java index ebd1c88443..7cfb3c4db9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/task/HeartbeatReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/task/HeartbeatReportBuilder.java @@ -22,8 +22,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; @@ -37,13 +35,11 @@ import com.dianping.cat.report.task.TaskHelper; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = HeartbeatReportBuilder.ID) public class HeartbeatReportBuilder implements TaskBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(HeartbeatReportBuilder.class); public static final String ID = HeartbeatAnalyzer.ID; - @Inject protected HeartbeatReportService m_reportService; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java index ef8f53f6a9..da349967cb 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java @@ -24,8 +24,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; @@ -45,13 +43,11 @@ import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = MatrixReportBuilder.ID) public class MatrixReportBuilder implements TaskBuilder, Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(MatrixReportBuilder.class); public static final String ID = MatrixAnalyzer.ID; - @Inject protected MatrixReportService m_reportService; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java index 21fe051e1c..23e41236f1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java @@ -25,8 +25,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -52,25 +50,19 @@ import com.dianping.cat.service.ProjectService; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = StateReportBuilder.ID) public class StateReportBuilder implements TaskBuilder, Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(StateReportBuilder.class); public static final String ID = StateAnalyzer.ID; - @Inject protected StateReportService m_reportService; - @Inject protected ServerConfigManager m_serverConfigManager; - @Inject protected ServerFilterConfigManager m_serverFilterConfigManager; - @Inject private ProjectService m_projectService; - @Inject private HostinfoService m_hostinfoService; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java index f130568c2c..0ce95a1dd3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/heavy/HeavyReportBuilder.java @@ -23,8 +23,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -45,19 +43,15 @@ import com.dianping.cat.report.task.TaskHelper; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = HeavyReportBuilder.ID) public class HeavyReportBuilder implements TaskBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(HeavyReportBuilder.class); public static final String ID = Constants.REPORT_HEAVY; - @Inject protected HeavyReportService m_reportService; - @Inject protected MatrixReportService m_matrixReportService; - @Inject private ServerFilterConfigManager m_configManager; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java index 173b9cf5f6..cfcee4800b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/jar/JarReportBuilder.java @@ -28,8 +28,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Constants; import com.dianping.cat.config.server.ServerFilterConfigManager; @@ -49,7 +47,6 @@ import com.dianping.cat.report.task.TaskBuilder; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = JarReportBuilder.ID) public class JarReportBuilder implements TaskBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(JarReportBuilder.class); @@ -60,13 +57,10 @@ public class JarReportBuilder implements TaskBuilder { "zebra-api", "swallow-client", "swallow-consumerclient", "swallow-producerclient", "platform-sdk", "squirrel-client"); - @Inject private JarReportService m_reportService; - @Inject private HeartbeatReportService m_heartbeatReportService; - @Inject private ServerFilterConfigManager m_configManager; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java index 64c16aa072..1a0b2f05e7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ClientReportBuilder.java @@ -23,8 +23,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -42,25 +40,19 @@ import com.dianping.cat.service.ProjectService; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = ClientReportBuilder.ID) public class ClientReportBuilder implements TaskBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(ClientReportBuilder.class); public static final String ID = Constants.REPORT_CLIENT; - @Inject protected ClientReportService m_reportService; - @Inject protected TransactionReportService m_transactionReportService; - @Inject private ServerFilterConfigManager m_configManger; - @Inject private ProjectService m_projectService; - @Inject private TransactionMergeHelper m_mergeHelper; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java index 8392ae9114..e8b707a341 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/service/ServiceReportBuilder.java @@ -26,8 +26,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -51,21 +49,17 @@ import com.dianping.cat.report.task.TaskHelper; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = ServiceReportBuilder.ID) public class ServiceReportBuilder implements TaskBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(ServiceReportBuilder.class); public static final String ID = Constants.REPORT_SERVICE; - @Inject - protected ServiceReportService m_reportService; - - @Inject - protected CrossReportService m_crossReportService; + protected ServiceReportService m_reportService; + + protected CrossReportService m_crossReportService; Map stat = new HashMap(); - @Inject private ServerFilterConfigManager m_configManger; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java index 2f3964b3c3..ca1a9505aa 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/task/utilization/UtilizationReportBuilder.java @@ -24,8 +24,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -54,29 +52,22 @@ import com.dianping.cat.report.task.TaskBuilder; import com.dianping.cat.report.task.TaskHelper; import com.dianping.cat.spring.CatSpringContext; - -@Named(type = TaskBuilder.class, value = UtilizationReportBuilder.ID) + public class UtilizationReportBuilder implements TaskBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(UtilizationReportBuilder.class); public static final String ID = Constants.REPORT_UTILIZATION; - @Inject - protected UtilizationReportService m_reportService; - - @Inject - protected TransactionReportService m_transactionReportService; - - @Inject - protected HeartbeatReportService m_heartbeatReportService; - - @Inject - protected CrossReportService m_crossReportService; - - @Inject - private TransactionMergeHelper m_mergeHelper; - - @Inject + protected UtilizationReportService m_reportService; + + protected TransactionReportService m_transactionReportService; + + protected HeartbeatReportService m_heartbeatReportService; + + protected CrossReportService m_crossReportService; + + private TransactionMergeHelper m_mergeHelper; + private ServerFilterConfigManager m_configManger; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java index 358c2cd4b3..1ca3e3daba 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java @@ -26,8 +26,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.AtomicMessageConfigManager; @@ -48,19 +46,15 @@ import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = TransactionReportBuilder.ID) public class TransactionReportBuilder implements Initializable, TaskBuilder, LogEnabled { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(TransactionReportBuilder.class); public static final String ID = TransactionAnalyzer.ID; - @Inject protected TransactionReportService m_reportService; - @Inject protected ServerConfigManager m_serverConfigManager; - @Inject private AtomicMessageConfigManager m_atomicMessageConfigManager; private Logger m_logger; diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 10a8228276..07e24028d0 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -226,22 +226,6 @@ - - com.dianping.cat.report.task.TaskBuilder - transaction - com.dianping.cat.report.page.transaction.task.TransactionReportBuilder - - - com.dianping.cat.report.page.transaction.service.TransactionReportService - - - com.dianping.cat.config.server.ServerConfigManager - - - com.dianping.cat.config.AtomicMessageConfigManager - - - com.dianping.cat.report.alert.event.EventRuleConfigManager com.dianping.cat.report.alert.event.EventRuleConfigManager @@ -379,22 +363,6 @@ - - com.dianping.cat.report.task.TaskBuilder - event - com.dianping.cat.report.page.event.task.EventReportBuilder - - - com.dianping.cat.report.page.event.service.EventReportService - - - com.dianping.cat.config.server.ServerConfigManager - - - com.dianping.cat.config.AtomicMessageConfigManager - - - com.dianping.cat.report.alert.business.BusinessRuleConfigManager com.dianping.cat.report.alert.business.BusinessRuleConfigManager @@ -522,34 +490,6 @@ - - com.dianping.cat.report.task.TaskBuilder - business - com.dianping.cat.report.page.business.task.BusinessBaselineReportBuilder - - - com.dianping.cat.report.page.business.service.BusinessReportService - - - com.dianping.cat.config.business.BusinessConfigManager - - - com.dianping.cat.report.page.metric.task.BaselineConfigManager - - - com.dianping.cat.report.page.business.task.BusinessPointParser - - - com.dianping.cat.report.page.metric.task.BaselineCreator - - - com.dianping.cat.report.page.metric.service.BaselineService - - - com.dianping.cat.report.page.business.task.BusinessKeyHelper - - - com.dianping.cat.alarm.spi.receiver.Contactor Business @@ -758,16 +698,6 @@ - - com.dianping.cat.report.task.TaskBuilder - heartbeat - com.dianping.cat.report.page.heartbeat.task.HeartbeatReportBuilder - - - com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService - - - com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager @@ -1264,22 +1194,6 @@ - - com.dianping.cat.report.task.TaskBuilder - dependency - com.dianping.cat.report.page.dependency.task.DependencyReportBuilder - - - com.dianping.cat.report.page.dependency.service.DependencyReportService - - - com.dianping.cat.report.page.dependency.graph.TopologyGraphBuilder - - - com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository - - - com.dianping.cat.report.page.statistics.service.UtilizationReportService com.dianping.cat.report.page.statistics.service.UtilizationReportService @@ -1310,31 +1224,6 @@ - - com.dianping.cat.report.task.TaskBuilder - utilization - com.dianping.cat.report.page.statistics.task.utilization.UtilizationReportBuilder - - - com.dianping.cat.report.page.statistics.service.UtilizationReportService - - - com.dianping.cat.report.page.transaction.service.TransactionReportService - - - com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService - - - com.dianping.cat.report.page.cross.service.CrossReportService - - - com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper - - - com.dianping.cat.config.server.ServerFilterConfigManager - - - com.dianping.cat.report.page.statistics.service.ServiceReportService com.dianping.cat.report.page.statistics.service.ServiceReportService @@ -1365,22 +1254,6 @@ - - com.dianping.cat.report.task.TaskBuilder - service - com.dianping.cat.report.page.statistics.task.service.ServiceReportBuilder - - - com.dianping.cat.report.page.statistics.service.ServiceReportService - - - com.dianping.cat.report.page.cross.service.CrossReportService - - - com.dianping.cat.config.server.ServerFilterConfigManager - - - com.dianping.cat.report.page.statistics.service.HeavyReportService com.dianping.cat.report.page.statistics.service.HeavyReportService @@ -1411,22 +1284,6 @@ - - com.dianping.cat.report.task.TaskBuilder - heavy - com.dianping.cat.report.page.statistics.task.heavy.HeavyReportBuilder - - - com.dianping.cat.report.page.statistics.service.HeavyReportService - - - com.dianping.cat.report.page.matrix.service.MatrixReportService - - - com.dianping.cat.config.server.ServerFilterConfigManager - - - com.dianping.cat.system.page.router.config.RouterConfigManager com.dianping.cat.system.page.router.config.RouterConfigManager @@ -1575,22 +1432,6 @@ - - com.dianping.cat.report.task.TaskBuilder - jar - com.dianping.cat.report.page.statistics.task.jar.JarReportBuilder - - - com.dianping.cat.report.page.statistics.service.JarReportService - - - com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService - - - com.dianping.cat.config.server.ServerFilterConfigManager - - - com.dianping.cat.report.page.statistics.service.ClientReportService com.dianping.cat.report.page.statistics.service.ClientReportService @@ -1621,28 +1462,6 @@ - - com.dianping.cat.report.task.TaskBuilder - client - com.dianping.cat.report.page.statistics.task.service.ClientReportBuilder - - - com.dianping.cat.report.page.statistics.service.ClientReportService - - - com.dianping.cat.report.page.transaction.service.TransactionReportService - - - com.dianping.cat.config.server.ServerFilterConfigManager - - - com.dianping.cat.service.ProjectService - - - com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper - - - com.dianping.cat.report.page.cross.service.CrossReportService com.dianping.cat.report.page.cross.service.CrossReportService @@ -1673,16 +1492,6 @@ - - com.dianping.cat.report.task.TaskBuilder - cross - com.dianping.cat.report.page.cross.task.CrossReportBuilder - - - com.dianping.cat.report.page.cross.service.CrossReportService - - - com.dianping.cat.report.service.LocalModelService cross @@ -1762,16 +1571,6 @@ - - com.dianping.cat.report.task.TaskBuilder - matrix - com.dianping.cat.report.page.matrix.task.MatrixReportBuilder - - - com.dianping.cat.report.page.matrix.service.MatrixReportService - - - com.dianping.cat.report.service.LocalModelService matrix @@ -1851,28 +1650,6 @@ - - com.dianping.cat.report.task.TaskBuilder - state - com.dianping.cat.report.page.state.task.StateReportBuilder - - - com.dianping.cat.report.page.state.service.StateReportService - - - com.dianping.cat.config.server.ServerConfigManager - - - com.dianping.cat.config.server.ServerFilterConfigManager - - - com.dianping.cat.service.ProjectService - - - com.dianping.cat.service.HostinfoService - - - com.dianping.cat.report.page.state.StateGraphBuilder com.dianping.cat.report.page.state.StateGraphBuilder From 5241b60622763b7b8184c4a6eb6f047c93b6b1bf Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 08:59:11 +0800 Subject: [PATCH 046/231] =?UTF-8?q?=E7=A7=BB=E9=99=A4=20router/problem/sto?= =?UTF-8?q?rage/databaseCapacity=20TaskBuilder=20=E7=9A=84=20Plexus=20?= =?UTF-8?q?=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/WebComponentConfigurator.java | 38 ++++ .../report/OfflineComponentConfigurator.java | 2 - .../report/ProblemComponentConfigurator.java | 2 - .../report/ReportComponentConfigurator.java | 2 - .../report/StorageComponentConfigurator.java | 3 - .../spring/CatHomeSpringContextListener.java | 6 + .../overload/task/CapacityUpdateTask.java | 18 +- .../problem/task/ProblemReportBuilder.java | 4 - .../storage/task/StorageReportBuilder.java | 5 - .../cat/system/page/router/Handler.java | 5 - .../page/router/task/RouterConfigBuilder.java | 8 - .../resources/META-INF/plexus/components.xml | 183 +++++++++++------- 12 files changed, 155 insertions(+), 121 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java index b22e0fe21a..22f36cd05f 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java @@ -23,6 +23,23 @@ import org.unidal.lookup.configuration.Component; import org.unidal.web.configuration.AbstractWebComponentsConfigurator; +import org.unidal.web.lifecycle.DefaultActionResolver; +import org.unidal.web.mvc.lifecycle.DefaultActionHandlerManager; +import org.unidal.web.mvc.lifecycle.DefaultErrorHandler; +import org.unidal.web.mvc.lifecycle.DefaultInboundActionHandler; +import org.unidal.web.mvc.lifecycle.DefaultOutboundActionHandler; +import org.unidal.web.mvc.lifecycle.DefaultRequestContextBuilder; +import org.unidal.web.mvc.lifecycle.DefaultRequestLifecycle; +import org.unidal.web.mvc.lifecycle.DefaultTransitionHandler; +import org.unidal.web.mvc.model.AnnotationMatrix; +import org.unidal.web.mvc.model.ModelManager; +import org.unidal.web.mvc.payload.DefaultParameterProvider; +import org.unidal.web.mvc.payload.DefaultPayloadProvider; +import org.unidal.web.mvc.payload.MultipartParameterProvider; +import org.unidal.web.mvc.payload.UrlEncodedParameterProvider; +import org.unidal.web.mvc.view.model.DefaultModelHandler; +import org.unidal.web.mvc.view.model.JsonModelBuilder; +import org.unidal.web.mvc.view.model.XmlModelBuilder; import com.dianping.cat.report.ReportModule; import com.dianping.cat.system.SystemModule; @@ -33,8 +50,29 @@ class WebComponentConfigurator extends AbstractWebComponentsConfigurator { public List defineComponents() { List all = new ArrayList(); + defineWebMvcComponents(all); defineModuleRegistry(all, ReportModule.class, ReportModule.class, SystemModule.class); return all; } + + private void defineWebMvcComponents(List all) { + all.add(A(AnnotationMatrix.class)); + all.add(A(ModelManager.class)); + all.add(A(DefaultActionResolver.class)); + all.add(A(DefaultInboundActionHandler.class)); + all.add(A(DefaultOutboundActionHandler.class)); + all.add(A(DefaultTransitionHandler.class)); + all.add(A(DefaultErrorHandler.class)); + all.add(A(DefaultPayloadProvider.class)); + all.add(A(DefaultActionHandlerManager.class)); + all.add(A(DefaultRequestLifecycle.class)); + all.add(A(DefaultRequestContextBuilder.class)); + all.add(A(UrlEncodedParameterProvider.class)); + all.add(A(MultipartParameterProvider.class)); + all.add(A(DefaultParameterProvider.class)); + all.add(A(DefaultModelHandler.class)); + all.add(A(XmlModelBuilder.class)); + all.add(A(JsonModelBuilder.class)); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java index cd02683313..954495dd1d 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java @@ -25,7 +25,6 @@ import org.unidal.lookup.configuration.Component; import com.dianping.cat.report.page.overload.task.CapacityUpdateStatusManager; -import com.dianping.cat.report.page.overload.task.CapacityUpdateTask; import com.dianping.cat.report.page.overload.task.DailyCapacityUpdater; import com.dianping.cat.report.page.overload.task.HourlyCapacityUpdater; import com.dianping.cat.report.page.overload.task.MonthlyCapacityUpdater; @@ -43,7 +42,6 @@ public List defineComponents() { all.add(A(WeeklyCapacityUpdater.class)); all.add(A(MonthlyCapacityUpdater.class)); all.add(A(TableCapacityService.class)); - all.add(A(CapacityUpdateTask.class)); return all; } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java index 2e66e5230d..bc625053c8 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java @@ -44,7 +44,6 @@ import com.dianping.cat.report.page.problem.service.HistoricalProblemService; import com.dianping.cat.report.page.problem.service.LocalProblemService; import com.dianping.cat.report.page.problem.service.ProblemReportService; -import com.dianping.cat.report.page.problem.task.ProblemReportBuilder; import com.dianping.cat.report.server.RemoteServersManager; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.service.ProjectService; @@ -57,7 +56,6 @@ public List defineComponents() { all.add(A(ExceptionRuleConfigManager.class)); all.add(A(ProblemReportService.class)); - all.add(A(ProblemReportBuilder.class)); all.add(A(LocalProblemService.class)); all.add(C(ModelService.class, "problem-historical", HistoricalProblemService.class) // diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java index e2296ecf52..6b27fa682c 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java @@ -68,7 +68,6 @@ import com.dianping.cat.system.page.router.config.RouterConfigManager; import com.dianping.cat.system.page.router.service.CachedRouterConfigService; import com.dianping.cat.system.page.router.service.RouterConfigService; -import com.dianping.cat.system.page.router.task.RouterConfigBuilder; public class ReportComponentConfigurator extends AbstractResourceConfigurator { @Override @@ -86,7 +85,6 @@ public List defineComponents() { all.add(A(RouterConfigService.class)); all.add(A(CachedRouterConfigService.class)); all.add(A(RouterConfigAdjustor.class)); - all.add(A(RouterConfigBuilder.class)); all.add(A(JarReportService.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/StorageComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/StorageComponentConfigurator.java index 3f372964bf..e925b3c28f 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/StorageComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/StorageComponentConfigurator.java @@ -31,7 +31,6 @@ import com.dianping.cat.report.page.storage.service.CompositeStorageService; import com.dianping.cat.report.page.storage.service.HistoricalStorageService; import com.dianping.cat.report.page.storage.service.LocalStorageService; -import com.dianping.cat.report.page.storage.task.StorageReportBuilder; import com.dianping.cat.report.page.storage.task.StorageReportService; import com.dianping.cat.report.server.RemoteServersManager; import com.dianping.cat.report.service.ModelService; @@ -50,8 +49,6 @@ public List defineComponents() { .req(ServerConfigManager.class, RemoteServersManager.class) // .req(ModelService.class, new String[] { "storage-historical" }, "m_services")); - all.add(A(StorageReportBuilder.class)); - all.add(A(StorageReportService.class)); all.add(A(StorageAlertInfoBuilder.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java index 0f3f939794..9c75fb3b8b 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java @@ -6,6 +6,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.unidal.lookup.ContainerLoader; import com.dianping.cat.spring.CatSpringContext; @@ -21,6 +22,9 @@ public void contextInitialized(ServletContextEvent event) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); try { + ContainerLoader.destroy(); + ContainerLoader.getDefaultContainer(); + LOGGER.info("Unidal default container initialized from CAT home webapp classloader."); context.register(CatHomeSpringConfiguration.class); context.refresh(); event.getServletContext().setAttribute(ATTRIBUTE_NAME, context); @@ -43,5 +47,7 @@ public void contextDestroyed(ServletContextEvent event) { m_context.close(); LOGGER.info("CAT home Spring context closed."); } + ContainerLoader.destroy(); + LOGGER.info("Unidal default container destroyed."); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java index 8f8c458330..7ed6762381 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java @@ -20,35 +20,24 @@ import java.util.Date; -import org.codehaus.plexus.logging.LogEnabled; -import org.codehaus.plexus.logging.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; import com.dianping.cat.report.task.TaskBuilder; -@Named(type = TaskBuilder.class, value = CapacityUpdateTask.ID) -public class CapacityUpdateTask implements TaskBuilder, LogEnabled { +public class CapacityUpdateTask implements TaskBuilder { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(CapacityUpdateTask.class); public static final String ID = Constants.REPORT_DATABASE_CAPACITY; - protected Logger m_logger; - - @Inject(type = CapacityUpdater.class, value = HourlyCapacityUpdater.ID) private CapacityUpdater m_hourlyUpdater; - @Inject(type = CapacityUpdater.class, value = DailyCapacityUpdater.ID) private CapacityUpdater m_dailyUpdater; - @Inject(type = CapacityUpdater.class, value = WeeklyCapacityUpdater.ID) private CapacityUpdater m_weeklyUpdater; - @Inject(type = CapacityUpdater.class, value = MonthlyCapacityUpdater.ID) private CapacityUpdater m_monthlyUpdater; @Override @@ -113,11 +102,6 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { } } - @Override - public void enableLogging(Logger logger) { - m_logger = logger; - } - public void setDailyUpdater(CapacityUpdater dailyUpdater) { m_dailyUpdater = dailyUpdater; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java index 73d43ae28b..e04c33eb6d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java @@ -25,8 +25,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; @@ -46,13 +44,11 @@ import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = ProblemReportBuilder.ID) public class ProblemReportBuilder implements TaskBuilder, Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(ProblemReportBuilder.class); public static final String ID = ProblemAnalyzer.ID; - @Inject protected ProblemReportService m_reportService; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java index aba2ae0adc..dff9e1dd3b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java @@ -26,8 +26,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -47,16 +45,13 @@ import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; import com.dianping.cat.spring.CatSpringContext; -@Named(type = TaskBuilder.class, value = StorageReportBuilder.ID) public class StorageReportBuilder implements TaskBuilder, Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(StorageReportBuilder.class); public static final String ID = StorageAnalyzer.ID; - @Inject protected StorageReportService m_reportService; - @Inject private StorageMergeHelper m_storageMergerHelper; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java index e8f08b3610..58b8e897a4 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java @@ -42,11 +42,9 @@ import com.dianping.cat.home.router.entity.Domain; import com.dianping.cat.home.router.entity.RouterConfig; import com.dianping.cat.home.router.entity.Server; -import com.dianping.cat.report.task.TaskBuilder; import com.dianping.cat.system.page.router.config.RouterConfigHandler; import com.dianping.cat.system.page.router.config.RouterConfigManager; import com.dianping.cat.system.page.router.service.CachedRouterConfigService; -import com.dianping.cat.system.page.router.task.RouterConfigBuilder; import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { @@ -64,9 +62,6 @@ public class Handler implements PageHandler { @Inject private ServerFilterConfigManager m_filterManager; - @Inject(RouterConfigBuilder.ID) - private TaskBuilder m_routerConfigBuilder; - @Inject private RouterConfigHandler m_routerConfigHandler; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/task/RouterConfigBuilder.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/task/RouterConfigBuilder.java index 22d7268a99..b927724232 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/task/RouterConfigBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/task/RouterConfigBuilder.java @@ -20,9 +20,6 @@ import java.util.Date; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.Constants; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.configuration.NetworkInterfaceManager; @@ -35,21 +32,16 @@ import com.dianping.cat.system.page.router.config.RouterConfigHandler; import com.dianping.cat.system.page.router.service.RouterConfigService; -@Named(type = TaskBuilder.class, value = RouterConfigBuilder.ID) public class RouterConfigBuilder implements TaskBuilder { public static final String ID = Constants.REPORT_ROUTER; - @Inject private RouterConfigHandler m_routerConfigHandler; - @Inject private RouterConfigAdjustor m_routerAdjustor; - @Inject private RouterConfigService m_reportService; - @Inject private ServerConfigManager m_serverConfigManager; @Override diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 07e24028d0..5559d48edb 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -740,16 +740,6 @@ - - com.dianping.cat.report.task.TaskBuilder - problem - com.dianping.cat.report.page.problem.task.ProblemReportBuilder - - - com.dianping.cat.report.page.problem.service.ProblemReportService - - - com.dianping.cat.report.service.LocalModelService problem @@ -993,19 +983,6 @@ - - com.dianping.cat.report.task.TaskBuilder - storage - com.dianping.cat.report.page.storage.task.StorageReportBuilder - - - com.dianping.cat.report.page.storage.task.StorageReportService - - - com.dianping.cat.report.page.storage.transform.StorageMergeHelper - - - com.dianping.cat.report.page.storage.task.StorageReportService com.dianping.cat.report.page.storage.task.StorageReportService @@ -1383,25 +1360,6 @@ - - com.dianping.cat.report.task.TaskBuilder - router - com.dianping.cat.system.page.router.task.RouterConfigBuilder - - - com.dianping.cat.system.page.router.config.RouterConfigHandler - - - com.dianping.cat.system.page.router.config.RouterConfigAdjustor - - - com.dianping.cat.system.page.router.service.RouterConfigService - - - com.dianping.cat.config.server.ServerConfigManager - - - com.dianping.cat.report.page.statistics.service.JarReportService com.dianping.cat.report.page.statistics.service.JarReportService @@ -1985,33 +1943,6 @@ - - com.dianping.cat.report.task.TaskBuilder - databaseCapacity - com.dianping.cat.report.page.overload.task.CapacityUpdateTask - - - com.dianping.cat.report.page.overload.task.CapacityUpdater - hourly_capacity_updater - m_hourlyUpdater - - - com.dianping.cat.report.page.overload.task.CapacityUpdater - daily_capacity_updater - m_dailyUpdater - - - com.dianping.cat.report.page.overload.task.CapacityUpdater - weekly_capacity_updater - m_weeklyUpdater - - - com.dianping.cat.report.page.overload.task.CapacityUpdater - monthly_capacity_updater - m_monthlyUpdater - - - org.unidal.dal.jdbc.datasource.DataSourceProvider org.unidal.dal.jdbc.datasource.DefaultDataSourceProvider @@ -2194,6 +2125,116 @@ + + org.unidal.web.mvc.model.AnnotationMatrix + org.unidal.web.mvc.model.AnnotationMatrix + per-lookup + + + org.unidal.web.mvc.model.ModelManager + org.unidal.web.mvc.model.ModelManager + + + org.unidal.web.mvc.model.ModuleRegistry + + + + + org.unidal.web.lifecycle.ActionResolver + org.unidal.web.lifecycle.DefaultActionResolver + + + org.unidal.web.mvc.lifecycle.InboundActionHandler + org.unidal.web.mvc.lifecycle.DefaultInboundActionHandler + per-lookup + + + org.unidal.web.mvc.lifecycle.OutboundActionHandler + org.unidal.web.mvc.lifecycle.DefaultOutboundActionHandler + per-lookup + + + org.unidal.web.mvc.lifecycle.TransitionHandler + org.unidal.web.mvc.lifecycle.DefaultTransitionHandler + per-lookup + + + org.unidal.web.mvc.lifecycle.ErrorHandler + org.unidal.web.mvc.lifecycle.DefaultErrorHandler + + + org.unidal.web.mvc.PayloadProvider + org.unidal.web.mvc.payload.DefaultPayloadProvider + + + org.unidal.web.mvc.lifecycle.ActionHandlerManager + org.unidal.web.mvc.lifecycle.DefaultActionHandlerManager + + + org.unidal.web.lifecycle.RequestLifecycle + mvc + org.unidal.web.mvc.lifecycle.DefaultRequestLifecycle + + + org.unidal.web.mvc.lifecycle.RequestContextBuilder + + + org.unidal.web.mvc.lifecycle.ActionHandlerManager + + + + + org.unidal.web.mvc.lifecycle.RequestContextBuilder + org.unidal.web.mvc.lifecycle.DefaultRequestContextBuilder + + + org.unidal.web.mvc.model.ModelManager + + + + + org.unidal.web.mvc.payload.ParameterProvider + application/x-www-form-urlencoded + org.unidal.web.mvc.payload.UrlEncodedParameterProvider + per-lookup + + + org.unidal.web.mvc.payload.ParameterProvider + multipart/form-data + org.unidal.web.mvc.payload.MultipartParameterProvider + per-lookup + + + org.unidal.web.mvc.payload.ParameterProvider + org.unidal.web.mvc.payload.DefaultParameterProvider + per-lookup + + + org.unidal.web.mvc.view.model.ModelHandler + org.unidal.web.mvc.view.model.DefaultModelHandler + + + org.unidal.web.mvc.view.model.ModelBuilder + xml + m_xmlBuilder + + + org.unidal.web.mvc.view.model.ModelBuilder + json + m_jsonBuilder + + + + + org.unidal.web.mvc.view.model.ModelBuilder + xml + org.unidal.web.mvc.view.model.XmlModelBuilder + + + org.unidal.web.mvc.view.model.ModelBuilder + json + org.unidal.web.mvc.view.model.JsonModelBuilder + org.unidal.web.mvc.model.ModuleRegistry org.unidal.web.mvc.model.ModuleRegistry @@ -3297,10 +3338,6 @@ com.dianping.cat.config.server.ServerFilterConfigManager - - com.dianping.cat.report.task.TaskBuilder - router - com.dianping.cat.system.page.router.config.RouterConfigHandler From 230eb2436c05cf75a1c5487c7e3f57b865b2b4b5 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 09:11:34 +0800 Subject: [PATCH 047/231] =?UTF-8?q?=E6=B8=85=E7=90=86=207=20=E4=B8=AA?= =?UTF-8?q?=E5=B7=B2=E7=94=B1=20Spring=20=E7=AE=A1=E7=90=86=E7=9A=84=20rep?= =?UTF-8?q?ort=20builder=20=E4=B8=AD=E6=AE=8B=E7=95=99=E7=9A=84=20Plexus?= =?UTF-8?q?=20lifecycle/logging=20=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../page/cross/task/CrossReportBuilder.java | 7 ++----- .../page/event/task/EventReportBuilder.java | 7 ++----- .../page/matrix/task/MatrixReportBuilder.java | 7 ++----- .../problem/task/ProblemReportBuilder.java | 7 ++----- .../page/state/task/StateReportBuilder.java | 7 ++----- .../storage/task/StorageReportBuilder.java | 7 ++----- .../task/TransactionReportBuilder.java | 19 ++----------------- 7 files changed, 14 insertions(+), 47 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java index 80a8efc1c1..2b1d37df2d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/task/CrossReportBuilder.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +40,7 @@ import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; import com.dianping.cat.spring.CatSpringContext; -public class CrossReportBuilder implements TaskBuilder, Initializable { +public class CrossReportBuilder implements TaskBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(CrossReportBuilder.class); public static final String ID = CrossAnalyzer.ID; @@ -106,8 +104,7 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { return m_reportService.insertWeeklyReport(report, binaryContent); } - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); CurrentWeeklyMonthlyReportTask.getInstance().register(new CurrentWeeklyMonthlyTask() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java index 7423e73d6a..34ef3f4544 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; @@ -45,7 +43,7 @@ import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; import com.dianping.cat.spring.CatSpringContext; -public class EventReportBuilder implements TaskBuilder, Initializable { +public class EventReportBuilder implements TaskBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(EventReportBuilder.class); public static final String ID = EventAnalyzer.ID; @@ -137,8 +135,7 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { return m_reportService.insertWeeklyReport(report, binaryContent); } - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); CurrentWeeklyMonthlyReportTask.getInstance().register(new CurrentWeeklyMonthlyTask() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java index da349967cb..bab6f509ed 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/task/MatrixReportBuilder.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,7 +41,7 @@ import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; import com.dianping.cat.spring.CatSpringContext; -public class MatrixReportBuilder implements TaskBuilder, Initializable { +public class MatrixReportBuilder implements TaskBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(MatrixReportBuilder.class); public static final String ID = MatrixAnalyzer.ID; @@ -107,8 +105,7 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { return m_reportService.insertWeeklyReport(report, binaryContent); } - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); CurrentWeeklyMonthlyReportTask.getInstance().register(new CurrentWeeklyMonthlyTask() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java index e04c33eb6d..946af109b4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; @@ -44,7 +42,7 @@ import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; import com.dianping.cat.spring.CatSpringContext; -public class ProblemReportBuilder implements TaskBuilder, Initializable { +public class ProblemReportBuilder implements TaskBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(ProblemReportBuilder.class); public static final String ID = ProblemAnalyzer.ID; @@ -118,8 +116,7 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { return m_reportService.insertWeeklyReport(report, binaryContent); } - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); CurrentWeeklyMonthlyReportTask.getInstance().register(new CurrentWeeklyMonthlyTask() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java index 23e41236f1..0b830ba4ce 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/task/StateReportBuilder.java @@ -21,8 +21,6 @@ import java.util.Date; import java.util.Set; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,7 +48,7 @@ import com.dianping.cat.service.ProjectService; import com.dianping.cat.spring.CatSpringContext; -public class StateReportBuilder implements TaskBuilder, Initializable { +public class StateReportBuilder implements TaskBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(StateReportBuilder.class); public static final String ID = StateAnalyzer.ID; @@ -135,8 +133,7 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { return m_reportService.insertWeeklyReport(report, binaryContent); } - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); CurrentWeeklyMonthlyReportTask.getInstance().register(new CurrentWeeklyMonthlyTask() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java index dff9e1dd3b..a6b7e790c6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java @@ -21,8 +21,6 @@ import java.util.Date; import java.util.Set; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; @@ -45,7 +43,7 @@ import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; import com.dianping.cat.spring.CatSpringContext; -public class StorageReportBuilder implements TaskBuilder, Initializable { +public class StorageReportBuilder implements TaskBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(StorageReportBuilder.class); public static final String ID = StorageAnalyzer.ID; @@ -183,8 +181,7 @@ private StorageReport queryHourlyReportsByDuration(String reportId, Date start, return storageReport; } - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); CurrentWeeklyMonthlyReportTask.getInstance().register(new CurrentWeeklyMonthlyTask() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java index 1ca3e3daba..f3b0d94448 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java @@ -20,10 +20,6 @@ import java.util.Date; -import org.codehaus.plexus.logging.LogEnabled; -import org.codehaus.plexus.logging.Logger; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; @@ -46,7 +42,7 @@ import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; import com.dianping.cat.spring.CatSpringContext; -public class TransactionReportBuilder implements Initializable, TaskBuilder, LogEnabled { +public class TransactionReportBuilder implements TaskBuilder { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(TransactionReportBuilder.class); public static final String ID = TransactionAnalyzer.ID; @@ -57,8 +53,6 @@ public class TransactionReportBuilder implements Initializable, TaskBuilder, Log private AtomicMessageConfigManager m_atomicMessageConfigManager; - private Logger m_logger; - @Override public boolean buildDailyTask(String name, String domain, Date period) { refreshSpringBeans(); @@ -80,9 +74,6 @@ public boolean buildDailyTask(String name, String domain, Date period) { } catch (Exception e) { SLF4J_LOGGER.error("Unable to build transaction daily report, name={}, domain={}, period={}.", name, domain, period, e); - if (m_logger != null) { - m_logger.error(e.getMessage(), e); - } Cat.logError(e); return false; } @@ -145,13 +136,7 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { return m_reportService.insertWeeklyReport(report, binaryContent); } - @Override - public void enableLogging(Logger logger) { - m_logger = logger; - } - - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); CurrentWeeklyMonthlyReportTask.getInstance().register(new CurrentWeeklyMonthlyTask() { From 60d32b83283193c1dd17986c31f9e605cfed0f0c Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 09:20:43 +0800 Subject: [PATCH 048/231] =?UTF-8?q?=E6=8A=8A=20ReportFacade.java=20?= =?UTF-8?q?=E4=BB=8E=20Plexus/Unidal=20lookup=20=E4=BD=93=E7=B3=BB?= =?UTF-8?q?=E9=87=8C=E6=91=98=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/CatHomeSpringConfiguration.java | 3 +- .../cat/report/task/ReportFacade.java | 41 ++++++------------- 2 files changed, 13 insertions(+), 31 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 86b26fa50b..b50ba58195 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -783,10 +783,9 @@ public ReportReloadTask reportReloadTask(ReportReloadConfigManager reportReloadC } @Bean(initMethod = "initialize") - public ReportFacade reportFacade(Logger plexusConsoleLogger, Map taskBuilders) { + public ReportFacade reportFacade(Map taskBuilders) { ReportFacade facade = new ReportFacade(); - facade.enableLogging(plexusConsoleLogger.getChildLogger(ReportFacade.class.getName())); facade.setReportBuilders(taskBuilders); return facade; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java b/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java index d43f021862..14bc324e1e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/ReportFacade.java @@ -23,27 +23,18 @@ import java.util.HashMap; import java.util.Map; -import org.codehaus.plexus.logging.LogEnabled; -import org.codehaus.plexus.logging.Logger; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.LoggerFactory; -import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.Task; import com.dianping.cat.task.TaskManager; -@Named -public class ReportFacade extends ContainerHolder implements LogEnabled, Initializable { +public class ReportFacade { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(ReportFacade.class); private static final int EXPECTED_REPORT_BUILDER_COUNT = 19; - private Logger m_logger; - - private Map m_reportBuilders = new HashMap(); + private Map m_reportBuilders = new HashMap(); public boolean builderReport(Task task) { try { @@ -81,35 +72,27 @@ public boolean builderReport(Task task) { } else { SLF4J_LOGGER.error("Report builder returned false, reportName={}, domain={}, type={}, period={}, taskId={}.", reportName, reportDomain, type, reportPeriod, task.getId()); - m_logger.error(task.toString()); } } } catch (Exception e) { SLF4J_LOGGER.error("Error when building report, task={}.", task, e); - m_logger.error("Error when building report," + e.getMessage(), e); Cat.logError(e); return false; - } - return false; - } - - @Override - public void enableLogging(Logger logger) { - m_logger = logger; - } - - private TaskBuilder getReportBuilder(String reportName) { - return m_reportBuilders.get(reportName); - } - - @Override - public void initialize() throws InitializationException { + } + return false; + } + + private TaskBuilder getReportBuilder(String reportName) { + return m_reportBuilders.get(reportName); + } + + public void initialize() { if (m_reportBuilders.size() < EXPECTED_REPORT_BUILDER_COUNT) { String message = String.format("Report facade requires %s Spring task builders but found %s, builders=%s.", EXPECTED_REPORT_BUILDER_COUNT, m_reportBuilders.size(), m_reportBuilders.keySet()); SLF4J_LOGGER.error(message); - throw new InitializationException(message); + throw new IllegalStateException(message); } SLF4J_LOGGER.info("Initialized report facade from Spring, builderCount={}, builders={}.", From 0d40f95ba10c635a43906d0a8795fe975a1e8a48 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 09:42:26 +0800 Subject: [PATCH 049/231] =?UTF-8?q?=E7=A7=BB=E9=99=A4=204=20=E4=B8=AA?= =?UTF-8?q?=E9=85=8D=E7=BD=AE/=E7=8A=B6=E6=80=81=E7=B1=BB=E7=9A=84=20Plexu?= =?UTF-8?q?s=20lifecycle=20=E5=92=8C=20Unidal=20=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/ComponentsConfigurator.java | 2 +- .../report/OfflineComponentConfigurator.java | 2 +- .../report/StorageComponentConfigurator.java | 2 +- .../report/page/DomainGroupConfigManager.java | 31 ++++++++---- .../config/HeartbeatDisplayPolicyManager.java | 10 +--- .../task/CapacityUpdateStatusManager.java | 12 +---- .../config/StorageGroupConfigManager.java | 12 +---- .../resources/META-INF/plexus/components.xml | 49 +++---------------- 8 files changed, 38 insertions(+), 82 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 61e0b6c5ec..17557e9b45 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -163,7 +163,7 @@ private void addCoreRepositoryComponents(List components) { private List defineConfigComponents() { List all = new ArrayList(); - all.add(A(DomainGroupConfigManager.class)); + all.add(C(DomainGroupConfigManager.class)); return all; } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java index 954495dd1d..7639d62d57 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java @@ -36,7 +36,7 @@ public class OfflineComponentConfigurator extends AbstractResourceConfigurator { public List defineComponents() { List all = new ArrayList(); - all.add(A(CapacityUpdateStatusManager.class)); + all.add(C(CapacityUpdateStatusManager.class)); all.add(A(HourlyCapacityUpdater.class)); all.add(A(DailyCapacityUpdater.class)); all.add(A(WeeklyCapacityUpdater.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/StorageComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/StorageComponentConfigurator.java index e925b3c28f..60a8b6f2b0 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/StorageComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/StorageComponentConfigurator.java @@ -40,7 +40,7 @@ public class StorageComponentConfigurator extends AbstractResourceConfigurator { public List defineComponents() { List all = new ArrayList(); - all.add(A(StorageGroupConfigManager.class)); + all.add(C(StorageGroupConfigManager.class)); all.add(A(LocalStorageService.class)); all.add(C(ModelService.class, "storage-historical", HistoricalStorageService.class) // diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java index d603cdf15b..56edee37fe 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java @@ -21,13 +21,9 @@ import java.util.ArrayList; import java.util.List; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -41,16 +37,13 @@ import com.dianping.cat.home.group.transform.DefaultSaxParser; import com.dianping.cat.spring.CatSpringContext; -@Named -public class DomainGroupConfigManager implements Initializable { +public class DomainGroupConfigManager { private static final Logger LOGGER = LoggerFactory.getLogger(DomainGroupConfigManager.class); private static final String CONFIG_NAME = "domainGroup"; - @Inject private ConfigRepository m_configDao; - @Inject private ContentFetcher m_fetcher; private int m_configId; @@ -58,6 +51,8 @@ public class DomainGroupConfigManager implements Initializable { private DomainGroup m_domainGroup; public DomainGroup getDomainGroup() { + ensureInitialized(); + return m_domainGroup; } @@ -69,8 +64,7 @@ public void setFetcher(ContentFetcher fetcher) { m_fetcher = fetcher; } - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); try { @@ -150,12 +144,16 @@ public String queryDefaultGroup(String domain) { } public Domain queryGroupDomain(String domain) { + ensureInitialized(); + Domain domainGroup = m_domainGroup.findDomain(domain); return domainGroup; } public List queryDomainGroup(String domain) { + ensureInitialized(); + Domain domainGroup = m_domainGroup.findDomain(domain); if (domainGroup == null) { @@ -166,6 +164,8 @@ public List queryDomainGroup(String domain) { } public List queryIpByDomainAndGroup(String domain, String group) { + ensureInitialized(); + Domain domainInfo = m_domainGroup.findDomain(domain); if (domainInfo != null) { @@ -178,6 +178,17 @@ public List queryIpByDomainAndGroup(String domain, String group) { return new ArrayList(); } + private void ensureInitialized() { + if (m_domainGroup == null) { + synchronized (this) { + if (m_domainGroup == null) { + LOGGER.warn("Domain group config is not initialized yet, loading it lazily."); + initialize(); + } + } + } + } + private boolean storeConfig() { synchronized (this) { refreshSpringBeans(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java index 3f593b7f09..95773fb344 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java @@ -25,10 +25,7 @@ import java.util.Map.Entry; import java.util.Set; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -41,16 +38,14 @@ import com.dianping.cat.home.heartbeat.transform.DefaultSaxParser; import com.dianping.cat.spring.CatSpringContext; -public class HeartbeatDisplayPolicyManager implements Initializable { +public class HeartbeatDisplayPolicyManager { private static final int K = 1024; private static final String CONFIG_NAME = "heartbeat-display-policy"; - @Inject private ConfigRepository m_configDao; - @Inject private ContentFetcher m_fetcher; private int m_configId; @@ -69,8 +64,7 @@ public void setFetcher(ContentFetcher fetcher) { m_fetcher = fetcher; } - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); try { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java index d4e45ef53e..46379c0911 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java @@ -18,13 +18,9 @@ */ package com.dianping.cat.report.page.overload.task; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.core.config.Config; @@ -34,16 +30,13 @@ import com.dianping.cat.home.dal.report.OverloadEntity; import com.dianping.cat.spring.CatSpringContext; -@Named -public class CapacityUpdateStatusManager implements Initializable { +public class CapacityUpdateStatusManager { private static final Logger LOGGER = LoggerFactory.getLogger(CapacityUpdateStatusManager.class); private static final String CONFIG_NAME = "capacityUpdateStatus"; - @Inject private ConfigRepository m_configDao; - @Inject private OverloadRepository m_overloadDao; private int m_hourlyStatus; @@ -97,8 +90,7 @@ public int getWeeklyStatus() { return m_weeklyStatus; } - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); try { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java index c3c41ad901..e00c9979be 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java @@ -24,11 +24,7 @@ import java.util.List; import java.util.Map; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.lookup.util.StringUtils; import com.dianping.cat.Cat; @@ -43,8 +39,7 @@ import com.dianping.cat.home.storage.transform.DefaultSaxParser; import com.dianping.cat.spring.CatSpringContext; -@Named -public class StorageGroupConfigManager implements Initializable { +public class StorageGroupConfigManager { public static final String IP_FORMAT = "${ip}"; @@ -54,10 +49,8 @@ public class StorageGroupConfigManager implements Initializable { private static final String CONFIG_NAME = "storageGroup"; - @Inject private ConfigRepository m_configDao; - @Inject private ContentFetcher m_fetcher; private int m_configId; @@ -85,8 +78,7 @@ public void setFetcher(ContentFetcher fetcher) { m_fetcher = fetcher; } - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); try { diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 5559d48edb..fee15d57d9 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -30,14 +30,6 @@ com.dianping.cat.report.page.DomainGroupConfigManager com.dianping.cat.report.page.DomainGroupConfigManager - - - com.dianping.cat.core.config.repository.ConfigRepository - - - com.dianping.cat.config.content.ContentFetcher - - org.unidal.dal.jdbc.mapping.TableProvider @@ -925,14 +917,6 @@ com.dianping.cat.report.page.storage.config.StorageGroupConfigManager com.dianping.cat.report.page.storage.config.StorageGroupConfigManager - - - com.dianping.cat.core.config.repository.ConfigRepository - - - com.dianping.cat.config.content.ContentFetcher - - com.dianping.cat.report.service.LocalModelService @@ -1837,14 +1821,6 @@ com.dianping.cat.report.page.overload.task.CapacityUpdateStatusManager com.dianping.cat.report.page.overload.task.CapacityUpdateStatusManager - - - com.dianping.cat.core.config.repository.ConfigRepository - - - com.dianping.cat.core.mybatis.repository.overload.OverloadRepository - - com.dianping.cat.report.page.overload.task.CapacityUpdater @@ -2308,6 +2284,10 @@ + + com.dianping.cat.report.page.DomainGroupConfigManager + com.dianping.cat.report.page.DomainGroupConfigManager + com.dianping.cat.report.page.transaction.Handler com.dianping.cat.report.page.transaction.Handler @@ -2436,23 +2416,6 @@ com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager - - - com.dianping.cat.core.config.repository.ConfigRepository - - - com.dianping.cat.config.content.ContentFetcher - - - - - com.dianping.cat.core.config.repository.ConfigRepository - com.dianping.cat.core.config.repository.ConfigRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - com.dianping.cat.report.page.heartbeat.JspViewer @@ -2876,6 +2839,10 @@ com.dianping.cat.report.page.storage.transform.StorageMergeHelper com.dianping.cat.report.page.storage.transform.StorageMergeHelper + + com.dianping.cat.report.page.storage.config.StorageGroupConfigManager + com.dianping.cat.report.page.storage.config.StorageGroupConfigManager + com.dianping.cat.report.page.top.Handler com.dianping.cat.report.page.top.Handler From 38e35fe6d822007f3e9d01d39daf5ea9c467811b Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 09:49:18 +0800 Subject: [PATCH 050/231] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=9D=83=E9=99=90?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=AE=A1=E7=90=86=E5=99=A8=E7=9A=84=20Plexus?= =?UTF-8?q?=20=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/ComponentsConfigurator.java | 6 ++--- .../permission/ResourceConfigManager.java | 27 ++++++++++++------- .../page/permission/UserConfigManager.java | 27 ++++++++++++------- .../resources/META-INF/plexus/components.xml | 24 ++++++----------- 4 files changed, 45 insertions(+), 39 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 17557e9b45..edef7bac1b 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -101,9 +101,9 @@ public List defineComponents() { all.add(A(CatHomeModule.class)); - all.add(A(UserConfigManager.class)); - - all.add(A(ResourceConfigManager.class)); + all.add(C(UserConfigManager.class)); + + all.add(C(ResourceConfigManager.class)); all.add(C(ModuleManager.class, DefaultModuleManager.class) // .config(E("topLevelModules").value(CatHomeModule.ID))); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java index fb79752d83..fee3bacbad 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java @@ -21,13 +21,9 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -41,8 +37,7 @@ import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; -@Named -public class ResourceConfigManager implements Initializable { +public class ResourceConfigManager { private static final Logger LOGGER = LoggerFactory.getLogger(ResourceConfigManager.class); public static final int DEFAULT_RESOURCE_ROLE = 1; @@ -51,10 +46,8 @@ public class ResourceConfigManager implements Initializable { private static final String ALL = "*"; - @Inject protected ConfigRepository m_configDao; - @Inject protected ContentFetcher m_fetcher; private int m_configId; @@ -74,10 +67,14 @@ public void setFetcher(ContentFetcher fetcher) { } public ResourceConfig getConfig() { + ensureInitialized(); + return m_config; } public int getRole(String path, String op) { + ensureInitialized(); + Map pathPermission = m_permissions.get(path); if (pathPermission == null) { @@ -99,8 +96,7 @@ public int getRole(String path, String op) { return DEFAULT_RESOURCE_ROLE; } - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); try { @@ -187,6 +183,17 @@ private void refreshConfig() throws Exception { } } + private void ensureInitialized() { + if (m_config == null) { + synchronized (this) { + if (m_config == null) { + LOGGER.warn("Resource config is not initialized yet, loading it lazily."); + initialize(); + } + } + } + } + private void refreshData() { Map> permissions = new ConcurrentHashMap>(); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java index 574d14182e..bda1a65340 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java @@ -18,13 +18,9 @@ */ package com.dianping.cat.system.page.permission; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -38,18 +34,15 @@ import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; -@Named -public class UserConfigManager implements Initializable { +public class UserConfigManager { private static final Logger LOGGER = LoggerFactory.getLogger(UserConfigManager.class); public static final int DEFAULT_ROLE = 1; private static final String CONFIG_NAME = "user-config"; - @Inject protected ConfigRepository m_configDao; - @Inject protected ContentFetcher m_fetcher; private int m_configId; @@ -67,10 +60,14 @@ public void setFetcher(ContentFetcher fetcher) { } public UserConfig getConfig() { + ensureInitialized(); + return m_config; } public int getRole(String user) { + ensureInitialized(); + User usr = m_config.findUser(user); if (usr != null) { @@ -80,8 +77,7 @@ public int getRole(String user) { return DEFAULT_ROLE; } - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); try { @@ -151,6 +147,17 @@ private void refreshConfig() throws Exception { } } + private void ensureInitialized() { + if (m_config == null) { + synchronized (this) { + if (m_config == null) { + LOGGER.warn("User config is not initialized yet, loading it lazily."); + initialize(); + } + } + } + } + public boolean insert(String xml) { try { m_config = DefaultSaxParser.parse(xml); diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index fee15d57d9..d1e720d37a 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -49,26 +49,10 @@ com.dianping.cat.system.page.permission.UserConfigManager com.dianping.cat.system.page.permission.UserConfigManager - - - com.dianping.cat.core.config.repository.ConfigRepository - - - com.dianping.cat.config.content.ContentFetcher - - com.dianping.cat.system.page.permission.ResourceConfigManager com.dianping.cat.system.page.permission.ResourceConfigManager - - - com.dianping.cat.core.config.repository.ConfigRepository - - - com.dianping.cat.config.content.ContentFetcher - - org.unidal.initialization.ModuleManager @@ -3394,6 +3378,14 @@ + + com.dianping.cat.system.page.permission.UserConfigManager + com.dianping.cat.system.page.permission.UserConfigManager + + + com.dianping.cat.system.page.permission.ResourceConfigManager + com.dianping.cat.system.page.permission.ResourceConfigManager + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.core.config.repository.ConfigRepository From 8a6a1b7d2450c18a2bbc3d8804d28b3e70b15a82 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 09:57:00 +0800 Subject: [PATCH 051/231] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E7=A7=BB=E9=99=A4Ple?= =?UTF-8?q?xus/Unidal=20=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DependencyComponentConfigurator.java | 8 ++-- .../config/TopoGraphFormatConfigManager.java | 28 +++++++----- .../graph/DependencyItemBuilder.java | 4 -- .../graph/TopologyGraphBuilder.java | 4 -- .../graph/TopologyGraphConfigManager.java | 44 ++++++++++++++----- .../resources/META-INF/plexus/components.xml | 24 ++++------ 6 files changed, 64 insertions(+), 48 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java index 2012e5119b..d5a652b746 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java @@ -43,15 +43,15 @@ public class DependencyComponentConfigurator extends AbstractResourceConfigurato public List defineComponents() { List all = new ArrayList(); - all.add(A(DependencyItemBuilder.class)); + all.add(C(DependencyItemBuilder.class).req(TopologyGraphConfigManager.class)); - all.add(A(TopologyGraphBuilder.class)); + all.add(C(TopologyGraphBuilder.class).req(DependencyItemBuilder.class)); all.add(A(TopologyGraphManager.class)); - all.add(A(TopologyGraphConfigManager.class)); + all.add(C(TopologyGraphConfigManager.class)); - all.add(A(TopoGraphFormatConfigManager.class)); + all.add(C(TopoGraphFormatConfigManager.class)); all.add(A(DependencyReportService.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java index 525e515dee..0a0f06004c 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java @@ -22,11 +22,7 @@ import java.util.List; import java.util.Map; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -39,15 +35,12 @@ import com.dianping.cat.home.dependency.format.transform.DefaultSaxParser; import com.dianping.cat.spring.CatSpringContext; -@Named -public class TopoGraphFormatConfigManager implements Initializable { +public class TopoGraphFormatConfigManager { private static final String CONFIG_NAME = "topoGraphFormat"; - @Inject private ConfigRepository m_configDao; - @Inject private ContentFetcher m_fetcher; private int m_configId; @@ -55,6 +48,8 @@ public class TopoGraphFormatConfigManager implements Initializable { private TopoGraphFormatConfig m_config; public String buildFormatJson() { + ensureInitialized(); + Map> map = new HashMap>(); for (ProductLine productline : m_config.getProductLines()) { @@ -67,6 +62,8 @@ public String buildFormatJson() { } public TopoGraphFormatConfig getConfig() { + ensureInitialized(); + return m_config; } @@ -78,8 +75,7 @@ public void setFetcher(ContentFetcher fetcher) { m_fetcher = fetcher; } - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); try { @@ -120,7 +116,19 @@ public boolean insert(String xml) { } } + private void ensureInitialized() { + if (m_config == null) { + synchronized (this) { + if (m_config == null) { + initialize(); + } + } + } + } + public List queryProduct() { + ensureInitialized(); + return m_config.getProductLines(); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/DependencyItemBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/DependencyItemBuilder.java index 0195de712c..118cc4d03c 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/DependencyItemBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/DependencyItemBuilder.java @@ -18,8 +18,6 @@ */ package com.dianping.cat.report.page.dependency.graph; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; import com.dianping.cat.consumer.dependency.model.entity.Dependency; @@ -27,7 +25,6 @@ import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; import com.dianping.cat.home.dependency.graph.entity.TopologyNode; -@Named public class DependencyItemBuilder { private static final int OK = GraphConstrant.OK; @@ -38,7 +35,6 @@ public class DependencyItemBuilder { private static final String CACHE = GraphConstrant.CACHE; - @Inject private TopologyGraphConfigManager m_graphConfigManager; public TopologyEdge buildEdge(String domain, Dependency dependency) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphBuilder.java index fbdf40be25..2ff78e5cbd 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphBuilder.java @@ -25,8 +25,6 @@ import java.util.Map; import java.util.Set; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.lookup.util.StringUtils; import com.dianping.cat.consumer.dependency.model.entity.Dependency; @@ -39,10 +37,8 @@ import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; import com.dianping.cat.home.dependency.graph.entity.TopologyNode; -@Named public class TopologyGraphBuilder extends BaseVisitor { - @Inject private DependencyItemBuilder m_itemBuilder; private String m_domain; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java index da462eacab..997f1b3f1b 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java @@ -25,12 +25,8 @@ import java.util.HashSet; import java.util.Set; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.helper.Files; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; import com.dianping.cat.Cat; @@ -48,8 +44,7 @@ import com.dianping.cat.home.dependency.config.transform.DefaultSaxParser; import com.dianping.cat.spring.CatSpringContext; -@Named -public class TopologyGraphConfigManager implements Initializable { +public class TopologyGraphConfigManager { private static final String AVG_STR = Chinese.RESPONSE_TIME; private static final String ERROR_STR = Chinese.EXCEPTION_COUNT; @@ -66,10 +61,8 @@ public class TopologyGraphConfigManager implements Initializable { private static final String CONFIG_NAME = "topologyConfig"; - @Inject private ConfigRepository m_configDao; - @Inject private ContentFetcher m_fetcher; private TopologyGraphConfig m_config; @@ -96,6 +89,8 @@ private String buildDes(String... args) { } public Pair buildEdgeState(String domain, Dependency dependency) { + ensureInitialized(); + String type = formatType(dependency.getType()); String from = domain; String to = dependency.getTarget(); @@ -146,6 +141,8 @@ private String buildErrorDes(String... args) { } public Pair buildNodeState(String domain, Index index) { + ensureInitialized(); + String type = index.getName(); String realType = formatType(type); DomainConfig config = queryNodeConfig(realType, domain); @@ -212,12 +209,16 @@ private EdgeConfig convertNodeConfig(DomainConfig config) { } public boolean deleteDomainConfig(String type, String domain) { + ensureInitialized(); + NodeConfig types = m_config.getNodeConfigs().get(type); types.removeDomainConfig(domain); return storeConfig(); } public boolean deleteEdgeConfig(String type, String from, String to) { + ensureInitialized(); + String key = type + ':' + from + ':' + to; m_config.removeEdgeConfig(key); return storeConfig(); @@ -236,6 +237,8 @@ private String formatType(String type) { } public synchronized TopologyGraphConfig getConfig() { + ensureInitialized(); + return m_config; } @@ -247,8 +250,7 @@ public void setFetcher(ContentFetcher fetcher) { m_fetcher = fetcher; } - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); if (m_fileName != null) { @@ -289,11 +291,15 @@ public void initialize() throws InitializationException { } public boolean insertDomainConfig(String type, DomainConfig config) { + ensureInitialized(); + m_config.findOrCreateNodeConfig(type).addDomainConfig(config); return storeConfig(); } public boolean insertDomainDefaultConfig(String type, DomainConfig config) { + ensureInitialized(); + NodeConfig node = m_config.findOrCreateNodeConfig(type); node.setDefaultMinCountThreshold(config.getMinCountThreshold()); @@ -305,12 +311,16 @@ public boolean insertDomainDefaultConfig(String type, DomainConfig config) { } public boolean insertEdgeConfig(EdgeConfig config) { + ensureInitialized(); + config.setKey(config.getType() + ":" + config.getFrom() + ":" + config.getTo()); m_config.addEdgeConfig(config); return storeConfig(); } public EdgeConfig queryEdgeConfig(String type, String from, String to) { + ensureInitialized(); + EdgeConfig edgeConfig = m_config.findEdgeConfig(type + ":" + from + ":" + to); if (edgeConfig == null) { @@ -330,6 +340,8 @@ public EdgeConfig queryEdgeConfig(String type, String from, String to) { } public DomainConfig queryNodeConfig(String type, String domain) { + ensureInitialized(); + NodeConfig typesConfig = m_config.findNodeConfig(type); if (typesConfig != null) { @@ -353,7 +365,19 @@ public void setFileName(String file) { m_fileName = file; } + private void ensureInitialized() { + if (m_config == null) { + synchronized (this) { + if (m_config == null) { + initialize(); + } + } + } + } + private boolean storeConfig() { + ensureInitialized(); + if (m_fileName != null) { try { Files.forIO().writeTo(new File(m_fileName), m_config.toString()); diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index d1e720d37a..9652f60fd4 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -1039,26 +1039,10 @@ com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager - - - com.dianping.cat.core.config.repository.ConfigRepository - - - com.dianping.cat.config.content.ContentFetcher - - com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager - - - com.dianping.cat.core.config.repository.ConfigRepository - - - com.dianping.cat.config.content.ContentFetcher - - com.dianping.cat.report.page.dependency.service.DependencyReportService @@ -2517,6 +2501,10 @@ + + com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager + com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager + com.dianping.cat.report.page.cross.Handler com.dianping.cat.report.page.cross.Handler @@ -3164,6 +3152,10 @@ + + com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager + com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager + com.dianping.cat.system.page.config.processor.ExceptionConfigProcessor com.dianping.cat.system.page.config.processor.ExceptionConfigProcessor From 7d20e19e70eeb28e2c3a7fde80813a4cb5a25916 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 10:03:44 +0800 Subject: [PATCH 052/231] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E7=A7=BB=E9=99=A4Ple?= =?UTF-8?q?xus/Unidal=20=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DependencyComponentConfigurator.java | 8 +- .../service/DependencyReportService.java | 2 - .../service/HistoricalDependencyService.java | 7 +- .../service/LocalDependencyService.java | 5 - .../resources/META-INF/plexus/components.xml | 133 ++++++++++++++---- 5 files changed, 113 insertions(+), 42 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java index d5a652b746..9ab423bf53 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java @@ -35,7 +35,9 @@ import com.dianping.cat.report.page.dependency.service.DependencyReportService; import com.dianping.cat.report.page.dependency.service.HistoricalDependencyService; import com.dianping.cat.report.page.dependency.service.LocalDependencyService; +import com.dianping.cat.report.ReportBucketManager; import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; public class DependencyComponentConfigurator extends AbstractResourceConfigurator { @@ -53,9 +55,11 @@ public List defineComponents() { all.add(C(TopoGraphFormatConfigManager.class)); - all.add(A(DependencyReportService.class)); + all.add(C(DependencyReportService.class)); - all.add(A(LocalDependencyService.class)); + all.add(C(LocalModelService.class, LocalDependencyService.ID, LocalDependencyService.class) // + .req(ServerConfigManager.class) // + .req(ReportBucketManager.class)); all.add(C(ModelService.class, "dependency-historical", HistoricalDependencyService.class) // .req(DependencyReportService.class, ServerConfigManager.class)); all.add(C(ModelService.class, DependencyAnalyzer.ID, CompositeDependencyService.class) // diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java index 95634d673a..928fae90cd 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java @@ -25,7 +25,6 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.consumer.dependency.DependencyAnalyzer; @@ -39,7 +38,6 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; -@Named public class DependencyReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(DependencyReportService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/HistoricalDependencyService.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/HistoricalDependencyService.java index 7f3a39e3f8..894438cc3a 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/HistoricalDependencyService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/HistoricalDependencyService.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.consumer.dependency.DependencyAnalyzer; import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; import com.dianping.cat.helper.TimeHelper; @@ -30,7 +28,6 @@ public class HistoricalDependencyService extends BaseHistoricalModelService { - @Inject private DependencyReportService m_reportService; public HistoricalDependencyService() { @@ -50,4 +47,8 @@ private DependencyReport getReportFromDatabase(long timestamp, String domain) th return m_reportService.queryReport(domain, new Date(timestamp), new Date(timestamp + TimeHelper.ONE_HOUR)); } + public void setReportService(DependencyReportService reportService) { + m_reportService = reportService; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/LocalDependencyService.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/LocalDependencyService.java index 5ff64d501d..5c9dc00a5b 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/LocalDependencyService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/LocalDependencyService.java @@ -21,9 +21,6 @@ import java.util.Date; import java.util.List; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.consumer.dependency.DependencyAnalyzer; import com.dianping.cat.consumer.dependency.DependencyReportMerger; import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; @@ -37,12 +34,10 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.spring.CatSpringContext; -@Named(type = LocalModelService.class, value = LocalDependencyService.ID) public class LocalDependencyService extends LocalModelService { public static final String ID = DependencyAnalyzer.ID; - @Inject private ReportBucketManager m_bucketManager; public LocalDependencyService() { diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 9652f60fd4..f130ba2396 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -1047,46 +1047,17 @@ com.dianping.cat.report.page.dependency.service.DependencyReportService com.dianping.cat.report.page.dependency.service.DependencyReportService - - - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - - - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - - - com.dianping.cat.core.report.daily.repository.DailyReportRepository - - - com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - - - com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - - - com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - - - com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - - - com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository - - com.dianping.cat.report.service.LocalModelService dependency com.dianping.cat.report.page.dependency.service.LocalDependencyService - - com.dianping.cat.report.ReportBucketManager - com.dianping.cat.config.server.ServerConfigManager - com.dianping.cat.analysis.MessageConsumer + com.dianping.cat.report.ReportBucketManager @@ -2492,6 +2463,108 @@ + + com.dianping.cat.report.page.dependency.service.DependencyReportService + com.dianping.cat.report.page.dependency.service.DependencyReportService + + + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + + + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + + + com.dianping.cat.core.report.daily.repository.DailyReportRepository + + + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + + + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + + + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + + + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + + + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + + + + + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.report.daily.repository.DailyReportRepository + com.dianping.cat.core.report.daily.repository.DailyReportRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + + + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + com.dianping.cat.report.page.dependency.JspViewer com.dianping.cat.report.page.dependency.JspViewer From 5b0f9d355e32ccbdcc3b9c85437d3b3f9053ca70 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 10:18:14 +0800 Subject: [PATCH 053/231] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E7=A7=BB=E9=99=A4Ple?= =?UTF-8?q?xus/Unidal=20=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/report/page/heartbeat/Handler.java | 7 ++++++ .../config/HeartbeatDisplayPolicyManager.java | 25 +++++++++++++++++++ .../config/StorageGroupConfigManager.java | 17 +++++++++++++ 3 files changed, 49 insertions(+) diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/Handler.java index c7a49c7b8c..2ff1bf27e2 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/Handler.java @@ -25,6 +25,8 @@ import java.util.List; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.web.mvc.PageHandler; @@ -51,6 +53,8 @@ import com.dianping.cat.report.service.ModelService; public class Handler implements PageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); + @Inject private GraphBuilder m_builder; @@ -201,6 +205,9 @@ private HeartbeatSvgGraph showReport(Model model, Payload payload) { return new HeartbeatSvgGraph(m_builder, m_manager).display(report, displayIp); } } catch (Throwable e) { + LOGGER.error("Unable to render heartbeat report, domain={}, ip={}, realIp={}, type={}, period={}, date={}, action={}.", + payload.getDomain(), payload.getIpAddress(), payload.getRealIp(), payload.getType(), payload.getPeriod(), + payload.getDate(), payload.getAction(), e); Cat.logError(e); model.setException(e); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java index 95773fb344..b3038ecd7c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java @@ -53,6 +53,8 @@ public class HeartbeatDisplayPolicyManager { private HeartbeatDisplayPolicy m_config; public HeartbeatDisplayPolicy getHeartbeatDisplayPolicy() { + ensureInitialized(); + return m_config; } @@ -107,6 +109,8 @@ public boolean insert(String xml) { } public boolean isDelta(String groupName, String metricName) { + ensureInitialized(); + Group group = m_config.findGroup(groupName); if (group != null) { @@ -120,6 +124,8 @@ public boolean isDelta(String groupName, String metricName) { } public Metric queryMetric(String groupName, String metricName) { + ensureInitialized(); + Group group = m_config.findGroup(groupName); if (group != null) { @@ -133,6 +139,8 @@ public Metric queryMetric(String groupName, String metricName) { } public List queryAlertMetrics() { + ensureInitialized(); + List metrics = new ArrayList(); for (Group group : m_config.getGroups().values()) { @@ -148,6 +156,8 @@ public List queryAlertMetrics() { } public int queryUnit(String groupName, String metricName) { + ensureInitialized(); + Group group = m_config.findGroup(groupName); if (group != null) { @@ -171,6 +181,8 @@ public int queryUnit(String groupName, String metricName) { } public List sortGroupNames(List originGroupNames) { + ensureInitialized(); + List groups = new ArrayList(); for (Entry entry : m_config.getGroups().entrySet()) { @@ -203,6 +215,8 @@ public List sortGroupNames(Set originGroupNameSet) { } public List sortMetricNames(String groupName, List originMetricNames) { + ensureInitialized(); + Group group = m_config.findGroup(groupName); List result = new ArrayList(); @@ -237,8 +251,19 @@ public List sortMetricNames(String groupName, Set originMetricNa return sortMetricNames(groupName, new ArrayList(originMetricNames)); } + private void ensureInitialized() { + if (m_config == null) { + synchronized (this) { + if (m_config == null) { + initialize(); + } + } + } + } + private boolean storeConfig() { synchronized (this) { + ensureInitialized(); refreshSpringBeans(); try { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java index e00c9979be..f5326e1cb9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java @@ -67,6 +67,8 @@ public String buildUrl(String format, String id, String ip) { } public StorageGroupConfig getConfig() { + ensureInitialized(); + return m_config; } @@ -135,6 +137,8 @@ public String queryLinkFormat(String type) { } public Map queryStorageDepartments(List ids, String type) { + ensureInitialized(); + Map departments = new LinkedHashMap(); for (String id : ids) { @@ -163,6 +167,8 @@ public Map queryStorageDepartments(List ids, String } public StorageGroup queryStorageGroup(String type) { + ensureInitialized(); + StorageGroup group = m_config.getStorageGroups().get(type); if (group != null) { @@ -172,8 +178,19 @@ public StorageGroup queryStorageGroup(String type) { } } + private void ensureInitialized() { + if (m_config == null) { + synchronized (this) { + if (m_config == null) { + initialize(); + } + } + } + } + private boolean storeConfig() { synchronized (this) { + ensureInitialized(); refreshSpringBeans(); try { From 5951979f8a48fd476b6642ea062d205a738028c0 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 13:56:06 +0800 Subject: [PATCH 054/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E9=83=A8=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=BB=84=E4=BB=B6=E5=88=B0=20Spring=20?= =?UTF-8?q?=E6=B3=A8=E5=85=A5=E5=B9=B6=E8=A1=A5=E9=BD=90=E6=97=A7=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/ComponentsConfigurator.java | 99 +++- .../DependencyComponentConfigurator.java | 32 +- .../spring/CatHomeSpringConfiguration.java | 177 ++++++- .../summary/build/FailureSummaryBuilder.java | 2 +- .../cat/report/page/alert/Handler.java | 20 +- .../cat/report/page/alteration/Handler.java | 11 +- .../cat/report/page/cache/Handler.java | 60 ++- .../page/dependency/ExternalInfoBuilder.java | 26 +- .../cat/report/page/dependency/Handler.java | 66 ++- .../graph/TopologyGraphManager.java | 84 ++- .../event/service/HistoricalEventService.java | 7 +- .../cat/report/page/home/Handler.java | 35 +- .../cat/report/page/monitor/Handler.java | 6 - .../service/HistoricalTransactionService.java | 7 +- .../resources/META-INF/plexus/components.xml | 498 +++++++----------- 15 files changed, 721 insertions(+), 409 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index edef7bac1b..cd2a01d2eb 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -18,26 +18,36 @@ */ package com.dianping.cat.build; -import java.util.ArrayList; -import java.util.List; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import org.unidal.dal.jdbc.configuration.AbstractJdbcResourceConfigurator; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.initialization.DefaultModuleManager; -import org.unidal.initialization.ModuleManager; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.CatConstants; -import com.dianping.cat.CatHomeModule; -import com.dianping.cat.build.report.DependencyComponentConfigurator; -import com.dianping.cat.build.report.EventComponentConfigurator; -import com.dianping.cat.build.report.HeartbeatComponentConfigurator; -import com.dianping.cat.build.report.MetricComponentConfigurator; -import com.dianping.cat.build.report.OfflineComponentConfigurator; -import com.dianping.cat.build.report.ProblemComponentConfigurator; +import org.unidal.initialization.DefaultModuleManager; +import org.unidal.initialization.ModuleManager; +import org.unidal.lookup.configuration.Component; +import org.unidal.web.mvc.view.model.ModelHandler; + +import com.dianping.cat.analysis.MessageConsumer; +import com.dianping.cat.analysis.TcpSocketReceiver; +import com.dianping.cat.CatConstants; +import com.dianping.cat.CatHomeModule; +import com.dianping.cat.alarm.spi.sender.SenderManager; +import com.dianping.cat.build.report.DependencyComponentConfigurator; +import com.dianping.cat.build.report.EventComponentConfigurator; +import com.dianping.cat.build.report.HeartbeatComponentConfigurator; +import com.dianping.cat.build.report.MetricComponentConfigurator; +import com.dianping.cat.build.report.OfflineComponentConfigurator; +import com.dianping.cat.build.report.ProblemComponentConfigurator; import com.dianping.cat.build.report.ReportComponentConfigurator; import com.dianping.cat.build.report.StorageComponentConfigurator; import com.dianping.cat.build.report.TransactionComponentConfigurator; +import com.dianping.cat.consumer.event.EventAnalyzer; +import com.dianping.cat.consumer.transaction.TransactionAnalyzer; +import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; +import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; @@ -53,11 +63,14 @@ import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.mvc.PayloadNormalizer; -import com.dianping.cat.report.HourlyReportContentTableProvider; -import com.dianping.cat.report.HourlyReportTableProvider; -import com.dianping.cat.report.graph.svg.DefaultGraphBuilder; -import com.dianping.cat.report.graph.svg.DefaultValueTranslater; -import com.dianping.cat.report.page.DomainGroupConfigManager; +import com.dianping.cat.report.HourlyReportContentTableProvider; +import com.dianping.cat.report.HourlyReportTableProvider; +import com.dianping.cat.report.graph.svg.DefaultGraphBuilder; +import com.dianping.cat.report.graph.svg.DefaultValueTranslater; +import com.dianping.cat.report.page.DomainGroupConfigManager; +import com.dianping.cat.report.page.event.service.EventReportService; +import com.dianping.cat.report.page.transaction.service.TransactionReportService; +import com.dianping.cat.report.service.ModelService; import com.dianping.cat.system.page.permission.ResourceConfigManager; import com.dianping.cat.system.page.permission.UserConfigManager; @@ -96,10 +109,36 @@ public List defineComponents() { all.addAll(defineConfigComponents()); - // must define in home module instead of core - all.addAll(defineTableProviderComponents()); - - all.add(A(CatHomeModule.class)); + // must define in home module instead of core + all.addAll(defineTableProviderComponents()); + + all.add(C(com.dianping.cat.report.page.home.Handler.class) // + .req(com.dianping.cat.report.page.home.JspViewer.class, (String) null, "m_jspViewer") // + .req(TcpSocketReceiver.class, (String) null, "m_receiver") // + .req(MessageConsumer.class, (String) null, "m_realtimeConsumer")); + all.add(C(com.dianping.cat.report.page.home.JspViewer.class).req(ModelHandler.class)); + + all.add(C(com.dianping.cat.report.page.alteration.Handler.class) // + .req(com.dianping.cat.report.page.alteration.JspViewer.class, (String) null, "m_jspViewer") // + .req(AlterationRepository.class, (String) null, "m_alterationDao")); + all.add(C(com.dianping.cat.report.page.alteration.JspViewer.class).req(ModelHandler.class)); + + all.add(C(com.dianping.cat.report.page.alert.Handler.class) // + .req(com.dianping.cat.report.page.alert.JspViewer.class, (String) null, "m_jspViewer") // + .req(SenderManager.class, (String) null, "m_senderManager") // + .req(AlertRepository.class, (String) null, "m_alertDao")); + all.add(C(com.dianping.cat.report.page.alert.JspViewer.class).req(ModelHandler.class)); + + all.add(C(com.dianping.cat.report.page.cache.Handler.class) // + .req(ModelService.class, EventAnalyzer.ID, "m_eventService") // + .req(com.dianping.cat.report.page.cache.JspViewer.class, (String) null, "m_jspViewer") // + .req(TransactionReportService.class, (String) null, "m_transactionReportService") // + .req(EventReportService.class, (String) null, "m_eventReportService") // + .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // + .req(ModelService.class, TransactionAnalyzer.ID, "m_transactionService")); + all.add(C(com.dianping.cat.report.page.cache.JspViewer.class).req(ModelHandler.class)); + + all.add(A(CatHomeModule.class)); all.add(C(UserConfigManager.class)); @@ -139,6 +178,7 @@ public List defineComponents() { all.addAll(new WebComponentConfigurator().defineComponents()); removeReplacedDaoComponents(all); + removeDuplicateComponents(all); addCoreRepositoryComponents(all); return all; @@ -181,6 +221,19 @@ private void removeReplacedDaoComponents(List components) { components.removeIf(component -> isCoreReplacedDaoRole(component.getModel().getRole())); } + private void removeDuplicateComponents(List components) { + Set keys = new HashSet(); + + components.removeIf(component -> { + String role = component.getModel().getRole(); + String roleHint = component.getModel().getRoleHint(); + String normalizedRoleHint = roleHint == null ? "" : roleHint; + String key = role + ":" + normalizedRoleHint; + + return !keys.add(key); + }); + } + private boolean isCoreReplacedDaoRole(String role) { for (String replacedDaoRole : CORE_REPLACED_DAO_ROLES) { if (replacedDaoRole.equals(role)) { diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java index 9ab423bf53..ae69e7946c 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/DependencyComponentConfigurator.java @@ -23,9 +23,17 @@ import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; +import org.unidal.web.mvc.view.model.ModelHandler; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.consumer.dependency.DependencyAnalyzer; +import com.dianping.cat.consumer.problem.ProblemAnalyzer; +import com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository; +import com.dianping.cat.mvc.PayloadNormalizer; +import com.dianping.cat.report.page.dependency.ExternalInfoBuilder; +import com.dianping.cat.report.page.dependency.Handler; +import com.dianping.cat.report.page.dependency.JspViewer; import com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager; import com.dianping.cat.report.page.dependency.graph.DependencyItemBuilder; import com.dianping.cat.report.page.dependency.graph.TopologyGraphBuilder; @@ -39,6 +47,7 @@ import com.dianping.cat.report.server.RemoteServersManager; import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.service.ProjectService; public class DependencyComponentConfigurator extends AbstractResourceConfigurator { @Override @@ -49,12 +58,33 @@ public List defineComponents() { all.add(C(TopologyGraphBuilder.class).req(DependencyItemBuilder.class)); - all.add(A(TopologyGraphManager.class)); + all.add(C(TopologyGraphManager.class) // + .req(ModelService.class, DependencyAnalyzer.ID, "m_service") // + .req(DependencyItemBuilder.class, (String) null, "m_itemBuilder") // + .req(TopoGraphFormatConfigManager.class, (String) null, "m_configManager") // + .req(ServerConfigManager.class, (String) null, "m_manager") // + .req(ServerFilterConfigManager.class, (String) null, "m_serverFilterConfigManager") // + .req(ProjectService.class, (String) null, "m_projectService") // + .req(TopologyGraphRepository.class, (String) null, "m_topologyGraphDao")); all.add(C(TopologyGraphConfigManager.class)); all.add(C(TopoGraphFormatConfigManager.class)); + all.add(C(ExternalInfoBuilder.class) // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager") // + .req(ModelService.class, ProblemAnalyzer.ID, "m_problemservice") // + .req(DependencyReportService.class, (String) null, "m_reportService")); + + all.add(C(Handler.class) // + .req(ModelService.class, DependencyAnalyzer.ID, "m_dependencyService") // + .req(TopologyGraphManager.class, (String) null, "m_graphManager") // + .req(ExternalInfoBuilder.class, (String) null, "m_externalInfoBuilder") // + .req(JspViewer.class, (String) null, "m_jspViewer") // + .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // + .req(TopoGraphFormatConfigManager.class, (String) null, "m_formatConfigManager")); + all.add(C(JspViewer.class).req(ModelHandler.class)); + all.add(C(DependencyReportService.class)); all.add(C(LocalModelService.class, LocalDependencyService.ID, LocalDependencyService.class) // diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index b50ba58195..1e3da69442 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -127,6 +127,7 @@ import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.message.DefaultPathBuilder; import com.dianping.cat.message.PathBuilder; +import com.dianping.cat.mvc.PayloadNormalizer; import com.dianping.cat.report.DefaultReportBucketManager; import com.dianping.cat.report.DefaultReportManager; import com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager; @@ -159,9 +160,11 @@ import com.dianping.cat.report.graph.metric.impl.DataExtractorImpl; import com.dianping.cat.report.page.DomainGroupConfigManager; import com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager; +import com.dianping.cat.report.page.dependency.ExternalInfoBuilder; import com.dianping.cat.report.page.dependency.graph.DependencyItemBuilder; import com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager; import com.dianping.cat.report.page.dependency.graph.TopologyGraphBuilder; +import com.dianping.cat.report.page.dependency.graph.TopologyGraphManager; import com.dianping.cat.report.page.business.graph.BusinessDataFetcher; import com.dianping.cat.report.page.business.graph.CustomDataCalculator; import com.dianping.cat.report.page.business.service.CachedBusinessReportService; @@ -176,9 +179,13 @@ import com.dianping.cat.report.page.cross.service.LocalCrossService; import com.dianping.cat.report.page.cross.task.CrossReportBuilder; import com.dianping.cat.report.page.dependency.service.DependencyReportService; +import com.dianping.cat.report.page.dependency.service.CompositeDependencyService; +import com.dianping.cat.report.page.dependency.service.HistoricalDependencyService; import com.dianping.cat.report.page.dependency.service.LocalDependencyService; import com.dianping.cat.report.page.dependency.task.DependencyReportBuilder; import com.dianping.cat.report.page.event.service.EventReportService; +import com.dianping.cat.report.page.event.service.CompositeEventService; +import com.dianping.cat.report.page.event.service.HistoricalEventService; import com.dianping.cat.report.page.event.task.EventReportBuilder; import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; import com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService; @@ -239,6 +246,8 @@ import com.dianping.cat.report.page.state.task.StateReportBuilder; import com.dianping.cat.report.page.top.service.LocalTopService; import com.dianping.cat.report.page.transaction.service.TransactionReportService; +import com.dianping.cat.report.page.transaction.service.CompositeTransactionService; +import com.dianping.cat.report.page.transaction.service.HistoricalTransactionService; import com.dianping.cat.report.page.transaction.service.LocalTransactionService; import com.dianping.cat.report.page.transaction.task.TransactionReportBuilder; import com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper; @@ -948,6 +957,101 @@ public TopologyGraphBuilder topologyGraphBuilder(DependencyItemBuilder dependenc return builder; } + @Bean + public PayloadNormalizer payloadNormalizer() { + return new PayloadNormalizer(); + } + + @Bean + public com.dianping.cat.report.page.alteration.JspViewer alterationJspViewer() { + return new com.dianping.cat.report.page.alteration.JspViewer(); + } + + @Bean + public com.dianping.cat.report.page.alteration.Handler alterationHandler( + com.dianping.cat.report.page.alteration.JspViewer alterationJspViewer, + AlterationRepository alterationRepository) { + com.dianping.cat.report.page.alteration.Handler handler = new com.dianping.cat.report.page.alteration.Handler(); + + handler.setJspViewer(alterationJspViewer); + handler.setAlterationDao(alterationRepository); + return handler; + } + + @Bean + public com.dianping.cat.report.page.alert.JspViewer alertJspViewer() { + return new com.dianping.cat.report.page.alert.JspViewer(); + } + + @Bean + public com.dianping.cat.report.page.alert.Handler alertHandler( + com.dianping.cat.report.page.alert.JspViewer alertJspViewer, SenderManager senderManager, + AlertRepository alertRepository) { + com.dianping.cat.report.page.alert.Handler handler = new com.dianping.cat.report.page.alert.Handler(); + + handler.setJspViewer(alertJspViewer); + handler.setSenderManager(senderManager); + handler.setAlertDao(alertRepository); + return handler; + } + + @Bean + public com.dianping.cat.report.page.cache.JspViewer cacheJspViewer() { + return new com.dianping.cat.report.page.cache.JspViewer(); + } + + @Bean + public com.dianping.cat.report.page.cache.Handler cacheHandler( + @Qualifier("eventModelService") ModelService eventModelService, + com.dianping.cat.report.page.cache.JspViewer cacheJspViewer, + TransactionReportService transactionReportService, EventReportService eventReportService, + PayloadNormalizer payloadNormalizer, + @Qualifier("transactionModelService") ModelService transactionModelService) { + com.dianping.cat.report.page.cache.Handler handler = new com.dianping.cat.report.page.cache.Handler(); + + handler.setEventService(eventModelService); + handler.setJspViewer(cacheJspViewer); + handler.setTransactionReportService(transactionReportService); + handler.setEventReportService(eventReportService); + handler.setNormalizePayload(payloadNormalizer); + handler.setTransactionService(transactionModelService); + return handler; + } + + @Bean + public com.dianping.cat.report.page.dependency.JspViewer dependencyJspViewer() { + return new com.dianping.cat.report.page.dependency.JspViewer(); + } + + @Bean + public ExternalInfoBuilder externalInfoBuilder(ServerConfigManager serverConfigManager, + @Qualifier("problemModelService") ModelService problemModelService, + DependencyReportService dependencyReportService) { + ExternalInfoBuilder builder = new ExternalInfoBuilder(); + + builder.setServerConfigManager(serverConfigManager); + builder.setProblemService(problemModelService); + builder.setReportService(dependencyReportService); + return builder; + } + + @Bean(initMethod = "initialize") + public TopologyGraphManager topologyGraphManager(@Qualifier("dependencyModelService") ModelService dependencyModelService, + DependencyItemBuilder dependencyItemBuilder, TopoGraphFormatConfigManager topoGraphFormatConfigManager, + ServerConfigManager serverConfigManager, ServerFilterConfigManager serverFilterConfigManager, + ProjectService projectService, TopologyGraphRepository topologyGraphRepository) { + TopologyGraphManager manager = new TopologyGraphManager(); + + manager.setService(dependencyModelService); + manager.setItemBuilder(dependencyItemBuilder); + manager.setConfigManager(topoGraphFormatConfigManager); + manager.setManager(serverConfigManager); + manager.setServerFilterConfigManager(serverFilterConfigManager); + manager.setProjectService(projectService); + manager.setTopologyGraphDao(topologyGraphRepository); + return manager; + } + @Bean(name = DependencyReportBuilder.ID) public TaskBuilder dependencyReportBuilder(DependencyReportService dependencyReportService, TopologyGraphBuilder topologyGraphBuilder, TopologyGraphRepository topologyGraphRepository) { @@ -1676,7 +1780,37 @@ public ModelService historicalBusinessService(BusinessReportServ return service; } - @Bean(initMethod = "initialize", name = ProblemAnalyzer.ID) + @Bean(initMethod = "initialize", name = "event-historical") + public ModelService historicalEventService(EventReportService eventReportService, + ServerConfigManager serverConfigManager) { + HistoricalEventService service = new HistoricalEventService(); + + service.setReportService(eventReportService); + service.setConfigManager(serverConfigManager); + return service; + } + + @Bean(initMethod = "initialize", name = "transaction-historical") + public ModelService historicalTransactionService( + TransactionReportService transactionReportService, ServerConfigManager serverConfigManager) { + HistoricalTransactionService service = new HistoricalTransactionService(); + + service.setReportService(transactionReportService); + service.setConfigManager(serverConfigManager); + return service; + } + + @Bean(initMethod = "initialize", name = "dependency-historical") + public ModelService historicalDependencyService(DependencyReportService dependencyReportService, + ServerConfigManager serverConfigManager) { + HistoricalDependencyService service = new HistoricalDependencyService(); + + service.setReportService(dependencyReportService); + service.setConfigManager(serverConfigManager); + return service; + } + + @Bean(initMethod = "initialize") public ModelService problemModelService( @Qualifier("problem-historical") ModelService historicalProblemService, ServerConfigManager serverConfigManager, RemoteServersManager remoteServersManager) { @@ -1702,6 +1836,45 @@ public ModelService businessModelService( return service; } + @Bean(initMethod = "initialize") + public ModelService eventModelService( + @Qualifier("event-historical") ModelService historicalEventService, + ServerConfigManager serverConfigManager, RemoteServersManager remoteServersManager) { + CompositeEventService service = new CompositeEventService(); + List> services = Collections.singletonList(historicalEventService); + + service.setServices(services); + service.setConfigManager(serverConfigManager); + service.setServerManager(remoteServersManager); + return service; + } + + @Bean(initMethod = "initialize") + public ModelService transactionModelService( + @Qualifier("transaction-historical") ModelService historicalTransactionService, + ServerConfigManager serverConfigManager, RemoteServersManager remoteServersManager) { + CompositeTransactionService service = new CompositeTransactionService(); + List> services = Collections.singletonList(historicalTransactionService); + + service.setServices(services); + service.setConfigManager(serverConfigManager); + service.setServerManager(remoteServersManager); + return service; + } + + @Bean(initMethod = "initialize") + public ModelService dependencyModelService( + @Qualifier("dependency-historical") ModelService historicalDependencyService, + ServerConfigManager serverConfigManager, RemoteServersManager remoteServersManager) { + CompositeDependencyService service = new CompositeDependencyService(); + List> services = Collections.singletonList(historicalDependencyService); + + service.setServices(services); + service.setConfigManager(serverConfigManager); + service.setServerManager(remoteServersManager); + return service; + } + @Bean(initMethod = "initialize") public LocalModelService localProblemService(ServerConfigManager serverConfigManager, ReportBucketManager reportBucketManager) { @@ -1870,7 +2043,7 @@ public SummaryBuilder relatedSummaryBuilder(AlertInfoBuilder alertInfoBuilder, } @Bean(initMethod = "initialize", name = FailureSummaryBuilder.ID) - public SummaryBuilder failureSummaryBuilder(@Qualifier(ProblemAnalyzer.ID) ModelService problemModelService) { + public SummaryBuilder failureSummaryBuilder(@Qualifier("problemModelService") ModelService problemModelService) { FailureSummaryBuilder builder = new FailureSummaryBuilder(); builder.setService(problemModelService); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java index e303194ab9..f2ef9c0f65 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java @@ -53,7 +53,7 @@ public class FailureSummaryBuilder extends SummaryBuilder { @SuppressWarnings("unchecked") private ModelService getService() { if (m_service == null) { - m_service = CatSpringContext.getBeanIfAvailable(ProblemAnalyzer.ID, ModelService.class); + m_service = CatSpringContext.getBeanIfAvailable("problemModelService", ModelService.class); } return m_service; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java index fc1d3984f3..12f989bdeb 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java @@ -33,7 +33,6 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.helper.Splitters; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,13 +54,10 @@ public class Handler implements PageHandler { private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); - @Inject private JspViewer m_jspViewer; - @Inject private SenderManager m_senderManager; - @Inject private AlertRepository m_alertDao; private Alert buildAlertEntity(Payload payload) { @@ -217,10 +213,26 @@ private void setAlertResult(Model model, int status) { private void refreshSpringBeans() { AlertRepository alertDao = CatSpringContext.getBeanIfAvailable(AlertRepository.class); + SenderManager senderManager = CatSpringContext.getBeanIfAvailable(SenderManager.class); if (alertDao != null) { m_alertDao = alertDao; } + if (senderManager != null) { + m_senderManager = senderManager; + } + } + + public void setAlertDao(AlertRepository alertDao) { + m_alertDao = alertDao; + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setSenderManager(SenderManager senderManager) { + m_senderManager = senderManager; } public class AlertDomain { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java index 2dd620734f..41aab01f31 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java @@ -34,7 +34,6 @@ import java.util.Map; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,10 +55,8 @@ public class Handler implements PageHandler { private final static String EMPTY = "N/A"; - @Inject private JspViewer m_jspViewer; - @Inject private AlterationRepository m_alterationDao; private SimpleDateFormat m_sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @@ -293,6 +290,14 @@ private void refreshSpringBeans() { } } + public void setAlterationDao(AlterationRepository alterationDao) { + m_alterationDao = alterationDao; + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + public static class AlterationDomain { private String m_name; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cache/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/cache/Handler.java index 02559cf5ae..cbae49275e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cache/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cache/Handler.java @@ -24,7 +24,6 @@ import java.util.Date; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -48,25 +47,20 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { - @Inject(type = ModelService.class, value = EventAnalyzer.ID) private ModelService m_eventService; - @Inject private JspViewer m_jspViewer; - @Inject private TransactionReportService m_transactionReportService; - @Inject private EventReportService m_eventReportService; - @Inject private PayloadNormalizer m_normalizePayload; - @Inject(type = ModelService.class, value = TransactionAnalyzer.ID) private ModelService m_transactionService; private CacheReport buildCacheReport(TransactionReport transactionReport, EventReport eventReport, Payload payload) { @@ -219,6 +213,7 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = "cache") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); Model model = new Model(ctx); Payload payload = ctx.getPayload(); String type = payload.getType(); @@ -255,4 +250,55 @@ private void normalize(Model model, Payload payload) { model.setQueryName(payload.getQueryName()); } + private void refreshSpringBeans() { + EventReportService eventReportService = CatSpringContext.getBeanIfAvailable(EventReportService.class); + TransactionReportService transactionReportService = CatSpringContext + .getBeanIfAvailable(TransactionReportService.class); + PayloadNormalizer normalizer = CatSpringContext.getBeanIfAvailable(PayloadNormalizer.class); + ModelService eventService = CatSpringContext.getBeanIfAvailable("eventModelService", + ModelService.class); + ModelService transactionService = CatSpringContext.getBeanIfAvailable( + "transactionModelService", ModelService.class); + + if (eventReportService != null) { + m_eventReportService = eventReportService; + } + if (transactionReportService != null) { + m_transactionReportService = transactionReportService; + } + if (normalizer != null) { + m_normalizePayload = normalizer; + } + if (eventService != null) { + m_eventService = eventService; + } + if (transactionService != null) { + m_transactionService = transactionService; + } + } + + public void setEventReportService(EventReportService eventReportService) { + m_eventReportService = eventReportService; + } + + public void setEventService(ModelService eventService) { + m_eventService = eventService; + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setNormalizePayload(PayloadNormalizer normalizePayload) { + m_normalizePayload = normalizePayload; + } + + public void setTransactionReportService(TransactionReportService transactionReportService) { + m_transactionReportService = transactionReportService; + } + + public void setTransactionService(ModelService transactionService) { + m_transactionService = transactionService; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/ExternalInfoBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/ExternalInfoBuilder.java index b2f559d91b..017df1a2eb 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/ExternalInfoBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/ExternalInfoBuilder.java @@ -21,8 +21,6 @@ import java.text.SimpleDateFormat; import java.util.Date; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; @@ -37,13 +35,10 @@ public class ExternalInfoBuilder { - @Inject protected ServerConfigManager m_serverConfigManager; - @Inject(type = ModelService.class, value = ProblemAnalyzer.ID) private ModelService m_problemservice; - @Inject private DependencyReportService m_reportService; private SimpleDateFormat m_dateFormat = new SimpleDateFormat("yyyyMMddHH"); @@ -108,10 +103,31 @@ private ProblemReport queryProblemReport(Payload payload, String domain) { private void refreshSpringBeans() { ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); + ModelService problemService = CatSpringContext.getBeanIfAvailable("problemModelService", + ModelService.class); + DependencyReportService reportService = CatSpringContext.getBeanIfAvailable(DependencyReportService.class); if (serverConfigManager != null) { m_serverConfigManager = serverConfigManager; } + if (problemService != null) { + m_problemservice = problemService; + } + if (reportService != null) { + m_reportService = reportService; + } + } + + public void setProblemService(ModelService problemService) { + m_problemservice = problemService; + } + + public void setReportService(DependencyReportService reportService) { + m_reportService = reportService; + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + m_serverConfigManager = serverConfigManager; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/Handler.java index df054925e6..916b695545 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/Handler.java @@ -38,7 +38,7 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; -import org.unidal.lookup.annotation.Inject; +import com.dianping.cat.spring.CatSpringContext; import org.unidal.lookup.util.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -55,22 +55,16 @@ public class Handler implements PageHandler { public static final List NORMAL_URLS = Arrays.asList("/cat/r", "/cat/r/", "/cat/r/dependency"); - @Inject(type = ModelService.class, value = DependencyAnalyzer.ID) private ModelService m_dependencyService; - @Inject private TopologyGraphManager m_graphManager; - @Inject private ExternalInfoBuilder m_externalInfoBuilder; - @Inject private JspViewer m_jspViewer; - @Inject private PayloadNormalizer m_normalizePayload; - @Inject private TopoGraphFormatConfigManager m_formatConfigManager; private Segment buildAllSegmentsInfo(DependencyReport report) { @@ -187,6 +181,8 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = DependencyAnalyzer.ID) public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + if (validate(ctx)) { Model model = new Model(ctx); Payload payload = ctx.getPayload(); @@ -249,6 +245,8 @@ private int parseQueryMinute(Payload payload) { } private DependencyReport queryDependencyReport(Payload payload) { + refreshSpringBeans(); + String domain = payload.getDomain(); ModelRequest request = new ModelRequest(domain, payload.getDate()); @@ -273,4 +271,58 @@ private boolean validate(Context ctx) { return NORMAL_URLS.contains(actionUrl); } + private void refreshSpringBeans() { + ModelService dependencyService = CatSpringContext.getBeanIfAvailable(DependencyAnalyzer.ID, + ModelService.class); + TopologyGraphManager graphManager = CatSpringContext.getBeanIfAvailable(TopologyGraphManager.class); + ExternalInfoBuilder externalInfoBuilder = CatSpringContext.getBeanIfAvailable(ExternalInfoBuilder.class); + JspViewer jspViewer = CatSpringContext.getBeanIfAvailable(JspViewer.class); + PayloadNormalizer normalizePayload = CatSpringContext.getBeanIfAvailable(PayloadNormalizer.class); + TopoGraphFormatConfigManager formatConfigManager = CatSpringContext + .getBeanIfAvailable(TopoGraphFormatConfigManager.class); + + if (dependencyService != null) { + m_dependencyService = dependencyService; + } + if (graphManager != null) { + m_graphManager = graphManager; + } + if (externalInfoBuilder != null) { + m_externalInfoBuilder = externalInfoBuilder; + } + if (jspViewer != null) { + m_jspViewer = jspViewer; + } + if (normalizePayload != null) { + m_normalizePayload = normalizePayload; + } + if (formatConfigManager != null) { + m_formatConfigManager = formatConfigManager; + } + } + + public void setDependencyService(ModelService dependencyService) { + m_dependencyService = dependencyService; + } + + public void setExternalInfoBuilder(ExternalInfoBuilder externalInfoBuilder) { + m_externalInfoBuilder = externalInfoBuilder; + } + + public void setFormatConfigManager(TopoGraphFormatConfigManager formatConfigManager) { + m_formatConfigManager = formatConfigManager; + } + + public void setGraphManager(TopologyGraphManager graphManager) { + m_graphManager = graphManager; + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setNormalizePayload(PayloadNormalizer normalizePayload) { + m_normalizePayload = normalizePayload; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java index 4309d8545a..5d91df4f3f 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java @@ -27,15 +27,11 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import org.codehaus.plexus.logging.LogEnabled; -import org.codehaus.plexus.logging.Logger; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.helper.Threads; import org.unidal.helper.Threads.Task; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -60,36 +56,28 @@ import com.dianping.cat.service.ProjectService; import com.dianping.cat.spring.CatSpringContext; -@Named -public class TopologyGraphManager implements Initializable, LogEnabled { +public class TopologyGraphManager { + + private static final Logger LOGGER = LoggerFactory.getLogger(TopologyGraphManager.class); - @Inject(type = ModelService.class, value = DependencyAnalyzer.ID) private ModelService m_service; - @Inject private DependencyItemBuilder m_itemBuilder; - @Inject private TopoGraphFormatConfigManager m_configManager; - @Inject private ServerConfigManager m_manager; - @Inject private ServerFilterConfigManager m_serverFilterConfigManager; - @Inject private ProjectService m_projectService; - @Inject private TopologyGraphRepository m_topologyGraphDao; private TopologyGraphBuilder m_currentBuilder; private Map m_topologyGraphs = new ConcurrentHashMap(); - private Logger m_logger; - public Set buildEdges(Set domains, Date start, Date end) { Set result = new HashSet(); @@ -205,17 +193,14 @@ public TopologyGraph buildTopologyGraph(String domain, long time) { return topologyGraph; } - @Override - public void enableLogging(Logger logger) { - m_logger = logger; - } - - @Override - public void initialize() throws InitializationException { + public void initialize() { refreshSpringBeans(); if (m_manager.isJobMachine()) { + LOGGER.info("Starting dependency topology graph reload task."); Threads.forGroup("cat").start(new DependencyReloadTask()); + } else { + LOGGER.info("Skip dependency topology graph reload task because current node is not job machine."); } } @@ -232,6 +217,7 @@ public TopologyGraph queryGraphFromDB(long time) { return DefaultNativeParser.parse(content); } } catch (DalException e) { + LOGGER.error("Unable to query dependency topology graph from database, time={}.", time, e); Cat.logError(e); } return null; @@ -276,7 +262,7 @@ private void buildDependencyInfo(TopologyGraphBuilder builder, String domain) { builder.visitDependencyReport(report); } } else { - m_logger.warn(String.format("Can't get dependency report of %s", domain)); + LOGGER.warn("Can't get dependency report, domain={}.", domain); } } } @@ -303,6 +289,7 @@ public void run() { try { buildDependencyInfo(builder, domain); } catch (Exception e) { + LOGGER.error("Unable to build dependency topology info, domain={}.", domain, e); Cat.logError(e); } } @@ -316,7 +303,7 @@ public void run() { m_currentBuilder = builder; t.setStatus(Transaction.SUCCESS); } catch (Exception e) { - m_logger.error(e.getMessage(), e); + LOGGER.error("Unable to reload dependency topology graph.", e); t.setStatus(e); } finally { t.complete(); @@ -340,11 +327,25 @@ public void shutdown() { } private void refreshSpringBeans() { + ModelService service = CatSpringContext.getBeanIfAvailable("dependencyModelService", + ModelService.class); + DependencyItemBuilder itemBuilder = CatSpringContext.getBeanIfAvailable(DependencyItemBuilder.class); + TopoGraphFormatConfigManager configManager = CatSpringContext.getBeanIfAvailable(TopoGraphFormatConfigManager.class); ServerConfigManager manager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); ServerFilterConfigManager serverFilterConfigManager = CatSpringContext .getBeanIfAvailable(ServerFilterConfigManager.class); ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + TopologyGraphRepository topologyGraphDao = CatSpringContext.getBeanIfAvailable(TopologyGraphRepository.class); + if (service != null) { + m_service = service; + } + if (itemBuilder != null) { + m_itemBuilder = itemBuilder; + } + if (configManager != null) { + m_configManager = configManager; + } if (manager != null) { m_manager = manager; } @@ -354,6 +355,37 @@ private void refreshSpringBeans() { if (projectService != null) { m_projectService = projectService; } + if (topologyGraphDao != null) { + m_topologyGraphDao = topologyGraphDao; + } + } + + public void setConfigManager(TopoGraphFormatConfigManager configManager) { + m_configManager = configManager; + } + + public void setItemBuilder(DependencyItemBuilder itemBuilder) { + m_itemBuilder = itemBuilder; + } + + public void setManager(ServerConfigManager manager) { + m_manager = manager; + } + + public void setProjectService(ProjectService projectService) { + m_projectService = projectService; + } + + public void setServerFilterConfigManager(ServerFilterConfigManager serverFilterConfigManager) { + m_serverFilterConfigManager = serverFilterConfigManager; + } + + public void setService(ModelService service) { + m_service = service; + } + + public void setTopologyGraphDao(TopologyGraphRepository topologyGraphDao) { + m_topologyGraphDao = topologyGraphDao; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/HistoricalEventService.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/HistoricalEventService.java index d577717ef4..357dc9a624 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/HistoricalEventService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/HistoricalEventService.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.consumer.event.EventAnalyzer; import com.dianping.cat.consumer.event.model.entity.EventReport; import com.dianping.cat.helper.TimeHelper; @@ -30,7 +28,6 @@ public class HistoricalEventService extends BaseHistoricalModelService { - @Inject private EventReportService m_reportService; public HistoricalEventService() { @@ -50,4 +47,8 @@ private EventReport getReportFromDatabase(long timestamp, String domain) throws return m_reportService.queryReport(domain, new Date(timestamp), new Date(timestamp + TimeHelper.ONE_HOUR)); } + public void setReportService(EventReportService reportService) { + m_reportService = reportService; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/home/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/home/Handler.java index 368c64213e..ec34b2e589 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/home/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/home/Handler.java @@ -25,7 +25,6 @@ import java.lang.management.ThreadMXBean; import java.util.TreeMap; -import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -34,15 +33,13 @@ import com.dianping.cat.analysis.MessageConsumer; import com.dianping.cat.analysis.TcpSocketReceiver; import com.dianping.cat.report.ReportPage; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { - @Inject private JspViewer m_jspViewer; - @Inject private TcpSocketReceiver m_receiver; - @Inject private MessageConsumer m_realtimeConsumer; @Override @@ -54,6 +51,8 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = "home") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + Model model = new Model(ctx); Payload payload = ctx.getPayload(); @@ -112,4 +111,32 @@ private void showThreadDump(Model model, Payload payload) { model.setContent(sb.toString()); } + + private void refreshSpringBeans() { + JspViewer jspViewer = CatSpringContext.getBeanIfAvailable(JspViewer.class); + TcpSocketReceiver receiver = CatSpringContext.getBeanIfAvailable(TcpSocketReceiver.class); + MessageConsumer realtimeConsumer = CatSpringContext.getBeanIfAvailable(MessageConsumer.class); + + if (jspViewer != null) { + m_jspViewer = jspViewer; + } + if (receiver != null) { + m_receiver = receiver; + } + if (realtimeConsumer != null) { + m_realtimeConsumer = realtimeConsumer; + } + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setRealtimeConsumer(MessageConsumer realtimeConsumer) { + m_realtimeConsumer = realtimeConsumer; + } + + public void setReceiver(TcpSocketReceiver receiver) { + m_receiver = receiver; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/monitor/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/monitor/Handler.java index af13c24289..4d0ef7b8d6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/monitor/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/monitor/Handler.java @@ -21,19 +21,13 @@ import javax.servlet.ServletException; import java.io.IOException; -import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; import org.unidal.web.mvc.annotation.PayloadMeta; -import com.dianping.cat.helper.JsonBuilder; - public class Handler implements PageHandler { - @Inject - private JsonBuilder m_builder; - @Override @PayloadMeta(Payload.class) @InboundActionMeta(name = "monitor") diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/HistoricalTransactionService.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/HistoricalTransactionService.java index 0e4eccd1c5..b0deddfed1 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/HistoricalTransactionService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/HistoricalTransactionService.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; import com.dianping.cat.helper.TimeHelper; @@ -30,7 +28,6 @@ public class HistoricalTransactionService extends BaseHistoricalModelService { - @Inject private TransactionReportService m_reportService; public HistoricalTransactionService() { @@ -50,4 +47,8 @@ private TransactionReport getReportFromDatabase(long timestamp, String domain) t return m_reportService.queryReport(domain, new Date(timestamp), new Date(timestamp + TimeHelper.ONE_HOUR)); } + public void setReportService(TransactionReportService reportService) { + m_reportService = reportService; + } + } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index f130ba2396..5b89250396 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -41,6 +41,124 @@ report-content com.dianping.cat.report.HourlyReportContentTableProvider + + com.dianping.cat.report.page.home.Handler + com.dianping.cat.report.page.home.Handler + + + com.dianping.cat.report.page.home.JspViewer + m_jspViewer + + + com.dianping.cat.analysis.TcpSocketReceiver + m_receiver + + + com.dianping.cat.analysis.MessageConsumer + m_realtimeConsumer + + + + + com.dianping.cat.report.page.home.JspViewer + com.dianping.cat.report.page.home.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + + + com.dianping.cat.report.page.alteration.Handler + com.dianping.cat.report.page.alteration.Handler + + + com.dianping.cat.report.page.alteration.JspViewer + m_jspViewer + + + com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository + m_alterationDao + + + + + com.dianping.cat.report.page.alteration.JspViewer + com.dianping.cat.report.page.alteration.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + + + com.dianping.cat.report.page.alert.Handler + com.dianping.cat.report.page.alert.Handler + + + com.dianping.cat.report.page.alert.JspViewer + m_jspViewer + + + com.dianping.cat.alarm.spi.sender.SenderManager + m_senderManager + + + com.dianping.cat.core.mybatis.repository.alert.AlertRepository + m_alertDao + + + + + com.dianping.cat.report.page.alert.JspViewer + com.dianping.cat.report.page.alert.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + + + com.dianping.cat.report.page.cache.Handler + com.dianping.cat.report.page.cache.Handler + + + com.dianping.cat.report.service.ModelService + event + m_eventService + + + com.dianping.cat.report.page.cache.JspViewer + m_jspViewer + + + com.dianping.cat.report.page.transaction.service.TransactionReportService + m_transactionReportService + + + com.dianping.cat.report.page.event.service.EventReportService + m_eventReportService + + + com.dianping.cat.mvc.PayloadNormalizer + m_normalizePayload + + + com.dianping.cat.report.service.ModelService + transaction + m_transactionService + + + + + com.dianping.cat.report.page.cache.JspViewer + com.dianping.cat.report.page.cache.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + org.unidal.initialization.Module cat-home @@ -1015,24 +1133,31 @@ com.dianping.cat.report.service.ModelService dependency + m_service com.dianping.cat.report.page.dependency.graph.DependencyItemBuilder + m_itemBuilder com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager + m_configManager com.dianping.cat.config.server.ServerConfigManager + m_manager com.dianping.cat.config.server.ServerFilterConfigManager + m_serverFilterConfigManager com.dianping.cat.service.ProjectService + m_projectService com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository + m_topologyGraphDao @@ -1044,6 +1169,65 @@ com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager + + com.dianping.cat.report.page.dependency.ExternalInfoBuilder + com.dianping.cat.report.page.dependency.ExternalInfoBuilder + + + com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager + + + com.dianping.cat.report.service.ModelService + problem + m_problemservice + + + com.dianping.cat.report.page.dependency.service.DependencyReportService + m_reportService + + + + + com.dianping.cat.report.page.dependency.Handler + com.dianping.cat.report.page.dependency.Handler + + + com.dianping.cat.report.service.ModelService + dependency + m_dependencyService + + + com.dianping.cat.report.page.dependency.graph.TopologyGraphManager + m_graphManager + + + com.dianping.cat.report.page.dependency.ExternalInfoBuilder + m_externalInfoBuilder + + + com.dianping.cat.report.page.dependency.JspViewer + m_jspViewer + + + com.dianping.cat.mvc.PayloadNormalizer + m_normalizePayload + + + com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager + m_formatConfigManager + + + + + com.dianping.cat.report.page.dependency.JspViewer + com.dianping.cat.report.page.dependency.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + com.dianping.cat.report.page.dependency.service.DependencyReportService com.dianping.cat.report.page.dependency.service.DependencyReportService @@ -2162,30 +2346,6 @@ com.dianping.cat.report.ReportModule com.dianping.cat.report.ReportModule - - com.dianping.cat.report.page.home.Handler - com.dianping.cat.report.page.home.Handler - - - com.dianping.cat.report.page.home.JspViewer - - - com.dianping.cat.analysis.TcpSocketReceiver - - - com.dianping.cat.analysis.MessageConsumer - - - - - com.dianping.cat.report.page.home.JspViewer - com.dianping.cat.report.page.home.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - com.dianping.cat.report.page.problem.Handler com.dianping.cat.report.page.problem.Handler @@ -2223,10 +2383,6 @@ - - com.dianping.cat.report.page.DomainGroupConfigManager - com.dianping.cat.report.page.DomainGroupConfigManager - com.dianping.cat.report.page.transaction.Handler com.dianping.cat.report.page.transaction.Handler @@ -2422,162 +2578,6 @@ - - com.dianping.cat.report.page.dependency.Handler - com.dianping.cat.report.page.dependency.Handler - - - com.dianping.cat.report.service.ModelService - dependency - - - com.dianping.cat.report.page.dependency.graph.TopologyGraphManager - - - com.dianping.cat.report.page.dependency.ExternalInfoBuilder - - - com.dianping.cat.report.page.dependency.JspViewer - - - com.dianping.cat.mvc.PayloadNormalizer - - - com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager - - - - - com.dianping.cat.report.page.dependency.ExternalInfoBuilder - com.dianping.cat.report.page.dependency.ExternalInfoBuilder - - - com.dianping.cat.config.server.ServerConfigManager - - - com.dianping.cat.report.service.ModelService - problem - - - com.dianping.cat.report.page.dependency.service.DependencyReportService - - - - - com.dianping.cat.report.page.dependency.service.DependencyReportService - com.dianping.cat.report.page.dependency.service.DependencyReportService - - - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - - - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - - - com.dianping.cat.core.report.daily.repository.DailyReportRepository - - - com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - - - com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - - - com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - - - com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - - - com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository - - - - - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - - - - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - - - - com.dianping.cat.core.report.daily.repository.DailyReportRepository - com.dianping.cat.core.report.daily.repository.DailyReportRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - - - - com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - - - - com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - - - - com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - - - - com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - - - - com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository - com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - - - - com.dianping.cat.report.page.dependency.JspViewer - com.dianping.cat.report.page.dependency.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - - - com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager - com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager - com.dianping.cat.report.page.cross.Handler com.dianping.cat.report.page.cross.Handler @@ -2609,43 +2609,6 @@ - - com.dianping.cat.report.page.cache.Handler - com.dianping.cat.report.page.cache.Handler - - - com.dianping.cat.report.service.ModelService - event - m_eventService - - - com.dianping.cat.report.page.cache.JspViewer - - - com.dianping.cat.report.page.transaction.service.TransactionReportService - - - com.dianping.cat.report.page.event.service.EventReportService - - - com.dianping.cat.mvc.PayloadNormalizer - - - com.dianping.cat.report.service.ModelService - transaction - m_transactionService - - - - - com.dianping.cat.report.page.cache.JspViewer - com.dianping.cat.report.page.cache.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - com.dianping.cat.report.page.state.Handler com.dianping.cat.report.page.state.Handler @@ -2738,77 +2701,9 @@ - - com.dianping.cat.report.page.alteration.Handler - com.dianping.cat.report.page.alteration.Handler - - - com.dianping.cat.report.page.alteration.JspViewer - - - com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository - - - - - com.dianping.cat.report.page.alteration.JspViewer - com.dianping.cat.report.page.alteration.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - - - com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository - com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - - com.dianping.cat.report.page.monitor.Handler com.dianping.cat.report.page.monitor.Handler - - - com.dianping.cat.helper.JsonBuilder - - - - - com.dianping.cat.report.page.alert.Handler - com.dianping.cat.report.page.alert.Handler - - - com.dianping.cat.report.page.alert.JspViewer - - - com.dianping.cat.alarm.spi.sender.SenderManager - - - com.dianping.cat.core.mybatis.repository.alert.AlertRepository - - - - - com.dianping.cat.report.page.alert.JspViewer - com.dianping.cat.report.page.alert.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - - - com.dianping.cat.core.mybatis.repository.alert.AlertRepository - com.dianping.cat.core.mybatis.repository.alert.AlertRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - com.dianping.cat.report.page.overload.Handler @@ -2884,10 +2779,6 @@ com.dianping.cat.report.page.storage.transform.StorageMergeHelper com.dianping.cat.report.page.storage.transform.StorageMergeHelper - - com.dianping.cat.report.page.storage.config.StorageGroupConfigManager - com.dianping.cat.report.page.storage.config.StorageGroupConfigManager - com.dianping.cat.report.page.top.Handler com.dianping.cat.report.page.top.Handler @@ -3225,10 +3116,6 @@ - - com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager - com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager - com.dianping.cat.system.page.config.processor.ExceptionConfigProcessor com.dianping.cat.system.page.config.processor.ExceptionConfigProcessor @@ -3311,15 +3198,6 @@ - - com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository - com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - - com.dianping.cat.system.page.plugin.Handler com.dianping.cat.system.page.plugin.Handler @@ -3443,14 +3321,6 @@ - - com.dianping.cat.system.page.permission.UserConfigManager - com.dianping.cat.system.page.permission.UserConfigManager - - - com.dianping.cat.system.page.permission.ResourceConfigManager - com.dianping.cat.system.page.permission.ResourceConfigManager - com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.core.config.repository.ConfigRepository From f7807fb009f432519de740742c6b88add2990667 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 19:17:39 +0800 Subject: [PATCH 055/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E6=A0=B8=E5=BF=83?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E9=A1=B5=E9=9D=A2=E7=BB=84=E4=BB=B6=E5=88=B0?= =?UTF-8?q?=20Spring=20=E6=B3=A8=E5=85=A5=E5=B9=B6=E8=A1=A5=E9=BD=90?= =?UTF-8?q?=E6=97=A7=20MVC=20=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dianping/cat/boot/EmbeddedCatServer.java | 34 ++- .../cat/build/ComponentsConfigurator.java | 48 +++- .../cat/build/WebComponentConfigurator.java | 13 +- .../spring/CatHomeSpringConfiguration.java | 105 +++++++ .../report/graph/svg/DefaultGraphBuilder.java | 4 + .../cat/report/page/event/Handler.java | 70 ++++- .../cat/report/page/problem/Handler.java | 63 +++- .../cat/report/page/transaction/Handler.java | 80 +++++- .../resources/META-INF/plexus/components.xml | 270 ++++++++++-------- 9 files changed, 531 insertions(+), 156 deletions(-) diff --git a/cat-boot/src/main/java/com/dianping/cat/boot/EmbeddedCatServer.java b/cat-boot/src/main/java/com/dianping/cat/boot/EmbeddedCatServer.java index f5b2f5b2ad..b9581b1b00 100644 --- a/cat-boot/src/main/java/com/dianping/cat/boot/EmbeddedCatServer.java +++ b/cat-boot/src/main/java/com/dianping/cat/boot/EmbeddedCatServer.java @@ -4,6 +4,7 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import org.apache.catalina.Context; import org.apache.catalina.startup.Tomcat; @@ -16,7 +17,8 @@ public class EmbeddedCatServer { public void start() throws IOException { int port = Integer.parseInt(System.getProperty("server.port", "8080")); - Path baseDir = Files.createTempDirectory("cat-boot-"); + Path baseDir = resolveBaseDir(port); + deleteDirectory(baseDir); Path appBase = Files.createDirectories(baseDir.resolve("webapps")); Path warFile = copyWar(baseDir); @@ -49,4 +51,34 @@ private Path copyWar(Path baseDir) throws IOException { return warFile; } + + private void deleteDirectory(Path directory) throws IOException { + if (!Files.exists(directory)) { + return; + } + + try (java.util.stream.Stream paths = Files.walk(directory)) { + paths.sorted(java.util.Comparator.reverseOrder()).forEach(path -> { + try { + Files.deleteIfExists(path); + } catch (IOException e) { + throw new IllegalStateException("Unable to clean CAT boot directory: " + directory, e); + } + }); + } catch (IllegalStateException e) { + if (e.getCause() instanceof IOException) { + throw (IOException) e.getCause(); + } + throw e; + } + } + + private Path resolveBaseDir(int port) { + String configuredBaseDir = System.getProperty("cat.boot.baseDir"); + + if (configuredBaseDir != null && configuredBaseDir.trim().length() > 0) { + return Paths.get(configuredBaseDir).toAbsolutePath().normalize(); + } + return Paths.get("target", "cat-boot-" + port).toAbsolutePath().normalize(); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index cd2a01d2eb..4384daf847 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -45,6 +45,7 @@ import com.dianping.cat.build.report.StorageComponentConfigurator; import com.dianping.cat.build.report.TransactionComponentConfigurator; import com.dianping.cat.consumer.event.EventAnalyzer; +import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; @@ -67,8 +68,11 @@ import com.dianping.cat.report.HourlyReportTableProvider; import com.dianping.cat.report.graph.svg.DefaultGraphBuilder; import com.dianping.cat.report.graph.svg.DefaultValueTranslater; +import com.dianping.cat.report.graph.svg.GraphBuilder; import com.dianping.cat.report.page.DomainGroupConfigManager; import com.dianping.cat.report.page.event.service.EventReportService; +import com.dianping.cat.report.page.event.transform.EventMergeHelper; +import com.dianping.cat.report.page.problem.service.ProblemReportService; import com.dianping.cat.report.page.transaction.service.TransactionReportService; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.system.page.permission.ResourceConfigManager; @@ -94,10 +98,12 @@ private List defineCommonComponents() { all.add(A(DefaultValueTranslater.class)); - all.add(A(DefaultGraphBuilder.class)); - - all.add(A(PayloadNormalizer.class)); - + all.add(A(DefaultGraphBuilder.class)); + + all.add(C(EventMergeHelper.class)); + + all.add(A(PayloadNormalizer.class)); + return all; } @@ -138,6 +144,40 @@ public List defineComponents() { .req(ModelService.class, TransactionAnalyzer.ID, "m_transactionService")); all.add(C(com.dianping.cat.report.page.cache.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.event.Handler.class) // + .req(GraphBuilder.class, (String) null, "m_builder") // + .req(com.dianping.cat.report.page.event.JspViewer.class, (String) null, "m_jspViewer") // + .req(EventReportService.class, (String) null, "m_reportService") // + .req(com.dianping.cat.report.page.event.transform.EventMergeHelper.class, (String) null, + "m_mergeHelper") // + .req(ModelService.class, EventAnalyzer.ID, "m_service") // + .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // + .req(DomainGroupConfigManager.class, (String) null, "m_configManager")); + all.add(C(com.dianping.cat.report.page.event.JspViewer.class).req(ModelHandler.class)); + + all.add(C(com.dianping.cat.report.page.transaction.Handler.class) // + .req(GraphBuilder.class, (String) null, "m_builder") // + .req(com.dianping.cat.report.page.transaction.JspViewer.class, (String) null, "m_jspViewer") // + .req(com.dianping.cat.report.page.transaction.XmlViewer.class, (String) null, "m_xmlViewer") // + .req(TransactionReportService.class, (String) null, "m_reportService") // + .req(com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper.class, + (String) null, "m_mergeHelper") // + .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // + .req(DomainGroupConfigManager.class, (String) null, "m_configManager") // + .req(ModelService.class, TransactionAnalyzer.ID, "m_service")); + all.add(C(com.dianping.cat.report.page.transaction.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.transaction.XmlViewer.class)); + + all.add(C(com.dianping.cat.report.page.problem.Handler.class) // + .req(com.dianping.cat.report.page.problem.JspViewer.class, (String) null, "m_jspViewer") // + .req(com.dianping.cat.config.server.ServerConfigManager.class, (String) null, "m_manager") // + .req(ProblemReportService.class, (String) null, "m_reportService") // + .req(ModelService.class, ProblemAnalyzer.ID, "m_service") // + .req(DomainGroupConfigManager.class, (String) null, "m_configManager") // + .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // + .req(JsonBuilder.class, (String) null, "m_jsonBuilder")); + all.add(C(com.dianping.cat.report.page.problem.JspViewer.class).req(ModelHandler.class)); + all.add(A(CatHomeModule.class)); all.add(C(UserConfigManager.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java index 22f36cd05f..b2ccba663d 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java @@ -24,6 +24,8 @@ import org.unidal.lookup.configuration.Component; import org.unidal.web.configuration.AbstractWebComponentsConfigurator; import org.unidal.web.lifecycle.DefaultActionResolver; +import org.unidal.web.lifecycle.RequestLifecycle; +import org.unidal.web.mvc.lifecycle.ActionHandlerManager; import org.unidal.web.mvc.lifecycle.DefaultActionHandlerManager; import org.unidal.web.mvc.lifecycle.DefaultErrorHandler; import org.unidal.web.mvc.lifecycle.DefaultInboundActionHandler; @@ -31,8 +33,10 @@ import org.unidal.web.mvc.lifecycle.DefaultRequestContextBuilder; import org.unidal.web.mvc.lifecycle.DefaultRequestLifecycle; import org.unidal.web.mvc.lifecycle.DefaultTransitionHandler; +import org.unidal.web.mvc.lifecycle.RequestContextBuilder; import org.unidal.web.mvc.model.AnnotationMatrix; import org.unidal.web.mvc.model.ModelManager; +import org.unidal.web.mvc.model.ModuleRegistry; import org.unidal.web.mvc.payload.DefaultParameterProvider; import org.unidal.web.mvc.payload.DefaultPayloadProvider; import org.unidal.web.mvc.payload.MultipartParameterProvider; @@ -58,7 +62,7 @@ public List defineComponents() { private void defineWebMvcComponents(List all) { all.add(A(AnnotationMatrix.class)); - all.add(A(ModelManager.class)); + all.add(C(ModelManager.class).req(ModuleRegistry.class, (String) null, "m_registry")); all.add(A(DefaultActionResolver.class)); all.add(A(DefaultInboundActionHandler.class)); all.add(A(DefaultOutboundActionHandler.class)); @@ -66,8 +70,11 @@ private void defineWebMvcComponents(List all) { all.add(A(DefaultErrorHandler.class)); all.add(A(DefaultPayloadProvider.class)); all.add(A(DefaultActionHandlerManager.class)); - all.add(A(DefaultRequestLifecycle.class)); - all.add(A(DefaultRequestContextBuilder.class)); + all.add(C(RequestLifecycle.class, "mvc", DefaultRequestLifecycle.class) // + .req(RequestContextBuilder.class, (String) null, "m_builder") // + .req(ActionHandlerManager.class, (String) null, "m_actionHandlerManager")); + all.add(C(RequestContextBuilder.class, DefaultRequestContextBuilder.class) // + .req(ModelManager.class, (String) null, "m_modelManager")); all.add(A(UrlEncodedParameterProvider.class)); all.add(A(MultipartParameterProvider.class)); all.add(A(DefaultParameterProvider.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 1e3da69442..43cddcbba2 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -125,6 +125,7 @@ import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; import com.dianping.cat.core.report.daily.repository.DailyReportRepository; +import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.message.DefaultPathBuilder; import com.dianping.cat.message.PathBuilder; import com.dianping.cat.mvc.PayloadNormalizer; @@ -156,6 +157,10 @@ import com.dianping.cat.report.alert.transaction.TransactionRuleConfigManager; import com.dianping.cat.report.alert.AlarmManager; import com.dianping.cat.report.DomainValidator; +import com.dianping.cat.report.graph.svg.DefaultGraphBuilder; +import com.dianping.cat.report.graph.svg.DefaultValueTranslater; +import com.dianping.cat.report.graph.svg.GraphBuilder; +import com.dianping.cat.report.graph.svg.ValueTranslater; import com.dianping.cat.report.graph.metric.DataExtractor; import com.dianping.cat.report.graph.metric.impl.DataExtractorImpl; import com.dianping.cat.report.page.DomainGroupConfigManager; @@ -187,6 +192,7 @@ import com.dianping.cat.report.page.event.service.CompositeEventService; import com.dianping.cat.report.page.event.service.HistoricalEventService; import com.dianping.cat.report.page.event.task.EventReportBuilder; +import com.dianping.cat.report.page.event.transform.EventMergeHelper; import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; import com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService; import com.dianping.cat.report.page.heartbeat.service.LocalHeartbeatService; @@ -879,6 +885,11 @@ public EventReportService eventReportService(HourlyReportRepository hourlyReport return service; } + @Bean + public EventMergeHelper eventMergeHelper() { + return new EventMergeHelper(); + } + @Bean(name = EventReportBuilder.ID, initMethod = "initialize") public TaskBuilder eventReportBuilder(EventReportService eventReportService, ServerConfigManager serverConfigManager, AtomicMessageConfigManager atomicMessageConfigManager) { @@ -962,6 +973,24 @@ public PayloadNormalizer payloadNormalizer() { return new PayloadNormalizer(); } + @Bean + public JsonBuilder jsonBuilder() { + return new JsonBuilder(); + } + + @Bean + public ValueTranslater valueTranslater() { + return new DefaultValueTranslater(); + } + + @Bean + public GraphBuilder graphBuilder(ValueTranslater valueTranslater) { + DefaultGraphBuilder builder = new DefaultGraphBuilder(); + + builder.setTranslater(valueTranslater); + return builder; + } + @Bean public com.dianping.cat.report.page.alteration.JspViewer alterationJspViewer() { return new com.dianping.cat.report.page.alteration.JspViewer(); @@ -1018,6 +1047,82 @@ public com.dianping.cat.report.page.cache.Handler cacheHandler( return handler; } + @Bean + public com.dianping.cat.report.page.event.JspViewer eventJspViewer() { + return new com.dianping.cat.report.page.event.JspViewer(); + } + + @Bean + public com.dianping.cat.report.page.event.Handler eventHandler(GraphBuilder graphBuilder, + com.dianping.cat.report.page.event.JspViewer eventJspViewer, EventReportService eventReportService, + EventMergeHelper eventMergeHelper, @Qualifier("eventModelService") ModelService eventModelService, + PayloadNormalizer payloadNormalizer, DomainGroupConfigManager domainGroupConfigManager) { + com.dianping.cat.report.page.event.Handler handler = new com.dianping.cat.report.page.event.Handler(); + + handler.setBuilder(graphBuilder); + handler.setJspViewer(eventJspViewer); + handler.setReportService(eventReportService); + handler.setMergeHelper(eventMergeHelper); + handler.setService(eventModelService); + handler.setNormalizePayload(payloadNormalizer); + handler.setConfigManager(domainGroupConfigManager); + return handler; + } + + @Bean + public com.dianping.cat.report.page.transaction.JspViewer transactionJspViewer() { + return new com.dianping.cat.report.page.transaction.JspViewer(); + } + + @Bean + public com.dianping.cat.report.page.transaction.XmlViewer transactionXmlViewer() { + return new com.dianping.cat.report.page.transaction.XmlViewer(); + } + + @Bean + public com.dianping.cat.report.page.transaction.Handler transactionHandler(GraphBuilder graphBuilder, + com.dianping.cat.report.page.transaction.JspViewer transactionJspViewer, + com.dianping.cat.report.page.transaction.XmlViewer transactionXmlViewer, + TransactionReportService transactionReportService, TransactionMergeHelper transactionMergeHelper, + PayloadNormalizer payloadNormalizer, DomainGroupConfigManager domainGroupConfigManager, + @Qualifier("transactionModelService") ModelService transactionModelService) { + com.dianping.cat.report.page.transaction.Handler handler = new com.dianping.cat.report.page.transaction.Handler(); + + handler.setBuilder(graphBuilder); + handler.setJspViewer(transactionJspViewer); + handler.setXmlViewer(transactionXmlViewer); + handler.setReportService(transactionReportService); + handler.setMergeHelper(transactionMergeHelper); + handler.setNormalizePayload(payloadNormalizer); + handler.setConfigManager(domainGroupConfigManager); + handler.setService(transactionModelService); + return handler; + } + + @Bean + public com.dianping.cat.report.page.problem.JspViewer problemJspViewer() { + return new com.dianping.cat.report.page.problem.JspViewer(); + } + + @Bean + public com.dianping.cat.report.page.problem.Handler problemHandler( + com.dianping.cat.report.page.problem.JspViewer problemJspViewer, ServerConfigManager serverConfigManager, + ProblemReportService problemReportService, + @Qualifier("problemModelService") ModelService problemModelService, + DomainGroupConfigManager domainGroupConfigManager, PayloadNormalizer payloadNormalizer, + JsonBuilder jsonBuilder) { + com.dianping.cat.report.page.problem.Handler handler = new com.dianping.cat.report.page.problem.Handler(); + + handler.setJspViewer(problemJspViewer); + handler.setManager(serverConfigManager); + handler.setReportService(problemReportService); + handler.setService(problemModelService); + handler.setConfigManager(domainGroupConfigManager); + handler.setNormalizePayload(payloadNormalizer); + handler.setJsonBuilder(jsonBuilder); + return handler; + } + @Bean public com.dianping.cat.report.page.dependency.JspViewer dependencyJspViewer() { return new com.dianping.cat.report.page.dependency.JspViewer(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/graph/svg/DefaultGraphBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/graph/svg/DefaultGraphBuilder.java index deca1a5ffe..3d3b025470 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/graph/svg/DefaultGraphBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/graph/svg/DefaultGraphBuilder.java @@ -58,6 +58,10 @@ public String build(GraphPayload payload) { return b.getResult().toString(); } + public void setTranslater(ValueTranslater translater) { + m_translater = translater; + } + protected void buildBars(GraphPayload payload, XmlBuilder b, double maxValue, double[] values) { DecimalFormat format = new DecimalFormat("0.#"); int width = payload.getWidth(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/Handler.java index 7187826207..ebd806a7c2 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/Handler.java @@ -24,7 +24,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -54,28 +53,22 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { - @Inject private GraphBuilder m_builder; - @Inject private JspViewer m_jspViewer; - @Inject private EventReportService m_reportService; - @Inject private EventMergeHelper m_mergeHelper; - @Inject(type = ModelService.class, value = EventAnalyzer.ID) private ModelService m_service; - @Inject private PayloadNormalizer m_normalizePayload; - @Inject private DomainGroupConfigManager m_configManager; private void buildDistributionInfo(Model model, String type, String name, EventReport report) { @@ -196,6 +189,7 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = "e") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); Cat.logMetricForCount("http-request-event"); Model model = new Model(ctx); @@ -333,6 +327,66 @@ private void normalize(Model model, Payload payload) { } } + private void refreshSpringBeans() { + GraphBuilder builder = CatSpringContext.getBeanIfAvailable(GraphBuilder.class); + JspViewer jspViewer = CatSpringContext.getBeanIfAvailable(JspViewer.class); + EventReportService reportService = CatSpringContext.getBeanIfAvailable(EventReportService.class); + EventMergeHelper mergeHelper = CatSpringContext.getBeanIfAvailable(EventMergeHelper.class); + ModelService service = CatSpringContext.getBeanIfAvailable("eventModelService", ModelService.class); + PayloadNormalizer normalizer = CatSpringContext.getBeanIfAvailable(PayloadNormalizer.class); + DomainGroupConfigManager configManager = CatSpringContext.getBeanIfAvailable(DomainGroupConfigManager.class); + + if (builder != null) { + m_builder = builder; + } + if (jspViewer != null) { + m_jspViewer = jspViewer; + } + if (reportService != null) { + m_reportService = reportService; + } + if (mergeHelper != null) { + m_mergeHelper = mergeHelper; + } + if (service != null) { + m_service = service; + } + if (normalizer != null) { + m_normalizePayload = normalizer; + } + if (configManager != null) { + m_configManager = configManager; + } + } + + public void setBuilder(GraphBuilder builder) { + m_builder = builder; + } + + public void setConfigManager(DomainGroupConfigManager configManager) { + m_configManager = configManager; + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setMergeHelper(EventMergeHelper mergeHelper) { + m_mergeHelper = mergeHelper; + } + + public void setNormalizePayload(PayloadNormalizer normalizePayload) { + m_normalizePayload = normalizePayload; + } + + public void setReportService(EventReportService reportService) { + m_reportService = reportService; + } + + public void setService(ModelService service) { + m_service = service; + } + public enum DetailOrder { TYPE, NAME, TOTAL_COUNT, FAILURE_COUNT } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java index 1064dab78b..c7e8d7a278 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java @@ -28,7 +28,6 @@ import java.util.List; import java.util.Map; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -63,25 +62,18 @@ public class Handler implements PageHandler { private static final String VIEW = "view"; - @Inject private JspViewer m_jspViewer; - @Inject private ServerConfigManager m_manager; - @Inject private ProblemReportService m_reportService; - @Inject(type = ModelService.class, value = ProblemAnalyzer.ID) private ModelService m_service; - @Inject private DomainGroupConfigManager m_configManager; - @Inject private PayloadNormalizer m_normalizePayload; - @Inject private JsonBuilder m_jsonBuilder; private void buildDefaultThreshold(Model model, Payload payload) { @@ -401,10 +393,63 @@ public enum SummaryOrder { } private void refreshSpringBeans() { + JspViewer jspViewer = CatSpringContext.getBeanIfAvailable(JspViewer.class); ServerConfigManager manager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); - + ProblemReportService reportService = CatSpringContext.getBeanIfAvailable(ProblemReportService.class); + ModelService service = CatSpringContext.getBeanIfAvailable("problemModelService", + ModelService.class); + DomainGroupConfigManager configManager = CatSpringContext.getBeanIfAvailable(DomainGroupConfigManager.class); + PayloadNormalizer normalizer = CatSpringContext.getBeanIfAvailable(PayloadNormalizer.class); + JsonBuilder jsonBuilder = CatSpringContext.getBeanIfAvailable(JsonBuilder.class); + + if (jspViewer != null) { + m_jspViewer = jspViewer; + } if (manager != null) { m_manager = manager; } + if (reportService != null) { + m_reportService = reportService; + } + if (service != null) { + m_service = service; + } + if (configManager != null) { + m_configManager = configManager; + } + if (normalizer != null) { + m_normalizePayload = normalizer; + } + if (jsonBuilder != null) { + m_jsonBuilder = jsonBuilder; + } + } + + public void setConfigManager(DomainGroupConfigManager configManager) { + m_configManager = configManager; + } + + public void setJsonBuilder(JsonBuilder jsonBuilder) { + m_jsonBuilder = jsonBuilder; + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setManager(ServerConfigManager manager) { + m_manager = manager; + } + + public void setNormalizePayload(PayloadNormalizer normalizePayload) { + m_normalizePayload = normalizePayload; + } + + public void setReportService(ProblemReportService reportService) { + m_reportService = reportService; + } + + public void setService(ModelService service) { + m_service = service; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java index c8bc6c3e40..51d000bc9b 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java @@ -25,7 +25,6 @@ import java.util.Date; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -59,31 +58,24 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { - @Inject private GraphBuilder m_builder; - @Inject private JspViewer m_jspViewer; - @Inject private XmlViewer m_xmlViewer; - @Inject private TransactionReportService m_reportService; - @Inject private TransactionMergeHelper m_mergeHelper; - @Inject private PayloadNormalizer m_normalizePayload; - @Inject private DomainGroupConfigManager m_configManager; - @Inject(type = ModelService.class, value = TransactionAnalyzer.ID) private ModelService m_service; private void buildDistributionInfo(Model model, String type, String name, TransactionReport report) { @@ -210,6 +202,7 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = "t") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); Cat.logMetricForCount("http-request-transaction"); Model model = new Model(ctx); @@ -364,6 +357,75 @@ private void normalize(Model model, Payload payload) { } } + private void refreshSpringBeans() { + GraphBuilder builder = CatSpringContext.getBeanIfAvailable(GraphBuilder.class); + JspViewer jspViewer = CatSpringContext.getBeanIfAvailable(JspViewer.class); + XmlViewer xmlViewer = CatSpringContext.getBeanIfAvailable(XmlViewer.class); + TransactionReportService reportService = CatSpringContext.getBeanIfAvailable(TransactionReportService.class); + TransactionMergeHelper mergeHelper = CatSpringContext.getBeanIfAvailable(TransactionMergeHelper.class); + PayloadNormalizer normalizer = CatSpringContext.getBeanIfAvailable(PayloadNormalizer.class); + DomainGroupConfigManager configManager = CatSpringContext.getBeanIfAvailable(DomainGroupConfigManager.class); + ModelService service = CatSpringContext.getBeanIfAvailable("transactionModelService", + ModelService.class); + + if (builder != null) { + m_builder = builder; + } + if (jspViewer != null) { + m_jspViewer = jspViewer; + } + if (xmlViewer != null) { + m_xmlViewer = xmlViewer; + } + if (reportService != null) { + m_reportService = reportService; + } + if (mergeHelper != null) { + m_mergeHelper = mergeHelper; + } + if (normalizer != null) { + m_normalizePayload = normalizer; + } + if (configManager != null) { + m_configManager = configManager; + } + if (service != null) { + m_service = service; + } + } + + public void setBuilder(GraphBuilder builder) { + m_builder = builder; + } + + public void setConfigManager(DomainGroupConfigManager configManager) { + m_configManager = configManager; + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setMergeHelper(TransactionMergeHelper mergeHelper) { + m_mergeHelper = mergeHelper; + } + + public void setNormalizePayload(PayloadNormalizer normalizePayload) { + m_normalizePayload = normalizePayload; + } + + public void setReportService(TransactionReportService reportService) { + m_reportService = reportService; + } + + public void setService(ModelService service) { + m_service = service; + } + + public void setXmlViewer(XmlViewer xmlViewer) { + m_xmlViewer = xmlViewer; + } + public enum DetailOrder { TYPE, NAME, TOTAL_COUNT, FAILURE_COUNT, MIN, MAX, SUM, SUM2 } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 5b89250396..1c0ffa1a08 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -18,6 +18,10 @@ + + com.dianping.cat.report.page.event.transform.EventMergeHelper + com.dianping.cat.report.page.event.transform.EventMergeHelper + com.dianping.cat.mvc.PayloadNormalizer com.dianping.cat.mvc.PayloadNormalizer @@ -159,6 +163,146 @@ + + com.dianping.cat.report.page.event.Handler + com.dianping.cat.report.page.event.Handler + + + com.dianping.cat.report.graph.svg.GraphBuilder + m_builder + + + com.dianping.cat.report.page.event.JspViewer + m_jspViewer + + + com.dianping.cat.report.page.event.service.EventReportService + m_reportService + + + com.dianping.cat.report.page.event.transform.EventMergeHelper + m_mergeHelper + + + com.dianping.cat.report.service.ModelService + event + m_service + + + com.dianping.cat.mvc.PayloadNormalizer + m_normalizePayload + + + com.dianping.cat.report.page.DomainGroupConfigManager + m_configManager + + + + + com.dianping.cat.report.page.event.JspViewer + com.dianping.cat.report.page.event.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + + + com.dianping.cat.report.page.transaction.Handler + com.dianping.cat.report.page.transaction.Handler + + + com.dianping.cat.report.graph.svg.GraphBuilder + m_builder + + + com.dianping.cat.report.page.transaction.JspViewer + m_jspViewer + + + com.dianping.cat.report.page.transaction.XmlViewer + m_xmlViewer + + + com.dianping.cat.report.page.transaction.service.TransactionReportService + m_reportService + + + com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper + m_mergeHelper + + + com.dianping.cat.mvc.PayloadNormalizer + m_normalizePayload + + + com.dianping.cat.report.page.DomainGroupConfigManager + m_configManager + + + com.dianping.cat.report.service.ModelService + transaction + m_service + + + + + com.dianping.cat.report.page.transaction.JspViewer + com.dianping.cat.report.page.transaction.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + + + com.dianping.cat.report.page.transaction.XmlViewer + com.dianping.cat.report.page.transaction.XmlViewer + + + com.dianping.cat.report.page.problem.Handler + com.dianping.cat.report.page.problem.Handler + + + com.dianping.cat.report.page.problem.JspViewer + m_jspViewer + + + com.dianping.cat.config.server.ServerConfigManager + m_manager + + + com.dianping.cat.report.page.problem.service.ProblemReportService + m_reportService + + + com.dianping.cat.report.service.ModelService + problem + m_service + + + com.dianping.cat.report.page.DomainGroupConfigManager + m_configManager + + + com.dianping.cat.mvc.PayloadNormalizer + m_normalizePayload + + + com.dianping.cat.helper.JsonBuilder + m_jsonBuilder + + + + + com.dianping.cat.report.page.problem.JspViewer + com.dianping.cat.report.page.problem.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + org.unidal.initialization.Module cat-home @@ -2235,6 +2379,7 @@ org.unidal.web.mvc.model.ModuleRegistry + m_registry @@ -2276,9 +2421,11 @@ org.unidal.web.mvc.lifecycle.RequestContextBuilder + m_builder org.unidal.web.mvc.lifecycle.ActionHandlerManager + m_actionHandlerManager @@ -2288,6 +2435,7 @@ org.unidal.web.mvc.model.ModelManager + m_modelManager @@ -2346,128 +2494,6 @@ com.dianping.cat.report.ReportModule com.dianping.cat.report.ReportModule - - com.dianping.cat.report.page.problem.Handler - com.dianping.cat.report.page.problem.Handler - - - com.dianping.cat.report.page.problem.JspViewer - - - com.dianping.cat.config.server.ServerConfigManager - - - com.dianping.cat.report.page.problem.service.ProblemReportService - - - com.dianping.cat.report.service.ModelService - problem - - - com.dianping.cat.report.page.DomainGroupConfigManager - - - com.dianping.cat.mvc.PayloadNormalizer - - - com.dianping.cat.helper.JsonBuilder - - - - - com.dianping.cat.report.page.problem.JspViewer - com.dianping.cat.report.page.problem.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - - - com.dianping.cat.report.page.transaction.Handler - com.dianping.cat.report.page.transaction.Handler - - - com.dianping.cat.report.graph.svg.GraphBuilder - - - com.dianping.cat.report.page.transaction.JspViewer - - - com.dianping.cat.report.page.transaction.XmlViewer - - - com.dianping.cat.report.page.transaction.service.TransactionReportService - - - com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper - - - com.dianping.cat.mvc.PayloadNormalizer - - - com.dianping.cat.report.page.DomainGroupConfigManager - - - com.dianping.cat.report.service.ModelService - transaction - - - - - com.dianping.cat.report.page.transaction.JspViewer - com.dianping.cat.report.page.transaction.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - - - com.dianping.cat.report.page.transaction.XmlViewer - com.dianping.cat.report.page.transaction.XmlViewer - - - com.dianping.cat.report.page.event.Handler - com.dianping.cat.report.page.event.Handler - - - com.dianping.cat.report.graph.svg.GraphBuilder - - - com.dianping.cat.report.page.event.JspViewer - - - com.dianping.cat.report.page.event.service.EventReportService - - - com.dianping.cat.report.page.event.transform.EventMergeHelper - - - com.dianping.cat.report.service.ModelService - event - - - com.dianping.cat.mvc.PayloadNormalizer - - - com.dianping.cat.report.page.DomainGroupConfigManager - - - - - com.dianping.cat.report.page.event.JspViewer - com.dianping.cat.report.page.event.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - - - com.dianping.cat.report.page.event.transform.EventMergeHelper - com.dianping.cat.report.page.event.transform.EventMergeHelper - com.dianping.cat.report.page.heartbeat.Handler com.dianping.cat.report.page.heartbeat.Handler From 52edf46ab01bbd57f03c74bdc9371308f6196841 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 19:32:59 +0800 Subject: [PATCH 056/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=20heartbeat=20?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E9=A1=B5=E9=9D=A2=E5=88=B0=20Spring=20?= =?UTF-8?q?=E6=B3=A8=E5=85=A5=E5=B9=B6=E5=85=BC=E5=AE=B9=E6=97=A7=20MVC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/ComponentsConfigurator.java | 19 +++ .../spring/CatHomeSpringConfiguration.java | 60 +++++++++ .../cat/report/page/heartbeat/Handler.java | 71 +++++++++-- .../report/page/heartbeat/HistoryGraphs.java | 27 +++- .../service/HistoricalHeartbeatService.java | 4 + .../resources/META-INF/plexus/components.xml | 115 ++++++++++-------- 6 files changed, 231 insertions(+), 65 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 4384daf847..316bbdba9b 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -45,6 +45,7 @@ import com.dianping.cat.build.report.StorageComponentConfigurator; import com.dianping.cat.build.report.TransactionComponentConfigurator; import com.dianping.cat.consumer.event.EventAnalyzer; +import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; @@ -178,6 +179,24 @@ public List defineComponents() { .req(JsonBuilder.class, (String) null, "m_jsonBuilder")); all.add(C(com.dianping.cat.report.page.problem.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.heartbeat.Handler.class) // + .req(GraphBuilder.class, (String) null, "m_builder") // + .req(com.dianping.cat.report.page.heartbeat.HistoryGraphs.class, (String) null, + "m_historyGraphs") // + .req(com.dianping.cat.report.page.heartbeat.JspViewer.class, (String) null, "m_jspViewer") // + .req(com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService.class, (String) null, + "m_reportService") // + .req(ModelService.class, HeartbeatAnalyzer.ID, "m_service") // + .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // + .req(com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager.class, + (String) null, "m_manager")); + all.add(C(com.dianping.cat.report.page.heartbeat.HistoryGraphs.class) // + .req(com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService.class, (String) null, + "m_reportService") // + .req(com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager.class, + (String) null, "m_manager")); + all.add(C(com.dianping.cat.report.page.heartbeat.JspViewer.class).req(ModelHandler.class)); + all.add(A(CatHomeModule.class)); all.add(C(UserConfigManager.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 43cddcbba2..6fc4bc7ff8 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -194,7 +194,9 @@ import com.dianping.cat.report.page.event.task.EventReportBuilder; import com.dianping.cat.report.page.event.transform.EventMergeHelper; import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; +import com.dianping.cat.report.page.heartbeat.service.CompositeHeartbeatService; import com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService; +import com.dianping.cat.report.page.heartbeat.service.HistoricalHeartbeatService; import com.dianping.cat.report.page.heartbeat.service.LocalHeartbeatService; import com.dianping.cat.report.page.heartbeat.task.HeartbeatReportBuilder; import com.dianping.cat.report.page.logview.service.LocalMessageService; @@ -1123,6 +1125,41 @@ public com.dianping.cat.report.page.problem.Handler problemHandler( return handler; } + @Bean + public com.dianping.cat.report.page.heartbeat.JspViewer heartbeatJspViewer() { + return new com.dianping.cat.report.page.heartbeat.JspViewer(); + } + + @Bean + public com.dianping.cat.report.page.heartbeat.HistoryGraphs heartbeatHistoryGraphs( + HeartbeatReportService heartbeatReportService, HeartbeatDisplayPolicyManager heartbeatDisplayPolicyManager) { + com.dianping.cat.report.page.heartbeat.HistoryGraphs historyGraphs = + new com.dianping.cat.report.page.heartbeat.HistoryGraphs(); + + historyGraphs.setReportService(heartbeatReportService); + historyGraphs.setManager(heartbeatDisplayPolicyManager); + return historyGraphs; + } + + @Bean + public com.dianping.cat.report.page.heartbeat.Handler heartbeatHandler(GraphBuilder graphBuilder, + com.dianping.cat.report.page.heartbeat.HistoryGraphs heartbeatHistoryGraphs, + com.dianping.cat.report.page.heartbeat.JspViewer heartbeatJspViewer, + HeartbeatReportService heartbeatReportService, + @Qualifier("heartbeatModelService") ModelService heartbeatModelService, + PayloadNormalizer payloadNormalizer, HeartbeatDisplayPolicyManager heartbeatDisplayPolicyManager) { + com.dianping.cat.report.page.heartbeat.Handler handler = new com.dianping.cat.report.page.heartbeat.Handler(); + + handler.setBuilder(graphBuilder); + handler.setHistoryGraphs(heartbeatHistoryGraphs); + handler.setJspViewer(heartbeatJspViewer); + handler.setReportService(heartbeatReportService); + handler.setService(heartbeatModelService); + handler.setNormalizePayload(payloadNormalizer); + handler.setManager(heartbeatDisplayPolicyManager); + return handler; + } + @Bean public com.dianping.cat.report.page.dependency.JspViewer dependencyJspViewer() { return new com.dianping.cat.report.page.dependency.JspViewer(); @@ -1905,6 +1942,16 @@ public ModelService historicalTransactionService( return service; } + @Bean(initMethod = "initialize", name = "heartbeat-historical") + public ModelService historicalHeartbeatService(HeartbeatReportService heartbeatReportService, + ServerConfigManager serverConfigManager) { + HistoricalHeartbeatService service = new HistoricalHeartbeatService(); + + service.setReportService(heartbeatReportService); + service.setConfigManager(serverConfigManager); + return service; + } + @Bean(initMethod = "initialize", name = "dependency-historical") public ModelService historicalDependencyService(DependencyReportService dependencyReportService, ServerConfigManager serverConfigManager) { @@ -1967,6 +2014,19 @@ public ModelService transactionModelService( return service; } + @Bean(initMethod = "initialize") + public ModelService heartbeatModelService( + @Qualifier("heartbeat-historical") ModelService historicalHeartbeatService, + ServerConfigManager serverConfigManager, RemoteServersManager remoteServersManager) { + CompositeHeartbeatService service = new CompositeHeartbeatService(); + List> services = Collections.singletonList(historicalHeartbeatService); + + service.setServices(services); + service.setConfigManager(serverConfigManager); + service.setServerManager(remoteServersManager); + return service; + } + @Bean(initMethod = "initialize") public ModelService dependencyModelService( @Qualifier("dependency-historical") ModelService historicalDependencyService, diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/Handler.java index 2ff1bf27e2..42195e677e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/Handler.java @@ -27,7 +27,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -36,6 +35,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.Constants; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; import com.dianping.cat.consumer.heartbeat.model.entity.Machine; @@ -55,25 +55,18 @@ public class Handler implements PageHandler { private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); - @Inject private GraphBuilder m_builder; - @Inject private HistoryGraphs m_historyGraphs; - @Inject private JspViewer m_jspViewer; - @Inject private HeartbeatReportService m_reportService; - @Inject(type = ModelService.class, value = HeartbeatAnalyzer.ID) private ModelService m_service; - @Inject private PayloadNormalizer m_normalizePayload; - @Inject private HeartbeatDisplayPolicyManager m_manager; private void buildHeartbeatGraphInfo(Model model, HeartbeatSvgGraph displayHeartbeat) { @@ -152,6 +145,7 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { Payload payload = ctx.getPayload(); HeartbeatSvgGraph heartbeat = null; + refreshSpringBeans(); normalize(model, payload); switch (payload.getAction()) { case VIEW: @@ -214,6 +208,67 @@ private HeartbeatSvgGraph showReport(Model model, Payload payload) { return null; } + private void refreshSpringBeans() { + GraphBuilder builder = CatSpringContext.getBeanIfAvailable(GraphBuilder.class); + HistoryGraphs historyGraphs = CatSpringContext.getBeanIfAvailable(HistoryGraphs.class); + JspViewer jspViewer = CatSpringContext.getBeanIfAvailable(JspViewer.class); + HeartbeatReportService reportService = CatSpringContext.getBeanIfAvailable(HeartbeatReportService.class); + ModelService service = CatSpringContext.getBeanIfAvailable("heartbeatModelService", + ModelService.class); + PayloadNormalizer normalizer = CatSpringContext.getBeanIfAvailable(PayloadNormalizer.class); + HeartbeatDisplayPolicyManager manager = CatSpringContext.getBeanIfAvailable(HeartbeatDisplayPolicyManager.class); + + if (builder != null) { + m_builder = builder; + } + if (historyGraphs != null) { + m_historyGraphs = historyGraphs; + } + if (jspViewer != null) { + m_jspViewer = jspViewer; + } + if (reportService != null) { + m_reportService = reportService; + } + if (service != null) { + m_service = service; + } + if (normalizer != null) { + m_normalizePayload = normalizer; + } + if (manager != null) { + m_manager = manager; + } + } + + public void setBuilder(GraphBuilder builder) { + m_builder = builder; + } + + public void setHistoryGraphs(HistoryGraphs historyGraphs) { + m_historyGraphs = historyGraphs; + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setManager(HeartbeatDisplayPolicyManager manager) { + m_manager = manager; + } + + public void setNormalizePayload(PayloadNormalizer normalizePayload) { + m_normalizePayload = normalizePayload; + } + + public void setReportService(HeartbeatReportService reportService) { + m_reportService = reportService; + } + + public void setService(ModelService service) { + m_service = service; + } + // the detail order of heartbeat is:name min max sum sum2 count_in_minutes public enum DetailOrder { NAME, diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/HistoryGraphs.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/HistoryGraphs.java index c65e88b1f1..2b2a8d4fbf 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/HistoryGraphs.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/HistoryGraphs.java @@ -26,8 +26,6 @@ import java.util.Map; import java.util.Set; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.consumer.heartbeat.model.entity.Extension; import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; import com.dianping.cat.consumer.heartbeat.model.entity.Machine; @@ -37,6 +35,7 @@ import com.dianping.cat.report.graph.LineChart; import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; import com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService; +import com.dianping.cat.spring.CatSpringContext; public class HistoryGraphs { @@ -44,10 +43,8 @@ public class HistoryGraphs { private static final int MINUTE_ONE_DAY = 1440; - @Inject private HeartbeatReportService m_reportService; - @Inject private HeartbeatDisplayPolicyManager m_manager; private Set m_extensionMetrics = new HashSet(); @@ -157,6 +154,8 @@ private Set queryMetricNames(HeartbeatReport report, String groupName) { // show the graph of heartbeat public void showHeartBeatGraph(Model model, Payload payload) { + refreshSpringBeans(); + Date start = payload.getHistoryStartDate(); Date end = payload.getHistoryEndDate(); int size = (int) ((end.getTime() - start.getTime()) / TimeHelper.ONE_HOUR * 60); @@ -171,6 +170,26 @@ public void showHeartBeatGraph(Model model, Payload payload) { model.setExtensionHistoryGraphs(new JsonBuilder().toJson(graphs)); } + private void refreshSpringBeans() { + HeartbeatReportService reportService = CatSpringContext.getBeanIfAvailable(HeartbeatReportService.class); + HeartbeatDisplayPolicyManager manager = CatSpringContext.getBeanIfAvailable(HeartbeatDisplayPolicyManager.class); + + if (reportService != null) { + m_reportService = reportService; + } + if (manager != null) { + m_manager = manager; + } + } + + public void setManager(HeartbeatDisplayPolicyManager manager) { + m_manager = manager; + } + + public void setReportService(HeartbeatReportService reportService) { + m_reportService = reportService; + } + private void updateMetricArray(Map datas, int minute, String metricName, double value) { double[] values = datas.get(metricName); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HistoricalHeartbeatService.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HistoricalHeartbeatService.java index 1420d8d690..7dae9bd02c 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HistoricalHeartbeatService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HistoricalHeartbeatService.java @@ -50,4 +50,8 @@ private HeartbeatReport getReportFromDatabase(long timestamp, String domain) thr return m_reportService.queryReport(domain, new Date(timestamp), new Date(timestamp + TimeHelper.ONE_HOUR)); } + public void setReportService(HeartbeatReportService reportService) { + m_reportService = reportService; + } + } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 1c0ffa1a08..74b6b439b4 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -303,6 +303,64 @@ + + com.dianping.cat.report.page.heartbeat.Handler + com.dianping.cat.report.page.heartbeat.Handler + + + com.dianping.cat.report.graph.svg.GraphBuilder + m_builder + + + com.dianping.cat.report.page.heartbeat.HistoryGraphs + m_historyGraphs + + + com.dianping.cat.report.page.heartbeat.JspViewer + m_jspViewer + + + com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService + m_reportService + + + com.dianping.cat.report.service.ModelService + heartbeat + m_service + + + com.dianping.cat.mvc.PayloadNormalizer + m_normalizePayload + + + com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager + m_manager + + + + + com.dianping.cat.report.page.heartbeat.HistoryGraphs + com.dianping.cat.report.page.heartbeat.HistoryGraphs + + + com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService + m_reportService + + + com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager + m_manager + + + + + com.dianping.cat.report.page.heartbeat.JspViewer + com.dianping.cat.report.page.heartbeat.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + org.unidal.initialization.Module cat-home @@ -2494,59 +2552,6 @@ com.dianping.cat.report.ReportModule com.dianping.cat.report.ReportModule - - com.dianping.cat.report.page.heartbeat.Handler - com.dianping.cat.report.page.heartbeat.Handler - - - com.dianping.cat.report.graph.svg.GraphBuilder - - - com.dianping.cat.report.page.heartbeat.HistoryGraphs - - - com.dianping.cat.report.page.heartbeat.JspViewer - - - com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService - - - com.dianping.cat.report.service.ModelService - heartbeat - - - com.dianping.cat.mvc.PayloadNormalizer - - - com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager - - - - - com.dianping.cat.report.page.heartbeat.HistoryGraphs - com.dianping.cat.report.page.heartbeat.HistoryGraphs - - - com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService - - - com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager - - - - - com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager - com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager - - - com.dianping.cat.report.page.heartbeat.JspViewer - com.dianping.cat.report.page.heartbeat.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - com.dianping.cat.report.page.logview.Handler com.dianping.cat.report.page.logview.Handler @@ -3172,6 +3177,10 @@ + + com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager + com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager + com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator From d54fb6ef648f8e0ed5e85d39d569121985c460e7 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 19:51:05 +0800 Subject: [PATCH 057/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=20top=20=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8=E9=A1=B5=E5=88=B0=20Spring=20=E6=B3=A8=E5=85=A5?= =?UTF-8?q?=E5=B9=B6=E8=A1=A5=E9=BD=90=E5=90=AF=E5=8A=A8=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/ComponentsConfigurator.java | 24 +++ .../spring/CatHomeSpringConfiguration.java | 105 +++++++++++++ .../cat/report/page/state/StateBuilder.java | 28 +++- .../state/service/HistoricalStateService.java | 7 +- .../dianping/cat/report/page/top/Handler.java | 108 +++++++++++-- .../top/service/HistoricalTopService.java | 7 +- .../resources/META-INF/plexus/components.xml | 144 ++++++++++-------- 7 files changed, 334 insertions(+), 89 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 316bbdba9b..f6dee4c5f7 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -47,6 +47,8 @@ import com.dianping.cat.consumer.event.EventAnalyzer; import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; import com.dianping.cat.consumer.problem.ProblemAnalyzer; +import com.dianping.cat.consumer.state.StateAnalyzer; +import com.dianping.cat.consumer.top.TopAnalyzer; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; @@ -197,6 +199,28 @@ public List defineComponents() { (String) null, "m_manager")); all.add(C(com.dianping.cat.report.page.heartbeat.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.top.Handler.class) // + .req(com.dianping.cat.report.page.top.JspViewer.class, (String) null, "m_jspViewer") // + .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // + .req(com.dianping.cat.report.page.dependency.ExternalInfoBuilder.class, (String) null, + "m_externalInfoBuilder") // + .req(com.dianping.cat.report.page.state.StateBuilder.class, (String) null, "m_stateBuilder") // + .req(ModelService.class, TopAnalyzer.ID, "m_topService") // + .req(ModelService.class, TransactionAnalyzer.ID, "m_transactionService") // + .req(ModelService.class, ProblemAnalyzer.ID, "m_problemService") // + .req(com.dianping.cat.report.page.top.service.TopReportService.class, (String) null, + "m_topReportService") // + .req(com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper.class, + (String) null, "m_mergeHelper") // + .req(com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager.class, (String) null, + "m_configManager") // + .req(JsonBuilder.class, (String) null, "m_builder")); + all.add(C(com.dianping.cat.report.page.top.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.state.StateBuilder.class) // + .req(com.dianping.cat.system.page.router.config.RouterConfigManager.class, (String) null, + "m_routerManager") // + .req(ModelService.class, StateAnalyzer.ID, "m_stateService")); + all.add(A(CatHomeModule.class)); all.add(C(UserConfigManager.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 6fc4bc7ff8..e68cf31f4d 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -250,9 +250,14 @@ import com.dianping.cat.report.task.cmdb.CmdbInfoReloadBuilder; import com.dianping.cat.report.task.cmdb.ProjectUpdateTask; import com.dianping.cat.report.page.state.service.LocalStateService; +import com.dianping.cat.report.page.state.service.CompositeStateService; +import com.dianping.cat.report.page.state.service.HistoricalStateService; import com.dianping.cat.report.page.state.service.StateReportService; import com.dianping.cat.report.page.state.task.StateReportBuilder; +import com.dianping.cat.report.page.top.service.CompositeTopService; +import com.dianping.cat.report.page.top.service.HistoricalTopService; import com.dianping.cat.report.page.top.service.LocalTopService; +import com.dianping.cat.report.page.top.service.TopReportService; import com.dianping.cat.report.page.transaction.service.TransactionReportService; import com.dianping.cat.report.page.transaction.service.CompositeTransactionService; import com.dianping.cat.report.page.transaction.service.HistoricalTransactionService; @@ -1160,6 +1165,46 @@ public com.dianping.cat.report.page.heartbeat.Handler heartbeatHandler(GraphBuil return handler; } + @Bean + public com.dianping.cat.report.page.top.JspViewer topJspViewer() { + return new com.dianping.cat.report.page.top.JspViewer(); + } + + @Bean + public com.dianping.cat.report.page.state.StateBuilder stateBuilder(RouterConfigManager routerConfigManager, + @Qualifier("stateModelService") ModelService stateModelService) { + com.dianping.cat.report.page.state.StateBuilder builder = new com.dianping.cat.report.page.state.StateBuilder(); + + builder.setRouterManager(routerConfigManager); + builder.setStateService(stateModelService); + return builder; + } + + @Bean + public com.dianping.cat.report.page.top.Handler topHandler( + com.dianping.cat.report.page.top.JspViewer topJspViewer, PayloadNormalizer payloadNormalizer, + ExternalInfoBuilder externalInfoBuilder, com.dianping.cat.report.page.state.StateBuilder stateBuilder, + @Qualifier("topModelService") ModelService topModelService, + @Qualifier("transactionModelService") ModelService transactionModelService, + @Qualifier("problemModelService") ModelService problemModelService, + TopReportService topReportService, TransactionMergeHelper transactionMergeHelper, + ExceptionRuleConfigManager exceptionRuleConfigManager, JsonBuilder jsonBuilder) { + com.dianping.cat.report.page.top.Handler handler = new com.dianping.cat.report.page.top.Handler(); + + handler.setJspViewer(topJspViewer); + handler.setNormalizePayload(payloadNormalizer); + handler.setExternalInfoBuilder(externalInfoBuilder); + handler.setStateBuilder(stateBuilder); + handler.setTopService(topModelService); + handler.setTransactionService(transactionModelService); + handler.setProblemService(problemModelService); + handler.setTopReportService(topReportService); + handler.setMergeHelper(transactionMergeHelper); + handler.setConfigManager(exceptionRuleConfigManager); + handler.setBuilder(jsonBuilder); + return handler; + } + @Bean public com.dianping.cat.report.page.dependency.JspViewer dependencyJspViewer() { return new com.dianping.cat.report.page.dependency.JspViewer(); @@ -1291,6 +1336,20 @@ public TransactionReportService transactionReportService(HourlyReportRepository return service; } + @Bean + public TopReportService topReportService(HourlyReportRepository hourlyReportRepository, + HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, + DailyReportContentRepository dailyReportContentRepository, WeeklyReportRepository weeklyReportRepository, + WeeklyReportContentRepository weeklyReportContentRepository, MonthlyReportRepository monthlyReportRepository, + MonthlyReportContentRepository monthlyReportContentRepository) { + TopReportService service = new TopReportService(); + + configureReportService(service, hourlyReportRepository, hourlyReportContentRepository, dailyReportRepository, + dailyReportContentRepository, weeklyReportRepository, weeklyReportContentRepository, monthlyReportRepository, + monthlyReportContentRepository); + return service; + } + @Bean(name = TransactionReportBuilder.ID, initMethod = "initialize") public TaskBuilder transactionReportBuilder(TransactionReportService transactionReportService, ServerConfigManager serverConfigManager, AtomicMessageConfigManager atomicMessageConfigManager) { @@ -1952,6 +2011,26 @@ public ModelService historicalHeartbeatService(HeartbeatReportS return service; } + @Bean(initMethod = "initialize", name = "top-historical") + public ModelService historicalTopService(TopReportService topReportService, + ServerConfigManager serverConfigManager) { + HistoricalTopService service = new HistoricalTopService(); + + service.setReportService(topReportService); + service.setConfigManager(serverConfigManager); + return service; + } + + @Bean(initMethod = "initialize", name = "state-historical") + public ModelService historicalStateService(StateReportService stateReportService, + ServerConfigManager serverConfigManager) { + HistoricalStateService service = new HistoricalStateService(); + + service.setReportService(stateReportService); + service.setConfigManager(serverConfigManager); + return service; + } + @Bean(initMethod = "initialize", name = "dependency-historical") public ModelService historicalDependencyService(DependencyReportService dependencyReportService, ServerConfigManager serverConfigManager) { @@ -2027,6 +2106,32 @@ public ModelService heartbeatModelService( return service; } + @Bean(initMethod = "initialize") + public ModelService topModelService( + @Qualifier("top-historical") ModelService historicalTopService, + ServerConfigManager serverConfigManager, RemoteServersManager remoteServersManager) { + CompositeTopService service = new CompositeTopService(); + List> services = Collections.singletonList(historicalTopService); + + service.setServices(services); + service.setConfigManager(serverConfigManager); + service.setServerManager(remoteServersManager); + return service; + } + + @Bean(initMethod = "initialize") + public ModelService stateModelService( + @Qualifier("state-historical") ModelService historicalStateService, + ServerConfigManager serverConfigManager, RemoteServersManager remoteServersManager) { + CompositeStateService service = new CompositeStateService(); + List> services = Collections.singletonList(historicalStateService); + + service.setServices(services); + service.setConfigManager(serverConfigManager); + service.setServerManager(remoteServersManager); + return service; + } + @Bean(initMethod = "initialize") public ModelService dependencyModelService( @Qualifier("dependency-historical") ModelService historicalDependencyService, diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/StateBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/StateBuilder.java index 3e9b4f04f6..23a94f67d9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/StateBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/StateBuilder.java @@ -25,8 +25,6 @@ import java.util.Map.Entry; import java.util.Set; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.Constants; import com.dianping.cat.consumer.state.StateAnalyzer; import com.dianping.cat.consumer.state.model.entity.Machine; @@ -35,16 +33,15 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.system.page.router.config.RouterConfigManager; public class StateBuilder { public static final int COUNT = 500 * 10000; - @Inject private RouterConfigManager m_routerManager; - @Inject(type = ModelService.class, value = StateAnalyzer.ID) private ModelService m_stateService; public static boolean checkTooMuchLoss(Machine machine) { @@ -52,6 +49,8 @@ public static boolean checkTooMuchLoss(Machine machine) { } public String buildStateMessage(long date, String ip) { + refreshSpringBeans(); + StateReport report = queryHourlyReport(date, ip); if (report != null) { @@ -117,4 +116,25 @@ private StateReport queryHourlyReport(long date, String ip) { throw new RuntimeException("Internal error: no eligable sql service registered for " + request + "!"); } } + + private void refreshSpringBeans() { + RouterConfigManager routerManager = CatSpringContext.getBeanIfAvailable(RouterConfigManager.class); + ModelService stateService = CatSpringContext.getBeanIfAvailable("stateModelService", + ModelService.class); + + if (routerManager != null) { + m_routerManager = routerManager; + } + if (stateService != null) { + m_stateService = stateService; + } + } + + public void setRouterManager(RouterConfigManager routerManager) { + m_routerManager = routerManager; + } + + public void setStateService(ModelService stateService) { + m_stateService = stateService; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/HistoricalStateService.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/HistoricalStateService.java index 0a38da5b00..338a1c3d05 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/HistoricalStateService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/HistoricalStateService.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.consumer.state.StateAnalyzer; import com.dianping.cat.consumer.state.model.entity.StateReport; import com.dianping.cat.helper.TimeHelper; @@ -30,7 +28,6 @@ public class HistoricalStateService extends BaseHistoricalModelService { - @Inject private StateReportService m_reportService; public HistoricalStateService() { @@ -50,4 +47,8 @@ private StateReport getReportFromDatabase(long timestamp, String domain) throws return m_reportService.queryReport(domain, new Date(timestamp), new Date(timestamp + TimeHelper.ONE_HOUR)); } + public void setReportService(StateReportService reportService) { + m_reportService = reportService; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/top/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/top/Handler.java index c3a6a356f8..603027ff6d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/top/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/top/Handler.java @@ -32,7 +32,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -62,41 +61,31 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); - @Inject private JspViewer m_jspViewer; - @Inject private PayloadNormalizer m_normalizePayload; - @Inject private ExternalInfoBuilder m_externalInfoBuilder; - @Inject private StateBuilder m_stateBuilder; - @Inject(type = ModelService.class, value = TopAnalyzer.ID) private ModelService m_topService; - @Inject(type = ModelService.class, value = TransactionAnalyzer.ID) private ModelService m_transactionService; - @Inject(type = ModelService.class, value = ProblemAnalyzer.ID) private ModelService m_problemService; - @Inject private TopReportService m_topReportService; - @Inject private TransactionMergeHelper m_mergeHelper; - @Inject private ExceptionRuleConfigManager m_configManager; - @Inject private JsonBuilder m_builder; private void buildExceptionDashboard(Model model, Payload payload, long date) { @@ -143,6 +132,7 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { Payload payload = ctx.getPayload(); Action action = payload.getAction(); + refreshSpringBeans(); LOGGER.info("Handling top report outbound, action={}, domain={}, ip={}, date={}, minute={}, minuteCounts={}.", action, payload.getDomain(), payload.getIpAddress(), payload.getDate(), payload.getMinute(), payload.getMinuteCounts()); @@ -324,4 +314,98 @@ private ProblemReport queryProblemReport(String domain, String ipAddress, long d } } + private void refreshSpringBeans() { + JspViewer jspViewer = CatSpringContext.getBeanIfAvailable(JspViewer.class); + PayloadNormalizer normalizer = CatSpringContext.getBeanIfAvailable(PayloadNormalizer.class); + ExternalInfoBuilder externalInfoBuilder = CatSpringContext.getBeanIfAvailable(ExternalInfoBuilder.class); + StateBuilder stateBuilder = CatSpringContext.getBeanIfAvailable(StateBuilder.class); + ModelService topService = CatSpringContext.getBeanIfAvailable("topModelService", ModelService.class); + ModelService transactionService = CatSpringContext.getBeanIfAvailable("transactionModelService", + ModelService.class); + ModelService problemService = CatSpringContext.getBeanIfAvailable("problemModelService", + ModelService.class); + TopReportService topReportService = CatSpringContext.getBeanIfAvailable(TopReportService.class); + TransactionMergeHelper mergeHelper = CatSpringContext.getBeanIfAvailable(TransactionMergeHelper.class); + ExceptionRuleConfigManager configManager = CatSpringContext.getBeanIfAvailable(ExceptionRuleConfigManager.class); + JsonBuilder builder = CatSpringContext.getBeanIfAvailable(JsonBuilder.class); + + if (jspViewer != null) { + m_jspViewer = jspViewer; + } + if (normalizer != null) { + m_normalizePayload = normalizer; + } + if (externalInfoBuilder != null) { + m_externalInfoBuilder = externalInfoBuilder; + } + if (stateBuilder != null) { + m_stateBuilder = stateBuilder; + } + if (topService != null) { + m_topService = topService; + } + if (transactionService != null) { + m_transactionService = transactionService; + } + if (problemService != null) { + m_problemService = problemService; + } + if (topReportService != null) { + m_topReportService = topReportService; + } + if (mergeHelper != null) { + m_mergeHelper = mergeHelper; + } + if (configManager != null) { + m_configManager = configManager; + } + if (builder != null) { + m_builder = builder; + } + } + + public void setBuilder(JsonBuilder builder) { + m_builder = builder; + } + + public void setConfigManager(ExceptionRuleConfigManager configManager) { + m_configManager = configManager; + } + + public void setExternalInfoBuilder(ExternalInfoBuilder externalInfoBuilder) { + m_externalInfoBuilder = externalInfoBuilder; + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setMergeHelper(TransactionMergeHelper mergeHelper) { + m_mergeHelper = mergeHelper; + } + + public void setNormalizePayload(PayloadNormalizer normalizePayload) { + m_normalizePayload = normalizePayload; + } + + public void setProblemService(ModelService problemService) { + m_problemService = problemService; + } + + public void setStateBuilder(StateBuilder stateBuilder) { + m_stateBuilder = stateBuilder; + } + + public void setTopReportService(TopReportService topReportService) { + m_topReportService = topReportService; + } + + public void setTopService(ModelService topService) { + m_topService = topService; + } + + public void setTransactionService(ModelService transactionService) { + m_transactionService = transactionService; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/HistoricalTopService.java b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/HistoricalTopService.java index 0a7dfc7e1f..4a6ae50f62 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/HistoricalTopService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/HistoricalTopService.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.consumer.top.TopAnalyzer; import com.dianping.cat.consumer.top.model.entity.TopReport; import com.dianping.cat.helper.TimeHelper; @@ -30,7 +28,6 @@ public class HistoricalTopService extends BaseHistoricalModelService { - @Inject private TopReportService m_reportService; public HistoricalTopService() { @@ -50,4 +47,8 @@ private TopReport getReportFromDatabase(long timestamp, String domain) throws Ex return m_reportService.queryReport(domain, new Date(timestamp), new Date(timestamp + TimeHelper.ONE_HOUR)); } + public void setReportService(TopReportService reportService) { + m_reportService = reportService; + } + } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 74b6b439b4..e5f88b721f 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -361,6 +361,83 @@ + + com.dianping.cat.report.page.top.Handler + com.dianping.cat.report.page.top.Handler + + + com.dianping.cat.report.page.top.JspViewer + m_jspViewer + + + com.dianping.cat.mvc.PayloadNormalizer + m_normalizePayload + + + com.dianping.cat.report.page.dependency.ExternalInfoBuilder + m_externalInfoBuilder + + + com.dianping.cat.report.page.state.StateBuilder + m_stateBuilder + + + com.dianping.cat.report.service.ModelService + top + m_topService + + + com.dianping.cat.report.service.ModelService + transaction + m_transactionService + + + com.dianping.cat.report.service.ModelService + problem + m_problemService + + + com.dianping.cat.report.page.top.service.TopReportService + m_topReportService + + + com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper + m_mergeHelper + + + com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager + m_configManager + + + com.dianping.cat.helper.JsonBuilder + m_builder + + + + + com.dianping.cat.report.page.top.JspViewer + com.dianping.cat.report.page.top.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + + + com.dianping.cat.report.page.state.StateBuilder + com.dianping.cat.report.page.state.StateBuilder + + + com.dianping.cat.system.page.router.config.RouterConfigManager + m_routerManager + + + com.dianping.cat.report.service.ModelService + state + m_stateService + + + org.unidal.initialization.Module cat-home @@ -2677,19 +2754,6 @@ - - com.dianping.cat.report.page.state.StateBuilder - com.dianping.cat.report.page.state.StateBuilder - - - com.dianping.cat.system.page.router.config.RouterConfigManager - - - com.dianping.cat.report.service.ModelService - state - - - com.dianping.cat.report.page.statistics.Handler com.dianping.cat.report.page.statistics.Handler @@ -2810,60 +2874,6 @@ com.dianping.cat.report.page.storage.transform.StorageMergeHelper com.dianping.cat.report.page.storage.transform.StorageMergeHelper - - com.dianping.cat.report.page.top.Handler - com.dianping.cat.report.page.top.Handler - - - com.dianping.cat.report.page.top.JspViewer - - - com.dianping.cat.mvc.PayloadNormalizer - - - com.dianping.cat.report.page.dependency.ExternalInfoBuilder - - - com.dianping.cat.report.page.state.StateBuilder - - - com.dianping.cat.report.service.ModelService - top - m_topService - - - com.dianping.cat.report.service.ModelService - transaction - m_transactionService - - - com.dianping.cat.report.service.ModelService - problem - m_problemService - - - com.dianping.cat.report.page.top.service.TopReportService - - - com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper - - - com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager - - - com.dianping.cat.helper.JsonBuilder - - - - - com.dianping.cat.report.page.top.JspViewer - com.dianping.cat.report.page.top.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - com.dianping.cat.report.page.business.Handler com.dianping.cat.report.page.business.Handler From a9e799e031502270e68637659c530d3fd33b9bce Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 20:00:45 +0800 Subject: [PATCH 058/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=20state=20=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8=E9=A1=B5=E5=88=B0=20Spring=20=E6=B3=A8=E5=85=A5?= =?UTF-8?q?=E5=B9=B6=E5=85=BC=E5=AE=B9=E6=97=A7=20MVC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/ComponentsConfigurator.java | 17 +++ .../spring/CatHomeSpringConfiguration.java | 35 ++++++ .../cat/report/page/state/Handler.java | 60 ++++++++-- .../report/page/state/StateGraphBuilder.java | 15 ++- .../resources/META-INF/plexus/components.xml | 107 ++++++++++-------- 5 files changed, 174 insertions(+), 60 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index f6dee4c5f7..ec85f574a8 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -216,10 +216,27 @@ public List defineComponents() { "m_configManager") // .req(JsonBuilder.class, (String) null, "m_builder")); all.add(C(com.dianping.cat.report.page.top.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.state.Handler.class) // + .req(com.dianping.cat.report.page.state.JspViewer.class, (String) null, "m_jspViewer") // + .req(com.dianping.cat.report.page.state.service.StateReportService.class, (String) null, + "m_reportService") // + .req(com.dianping.cat.report.page.state.StateGraphBuilder.class, (String) null, + "m_stateGraphs") // + .req(com.dianping.cat.report.page.state.StateBuilder.class, (String) null, "m_stateBuilder") // + .req(ModelService.class, StateAnalyzer.ID, "m_service") // + .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // + .req(com.dianping.cat.config.server.ServerFilterConfigManager.class, (String) null, + "m_serverFilterConfigManager")); + all.add(C(com.dianping.cat.report.page.state.JspViewer.class).req(ModelHandler.class)); all.add(C(com.dianping.cat.report.page.state.StateBuilder.class) // .req(com.dianping.cat.system.page.router.config.RouterConfigManager.class, (String) null, "m_routerManager") // .req(ModelService.class, StateAnalyzer.ID, "m_stateService")); + all.add(C(com.dianping.cat.report.page.state.StateGraphBuilder.class) // + .req(com.dianping.cat.report.page.state.service.StateReportService.class, (String) null, + "m_reportService") // + .req(com.dianping.cat.config.server.ServerFilterConfigManager.class, (String) null, + "m_serverFilterConfigManager")); all.add(A(CatHomeModule.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index e68cf31f4d..94355c3189 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -1170,6 +1170,22 @@ public com.dianping.cat.report.page.top.JspViewer topJspViewer() { return new com.dianping.cat.report.page.top.JspViewer(); } + @Bean + public com.dianping.cat.report.page.state.JspViewer stateJspViewer() { + return new com.dianping.cat.report.page.state.JspViewer(); + } + + @Bean + public com.dianping.cat.report.page.state.StateGraphBuilder stateGraphBuilder( + StateReportService stateReportService, ServerFilterConfigManager serverFilterConfigManager) { + com.dianping.cat.report.page.state.StateGraphBuilder builder = + new com.dianping.cat.report.page.state.StateGraphBuilder(); + + builder.setReportService(stateReportService); + builder.setServerFilterConfigManager(serverFilterConfigManager); + return builder; + } + @Bean public com.dianping.cat.report.page.state.StateBuilder stateBuilder(RouterConfigManager routerConfigManager, @Qualifier("stateModelService") ModelService stateModelService) { @@ -1205,6 +1221,25 @@ public com.dianping.cat.report.page.top.Handler topHandler( return handler; } + @Bean + public com.dianping.cat.report.page.state.Handler stateHandler( + com.dianping.cat.report.page.state.JspViewer stateJspViewer, StateReportService stateReportService, + com.dianping.cat.report.page.state.StateGraphBuilder stateGraphBuilder, + com.dianping.cat.report.page.state.StateBuilder stateBuilder, + @Qualifier("stateModelService") ModelService stateModelService, + PayloadNormalizer payloadNormalizer, ServerFilterConfigManager serverFilterConfigManager) { + com.dianping.cat.report.page.state.Handler handler = new com.dianping.cat.report.page.state.Handler(); + + handler.setJspViewer(stateJspViewer); + handler.setReportService(stateReportService); + handler.setStateGraphs(stateGraphBuilder); + handler.setStateBuilder(stateBuilder); + handler.setService(stateModelService); + handler.setNormalizePayload(payloadNormalizer); + handler.setServerFilterConfigManager(serverFilterConfigManager); + return handler; + } + @Bean public com.dianping.cat.report.page.dependency.JspViewer dependencyJspViewer() { return new com.dianping.cat.report.page.dependency.JspViewer(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java index 163798ca28..7b8e05f603 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java @@ -24,7 +24,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.tuple.Pair; import org.unidal.web.mvc.PageHandler; @@ -51,25 +50,18 @@ public class Handler implements PageHandler { private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); - @Inject private JspViewer m_jspViewer; - @Inject private StateReportService m_reportService; - @Inject private StateGraphBuilder m_stateGraphs; - @Inject private StateBuilder m_stateBuilder; - @Inject(type = ModelService.class, value = StateAnalyzer.ID) private ModelService m_service; - @Inject private PayloadNormalizer m_normalizePayload; - @Inject private ServerFilterConfigManager m_serverFilterConfigManager; private void buildDisplayInfo(Model model, Payload payload, StateReport report) { @@ -184,12 +176,64 @@ private void normalize(Model model, Payload payload) { } private void refreshSpringBeans() { + JspViewer jspViewer = CatSpringContext.getBeanIfAvailable(JspViewer.class); + StateReportService reportService = CatSpringContext.getBeanIfAvailable(StateReportService.class); + StateGraphBuilder stateGraphs = CatSpringContext.getBeanIfAvailable(StateGraphBuilder.class); + StateBuilder stateBuilder = CatSpringContext.getBeanIfAvailable(StateBuilder.class); + ModelService service = CatSpringContext.getBeanIfAvailable("stateModelService", ModelService.class); + PayloadNormalizer normalizer = CatSpringContext.getBeanIfAvailable(PayloadNormalizer.class); ServerFilterConfigManager serverFilterConfigManager = CatSpringContext .getBeanIfAvailable(ServerFilterConfigManager.class); + if (jspViewer != null) { + m_jspViewer = jspViewer; + } + if (reportService != null) { + m_reportService = reportService; + } + if (stateGraphs != null) { + m_stateGraphs = stateGraphs; + } + if (stateBuilder != null) { + m_stateBuilder = stateBuilder; + } + if (service != null) { + m_service = service; + } + if (normalizer != null) { + m_normalizePayload = normalizer; + } if (serverFilterConfigManager != null) { m_serverFilterConfigManager = serverFilterConfigManager; } } + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setNormalizePayload(PayloadNormalizer normalizePayload) { + m_normalizePayload = normalizePayload; + } + + public void setReportService(StateReportService reportService) { + m_reportService = reportService; + } + + public void setServerFilterConfigManager(ServerFilterConfigManager serverFilterConfigManager) { + m_serverFilterConfigManager = serverFilterConfigManager; + } + + public void setService(ModelService service) { + m_service = service; + } + + public void setStateBuilder(StateBuilder stateBuilder) { + m_stateBuilder = stateBuilder; + } + + public void setStateGraphs(StateGraphBuilder stateGraphs) { + m_stateGraphs = stateGraphs; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java index eeaf054f16..a94642cb9f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java @@ -24,7 +24,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; @@ -40,10 +39,8 @@ @Named public class StateGraphBuilder { - @Inject private StateReportService m_reportService; - @Inject private ServerFilterConfigManager m_serverFilterConfigManager; public Pair buildGraph(Payload payload, String key) { @@ -130,11 +127,23 @@ private PieChart buildPiechart(Map distributes) { } private void refreshSpringBeans() { + StateReportService reportService = CatSpringContext.getBeanIfAvailable(StateReportService.class); ServerFilterConfigManager serverFilterConfigManager = CatSpringContext .getBeanIfAvailable(ServerFilterConfigManager.class); + if (reportService != null) { + m_reportService = reportService; + } if (serverFilterConfigManager != null) { m_serverFilterConfigManager = serverFilterConfigManager; } } + + public void setReportService(StateReportService reportService) { + m_reportService = reportService; + } + + public void setServerFilterConfigManager(ServerFilterConfigManager serverFilterConfigManager) { + m_serverFilterConfigManager = serverFilterConfigManager; + } } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index e5f88b721f..cd23c78b17 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -423,6 +423,50 @@ + + com.dianping.cat.report.page.state.Handler + com.dianping.cat.report.page.state.Handler + + + com.dianping.cat.report.page.state.JspViewer + m_jspViewer + + + com.dianping.cat.report.page.state.service.StateReportService + m_reportService + + + com.dianping.cat.report.page.state.StateGraphBuilder + m_stateGraphs + + + com.dianping.cat.report.page.state.StateBuilder + m_stateBuilder + + + com.dianping.cat.report.service.ModelService + state + m_service + + + com.dianping.cat.mvc.PayloadNormalizer + m_normalizePayload + + + com.dianping.cat.config.server.ServerFilterConfigManager + m_serverFilterConfigManager + + + + + com.dianping.cat.report.page.state.JspViewer + com.dianping.cat.report.page.state.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + com.dianping.cat.report.page.state.StateBuilder com.dianping.cat.report.page.state.StateBuilder @@ -438,6 +482,20 @@ + + com.dianping.cat.report.page.state.StateGraphBuilder + com.dianping.cat.report.page.state.StateGraphBuilder + + + com.dianping.cat.report.page.state.service.StateReportService + m_reportService + + + com.dianping.cat.config.server.ServerFilterConfigManager + m_serverFilterConfigManager + + + org.unidal.initialization.Module cat-home @@ -1994,18 +2052,6 @@ - - com.dianping.cat.report.page.state.StateGraphBuilder - com.dianping.cat.report.page.state.StateGraphBuilder - - - com.dianping.cat.report.page.state.service.StateReportService - - - com.dianping.cat.config.server.ServerFilterConfigManager - - - com.dianping.cat.report.service.LocalModelService state @@ -2717,43 +2763,6 @@ - - com.dianping.cat.report.page.state.Handler - com.dianping.cat.report.page.state.Handler - - - com.dianping.cat.report.page.state.JspViewer - - - com.dianping.cat.report.page.state.service.StateReportService - - - com.dianping.cat.report.page.state.StateGraphBuilder - - - com.dianping.cat.report.page.state.StateBuilder - - - com.dianping.cat.report.service.ModelService - state - - - com.dianping.cat.mvc.PayloadNormalizer - - - com.dianping.cat.config.server.ServerFilterConfigManager - - - - - com.dianping.cat.report.page.state.JspViewer - com.dianping.cat.report.page.state.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - com.dianping.cat.report.page.statistics.Handler com.dianping.cat.report.page.statistics.Handler From 47d43c90d7fa8e0b6dec609dbbdd16f983f589a7 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 20:23:07 +0800 Subject: [PATCH 059/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=20storage=20?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E9=A1=B5=E5=88=B0=20Spring=20=E6=B3=A8?= =?UTF-8?q?=E5=85=A5=E5=B9=B6=E5=85=BC=E5=AE=B9=E6=97=A7=E5=AE=B9=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/alarm/service/AlertService.java | 4 + .../dianping/cat/consumer/DatabaseParser.java | 13 +- .../builder/StorageBuilderManager.java | 8 +- .../storage/builder/StorageSQLBuilder.java | 4 + .../cat/build/ComponentsConfigurator.java | 23 +++ .../spring/CatHomeSpringConfiguration.java | 113 +++++++++++++++ .../cat/report/page/storage/Handler.java | 108 ++++++++++++-- .../display/StorageAlertInfoBuilder.java | 17 ++- .../service/HistoricalStorageService.java | 7 +- .../resources/META-INF/plexus/components.xml | 136 ++++++++++-------- 10 files changed, 352 insertions(+), 81 deletions(-) diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java index 438e6bf913..d861bf65d1 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java @@ -88,4 +88,8 @@ public void insert(AlertEntity alertEntity, SendMessageEntity message) { Cat.logError(e); } } + + public void setAlertDao(AlertRepository alertDao) { + m_alertDao = alertDao; + } } diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/DatabaseParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/DatabaseParser.java index dd70d7d26d..f694bee99d 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/DatabaseParser.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/DatabaseParser.java @@ -25,6 +25,7 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; +import org.slf4j.LoggerFactory; import org.unidal.lookup.util.StringUtils; import com.dianping.cat.Cat; @@ -33,6 +34,8 @@ public class DatabaseParser implements LogEnabled { + private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(DatabaseParser.class); + private Logger m_logger; private Set m_errorConnections = new HashSet(); @@ -81,7 +84,7 @@ public Database parseDatabase(String connection) { m_connections.put(connection, database); } else { m_errorConnections.add(connection); - m_logger.info("Unrecognized jdbc connection string: " + connection); + logUnrecognizedConnection(connection); } } catch (Exception e) { m_errorConnections.add(connection); @@ -103,6 +106,14 @@ public void showErrorCon() { } } + private void logUnrecognizedConnection(String connection) { + if (m_logger != null) { + m_logger.info("Unrecognized jdbc connection string: " + connection); + } else { + LOGGER.warn("Unrecognized jdbc connection string: {}", connection); + } + } + public static class Database { private String m_name; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageBuilderManager.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageBuilderManager.java index 2a722b0796..428877b31a 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageBuilderManager.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageBuilderManager.java @@ -48,7 +48,13 @@ public StorageBuilder getStorageBuilder(String type) { @Override public void initialize() throws InitializationException { - m_storageBuilders = lookupMap(StorageBuilder.class); + if (m_storageBuilders == null) { + m_storageBuilders = lookupMap(StorageBuilder.class); + } + } + + public void setStorageBuilders(Map storageBuilders) { + m_storageBuilders = storageBuilders; } } diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageSQLBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageSQLBuilder.java index e261d07a1c..04fcf63184 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageSQLBuilder.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageSQLBuilder.java @@ -84,4 +84,8 @@ public boolean isEligable(Transaction t) { return "SQL".equals(t.getType()); } + public void setDatabaseParser(DatabaseParser databaseParser) { + m_databaseParser = databaseParser; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index ec85f574a8..59cd05e711 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -48,6 +48,7 @@ import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.state.StateAnalyzer; +import com.dianping.cat.consumer.storage.StorageAnalyzer; import com.dianping.cat.consumer.top.TopAnalyzer; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; @@ -238,6 +239,28 @@ public List defineComponents() { .req(com.dianping.cat.config.server.ServerFilterConfigManager.class, (String) null, "m_serverFilterConfigManager")); + all.add(C(com.dianping.cat.report.page.storage.Handler.class) // + .req(com.dianping.cat.report.page.storage.JspViewer.class, (String) null, "m_jspViewer") // + .req(com.dianping.cat.report.page.storage.task.StorageReportService.class, (String) null, + "m_reportService") // + .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // + .req(ModelService.class, StorageAnalyzer.ID, "m_service") // + .req(com.dianping.cat.report.page.storage.transform.StorageMergeHelper.class, (String) null, + "m_mergeHelper") // + .req(com.dianping.cat.report.page.storage.config.StorageGroupConfigManager.class, + (String) null, "m_storageGroupConfigManager") // + .req(JsonBuilder.class, (String) null, "m_jsonBuilder") // + .req(AlterationRepository.class, (String) null, "m_alterationDao") // + .req(com.dianping.cat.alarm.service.AlertService.class, (String) null, "m_alertService") // + .req(com.dianping.cat.report.page.storage.display.StorageAlertInfoBuilder.class, + (String) null, "m_alertInfoBuilder") // + .req(com.dianping.cat.consumer.storage.builder.StorageBuilderManager.class, (String) null, + "m_storageBuilderManager")); + all.add(C(com.dianping.cat.report.page.storage.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.storage.display.StorageAlertInfoBuilder.class) // + .req(com.dianping.cat.alarm.service.AlertService.class, (String) null, "m_alertService")); + all.add(C(com.dianping.cat.report.page.storage.transform.StorageMergeHelper.class)); + all.add(A(CatHomeModule.class)); all.add(C(UserConfigManager.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 94355c3189..8281164e60 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -73,6 +73,11 @@ import com.dianping.cat.consumer.storage.StorageAnalyzer; import com.dianping.cat.consumer.storage.StorageDelegate; import com.dianping.cat.consumer.storage.StorageReportUpdater; +import com.dianping.cat.consumer.storage.builder.StorageBuilder; +import com.dianping.cat.consumer.storage.builder.StorageBuilderManager; +import com.dianping.cat.consumer.storage.builder.StorageCacheBuilder; +import com.dianping.cat.consumer.storage.builder.StorageRPCBuilder; +import com.dianping.cat.consumer.storage.builder.StorageSQLBuilder; import com.dianping.cat.consumer.storage.model.entity.StorageReport; import com.dianping.cat.consumer.top.TopAnalyzer; import com.dianping.cat.consumer.top.TopDelegate; @@ -232,6 +237,9 @@ import com.dianping.cat.report.page.statistics.task.service.ServiceReportBuilder; import com.dianping.cat.report.page.statistics.task.utilization.UtilizationReportBuilder; import com.dianping.cat.report.page.storage.config.StorageGroupConfigManager; +import com.dianping.cat.report.page.storage.display.StorageAlertInfoBuilder; +import com.dianping.cat.report.page.storage.service.CompositeStorageService; +import com.dianping.cat.report.page.storage.service.HistoricalStorageService; import com.dianping.cat.report.page.storage.service.LocalStorageService; import com.dianping.cat.report.page.storage.task.StorageReportBuilder; import com.dianping.cat.report.page.storage.task.StorageReportService; @@ -1240,6 +1248,44 @@ public com.dianping.cat.report.page.state.Handler stateHandler( return handler; } + @Bean + public com.dianping.cat.report.page.storage.JspViewer storageJspViewer() { + return new com.dianping.cat.report.page.storage.JspViewer(); + } + + @Bean + public StorageAlertInfoBuilder storageAlertInfoBuilder(com.dianping.cat.alarm.service.AlertService alertService) { + StorageAlertInfoBuilder builder = new StorageAlertInfoBuilder(); + + builder.setAlertService(alertService); + return builder; + } + + @Bean + public com.dianping.cat.report.page.storage.Handler storageHandler( + com.dianping.cat.report.page.storage.JspViewer storageJspViewer, StorageReportService storageReportService, + PayloadNormalizer payloadNormalizer, + @Qualifier("storageModelService") ModelService storageModelService, + StorageMergeHelper storageMergeHelper, StorageGroupConfigManager storageGroupConfigManager, + JsonBuilder jsonBuilder, AlterationRepository alterationRepository, + com.dianping.cat.alarm.service.AlertService alertService, StorageAlertInfoBuilder storageAlertInfoBuilder, + StorageBuilderManager storageBuilderManager) { + com.dianping.cat.report.page.storage.Handler handler = new com.dianping.cat.report.page.storage.Handler(); + + handler.setJspViewer(storageJspViewer); + handler.setReportService(storageReportService); + handler.setNormalizePayload(payloadNormalizer); + handler.setService(storageModelService); + handler.setMergeHelper(storageMergeHelper); + handler.setStorageGroupConfigManager(storageGroupConfigManager); + handler.setJsonBuilder(jsonBuilder); + handler.setAlterationDao(alterationRepository); + handler.setAlertService(alertService); + handler.setAlertInfoBuilder(storageAlertInfoBuilder); + handler.setStorageBuilderManager(storageBuilderManager); + return handler; + } + @Bean public com.dianping.cat.report.page.dependency.JspViewer dependencyJspViewer() { return new com.dianping.cat.report.page.dependency.JspViewer(); @@ -1945,6 +1991,14 @@ public AlertSummaryService alertSummaryService() { return new AlertSummaryService(); } + @Bean + public com.dianping.cat.alarm.service.AlertService alertService(AlertRepository alertRepository) { + com.dianping.cat.alarm.service.AlertService service = new com.dianping.cat.alarm.service.AlertService(); + + service.setAlertDao(alertRepository); + return service; + } + @Bean public AlarmManager alarmManager() { return new AlarmManager(); @@ -1987,6 +2041,42 @@ public StorageMergeHelper storageMergeHelper() { return new StorageMergeHelper(); } + @Bean + public com.dianping.cat.consumer.DatabaseParser databaseParser() { + return new com.dianping.cat.consumer.DatabaseParser(); + } + + @Bean + public StorageSQLBuilder storageSQLBuilder(com.dianping.cat.consumer.DatabaseParser databaseParser) { + StorageSQLBuilder builder = new StorageSQLBuilder(); + + builder.setDatabaseParser(databaseParser); + return builder; + } + + @Bean + public StorageCacheBuilder storageCacheBuilder() { + return new StorageCacheBuilder(); + } + + @Bean + public StorageRPCBuilder storageRPCBuilder() { + return new StorageRPCBuilder(); + } + + @Bean(initMethod = "initialize") + public StorageBuilderManager storageBuilderManager(StorageSQLBuilder storageSQLBuilder, + StorageCacheBuilder storageCacheBuilder, StorageRPCBuilder storageRPCBuilder) { + StorageBuilderManager manager = new StorageBuilderManager(); + Map builders = new LinkedHashMap(); + + builders.put(storageSQLBuilder.getType(), storageSQLBuilder); + builders.put(storageCacheBuilder.getType(), storageCacheBuilder); + builders.put(storageRPCBuilder.getType(), storageRPCBuilder); + manager.setStorageBuilders(builders); + return manager; + } + @Bean(initMethod = "initialize") public TaskBuilder storageReportBuilder(StorageReportService storageReportService, StorageMergeHelper storageMergeHelper) { StorageReportBuilder builder = new StorageReportBuilder(); @@ -2066,6 +2156,16 @@ public ModelService historicalStateService(StateReportService state return service; } + @Bean(initMethod = "initialize", name = "storage-historical") + public ModelService historicalStorageService(StorageReportService storageReportService, + ServerConfigManager serverConfigManager) { + HistoricalStorageService service = new HistoricalStorageService(); + + service.setReportService(storageReportService); + service.setConfigManager(serverConfigManager); + return service; + } + @Bean(initMethod = "initialize", name = "dependency-historical") public ModelService historicalDependencyService(DependencyReportService dependencyReportService, ServerConfigManager serverConfigManager) { @@ -2167,6 +2267,19 @@ public ModelService stateModelService( return service; } + @Bean(initMethod = "initialize") + public ModelService storageModelService( + @Qualifier("storage-historical") ModelService historicalStorageService, + ServerConfigManager serverConfigManager, RemoteServersManager remoteServersManager) { + CompositeStorageService service = new CompositeStorageService(); + List> services = Collections.singletonList(historicalStorageService); + + service.setServices(services); + service.setConfigManager(serverConfigManager); + service.setServerManager(remoteServersManager); + return service; + } + @Bean(initMethod = "initialize") public ModelService dependencyModelService( @Qualifier("dependency-historical") ModelService historicalDependencyService, diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java index 25b7f78e39..370828d816 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java @@ -33,7 +33,6 @@ import java.util.Set; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.tuple.Pair; import org.slf4j.Logger; @@ -73,41 +72,31 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); - @Inject private JspViewer m_jspViewer; - @Inject private StorageReportService m_reportService; - @Inject private PayloadNormalizer m_normalizePayload; - @Inject(type = ModelService.class, value = StorageAnalyzer.ID) private ModelService m_service; - @Inject private StorageMergeHelper m_mergeHelper; - @Inject private StorageGroupConfigManager m_storageGroupConfigManager; - @Inject private JsonBuilder m_jsonBuilder; - @Inject private AlterationRepository m_alterationDao; - @Inject private AlertService m_alertService; - @Inject private StorageAlertInfoBuilder m_alertInfoBuilder; - @Inject private StorageBuilderManager m_storageBuilderManager; private Map>> buildAlertLinks(Map alertInfos, String type) { @@ -241,6 +230,8 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = "storage") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + Model model = new Model(ctx); Payload payload = ctx.getPayload(); normalize(model, payload); @@ -465,4 +456,97 @@ public int compare(String o1, String o2) { } } + private void refreshSpringBeans() { + JspViewer jspViewer = CatSpringContext.getBeanIfAvailable(JspViewer.class); + StorageReportService reportService = CatSpringContext.getBeanIfAvailable(StorageReportService.class); + PayloadNormalizer normalizer = CatSpringContext.getBeanIfAvailable(PayloadNormalizer.class); + ModelService service = CatSpringContext.getBeanIfAvailable("storageModelService", ModelService.class); + StorageMergeHelper mergeHelper = CatSpringContext.getBeanIfAvailable(StorageMergeHelper.class); + StorageGroupConfigManager storageGroupConfigManager = CatSpringContext + .getBeanIfAvailable(StorageGroupConfigManager.class); + JsonBuilder jsonBuilder = CatSpringContext.getBeanIfAvailable(JsonBuilder.class); + AlterationRepository alterationRepository = CatSpringContext.getBeanIfAvailable(AlterationRepository.class); + AlertService alertService = CatSpringContext.getBeanIfAvailable(AlertService.class); + StorageAlertInfoBuilder alertInfoBuilder = CatSpringContext.getBeanIfAvailable(StorageAlertInfoBuilder.class); + StorageBuilderManager storageBuilderManager = CatSpringContext.getBeanIfAvailable(StorageBuilderManager.class); + + if (jspViewer != null) { + m_jspViewer = jspViewer; + } + if (reportService != null) { + m_reportService = reportService; + } + if (normalizer != null) { + m_normalizePayload = normalizer; + } + if (service != null) { + m_service = service; + } + if (mergeHelper != null) { + m_mergeHelper = mergeHelper; + } + if (storageGroupConfigManager != null) { + m_storageGroupConfigManager = storageGroupConfigManager; + } + if (jsonBuilder != null) { + m_jsonBuilder = jsonBuilder; + } + if (alterationRepository != null) { + m_alterationDao = alterationRepository; + } + if (alertService != null) { + m_alertService = alertService; + } + if (alertInfoBuilder != null) { + m_alertInfoBuilder = alertInfoBuilder; + } + if (storageBuilderManager != null) { + m_storageBuilderManager = storageBuilderManager; + } + } + + public void setAlertInfoBuilder(StorageAlertInfoBuilder alertInfoBuilder) { + m_alertInfoBuilder = alertInfoBuilder; + } + + public void setAlertService(AlertService alertService) { + m_alertService = alertService; + } + + public void setAlterationDao(AlterationRepository alterationDao) { + m_alterationDao = alterationDao; + } + + public void setJsonBuilder(JsonBuilder jsonBuilder) { + m_jsonBuilder = jsonBuilder; + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setMergeHelper(StorageMergeHelper mergeHelper) { + m_mergeHelper = mergeHelper; + } + + public void setNormalizePayload(PayloadNormalizer normalizePayload) { + m_normalizePayload = normalizePayload; + } + + public void setReportService(StorageReportService reportService) { + m_reportService = reportService; + } + + public void setService(ModelService service) { + m_service = service; + } + + public void setStorageBuilderManager(StorageBuilderManager storageBuilderManager) { + m_storageBuilderManager = storageBuilderManager; + } + + public void setStorageGroupConfigManager(StorageGroupConfigManager storageGroupConfigManager) { + m_storageGroupConfigManager = storageGroupConfigManager; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/display/StorageAlertInfoBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/display/StorageAlertInfoBuilder.java index 5045340e23..57f10ca692 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/display/StorageAlertInfoBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/display/StorageAlertInfoBuilder.java @@ -25,7 +25,6 @@ import java.util.Map; import org.unidal.helper.Splitters; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; @@ -40,11 +39,11 @@ import com.dianping.cat.home.storage.alert.entity.StorageAlertInfo; import com.dianping.cat.home.storage.alert.entity.Target; import com.dianping.cat.report.page.storage.StorageConstants; +import com.dianping.cat.spring.CatSpringContext; @Named public class StorageAlertInfoBuilder { - @Inject private AlertService m_alertService; private SimpleDateFormat m_sdf = new SimpleDateFormat("HH:mm"); @@ -55,6 +54,8 @@ public int buildLevel(int level, int other) { public Map buildStorageAlertInfos(Date start, Date end, int minuteCounts, String type, List alerts) { + refreshSpringBeans(); + Map results = prepareBlankAlert(start.getTime(), end.getTime(), minuteCounts, type); for (Alert alert : alerts) { @@ -129,4 +130,16 @@ private String queryTargetTitle(String target) { return target; } } + + private void refreshSpringBeans() { + AlertService alertService = CatSpringContext.getBeanIfAvailable(AlertService.class); + + if (alertService != null) { + m_alertService = alertService; + } + } + + public void setAlertService(AlertService alertService) { + m_alertService = alertService; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/HistoricalStorageService.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/HistoricalStorageService.java index 523e85e3cd..b2024ae4f0 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/HistoricalStorageService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/HistoricalStorageService.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.consumer.storage.StorageAnalyzer; import com.dianping.cat.consumer.storage.model.entity.StorageReport; import com.dianping.cat.helper.TimeHelper; @@ -31,7 +29,6 @@ public class HistoricalStorageService extends BaseHistoricalModelService { - @Inject private StorageReportService m_reportService; public HistoricalStorageService() { @@ -51,4 +48,8 @@ private StorageReport getReportFromDatabase(long timestamp, String id) throws Ex return m_reportService.queryReport(id, new Date(timestamp), new Date(timestamp + TimeHelper.ONE_HOUR)); } + public void setReportService(StorageReportService reportService) { + m_reportService = reportService; + } + } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index cd23c78b17..23fb36d139 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -496,6 +496,80 @@ + + com.dianping.cat.report.page.storage.Handler + com.dianping.cat.report.page.storage.Handler + + + com.dianping.cat.report.page.storage.JspViewer + m_jspViewer + + + com.dianping.cat.report.page.storage.task.StorageReportService + m_reportService + + + com.dianping.cat.mvc.PayloadNormalizer + m_normalizePayload + + + com.dianping.cat.report.service.ModelService + storage + m_service + + + com.dianping.cat.report.page.storage.transform.StorageMergeHelper + m_mergeHelper + + + com.dianping.cat.report.page.storage.config.StorageGroupConfigManager + m_storageGroupConfigManager + + + com.dianping.cat.helper.JsonBuilder + m_jsonBuilder + + + com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository + m_alterationDao + + + com.dianping.cat.alarm.service.AlertService + m_alertService + + + com.dianping.cat.report.page.storage.display.StorageAlertInfoBuilder + m_alertInfoBuilder + + + com.dianping.cat.consumer.storage.builder.StorageBuilderManager + m_storageBuilderManager + + + + + com.dianping.cat.report.page.storage.JspViewer + com.dianping.cat.report.page.storage.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + + + com.dianping.cat.report.page.storage.display.StorageAlertInfoBuilder + com.dianping.cat.report.page.storage.display.StorageAlertInfoBuilder + + + com.dianping.cat.alarm.service.AlertService + m_alertService + + + + + com.dianping.cat.report.page.storage.transform.StorageMergeHelper + com.dianping.cat.report.page.storage.transform.StorageMergeHelper + org.unidal.initialization.Module cat-home @@ -1436,15 +1510,6 @@ - - com.dianping.cat.report.page.storage.display.StorageAlertInfoBuilder - com.dianping.cat.report.page.storage.display.StorageAlertInfoBuilder - - - com.dianping.cat.alarm.service.AlertService - - - com.dianping.cat.report.page.dependency.graph.DependencyItemBuilder com.dianping.cat.report.page.dependency.graph.DependencyItemBuilder @@ -2830,59 +2895,6 @@ - - com.dianping.cat.report.page.storage.Handler - com.dianping.cat.report.page.storage.Handler - - - com.dianping.cat.report.page.storage.JspViewer - - - com.dianping.cat.report.page.storage.task.StorageReportService - - - com.dianping.cat.mvc.PayloadNormalizer - - - com.dianping.cat.report.service.ModelService - storage - - - com.dianping.cat.report.page.storage.transform.StorageMergeHelper - - - com.dianping.cat.report.page.storage.config.StorageGroupConfigManager - - - com.dianping.cat.helper.JsonBuilder - - - com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository - - - com.dianping.cat.alarm.service.AlertService - - - com.dianping.cat.report.page.storage.display.StorageAlertInfoBuilder - - - com.dianping.cat.consumer.storage.builder.StorageBuilderManager - - - - - com.dianping.cat.report.page.storage.JspViewer - com.dianping.cat.report.page.storage.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - - - com.dianping.cat.report.page.storage.transform.StorageMergeHelper - com.dianping.cat.report.page.storage.transform.StorageMergeHelper - com.dianping.cat.report.page.business.Handler com.dianping.cat.report.page.business.Handler From 7e27d3ca110694b3ff3a03582088ac3cafd79495 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 20:32:33 +0800 Subject: [PATCH 060/231] =?UTF-8?q?=E5=AE=8C=E6=88=90=20cross=20=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8=E9=A1=B5=E8=BF=99=E4=B8=80=E6=89=B9=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/ComponentsConfigurator.java | 10 +++ .../spring/CatHomeSpringConfiguration.java | 45 +++++++++++++ .../cat/report/page/cross/Handler.java | 53 +++++++++++++-- .../cross/service/HistoricalCrossService.java | 7 +- .../resources/META-INF/plexus/components.xml | 67 ++++++++++--------- 5 files changed, 142 insertions(+), 40 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 59cd05e711..4a3f7ec137 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -45,6 +45,7 @@ import com.dianping.cat.build.report.StorageComponentConfigurator; import com.dianping.cat.build.report.TransactionComponentConfigurator; import com.dianping.cat.consumer.event.EventAnalyzer; +import com.dianping.cat.consumer.cross.CrossAnalyzer; import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.state.StateAnalyzer; @@ -261,6 +262,15 @@ public List defineComponents() { .req(com.dianping.cat.alarm.service.AlertService.class, (String) null, "m_alertService")); all.add(C(com.dianping.cat.report.page.storage.transform.StorageMergeHelper.class)); + all.add(C(com.dianping.cat.report.page.cross.Handler.class) // + .req(com.dianping.cat.report.page.cross.JspViewer.class, (String) null, "m_jspViewer") // + .req(com.dianping.cat.report.page.cross.service.CrossReportService.class, (String) null, + "m_reportService") // + .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // + .req(com.dianping.cat.service.HostinfoService.class, (String) null, "m_hostinfoService") // + .req(ModelService.class, CrossAnalyzer.ID, "m_service")); + all.add(C(com.dianping.cat.report.page.cross.JspViewer.class).req(ModelHandler.class)); + all.add(A(CatHomeModule.class)); all.add(C(UserConfigManager.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 8281164e60..2f04aec31b 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -185,7 +185,9 @@ import com.dianping.cat.report.page.business.task.BusinessBaselineReportBuilder; import com.dianping.cat.report.page.business.task.BusinessKeyHelper; import com.dianping.cat.report.page.business.task.BusinessPointParser; +import com.dianping.cat.report.page.cross.service.CompositeCrossService; import com.dianping.cat.report.page.cross.service.CrossReportService; +import com.dianping.cat.report.page.cross.service.HistoricalCrossService; import com.dianping.cat.report.page.cross.service.LocalCrossService; import com.dianping.cat.report.page.cross.task.CrossReportBuilder; import com.dianping.cat.report.page.dependency.service.DependencyReportService; @@ -1535,6 +1537,26 @@ public TaskBuilder capacityUpdateTask(@Qualifier(HourlyCapacityUpdater.ID) Capac return task; } + @Bean + public com.dianping.cat.report.page.cross.JspViewer crossJspViewer() { + return new com.dianping.cat.report.page.cross.JspViewer(); + } + + @Bean + public com.dianping.cat.report.page.cross.Handler crossHandler( + com.dianping.cat.report.page.cross.JspViewer crossJspViewer, CrossReportService crossReportService, + PayloadNormalizer payloadNormalizer, HostinfoService hostinfoService, + @Qualifier("crossModelService") ModelService crossModelService) { + com.dianping.cat.report.page.cross.Handler handler = new com.dianping.cat.report.page.cross.Handler(); + + handler.setJspViewer(crossJspViewer); + handler.setReportService(crossReportService); + handler.setNormalizePayload(payloadNormalizer); + handler.setHostinfoService(hostinfoService); + handler.setService(crossModelService); + return handler; + } + @Bean public CrossReportService crossReportService(HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, @@ -2166,6 +2188,16 @@ public ModelService historicalStorageService(StorageReportService return service; } + @Bean(initMethod = "initialize", name = "cross-historical") + public ModelService historicalCrossService(CrossReportService crossReportService, + ServerConfigManager serverConfigManager) { + HistoricalCrossService service = new HistoricalCrossService(); + + service.setReportService(crossReportService); + service.setConfigManager(serverConfigManager); + return service; + } + @Bean(initMethod = "initialize", name = "dependency-historical") public ModelService historicalDependencyService(DependencyReportService dependencyReportService, ServerConfigManager serverConfigManager) { @@ -2280,6 +2312,19 @@ public ModelService storageModelService( return service; } + @Bean(initMethod = "initialize", name = "crossModelService") + public ModelService crossModelService( + @Qualifier("cross-historical") ModelService historicalCrossService, + ServerConfigManager serverConfigManager, RemoteServersManager remoteServersManager) { + CompositeCrossService service = new CompositeCrossService(); + List> services = Collections.singletonList(historicalCrossService); + + service.setServices(services); + service.setConfigManager(serverConfigManager); + service.setServerManager(remoteServersManager); + return service; + } + @Bean(initMethod = "initialize") public ModelService dependencyModelService( @Qualifier("dependency-historical") ModelService historicalDependencyService, diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/Handler.java index 89b182f889..c380a8c755 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/Handler.java @@ -22,7 +22,6 @@ import java.io.IOException; import java.util.Date; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -41,21 +40,17 @@ import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.service.HostinfoService; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { - @Inject private JspViewer m_jspViewer; - @Inject private CrossReportService m_reportService; - @Inject private PayloadNormalizer m_normalizePayload; - @Inject private HostinfoService m_hostinfoService; - @Inject(type = ModelService.class, value = CrossAnalyzer.ID) private ModelService m_service; private CrossReport getHourlyReport(Payload payload) { @@ -93,6 +88,8 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = CrossAnalyzer.ID) public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + Model model = new Model(ctx); Payload payload = ctx.getPayload(); @@ -218,4 +215,48 @@ private void normalize(Model model, Payload payload) { } } + @SuppressWarnings("unchecked") + private void refreshSpringBeans() { + JspViewer jspViewer = CatSpringContext.getBeanIfAvailable(JspViewer.class); + CrossReportService reportService = CatSpringContext.getBeanIfAvailable(CrossReportService.class); + PayloadNormalizer normalizer = CatSpringContext.getBeanIfAvailable(PayloadNormalizer.class); + HostinfoService hostinfoService = CatSpringContext.getBeanIfAvailable(HostinfoService.class); + ModelService service = CatSpringContext.getBeanIfAvailable("crossModelService", ModelService.class); + + if (jspViewer != null) { + m_jspViewer = jspViewer; + } + if (reportService != null) { + m_reportService = reportService; + } + if (normalizer != null) { + m_normalizePayload = normalizer; + } + if (hostinfoService != null) { + m_hostinfoService = hostinfoService; + } + if (service != null) { + m_service = service; + } + } + + public void setHostinfoService(HostinfoService hostinfoService) { + m_hostinfoService = hostinfoService; + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setNormalizePayload(PayloadNormalizer normalizePayload) { + m_normalizePayload = normalizePayload; + } + + public void setReportService(CrossReportService reportService) { + m_reportService = reportService; + } + + public void setService(ModelService service) { + m_service = service; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/HistoricalCrossService.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/HistoricalCrossService.java index 4667f8049e..c55cf39a7d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/HistoricalCrossService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/HistoricalCrossService.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.consumer.cross.CrossAnalyzer; import com.dianping.cat.consumer.cross.model.entity.CrossReport; import com.dianping.cat.helper.TimeHelper; @@ -30,7 +28,6 @@ public class HistoricalCrossService extends BaseHistoricalModelService { - @Inject private CrossReportService m_reportService; public HistoricalCrossService() { @@ -50,4 +47,8 @@ private CrossReport getReportFromDatabase(long timestamp, String domain) throws return m_reportService.queryReport(domain, new Date(timestamp), new Date(timestamp + TimeHelper.ONE_HOUR)); } + public void setReportService(CrossReportService reportService) { + m_reportService = reportService; + } + } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 23fb36d139..b4e556ec0e 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -570,6 +570,42 @@ com.dianping.cat.report.page.storage.transform.StorageMergeHelper com.dianping.cat.report.page.storage.transform.StorageMergeHelper + + com.dianping.cat.report.page.cross.Handler + com.dianping.cat.report.page.cross.Handler + + + com.dianping.cat.report.page.cross.JspViewer + m_jspViewer + + + com.dianping.cat.report.page.cross.service.CrossReportService + m_reportService + + + com.dianping.cat.mvc.PayloadNormalizer + m_normalizePayload + + + com.dianping.cat.service.HostinfoService + m_hostinfoService + + + com.dianping.cat.report.service.ModelService + cross + m_service + + + + + com.dianping.cat.report.page.cross.JspViewer + com.dianping.cat.report.page.cross.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + org.unidal.initialization.Module cat-home @@ -2797,37 +2833,6 @@ - - com.dianping.cat.report.page.cross.Handler - com.dianping.cat.report.page.cross.Handler - - - com.dianping.cat.report.page.cross.JspViewer - - - com.dianping.cat.report.page.cross.service.CrossReportService - - - com.dianping.cat.mvc.PayloadNormalizer - - - com.dianping.cat.service.HostinfoService - - - com.dianping.cat.report.service.ModelService - cross - - - - - com.dianping.cat.report.page.cross.JspViewer - com.dianping.cat.report.page.cross.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - com.dianping.cat.report.page.statistics.Handler com.dianping.cat.report.page.statistics.Handler From 4f24a94cbe16ede2235279b02422a265f0ddb49a Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 20:41:22 +0800 Subject: [PATCH 061/231] =?UTF-8?q?=E6=89=A7=E8=A1=8C=E8=BF=81=E7=A7=BBmat?= =?UTF-8?q?rix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/ComponentsConfigurator.java | 9 +++ .../spring/CatHomeSpringConfiguration.java | 44 ++++++++++++++ .../cat/report/page/matrix/Handler.java | 45 ++++++++++++-- .../service/HistoricalMatrixService.java | 7 ++- .../resources/META-INF/plexus/components.xml | 60 ++++++++++--------- 5 files changed, 129 insertions(+), 36 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 4a3f7ec137..71abb9cb26 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -47,6 +47,7 @@ import com.dianping.cat.consumer.event.EventAnalyzer; import com.dianping.cat.consumer.cross.CrossAnalyzer; import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; +import com.dianping.cat.consumer.matrix.MatrixAnalyzer; import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.state.StateAnalyzer; import com.dianping.cat.consumer.storage.StorageAnalyzer; @@ -271,6 +272,14 @@ public List defineComponents() { .req(ModelService.class, CrossAnalyzer.ID, "m_service")); all.add(C(com.dianping.cat.report.page.cross.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.matrix.Handler.class) // + .req(com.dianping.cat.report.page.matrix.service.MatrixReportService.class, (String) null, + "m_reportService") // + .req(com.dianping.cat.report.page.matrix.JspViewer.class, (String) null, "m_jspViewer") // + .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // + .req(ModelService.class, MatrixAnalyzer.ID, "m_service")); + all.add(C(com.dianping.cat.report.page.matrix.JspViewer.class).req(ModelHandler.class)); + all.add(A(CatHomeModule.class)); all.add(C(UserConfigManager.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 2f04aec31b..3697db02f3 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -207,6 +207,8 @@ import com.dianping.cat.report.page.heartbeat.service.LocalHeartbeatService; import com.dianping.cat.report.page.heartbeat.task.HeartbeatReportBuilder; import com.dianping.cat.report.page.logview.service.LocalMessageService; +import com.dianping.cat.report.page.matrix.service.CompositeMatrixService; +import com.dianping.cat.report.page.matrix.service.HistoricalMatrixService; import com.dianping.cat.report.page.matrix.service.MatrixReportService; import com.dianping.cat.report.page.matrix.service.LocalMatrixService; import com.dianping.cat.report.page.matrix.task.MatrixReportBuilder; @@ -1358,6 +1360,25 @@ public TaskBuilder jarReportBuilder(JarReportService jarReportService, Heartbeat return builder; } + @Bean + public com.dianping.cat.report.page.matrix.JspViewer matrixJspViewer() { + return new com.dianping.cat.report.page.matrix.JspViewer(); + } + + @Bean + public com.dianping.cat.report.page.matrix.Handler matrixHandler( + com.dianping.cat.report.page.matrix.JspViewer matrixJspViewer, MatrixReportService matrixReportService, + PayloadNormalizer payloadNormalizer, + @Qualifier("matrixModelService") ModelService matrixModelService) { + com.dianping.cat.report.page.matrix.Handler handler = new com.dianping.cat.report.page.matrix.Handler(); + + handler.setJspViewer(matrixJspViewer); + handler.setReportService(matrixReportService); + handler.setNormalizePayload(payloadNormalizer); + handler.setService(matrixModelService); + return handler; + } + @Bean public MatrixReportService matrixReportService(HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DailyReportRepository dailyReportRepository, @@ -2198,6 +2219,16 @@ public ModelService historicalCrossService(CrossReportService cross return service; } + @Bean(initMethod = "initialize", name = "matrix-historical") + public ModelService historicalMatrixService(MatrixReportService matrixReportService, + ServerConfigManager serverConfigManager) { + HistoricalMatrixService service = new HistoricalMatrixService(); + + service.setReportService(matrixReportService); + service.setConfigManager(serverConfigManager); + return service; + } + @Bean(initMethod = "initialize", name = "dependency-historical") public ModelService historicalDependencyService(DependencyReportService dependencyReportService, ServerConfigManager serverConfigManager) { @@ -2325,6 +2356,19 @@ public ModelService crossModelService( return service; } + @Bean(initMethod = "initialize", name = "matrixModelService") + public ModelService matrixModelService( + @Qualifier("matrix-historical") ModelService historicalMatrixService, + ServerConfigManager serverConfigManager, RemoteServersManager remoteServersManager) { + CompositeMatrixService service = new CompositeMatrixService(); + List> services = Collections.singletonList(historicalMatrixService); + + service.setServices(services); + service.setConfigManager(serverConfigManager); + service.setServerManager(remoteServersManager); + return service; + } + @Bean(initMethod = "initialize") public ModelService dependencyModelService( @Qualifier("dependency-historical") ModelService historicalDependencyService, diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/Handler.java index 6072ba1429..5b984150e3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/Handler.java @@ -22,7 +22,6 @@ import java.io.IOException; import java.util.Date; -import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -36,19 +35,16 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { - @Inject private MatrixReportService m_reportService; - @Inject private JspViewer m_jspViewer; - @Inject private PayloadNormalizer m_normalizePayload; - @Inject(type = ModelService.class, value = MatrixAnalyzer.ID) private ModelService m_service; private MatrixReport getHourlyReport(Payload payload) { @@ -77,6 +73,8 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = MatrixAnalyzer.ID) public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + Model model = new Model(ctx); Payload payload = ctx.getPayload(); @@ -116,4 +114,41 @@ private void showSummarizeReport(Model model, Payload payload) { model.setMatrix(new DisplayMatrix(matrixReport).setSortBy(payload.getSortBy())); } + @SuppressWarnings("unchecked") + private void refreshSpringBeans() { + MatrixReportService reportService = CatSpringContext.getBeanIfAvailable(MatrixReportService.class); + JspViewer jspViewer = CatSpringContext.getBeanIfAvailable(JspViewer.class); + PayloadNormalizer normalizer = CatSpringContext.getBeanIfAvailable(PayloadNormalizer.class); + ModelService service = CatSpringContext.getBeanIfAvailable("matrixModelService", ModelService.class); + + if (reportService != null) { + m_reportService = reportService; + } + if (jspViewer != null) { + m_jspViewer = jspViewer; + } + if (normalizer != null) { + m_normalizePayload = normalizer; + } + if (service != null) { + m_service = service; + } + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setNormalizePayload(PayloadNormalizer normalizePayload) { + m_normalizePayload = normalizePayload; + } + + public void setReportService(MatrixReportService reportService) { + m_reportService = reportService; + } + + public void setService(ModelService service) { + m_service = service; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/HistoricalMatrixService.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/HistoricalMatrixService.java index f83077f15a..81b8964faf 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/HistoricalMatrixService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/HistoricalMatrixService.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.consumer.matrix.MatrixAnalyzer; import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; import com.dianping.cat.helper.TimeHelper; @@ -30,7 +28,6 @@ public class HistoricalMatrixService extends BaseHistoricalModelService { - @Inject private MatrixReportService m_reportService; public HistoricalMatrixService() { @@ -50,4 +47,8 @@ private MatrixReport getReportFromDatabase(long timestamp, String domain) throws return m_reportService.queryReport(domain, new Date(timestamp), new Date(timestamp + TimeHelper.ONE_HOUR)); } + public void setReportService(MatrixReportService reportService) { + m_reportService = reportService; + } + } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index b4e556ec0e..6f9dbd8763 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -606,6 +606,38 @@ + + com.dianping.cat.report.page.matrix.Handler + com.dianping.cat.report.page.matrix.Handler + + + com.dianping.cat.report.page.matrix.service.MatrixReportService + m_reportService + + + com.dianping.cat.report.page.matrix.JspViewer + m_jspViewer + + + com.dianping.cat.mvc.PayloadNormalizer + m_normalizePayload + + + com.dianping.cat.report.service.ModelService + matrix + m_service + + + + + com.dianping.cat.report.page.matrix.JspViewer + com.dianping.cat.report.page.matrix.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + org.unidal.initialization.Module cat-home @@ -2805,34 +2837,6 @@ com.dianping.cat.report.page.model.Handler com.dianping.cat.report.page.model.Handler - - com.dianping.cat.report.page.matrix.Handler - com.dianping.cat.report.page.matrix.Handler - - - com.dianping.cat.report.page.matrix.service.MatrixReportService - - - com.dianping.cat.report.page.matrix.JspViewer - - - com.dianping.cat.mvc.PayloadNormalizer - - - com.dianping.cat.report.service.ModelService - matrix - - - - - com.dianping.cat.report.page.matrix.JspViewer - com.dianping.cat.report.page.matrix.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - com.dianping.cat.report.page.statistics.Handler com.dianping.cat.report.page.statistics.Handler From 688e7123b83415e2e33f0ac401bbaebfb3ec4250 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 21:12:40 +0800 Subject: [PATCH 062/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=20business=20?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=B3=A8=E5=85=A5=E5=B9=B6=E6=A1=A5=E6=8E=A5?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E7=AE=A1=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/DailyReportContentRepository.java | 4 + .../HourlyReportContentRepository.java | 4 + .../hourlyreport/HourlyReportRepository.java | 4 + .../MonthlyReportContentRepository.java | 4 + .../monthreport/MonthlyReportRepository.java | 4 + .../WeeklyReportContentRepository.java | 4 + .../weeklyreport/WeeklyReportRepository.java | 4 + .../repository/DailyReportRepository.java | 4 + .../cat/build/ComponentsConfigurator.java | 40 +++ .../report/MetricComponentConfigurator.java | 8 +- .../spring/CatHomeSpringConfiguration.java | 68 +++-- .../cat/report/page/business/Handler.java | 38 ++- .../business/graph/BusinessDataFetcher.java | 13 +- .../business/graph/BusinessGraphCreator.java | 12 +- .../business/graph/CustomDataCalculator.java | 15 +- .../service/CachedBusinessReportService.java | 8 +- .../service/HistoricalBusinessService.java | 3 - .../service/LocalBusinessService.java | 2 - .../resources/META-INF/plexus/components.xml | 252 ++++++++++-------- 19 files changed, 332 insertions(+), 159 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java index d6271b7cb4..3a09f34c7c 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java @@ -33,6 +33,10 @@ public class DailyReportContentRepository { private volatile SqlSessionFactory m_sqlSessionFactory; + public void setDataSourceManager(DataSourceManager dataSourceManager) { + m_dataSourceManager = dataSourceManager; + } + public DailyReportContent createLocal() { return new DailyReportContent(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java index 487dc2b75a..30265bf91e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java @@ -33,6 +33,10 @@ public class HourlyReportContentRepository { private volatile SqlSessionFactory m_sqlSessionFactory; + public void setDataSourceManager(DataSourceManager dataSourceManager) { + m_dataSourceManager = dataSourceManager; + } + public HourlyReportContent createLocal() { return new HourlyReportContent(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java index 67b35b2b44..711279002c 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java @@ -47,6 +47,10 @@ public class HourlyReportRepository { private volatile SqlSessionFactory m_sqlSessionFactory; + public void setDataSourceManager(DataSourceManager dataSourceManager) { + m_dataSourceManager = dataSourceManager; + } + public HourlyReport createLocal() { return new HourlyReport(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java index ada3385d11..8a708045fb 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java @@ -33,6 +33,10 @@ public class MonthlyReportContentRepository { private volatile SqlSessionFactory m_sqlSessionFactory; + public void setDataSourceManager(DataSourceManager dataSourceManager) { + m_dataSourceManager = dataSourceManager; + } + public MonthlyReportContent createLocal() { return new MonthlyReportContent(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java index 47f7c52362..c39efbfcc3 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java @@ -45,6 +45,10 @@ public class MonthlyReportRepository { private volatile SqlSessionFactory m_sqlSessionFactory; + public void setDataSourceManager(DataSourceManager dataSourceManager) { + m_dataSourceManager = dataSourceManager; + } + public MonthlyReport createLocal() { return new MonthlyReport(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java index 62a80b43b9..7083e0a92e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java @@ -33,6 +33,10 @@ public class WeeklyReportContentRepository { private volatile SqlSessionFactory m_sqlSessionFactory; + public void setDataSourceManager(DataSourceManager dataSourceManager) { + m_dataSourceManager = dataSourceManager; + } + public WeeklyReportContent createLocal() { return new WeeklyReportContent(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java index 00f155cb42..154b194c9d 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java @@ -45,6 +45,10 @@ public class WeeklyReportRepository { private volatile SqlSessionFactory m_sqlSessionFactory; + public void setDataSourceManager(DataSourceManager dataSourceManager) { + m_dataSourceManager = dataSourceManager; + } + public WeeklyReport createLocal() { return new WeeklyReport(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java index 1f60a6b1d5..6d2540cef2 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java @@ -47,6 +47,10 @@ public class DailyReportRepository { private volatile SqlSessionFactory m_sqlSessionFactory; + public void setDataSourceManager(DataSourceManager dataSourceManager) { + m_dataSourceManager = dataSourceManager; + } + public DailyReport createLocal() { return new DailyReport(); } diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 71abb9cb26..002b614e51 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -44,6 +44,7 @@ import com.dianping.cat.build.report.ReportComponentConfigurator; import com.dianping.cat.build.report.StorageComponentConfigurator; import com.dianping.cat.build.report.TransactionComponentConfigurator; +import com.dianping.cat.consumer.business.BusinessAnalyzer; import com.dianping.cat.consumer.event.EventAnalyzer; import com.dianping.cat.consumer.cross.CrossAnalyzer; import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; @@ -280,6 +281,45 @@ public List defineComponents() { .req(ModelService.class, MatrixAnalyzer.ID, "m_service")); all.add(C(com.dianping.cat.report.page.matrix.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.business.Handler.class) // + .req(com.dianping.cat.report.page.business.JspViewer.class, (String) null, "m_jspViewer") // + .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // + .req(com.dianping.cat.service.ProjectService.class, (String) null, "m_projectService") // + .req(com.dianping.cat.report.page.business.graph.BusinessGraphCreator.class, (String) null, + "m_graphCreator") // + .req(com.dianping.cat.system.page.business.config.BusinessTagConfigManager.class, + (String) null, "m_tagConfigManager")); + all.add(C(com.dianping.cat.report.page.business.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.business.graph.BusinessGraphCreator.class) // + .req(com.dianping.cat.report.page.business.service.CachedBusinessReportService.class, + (String) null, "m_reportService") // + .req(com.dianping.cat.config.business.BusinessConfigManager.class, (String) null, + "m_configManager") // + .req(com.dianping.cat.report.page.business.graph.BusinessDataFetcher.class, (String) null, + "m_dataFetcher") // + .req(com.dianping.cat.service.ProjectService.class, (String) null, "m_projectService") // + .req(com.dianping.cat.system.page.business.config.BusinessTagConfigManager.class, + (String) null, "m_tagManager") // + .req(com.dianping.cat.report.page.business.task.BusinessKeyHelper.class, (String) null, + "m_keyHelper") // + .req(com.dianping.cat.report.page.business.graph.CustomDataCalculator.class, (String) null, + "m_customDataCalculator") // + .req(com.dianping.cat.report.page.metric.service.BaselineService.class, (String) null, + "m_baselineService") // + .req(com.dianping.cat.report.graph.metric.DataExtractor.class, (String) null, + "m_dataExtractor") // + .req(com.dianping.cat.alarm.spi.AlertManager.class, (String) null, "m_alertManager")); + all.add(C(com.dianping.cat.report.page.business.service.CachedBusinessReportService.class) // + .req(com.dianping.cat.report.page.business.service.BusinessReportService.class, (String) null, + "m_reportService") // + .req(ModelService.class, BusinessAnalyzer.ID, "m_service")); + all.add(C(com.dianping.cat.report.page.business.graph.BusinessDataFetcher.class) // + .req(com.dianping.cat.report.page.business.task.BusinessKeyHelper.class, (String) null, + "m_keyHelper")); + all.add(C(com.dianping.cat.report.page.business.graph.CustomDataCalculator.class) // + .req(com.dianping.cat.report.page.business.task.BusinessKeyHelper.class, (String) null, + "m_keyHelper")); + all.add(A(CatHomeModule.class)); all.add(C(UserConfigManager.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java index 00ab1e0cb7..213669ea8b 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java @@ -27,6 +27,7 @@ import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; +import com.dianping.cat.analysis.MessageConsumer; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.consumer.business.BusinessAnalyzer; import com.dianping.cat.report.alert.business.BusinessAlert; @@ -42,10 +43,12 @@ import com.dianping.cat.report.page.business.service.LocalBusinessService; import com.dianping.cat.report.page.business.task.BusinessKeyHelper; import com.dianping.cat.report.page.business.task.BusinessPointParser; +import com.dianping.cat.report.ReportBucketManager; import com.dianping.cat.report.page.metric.service.DefaultBaselineService; import com.dianping.cat.report.page.metric.task.BaselineConfigManager; import com.dianping.cat.report.page.metric.task.DefaultBaselineCreator; import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.service.ProjectService; @@ -62,7 +65,10 @@ public List defineComponents() { all.add(A(BusinessReportGroupService.class)); - all.add(A(LocalBusinessService.class)); + all.add(C(LocalModelService.class, LocalBusinessService.ID, LocalBusinessService.class) // + .req(ReportBucketManager.class, (String) null, "m_bucketManager") // + .req(ServerConfigManager.class, (String) null, "m_configManager") // + .req(MessageConsumer.class, (String) null, "m_consumer")); all.add(C(ModelService.class, "business-historical", HistoricalBusinessService.class) // .req(BusinessReportService.class, ServerConfigManager.class)); all.add(C(ModelService.class, BusinessAnalyzer.ID, CompositeBusinessService.class) // diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 3697db02f3..6ed3fccd56 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -25,6 +25,9 @@ import org.unidal.cat.message.storage.local.LocalBucket; import org.unidal.cat.message.storage.local.LocalBucketManager; import org.unidal.cat.message.storage.local.LocalFileBuilder; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.lookup.ContainerLoader; +import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.beans.factory.annotation.Qualifier; @@ -1919,43 +1922,76 @@ public HostinfoRepository hostinfoRepository(SqlSessionTemplate sqlSessionTempla } @Bean - public DailyReportRepository dailyReportRepository() { - return new DailyReportRepository(); + public DataSourceManager dataSourceManager() { + try { + return ContainerLoader.getDefaultContainer().lookup(DataSourceManager.class); + } catch (ComponentLookupException e) { + throw new IllegalStateException("Unable to resolve DataSourceManager from Unidal container.", e); + } } @Bean - public DailyReportContentRepository dailyReportContentRepository() { - return new DailyReportContentRepository(); + public DailyReportRepository dailyReportRepository(DataSourceManager dataSourceManager) { + DailyReportRepository repository = new DailyReportRepository(); + + repository.setDataSourceManager(dataSourceManager); + return repository; } @Bean - public HourlyReportRepository hourlyReportRepository() { - return new HourlyReportRepository(); + public DailyReportContentRepository dailyReportContentRepository(DataSourceManager dataSourceManager) { + DailyReportContentRepository repository = new DailyReportContentRepository(); + + repository.setDataSourceManager(dataSourceManager); + return repository; } @Bean - public HourlyReportContentRepository hourlyReportContentRepository() { - return new HourlyReportContentRepository(); + public HourlyReportRepository hourlyReportRepository(DataSourceManager dataSourceManager) { + HourlyReportRepository repository = new HourlyReportRepository(); + + repository.setDataSourceManager(dataSourceManager); + return repository; } @Bean - public WeeklyReportRepository weeklyReportRepository() { - return new WeeklyReportRepository(); + public HourlyReportContentRepository hourlyReportContentRepository(DataSourceManager dataSourceManager) { + HourlyReportContentRepository repository = new HourlyReportContentRepository(); + + repository.setDataSourceManager(dataSourceManager); + return repository; } @Bean - public WeeklyReportContentRepository weeklyReportContentRepository() { - return new WeeklyReportContentRepository(); + public WeeklyReportRepository weeklyReportRepository(DataSourceManager dataSourceManager) { + WeeklyReportRepository repository = new WeeklyReportRepository(); + + repository.setDataSourceManager(dataSourceManager); + return repository; } @Bean - public MonthlyReportRepository monthlyReportRepository() { - return new MonthlyReportRepository(); + public WeeklyReportContentRepository weeklyReportContentRepository(DataSourceManager dataSourceManager) { + WeeklyReportContentRepository repository = new WeeklyReportContentRepository(); + + repository.setDataSourceManager(dataSourceManager); + return repository; } @Bean - public MonthlyReportContentRepository monthlyReportContentRepository() { - return new MonthlyReportContentRepository(); + public MonthlyReportRepository monthlyReportRepository(DataSourceManager dataSourceManager) { + MonthlyReportRepository repository = new MonthlyReportRepository(); + + repository.setDataSourceManager(dataSourceManager); + return repository; + } + + @Bean + public MonthlyReportContentRepository monthlyReportContentRepository(DataSourceManager dataSourceManager) { + MonthlyReportContentRepository repository = new MonthlyReportContentRepository(); + + repository.setDataSourceManager(dataSourceManager); + return repository; } @Bean diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/Handler.java index 32b8f3089b..7d93946a17 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/Handler.java @@ -26,7 +26,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -43,19 +42,14 @@ public class Handler implements PageHandler { private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); - @Inject private JspViewer m_jspViewer; - @Inject private PayloadNormalizer m_normalizePayload; - @Inject private ProjectService m_projectService; - @Inject private BusinessGraphCreator m_graphCreator; - @Inject private BusinessTagConfigManager m_tagConfigManager; @Override @@ -103,12 +97,24 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { } private void refreshSpringBeans() { + JspViewer jspViewer = CatSpringContext.getBeanIfAvailable(JspViewer.class); + PayloadNormalizer normalizer = CatSpringContext.getBeanIfAvailable(PayloadNormalizer.class); ProjectService projectService = CatSpringContext.getBeanIfAvailable(ProjectService.class); + BusinessGraphCreator graphCreator = CatSpringContext.getBeanIfAvailable(BusinessGraphCreator.class); BusinessTagConfigManager tagConfigManager = CatSpringContext.getBeanIfAvailable(BusinessTagConfigManager.class); + if (jspViewer != null) { + m_jspViewer = jspViewer; + } + if (normalizer != null) { + m_normalizePayload = normalizer; + } if (projectService != null) { m_projectService = projectService; } + if (graphCreator != null) { + m_graphCreator = graphCreator; + } if (tagConfigManager != null) { m_tagConfigManager = tagConfigManager; } @@ -134,4 +140,24 @@ private void normalize(Model model, Payload payload) { model.setAction(payload.getAction()); m_normalizePayload.normalize(model, payload); } + + public void setGraphCreator(BusinessGraphCreator graphCreator) { + m_graphCreator = graphCreator; + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setNormalizePayload(PayloadNormalizer normalizePayload) { + m_normalizePayload = normalizePayload; + } + + public void setProjectService(ProjectService projectService) { + m_projectService = projectService; + } + + public void setTagConfigManager(BusinessTagConfigManager tagConfigManager) { + m_tagConfigManager = tagConfigManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessDataFetcher.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessDataFetcher.java index 2a2e7c30aa..b1de37b2c8 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessDataFetcher.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessDataFetcher.java @@ -23,7 +23,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.consumer.business.model.entity.BusinessItem; import com.dianping.cat.consumer.business.model.entity.BusinessReport; @@ -31,11 +30,11 @@ import com.dianping.cat.consumer.business.model.transform.BaseVisitor; import com.dianping.cat.helper.MetricType; import com.dianping.cat.report.page.business.task.BusinessKeyHelper; +import com.dianping.cat.spring.CatSpringContext; public class BusinessDataFetcher { private static final Logger LOGGER = LoggerFactory.getLogger(BusinessDataFetcher.class); - @Inject private BusinessKeyHelper m_keyHelper; public void setKeyHelper(BusinessKeyHelper keyHelper) { @@ -43,6 +42,8 @@ public void setKeyHelper(BusinessKeyHelper keyHelper) { } public Map buildGraphData(BusinessReport businessReport) { + refreshSpringBeans(); + BusinessDataBuilder builder = new BusinessDataBuilder(); if (businessReport == null) { @@ -52,6 +53,14 @@ public Map buildGraphData(BusinessReport businessReport) { return builder.getDatas(); } + private void refreshSpringBeans() { + BusinessKeyHelper keyHelper = CatSpringContext.getBeanIfAvailable(BusinessKeyHelper.class); + + if (keyHelper != null) { + m_keyHelper = keyHelper; + } + } + public class BusinessDataBuilder extends BaseVisitor { private Map m_datas = new LinkedHashMap(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java index 6fc921aa64..5aa07615d3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java @@ -32,7 +32,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.tuple.Pair; @@ -61,25 +60,18 @@ public class BusinessGraphCreator extends AbstractGraphCreator { private static final Logger LOGGER = LoggerFactory.getLogger(BusinessGraphCreator.class); - @Inject private CachedBusinessReportService m_reportService; - @Inject private BusinessConfigManager m_configManager; - @Inject private BusinessDataFetcher m_dataFetcher; - @Inject private ProjectService m_projectService; - @Inject private BusinessTagConfigManager m_tagManager; - @Inject private BusinessKeyHelper m_keyHelper; - @Inject private CustomDataCalculator m_customDataCalculator; private Pair buildTitleAndPrivilege(BusinessReportConfig businessReportConfig, String itemId, @@ -458,6 +450,7 @@ private void refreshSpringBeans() { BusinessDataFetcher dataFetcher = CatSpringContext.getBeanIfAvailable(BusinessDataFetcher.class); BusinessKeyHelper keyHelper = CatSpringContext.getBeanIfAvailable(BusinessKeyHelper.class); CustomDataCalculator customDataCalculator = CatSpringContext.getBeanIfAvailable(CustomDataCalculator.class); + CachedBusinessReportService reportService = CatSpringContext.getBeanIfAvailable(CachedBusinessReportService.class); if (configManager != null) { m_configManager = configManager; @@ -477,6 +470,9 @@ private void refreshSpringBeans() { if (customDataCalculator != null) { m_customDataCalculator = customDataCalculator; } + if (reportService != null) { + m_reportService = reportService; + } } public void setConfigManager(BusinessConfigManager configManager) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/CustomDataCalculator.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/CustomDataCalculator.java index 80bdf2965e..dacd9993fe 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/CustomDataCalculator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/CustomDataCalculator.java @@ -26,10 +26,10 @@ import org.apache.commons.jexl3.JexlEngine; import org.apache.commons.jexl3.JexlException; import org.apache.commons.jexl3.JexlExpression; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.report.page.business.task.BusinessKeyHelper; +import com.dianping.cat.spring.CatSpringContext; public class CustomDataCalculator { @@ -41,7 +41,6 @@ public class CustomDataCalculator { private final JexlEngine jexl = new JexlBuilder().cache(512).strict(true).silent(false).create(); - @Inject private BusinessKeyHelper m_keyHelper; public void setKeyHelper(BusinessKeyHelper keyHelper) { @@ -49,6 +48,8 @@ public void setKeyHelper(BusinessKeyHelper keyHelper) { } public List translatePattern(String pattern) { + refreshSpringBeans(); + List infos = new ArrayList(); boolean result = true; int length = pattern.length(); @@ -91,6 +92,8 @@ public List translatePattern(String pattern) { public double[] calculate(String pattern, List customInfos, Map businessItemData, int totalSize) { + refreshSpringBeans(); + double[] result = new double[totalSize]; for (int i = 0; i < totalSize; i++) { @@ -123,4 +126,12 @@ private double calculate(String pattern) { return result.doubleValue(); } + private void refreshSpringBeans() { + BusinessKeyHelper keyHelper = CatSpringContext.getBeanIfAvailable(BusinessKeyHelper.class); + + if (keyHelper != null) { + m_keyHelper = keyHelper; + } + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/CachedBusinessReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/CachedBusinessReportService.java index 564d285bf2..91aba649a4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/CachedBusinessReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/CachedBusinessReportService.java @@ -23,8 +23,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.consumer.business.BusinessAnalyzer; import com.dianping.cat.consumer.business.model.entity.BusinessReport; import com.dianping.cat.helper.TimeHelper; @@ -46,10 +44,8 @@ protected boolean removeEldestEntry(Entry eldest) { } }; - @Inject private BusinessReportService m_reportService; - @Inject(type = ModelService.class, value = BusinessAnalyzer.ID) private ModelService m_service; public BusinessReport queryBusinessReport(String domain, Date start) { @@ -93,10 +89,14 @@ private BusinessReport getReportFromCache(String domain, long time) { private void refreshSpringBeans() { BusinessReportService reportService = CatSpringContext.getBeanIfAvailable(BusinessReportService.class); + ModelService service = CatSpringContext.getBeanIfAvailable("businessModelService", ModelService.class); if (reportService != null) { m_reportService = reportService; } + if (service != null) { + m_service = service; + } } public void setModelService(ModelService service) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/HistoricalBusinessService.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/HistoricalBusinessService.java index d0c46849e0..cf732cdb0c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/HistoricalBusinessService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/HistoricalBusinessService.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.consumer.business.BusinessAnalyzer; import com.dianping.cat.consumer.business.model.entity.BusinessReport; import com.dianping.cat.helper.TimeHelper; @@ -31,7 +29,6 @@ public class HistoricalBusinessService extends BaseHistoricalModelService { - @Inject private BusinessReportService m_reportService; public HistoricalBusinessService() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/LocalBusinessService.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/LocalBusinessService.java index ce31ca9605..2cbd40172d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/LocalBusinessService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/LocalBusinessService.java @@ -21,7 +21,6 @@ import java.util.Date; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; import com.dianping.cat.consumer.business.BusinessAnalyzer; @@ -43,7 +42,6 @@ public class LocalBusinessService extends LocalModelService { public static final String ID = BusinessAnalyzer.ID; - @Inject private ReportBucketManager m_bucketManager; public LocalBusinessService() { diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 6f9dbd8763..5b7b07d0f6 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -638,6 +638,122 @@ + + com.dianping.cat.report.page.business.Handler + com.dianping.cat.report.page.business.Handler + + + com.dianping.cat.report.page.business.JspViewer + m_jspViewer + + + com.dianping.cat.mvc.PayloadNormalizer + m_normalizePayload + + + com.dianping.cat.service.ProjectService + m_projectService + + + com.dianping.cat.report.page.business.graph.BusinessGraphCreator + m_graphCreator + + + com.dianping.cat.system.page.business.config.BusinessTagConfigManager + m_tagConfigManager + + + + + com.dianping.cat.report.page.business.JspViewer + com.dianping.cat.report.page.business.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + + + com.dianping.cat.report.page.business.graph.BusinessGraphCreator + com.dianping.cat.report.page.business.graph.BusinessGraphCreator + + + com.dianping.cat.report.page.business.service.CachedBusinessReportService + m_reportService + + + com.dianping.cat.config.business.BusinessConfigManager + m_configManager + + + com.dianping.cat.report.page.business.graph.BusinessDataFetcher + m_dataFetcher + + + com.dianping.cat.service.ProjectService + m_projectService + + + com.dianping.cat.system.page.business.config.BusinessTagConfigManager + m_tagManager + + + com.dianping.cat.report.page.business.task.BusinessKeyHelper + m_keyHelper + + + com.dianping.cat.report.page.business.graph.CustomDataCalculator + m_customDataCalculator + + + com.dianping.cat.report.page.metric.service.BaselineService + m_baselineService + + + com.dianping.cat.report.graph.metric.DataExtractor + m_dataExtractor + + + com.dianping.cat.alarm.spi.AlertManager + m_alertManager + + + + + com.dianping.cat.report.page.business.service.CachedBusinessReportService + com.dianping.cat.report.page.business.service.CachedBusinessReportService + + + com.dianping.cat.report.page.business.service.BusinessReportService + m_reportService + + + com.dianping.cat.report.service.ModelService + business + m_service + + + + + com.dianping.cat.report.page.business.graph.BusinessDataFetcher + com.dianping.cat.report.page.business.graph.BusinessDataFetcher + + + com.dianping.cat.report.page.business.task.BusinessKeyHelper + m_keyHelper + + + + + com.dianping.cat.report.page.business.graph.CustomDataCalculator + com.dianping.cat.report.page.business.graph.CustomDataCalculator + + + com.dianping.cat.report.page.business.task.BusinessKeyHelper + m_keyHelper + + + org.unidal.initialization.Module cat-home @@ -996,12 +1112,15 @@ com.dianping.cat.report.ReportBucketManager + m_bucketManager com.dianping.cat.config.server.ServerConfigManager + m_configManager com.dianping.cat.analysis.MessageConsumer + m_consumer @@ -2904,121 +3023,6 @@ - - com.dianping.cat.report.page.business.Handler - com.dianping.cat.report.page.business.Handler - - - com.dianping.cat.report.page.business.JspViewer - - - com.dianping.cat.mvc.PayloadNormalizer - - - com.dianping.cat.service.ProjectService - - - com.dianping.cat.report.page.business.graph.BusinessGraphCreator - - - com.dianping.cat.system.page.business.config.BusinessTagConfigManager - - - - - com.dianping.cat.report.page.business.JspViewer - com.dianping.cat.report.page.business.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - - - com.dianping.cat.report.page.business.graph.BusinessGraphCreator - com.dianping.cat.report.page.business.graph.BusinessGraphCreator - - - com.dianping.cat.report.page.business.service.CachedBusinessReportService - - - com.dianping.cat.config.business.BusinessConfigManager - - - com.dianping.cat.report.page.business.graph.BusinessDataFetcher - - - com.dianping.cat.service.ProjectService - - - com.dianping.cat.system.page.business.config.BusinessTagConfigManager - - - com.dianping.cat.report.page.business.task.BusinessKeyHelper - - - com.dianping.cat.report.page.business.graph.CustomDataCalculator - - - com.dianping.cat.report.page.metric.service.BaselineService - - - com.dianping.cat.report.graph.metric.DataExtractor - - - com.dianping.cat.alarm.spi.AlertManager - - - - - com.dianping.cat.report.page.business.service.CachedBusinessReportService - com.dianping.cat.report.page.business.service.CachedBusinessReportService - - - com.dianping.cat.report.page.business.service.BusinessReportService - - - com.dianping.cat.report.service.ModelService - business - - - - - com.dianping.cat.report.page.business.graph.BusinessDataFetcher - com.dianping.cat.report.page.business.graph.BusinessDataFetcher - - - com.dianping.cat.report.page.business.task.BusinessKeyHelper - - - - - com.dianping.cat.system.page.business.config.BusinessTagConfigManager - com.dianping.cat.system.page.business.config.BusinessTagConfigManager - - - com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository - - - - - com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository - com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - - - - com.dianping.cat.report.page.business.graph.CustomDataCalculator - com.dianping.cat.report.page.business.graph.CustomDataCalculator - - - com.dianping.cat.report.page.business.task.BusinessKeyHelper - - - org.unidal.web.mvc.Module com.dianping.cat.system.SystemModule @@ -3369,6 +3373,24 @@ + + com.dianping.cat.system.page.business.config.BusinessTagConfigManager + com.dianping.cat.system.page.business.config.BusinessTagConfigManager + + + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository + + + + + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + com.dianping.cat.system.page.permission.Handler com.dianping.cat.system.page.permission.Handler From 4cacc39db4af334c089ef53235fbeec0b581e87d Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 21:22:00 +0800 Subject: [PATCH 063/231] =?UTF-8?q?=E6=89=A7=E8=A1=8C=20overload=20?= =?UTF-8?q?=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/ComponentsConfigurator.java | 6 ++ .../report/OfflineComponentConfigurator.java | 41 ++++++++++-- .../spring/CatHomeSpringConfiguration.java | 31 +++++++++ .../cat/report/page/overload/Handler.java | 26 +++++++- .../overload/task/DailyCapacityUpdater.java | 7 -- .../overload/task/HourlyCapacityUpdater.java | 7 -- .../overload/task/MonthlyCapacityUpdater.java | 7 -- .../overload/task/TableCapacityService.java | 31 ++++++--- .../overload/task/WeeklyCapacityUpdater.java | 7 -- .../resources/META-INF/plexus/components.xml | 65 +++++++++++++------ 10 files changed, 161 insertions(+), 67 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 002b614e51..064e60a150 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -281,6 +281,12 @@ public List defineComponents() { .req(ModelService.class, MatrixAnalyzer.ID, "m_service")); all.add(C(com.dianping.cat.report.page.matrix.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.overload.Handler.class) // + .req(com.dianping.cat.report.page.overload.JspViewer.class, (String) null, "m_jspViewer") // + .req(com.dianping.cat.report.page.overload.task.TableCapacityService.class, (String) null, + "m_tableCapacityService")); + all.add(C(com.dianping.cat.report.page.overload.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.business.Handler.class) // .req(com.dianping.cat.report.page.business.JspViewer.class, (String) null, "m_jspViewer") // .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java index 7639d62d57..910d1f2f77 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/OfflineComponentConfigurator.java @@ -24,7 +24,17 @@ import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; +import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.report.page.overload.task.CapacityUpdateStatusManager; +import com.dianping.cat.report.page.overload.task.CapacityUpdater; import com.dianping.cat.report.page.overload.task.DailyCapacityUpdater; import com.dianping.cat.report.page.overload.task.HourlyCapacityUpdater; import com.dianping.cat.report.page.overload.task.MonthlyCapacityUpdater; @@ -37,11 +47,32 @@ public List defineComponents() { List all = new ArrayList(); all.add(C(CapacityUpdateStatusManager.class)); - all.add(A(HourlyCapacityUpdater.class)); - all.add(A(DailyCapacityUpdater.class)); - all.add(A(WeeklyCapacityUpdater.class)); - all.add(A(MonthlyCapacityUpdater.class)); - all.add(A(TableCapacityService.class)); + all.add(C(CapacityUpdater.class, HourlyCapacityUpdater.ID, HourlyCapacityUpdater.class) // + .req(HourlyReportContentRepository.class, (String) null, "m_hourlyReportContentDao") // + .req(HourlyReportRepository.class, (String) null, "m_hourlyReportDao") // + .req(OverloadRepository.class, (String) null, "m_overloadDao") // + .req(CapacityUpdateStatusManager.class, (String) null, "m_manager")); + all.add(C(CapacityUpdater.class, DailyCapacityUpdater.ID, DailyCapacityUpdater.class) // + .req(DailyReportContentRepository.class, (String) null, "m_dailyReportContentDao") // + .req(DailyReportRepository.class, (String) null, "m_dailyReportDao") // + .req(OverloadRepository.class, (String) null, "m_overloadDao") // + .req(CapacityUpdateStatusManager.class, (String) null, "m_manager")); + all.add(C(CapacityUpdater.class, WeeklyCapacityUpdater.ID, WeeklyCapacityUpdater.class) // + .req(WeeklyReportRepository.class, (String) null, "m_weeklyReportDao") // + .req(WeeklyReportContentRepository.class, (String) null, "m_weeklyReportContentDao") // + .req(OverloadRepository.class, (String) null, "m_overloadDao") // + .req(CapacityUpdateStatusManager.class, (String) null, "m_manager")); + all.add(C(CapacityUpdater.class, MonthlyCapacityUpdater.ID, MonthlyCapacityUpdater.class) // + .req(MonthlyReportRepository.class, (String) null, "m_monthlyReportDao") // + .req(MonthlyReportContentRepository.class, (String) null, "m_monthlyReportContentDao") // + .req(OverloadRepository.class, (String) null, "m_overloadDao") // + .req(CapacityUpdateStatusManager.class, (String) null, "m_manager")); + all.add(C(TableCapacityService.class) // + .req(OverloadRepository.class, (String) null, "m_overloadDao") // + .req(HourlyReportRepository.class, (String) null, "m_hourlyReportDao") // + .req(DailyReportRepository.class, (String) null, "m_dailyReportDao") // + .req(WeeklyReportRepository.class, (String) null, "m_weeklyReportDao") // + .req(MonthlyReportRepository.class, (String) null, "m_monthlyReportDao")); return all; } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 6ed3fccd56..9378a92f0b 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -226,6 +226,7 @@ import com.dianping.cat.report.page.overload.task.DailyCapacityUpdater; import com.dianping.cat.report.page.overload.task.HourlyCapacityUpdater; import com.dianping.cat.report.page.overload.task.MonthlyCapacityUpdater; +import com.dianping.cat.report.page.overload.task.TableCapacityService; import com.dianping.cat.report.page.overload.task.WeeklyCapacityUpdater; import com.dianping.cat.report.page.event.service.LocalEventService; import com.dianping.cat.report.page.problem.service.CompositeProblemService; @@ -1561,6 +1562,36 @@ public TaskBuilder capacityUpdateTask(@Qualifier(HourlyCapacityUpdater.ID) Capac return task; } + @Bean + public com.dianping.cat.report.page.overload.JspViewer overloadJspViewer() { + return new com.dianping.cat.report.page.overload.JspViewer(); + } + + @Bean + public TableCapacityService tableCapacityService(OverloadRepository overloadRepository, + HourlyReportRepository hourlyReportRepository, DailyReportRepository dailyReportRepository, + WeeklyReportRepository weeklyReportRepository, MonthlyReportRepository monthlyReportRepository) { + TableCapacityService service = new TableCapacityService(); + + service.setOverloadDao(overloadRepository); + service.setHourlyReportDao(hourlyReportRepository); + service.setDailyReportDao(dailyReportRepository); + service.setWeeklyReportDao(weeklyReportRepository); + service.setMonthlyReportDao(monthlyReportRepository); + return service; + } + + @Bean + public com.dianping.cat.report.page.overload.Handler overloadHandler( + com.dianping.cat.report.page.overload.JspViewer overloadJspViewer, + TableCapacityService tableCapacityService) { + com.dianping.cat.report.page.overload.Handler handler = new com.dianping.cat.report.page.overload.Handler(); + + handler.setJspViewer(overloadJspViewer); + handler.setTableCapacityService(tableCapacityService); + return handler; + } + @Bean public com.dianping.cat.report.page.cross.JspViewer crossJspViewer() { return new com.dianping.cat.report.page.cross.JspViewer(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/Handler.java index 82b7392a2b..096ed53683 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/Handler.java @@ -23,7 +23,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -32,14 +31,13 @@ import com.dianping.cat.Cat; import com.dianping.cat.report.ReportPage; import com.dianping.cat.report.page.overload.task.TableCapacityService; +import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); - @Inject private JspViewer m_jspViewer; - @Inject private TableCapacityService m_tableCapacityService; @Override @@ -52,6 +50,8 @@ public void handleInbound(Context ctx) throws ServletException, IOException { @Override @OutboundActionMeta(name = "overload") public void handleOutbound(Context ctx) throws ServletException, IOException { + refreshSpringBeans(); + Model model = new Model(ctx); Payload payload = ctx.getPayload(); Action action = payload.getAction(); @@ -75,4 +75,24 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { m_jspViewer.view(ctx, model); } } + + private void refreshSpringBeans() { + JspViewer jspViewer = CatSpringContext.getBeanIfAvailable(JspViewer.class); + TableCapacityService tableCapacityService = CatSpringContext.getBeanIfAvailable(TableCapacityService.class); + + if (jspViewer != null) { + m_jspViewer = jspViewer; + } + if (tableCapacityService != null) { + m_tableCapacityService = tableCapacityService; + } + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setTableCapacityService(TableCapacityService tableCapacityService) { + m_tableCapacityService = tableCapacityService; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java index 2741230e0c..c7732c3086 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java @@ -22,8 +22,6 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,22 +36,17 @@ import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; import com.dianping.cat.spring.CatSpringContext; -@Named(type = CapacityUpdater.class, value = DailyCapacityUpdater.ID) public class DailyCapacityUpdater implements CapacityUpdater { private static final Logger LOGGER = LoggerFactory.getLogger(DailyCapacityUpdater.class); public static final String ID = "daily_capacity_updater"; - @Inject private DailyReportContentRepository m_dailyReportContentDao; - @Inject private DailyReportRepository m_dailyReportDao; - @Inject private OverloadRepository m_overloadDao; - @Inject private CapacityUpdateStatusManager m_manager; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java index 9776aabcc1..8a3968dc7f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java @@ -22,8 +22,6 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,22 +36,17 @@ import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; import com.dianping.cat.spring.CatSpringContext; -@Named(type = CapacityUpdater.class, value = HourlyCapacityUpdater.ID) public class HourlyCapacityUpdater implements CapacityUpdater { private static final Logger LOGGER = LoggerFactory.getLogger(HourlyCapacityUpdater.class); public static final String ID = "hourly_capacity_updater"; - @Inject private HourlyReportContentRepository m_hourlyReportContentDao; - @Inject private HourlyReportRepository m_hourlyReportDao; - @Inject private OverloadRepository m_overloadDao; - @Inject private CapacityUpdateStatusManager m_manager; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java index 0c38162f42..b5fa0bd8a3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java @@ -22,8 +22,6 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,22 +36,17 @@ import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; import com.dianping.cat.spring.CatSpringContext; -@Named(type = CapacityUpdater.class, value = MonthlyCapacityUpdater.ID) public class MonthlyCapacityUpdater implements CapacityUpdater { private static final Logger LOGGER = LoggerFactory.getLogger(MonthlyCapacityUpdater.class); public static final String ID = "monthly_capacity_updater"; - @Inject private MonthlyReportRepository m_monthlyReportDao; - @Inject private MonthlyReportContentRepository m_monthlyReportContentDao; - @Inject private OverloadRepository m_overloadDao; - @Inject private CapacityUpdateStatusManager m_manager; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java index 9b0d0e7647..a7fb1c1f0a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java @@ -24,9 +24,6 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,23 +45,17 @@ import com.dianping.cat.home.dal.report.OverloadEntity; import com.dianping.cat.spring.CatSpringContext; -@Named -public class TableCapacityService extends ContainerHolder { +public class TableCapacityService { private static final Logger LOGGER = LoggerFactory.getLogger(TableCapacityService.class); - @Inject private OverloadRepository m_overloadDao; - @Inject private HourlyReportRepository m_hourlyReportDao; - @Inject private DailyReportRepository m_dailyReportDao; - @Inject private WeeklyReportRepository m_weeklyReportDao; - @Inject private MonthlyReportRepository m_monthlyReportDao; private OverloadReport generateOverloadReport(Object object, double reportSize, int reportType) { @@ -178,4 +169,24 @@ private void refreshSpringBeans() { } } + public void setDailyReportDao(DailyReportRepository dailyReportDao) { + m_dailyReportDao = dailyReportDao; + } + + public void setHourlyReportDao(HourlyReportRepository hourlyReportDao) { + m_hourlyReportDao = hourlyReportDao; + } + + public void setMonthlyReportDao(MonthlyReportRepository monthlyReportDao) { + m_monthlyReportDao = monthlyReportDao; + } + + public void setOverloadDao(OverloadRepository overloadDao) { + m_overloadDao = overloadDao; + } + + public void setWeeklyReportDao(WeeklyReportRepository weeklyReportDao) { + m_weeklyReportDao = weeklyReportDao; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java index 66cc591992..0859f55b77 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java @@ -22,8 +22,6 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,22 +36,17 @@ import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; import com.dianping.cat.spring.CatSpringContext; -@Named(type = CapacityUpdater.class, value = WeeklyCapacityUpdater.ID) public class WeeklyCapacityUpdater implements CapacityUpdater { private static final Logger LOGGER = LoggerFactory.getLogger(WeeklyCapacityUpdater.class); public static final String ID = "weekly_capacity_updater"; - @Inject private WeeklyReportRepository m_weeklyReportDao; - @Inject private WeeklyReportContentRepository m_weeklyReportContentDao; - @Inject private OverloadRepository m_overloadDao; - @Inject private CapacityUpdateStatusManager m_manager; @Override diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 5b7b07d0f6..bb932ac6ef 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -638,6 +638,29 @@ + + com.dianping.cat.report.page.overload.Handler + com.dianping.cat.report.page.overload.Handler + + + com.dianping.cat.report.page.overload.JspViewer + m_jspViewer + + + com.dianping.cat.report.page.overload.task.TableCapacityService + m_tableCapacityService + + + + + com.dianping.cat.report.page.overload.JspViewer + com.dianping.cat.report.page.overload.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + com.dianping.cat.report.page.business.Handler com.dianping.cat.report.page.business.Handler @@ -2529,15 +2552,19 @@ com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.overload.OverloadRepository + m_overloadDao com.dianping.cat.report.page.overload.task.CapacityUpdateStatusManager + m_manager @@ -2548,15 +2575,19 @@ com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.overload.OverloadRepository + m_overloadDao com.dianping.cat.report.page.overload.task.CapacityUpdateStatusManager + m_manager @@ -2567,15 +2598,19 @@ com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.overload.OverloadRepository + m_overloadDao com.dianping.cat.report.page.overload.task.CapacityUpdateStatusManager + m_manager @@ -2586,15 +2621,19 @@ com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao com.dianping.cat.core.mybatis.repository.overload.OverloadRepository + m_overloadDao com.dianping.cat.report.page.overload.task.CapacityUpdateStatusManager + m_manager @@ -2604,18 +2643,23 @@ com.dianping.cat.core.mybatis.repository.overload.OverloadRepository + m_overloadDao com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao @@ -3002,27 +3046,6 @@ com.dianping.cat.report.page.monitor.Handler com.dianping.cat.report.page.monitor.Handler - - com.dianping.cat.report.page.overload.Handler - com.dianping.cat.report.page.overload.Handler - - - com.dianping.cat.report.page.overload.JspViewer - - - com.dianping.cat.report.page.overload.task.TableCapacityService - - - - - com.dianping.cat.report.page.overload.JspViewer - com.dianping.cat.report.page.overload.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - org.unidal.web.mvc.Module com.dianping.cat.system.SystemModule From 76862b510cdd3e78a567eefceee9e67b81f2ba29 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 21:40:12 +0800 Subject: [PATCH 064/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=20logview=20?= =?UTF-8?q?=E6=B3=A8=E5=85=A5=E5=B9=B6=E8=A1=A5=E5=85=85=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E6=9F=A5=E6=89=BE=E8=AF=8A=E6=96=AD=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/ComponentsConfigurator.java | 7 ++ .../report/ReportComponentConfigurator.java | 23 ++++--- .../spring/CatHomeSpringConfiguration.java | 5 +- .../cat/report/page/logview/Handler.java | 16 +++-- .../service/CompositeLogViewService.java | 7 ++ .../service/HistoricalMessageService.java | 22 ++++++- .../logview/service/LocalMessageService.java | 30 ++++++--- .../resources/META-INF/plexus/components.xml | 66 ++++++++++++------- 8 files changed, 127 insertions(+), 49 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 064e60a150..fa469170d6 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -287,6 +287,13 @@ public List defineComponents() { "m_tableCapacityService")); all.add(C(com.dianping.cat.report.page.overload.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.logview.Handler.class) // + .req(com.dianping.cat.report.page.logview.JspViewer.class, (String) null, "m_jspViewer") // + .req(ModelService.class, "logview", "m_service") // + .req(com.dianping.cat.config.server.ServerConfigManager.class, (String) null, + "m_configManager")); + all.add(C(com.dianping.cat.report.page.logview.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.business.Handler.class) // .req(com.dianping.cat.report.page.business.JspViewer.class, (String) null, "m_jspViewer") // .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java index 6b27fa682c..1241034670 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java @@ -62,6 +62,7 @@ import com.dianping.cat.report.page.top.service.LocalTopService; import com.dianping.cat.report.page.top.service.TopReportService; import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.system.page.router.config.RouterConfigAdjustor; import com.dianping.cat.system.page.router.config.RouterConfigHandler; @@ -132,16 +133,22 @@ public List defineComponents() { .req(ModelService.class, new String[] { "top-historical" }, "m_services")); // message service - all.add(A(LocalMessageService.class)); + all.add(C(LocalModelService.class, "logview", LocalMessageService.class) // + .req(MessageFinderManager.class, (String) null, "m_finderManager") // + .req(BucketManager.class, "local", "m_bucketManager") // + .req(MessageBucketManager.class, LocalMessageBucketManager.ID, "m_messageBucketManager") // + .req(ServerConfigManager.class, (String) null, "m_configManager") // + .req(MessageConsumer.class, (String) null, "m_consumer")); all.add(C(ModelService.class, "logview-local", LocalMessageService.class) // - .req(MessageFinderManager.class) // - .req(BucketManager.class, "local") // - .req(MessageBucketManager.class, LocalMessageBucketManager.ID) // - .req(ServerConfigManager.class) // - .req(MessageConsumer.class)); + .req(MessageFinderManager.class, (String) null, "m_finderManager") // + .req(BucketManager.class, "local", "m_bucketManager") // + .req(MessageBucketManager.class, LocalMessageBucketManager.ID, "m_messageBucketManager") // + .req(ServerConfigManager.class, (String) null, "m_configManager") // + .req(MessageConsumer.class, (String) null, "m_consumer")); all.add(C(ModelService.class, "logview-historical", HistoricalMessageService.class) // - .req(MessageBucketManager.class, HdfsMessageBucketManager.ID) // - .req(HdfsBucketManager.class).req(ServerConfigManager.class)); + .req(MessageBucketManager.class, HdfsMessageBucketManager.ID, "m_hdfsBucketManager") // + .req(HdfsBucketManager.class, (String) null, "m_bucketManager") // + .req(ServerConfigManager.class, (String) null, "m_configManager")); all.add(C(ModelService.class, "logview", CompositeLogViewService.class) // .req(ServerConfigManager.class, RemoteServersManager.class) // .req(ModelService.class, new String[] { "logview-local", "logview-historical" }, diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 9378a92f0b..a993da7c33 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -2560,10 +2560,13 @@ public LocalModelService localBusinessService(ServerConfigManage } @Bean(initMethod = "initialize") - public LocalModelService localMessageService(ServerConfigManager serverConfigManager) { + public LocalModelService localMessageService(ServerConfigManager serverConfigManager, + MessageFinderManager messageFinderManager, @Qualifier("local") BucketManager localBucketManager) { LocalMessageService service = new LocalMessageService(); service.setConfigManager(serverConfigManager); + service.setFinderManager(messageFinderManager); + service.setBucketManager(localBucketManager); return service; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/logview/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/logview/Handler.java index 6e3d6b366e..195e7a339e 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/logview/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/logview/Handler.java @@ -23,7 +23,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -43,13 +42,10 @@ public class Handler implements PageHandler { private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); - @Inject private JspViewer m_jspViewer; - @Inject(type = ModelService.class, value = "logview") private ModelService m_service; - @Inject private ServerConfigManager m_configManager; private boolean checkStorageTime(MessageId msg) { @@ -163,4 +159,16 @@ private void refreshSpringBeans() { m_configManager = configManager; } } + + public void setConfigManager(ServerConfigManager configManager) { + m_configManager = configManager; + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setService(ModelService service) { + m_service = service; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/CompositeLogViewService.java b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/CompositeLogViewService.java index 6671681ec3..4d3ba5858e 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/CompositeLogViewService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/CompositeLogViewService.java @@ -20,12 +20,17 @@ import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.dianping.cat.report.service.BaseCompositeModelService; import com.dianping.cat.report.service.BaseRemoteModelService; import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; public class CompositeLogViewService extends BaseCompositeModelService { + private static final Logger LOGGER = LoggerFactory.getLogger(CompositeLogViewService.class); + public CompositeLogViewService() { super("logview"); } @@ -50,6 +55,8 @@ protected String merge(ModelRequest request, List> respons } } + LOGGER.warn("Composite logview service returned empty result, messageId={}, domain={}, period={}, responseCount={}.", + request.getProperty("messageId"), request.getDomain(), request.getPeriod(), responses.size()); return null; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/HistoricalMessageService.java b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/HistoricalMessageService.java index 9ccc80f547..700cd542f7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/HistoricalMessageService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/HistoricalMessageService.java @@ -25,7 +25,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.cat.message.storage.hdfs.HdfsBucketManager; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.hadoop.hdfs.HdfsMessageBucketManager; @@ -42,10 +41,8 @@ public class HistoricalMessageService extends BaseHistoricalModelService { private static final Logger LOGGER = LoggerFactory.getLogger(HistoricalMessageService.class); - @Inject private HdfsBucketManager m_bucketManager; - @Inject(type = MessageBucketManager.class, value = HdfsMessageBucketManager.ID) private MessageBucketManager m_hdfsBucketManager; private WaterfallMessageCodec m_waterfall = new WaterfallMessageCodec(); @@ -69,11 +66,17 @@ protected String buildModel(ModelRequest request) throws Exception { protected String buildOldMessageModel(ModelRequest request) throws Exception { String messageId = request.getProperty("messageId"); Cat.logEvent("LoadMessage", "messageTree", Event.SUCCESS, messageId); + if (m_hdfsBucketManager == null) { + LOGGER.warn("HDFS message bucket manager is not configured for historical old logview lookup, request={}.", + request); + return null; + } MessageTree tree = m_hdfsBucketManager.loadMessage(messageId); if (tree != null) { return toString(request, tree); } else { + LOGGER.warn("Historical old logview message not found, messageId={}, request={}.", messageId, request); return null; } } @@ -82,11 +85,16 @@ protected String buildNewMessageModel(ModelRequest request) throws Exception { String messageId = request.getProperty("messageId"); Cat.logEvent("LoadMessage", "messageTree", Event.SUCCESS, messageId); MessageId id = MessageId.parse(messageId); + if (m_bucketManager == null) { + LOGGER.warn("HDFS bucket manager is not configured for historical new logview lookup, request={}.", request); + return null; + } MessageTree tree = m_bucketManager.loadMessage(id); if (tree != null) { return toString(request, tree); } else { + LOGGER.warn("Historical new logview message not found, messageId={}, request={}.", messageId, request); return null; } } @@ -116,4 +124,12 @@ protected String toString(ModelRequest request, MessageTree tree) { } return null; } + + public void setBucketManager(HdfsBucketManager bucketManager) { + m_bucketManager = bucketManager; + } + + public void setHdfsBucketManager(MessageBucketManager hdfsBucketManager) { + m_hdfsBucketManager = hdfsBucketManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java index 3630915c6c..246bc19bf6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java @@ -27,8 +27,6 @@ import org.unidal.cat.message.storage.Bucket; import org.unidal.cat.message.storage.BucketManager; import org.unidal.cat.message.storage.MessageFinderManager; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; @@ -49,19 +47,15 @@ import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; -@Named(type = LocalModelService.class, value = "logview") public class LocalMessageService extends LocalModelService implements ModelService { private static final Logger LOGGER = LoggerFactory.getLogger(LocalMessageService.class); public static final String ID = DumpAnalyzer.ID; - @Inject private MessageFinderManager m_finderManager; - @Inject("local") private BucketManager m_bucketManager; - @Inject(type = MessageBucketManager.class, value = LocalMessageBucketManager.ID) private MessageBucketManager m_messageBucketManager; private WaterfallMessageCodec m_waterfall = new WaterfallMessageCodec(); @@ -90,17 +84,20 @@ private String buildNewReport(ModelRequest request, ModelPeriod period, String d MessageId id = MessageId.parse(messageId); ByteBuf buf = null; MessageTree tree = null; + String localHostAddress = NetworkInterfaceManager.INSTANCE.getLocalHostAddress(); if (m_finderManager != null) { buf = m_finderManager.find(id); + } else { + LOGGER.warn("Message finder manager is not configured for local logview lookup, messageId={}, period={}, domain={}.", + messageId, period, domain); } if (buf != null) { tree = CodecHandler.decode(changeBuf(buf)); } if (tree == null && m_bucketManager != null) { - Bucket bucket = m_bucketManager.getBucket(id.getDomain(), - NetworkInterfaceManager.INSTANCE.getLocalHostAddress(), id.getHour(), false); + Bucket bucket = m_bucketManager.getBucket(id.getDomain(), localHostAddress, id.getHour(), false); if (bucket != null) { bucket.flush(); @@ -110,7 +107,14 @@ private String buildNewReport(ModelRequest request, ModelPeriod period, String d if (data != null) { tree = CodecHandler.decode(changeBuf(data)); } + } else { + LOGGER.warn( + "Local bucket is not available for logview lookup, messageId={}, messageDomain={}, localHost={}, hour={}, period={}, domain={}.", + messageId, id.getDomain(), localHostAddress, id.getHour(), period, domain); } + } else if (tree == null) { + LOGGER.warn("Local bucket manager is not configured for logview lookup, messageId={}, period={}, domain={}.", + messageId, period, domain); } if (tree != null) { @@ -131,6 +135,10 @@ private String buildNewReport(ModelRequest request, ModelPeriod period, String d } } + LOGGER.warn( + "New local logview message not found, messageId={}, messageDomain={}, localHost={}, hour={}, period={}, domain={}, finderManagerConfigured={}, bucketManagerConfigured={}.", + messageId, id.getDomain(), localHostAddress, id.getHour(), period, domain, m_finderManager != null, + m_bucketManager != null); return null; } @@ -153,6 +161,9 @@ public String buildOldReport(ModelRequest request, ModelPeriod period, String do if (m_messageBucketManager != null) { tree = m_messageBucketManager.loadMessage(messageId); + } else { + LOGGER.warn("Old local message bucket manager is not configured for logview lookup, messageId={}, period={}, domain={}.", + messageId, period, domain); } if (tree != null) { @@ -172,6 +183,9 @@ public String buildOldReport(ModelRequest request, ModelPeriod period, String do waterfall, e); } } + LOGGER.warn( + "Old local logview message not found, messageId={}, period={}, domain={}, waterfall={}, messageBucketManagerConfigured={}.", + messageId, period, domain, waterfall, m_messageBucketManager != null); return null; } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index bb932ac6ef..79bd1d5cec 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -661,6 +661,34 @@ + + com.dianping.cat.report.page.logview.Handler + com.dianping.cat.report.page.logview.Handler + + + com.dianping.cat.report.page.logview.JspViewer + m_jspViewer + + + com.dianping.cat.report.service.ModelService + logview + m_service + + + com.dianping.cat.config.server.ServerConfigManager + m_configManager + + + + + com.dianping.cat.report.page.logview.JspViewer + com.dianping.cat.report.page.logview.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + com.dianping.cat.report.page.business.Handler com.dianping.cat.report.page.business.Handler @@ -2462,20 +2490,25 @@ org.unidal.cat.message.storage.MessageFinderManager + m_finderManager org.unidal.cat.message.storage.BucketManager local + m_bucketManager com.dianping.cat.message.storage.MessageBucketManager local + m_messageBucketManager com.dianping.cat.config.server.ServerConfigManager + m_configManager com.dianping.cat.analysis.MessageConsumer + m_consumer @@ -2486,20 +2519,25 @@ org.unidal.cat.message.storage.MessageFinderManager + m_finderManager org.unidal.cat.message.storage.BucketManager local + m_bucketManager com.dianping.cat.message.storage.MessageBucketManager local + m_messageBucketManager com.dianping.cat.config.server.ServerConfigManager + m_configManager com.dianping.cat.analysis.MessageConsumer + m_consumer @@ -2511,12 +2549,15 @@ com.dianping.cat.message.storage.MessageBucketManager hdfs + m_hdfsBucketManager org.unidal.cat.message.storage.hdfs.HdfsBucketManager + m_bucketManager com.dianping.cat.config.server.ServerConfigManager + m_configManager @@ -2971,31 +3012,6 @@ com.dianping.cat.report.ReportModule com.dianping.cat.report.ReportModule - - com.dianping.cat.report.page.logview.Handler - com.dianping.cat.report.page.logview.Handler - - - com.dianping.cat.report.page.logview.JspViewer - - - com.dianping.cat.report.service.ModelService - logview - - - com.dianping.cat.config.server.ServerConfigManager - - - - - com.dianping.cat.report.page.logview.JspViewer - com.dianping.cat.report.page.logview.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - com.dianping.cat.report.page.model.Handler com.dianping.cat.report.page.model.Handler From 700f8a3ccb5da47a7fb0347fa5a554ed57d9cd0f Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 21:48:48 +0800 Subject: [PATCH 065/231] =?UTF-8?q?=E5=AE=8C=E6=88=90=20statistics=20?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=B3=A8=E5=85=A5=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/ComponentsConfigurator.java | 21 ++- .../report/ReportComponentConfigurator.java | 30 +++- .../spring/CatHomeSpringConfiguration.java | 27 ++++ .../cat/report/page/statistics/Handler.java | 94 ++++++++----- .../service/ClientReportService.java | 2 - .../service/HeavyReportService.java | 2 - .../statistics/service/JarReportService.java | 2 - .../service/ServiceReportService.java | 2 - .../service/UtilizationReportService.java | 2 - .../resources/META-INF/plexus/components.xml | 133 ++++++++++++------ 10 files changed, 223 insertions(+), 92 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index fa469170d6..59ad438e46 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -70,7 +70,8 @@ import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.helper.JsonBuilder; -import com.dianping.cat.mvc.PayloadNormalizer; +import com.dianping.cat.mvc.PayloadNormalizer; +import com.dianping.cat.report.alert.summary.AlertSummaryExecutor; import com.dianping.cat.report.HourlyReportContentTableProvider; import com.dianping.cat.report.HourlyReportTableProvider; import com.dianping.cat.report.graph.svg.DefaultGraphBuilder; @@ -80,8 +81,14 @@ import com.dianping.cat.report.page.event.service.EventReportService; import com.dianping.cat.report.page.event.transform.EventMergeHelper; import com.dianping.cat.report.page.problem.service.ProblemReportService; +import com.dianping.cat.report.page.statistics.service.ClientReportService; +import com.dianping.cat.report.page.statistics.service.HeavyReportService; +import com.dianping.cat.report.page.statistics.service.JarReportService; +import com.dianping.cat.report.page.statistics.service.ServiceReportService; +import com.dianping.cat.report.page.statistics.service.UtilizationReportService; import com.dianping.cat.report.page.transaction.service.TransactionReportService; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.service.ProjectService; import com.dianping.cat.system.page.permission.ResourceConfigManager; import com.dianping.cat.system.page.permission.UserConfigManager; @@ -294,6 +301,18 @@ public List defineComponents() { "m_configManager")); all.add(C(com.dianping.cat.report.page.logview.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.statistics.Handler.class) // + .req(com.dianping.cat.report.page.statistics.JspViewer.class, (String) null, "m_jspViewer") // + .req(HeavyReportService.class, (String) null, "m_heavyReportService") // + .req(UtilizationReportService.class, (String) null, "m_utilizationReportService") // + .req(ServiceReportService.class, (String) null, "m_serviceReportService") // + .req(ClientReportService.class, (String) null, "m_clientReportService") // + .req(JarReportService.class, (String) null, "m_jarReportService") // + .req(ProjectService.class, (String) null, "m_projectService") // + .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // + .req(AlertSummaryExecutor.class, (String) null, "m_executor")); + all.add(C(com.dianping.cat.report.page.statistics.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.report.page.business.Handler.class) // .req(com.dianping.cat.report.page.business.JspViewer.class, (String) null, "m_jspViewer") // .req(PayloadNormalizer.class, (String) null, "m_normalizePayload") // diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java index 1241034670..9cab9e4bd3 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java @@ -29,6 +29,14 @@ import com.dianping.cat.analysis.MessageConsumer; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.consumer.cross.CrossAnalyzer; import com.dianping.cat.consumer.dump.LocalMessageBucketManager; import com.dianping.cat.consumer.matrix.MatrixAnalyzer; @@ -75,11 +83,11 @@ public class ReportComponentConfigurator extends AbstractResourceConfigurator { public List defineComponents() { List all = new ArrayList(); - all.add(A(UtilizationReportService.class)); + all.add(reportService(UtilizationReportService.class)); - all.add(A(ServiceReportService.class)); + all.add(reportService(ServiceReportService.class)); - all.add(A(HeavyReportService.class)); + all.add(reportService(HeavyReportService.class)); all.add(A(RouterConfigManager.class)); all.add(A(RouterConfigHandler.class)); @@ -87,9 +95,9 @@ public List defineComponents() { all.add(A(CachedRouterConfigService.class)); all.add(A(RouterConfigAdjustor.class)); - all.add(A(JarReportService.class)); + all.add(reportService(JarReportService.class)); - all.add(A(ClientReportService.class)); + all.add(reportService(ClientReportService.class)); // cross report all.add(A(CrossReportService.class)); @@ -156,4 +164,16 @@ public List defineComponents() { return all; } + + private Component reportService(Class implementation) { + return C(implementation) // + .req(HourlyReportRepository.class, (String) null, "m_hourlyReportDao") // + .req(HourlyReportContentRepository.class, (String) null, "m_hourlyReportContentDao") // + .req(DailyReportRepository.class, (String) null, "m_dailyReportDao") // + .req(DailyReportContentRepository.class, (String) null, "m_dailyReportContentDao") // + .req(WeeklyReportRepository.class, (String) null, "m_weeklyReportDao") // + .req(WeeklyReportContentRepository.class, (String) null, "m_weeklyReportContentDao") // + .req(MonthlyReportRepository.class, (String) null, "m_monthlyReportDao") // + .req(MonthlyReportContentRepository.class, (String) null, "m_monthlyReportContentDao"); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index a993da7c33..97942404fc 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -1369,6 +1369,33 @@ public com.dianping.cat.report.page.matrix.JspViewer matrixJspViewer() { return new com.dianping.cat.report.page.matrix.JspViewer(); } + @Bean + public com.dianping.cat.report.page.statistics.JspViewer statisticsJspViewer() { + return new com.dianping.cat.report.page.statistics.JspViewer(); + } + + @Bean + public com.dianping.cat.report.page.statistics.Handler statisticsHandler( + com.dianping.cat.report.page.statistics.JspViewer statisticsJspViewer, + HeavyReportService heavyReportService, UtilizationReportService utilizationReportService, + ServiceReportService serviceReportService, ClientReportService clientReportService, + JarReportService jarReportService, ProjectService projectService, PayloadNormalizer payloadNormalizer, + AlertSummaryExecutor alertSummaryExecutor) { + com.dianping.cat.report.page.statistics.Handler handler = + new com.dianping.cat.report.page.statistics.Handler(); + + handler.setJspViewer(statisticsJspViewer); + handler.setHeavyReportService(heavyReportService); + handler.setUtilizationReportService(utilizationReportService); + handler.setServiceReportService(serviceReportService); + handler.setClientReportService(clientReportService); + handler.setJarReportService(jarReportService); + handler.setProjectService(projectService); + handler.setNormalizePayload(payloadNormalizer); + handler.setExecutor(alertSummaryExecutor); + return handler; + } + @Bean public com.dianping.cat.report.page.matrix.Handler matrixHandler( com.dianping.cat.report.page.matrix.JspViewer matrixJspViewer, MatrixReportService matrixReportService, diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/Handler.java index 5c599690c6..2975f71b7a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/Handler.java @@ -28,8 +28,7 @@ import java.util.LinkedList; import java.util.List; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.util.StringUtils; +import org.unidal.lookup.util.StringUtils; import org.unidal.tuple.Pair; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -63,33 +62,24 @@ import com.dianping.cat.service.ProjectService; import com.dianping.cat.spring.CatSpringContext; -public class Handler implements PageHandler { - @Inject - private JspViewer m_jspViewer; - - @Inject - private HeavyReportService m_heavyReportService; - - @Inject - private UtilizationReportService m_utilizationReportService; - - @Inject - private ServiceReportService m_serviceReportService; - - @Inject - private ClientReportService m_clientReportService; - - @Inject - private JarReportService m_jarReportService; - - @Inject - private ProjectService m_projectService; - - @Inject - private PayloadNormalizer m_normalizePayload; - - @Inject - private AlertSummaryExecutor m_executor; +public class Handler implements PageHandler { + private JspViewer m_jspViewer; + + private HeavyReportService m_heavyReportService; + + private UtilizationReportService m_utilizationReportService; + + private ServiceReportService m_serviceReportService; + + private ClientReportService m_clientReportService; + + private JarReportService m_jarReportService; + + private ProjectService m_projectService; + + private PayloadNormalizer m_normalizePayload; + + private AlertSummaryExecutor m_executor; private void buildHeavyInfo(Model model, Payload payload) { HeavyReport heavyReport = queryHeavyReport(payload); @@ -287,7 +277,7 @@ private UtilizationReport queryUtilizationReport(Payload payload) { return report; } - private List sort(ServiceReport serviceReport, final String sortBy) { + private List sort(ServiceReport serviceReport, final String sortBy) { List result = new ArrayList( serviceReport.getDomains().values()); Collections.sort(result, new Comparator() { @@ -311,7 +301,43 @@ public int compare(com.dianping.cat.home.service.entity.Domain d1, com.dianping. } } }); - return result; - } - -} + return result; + } + + public void setClientReportService(ClientReportService clientReportService) { + m_clientReportService = clientReportService; + } + + public void setExecutor(AlertSummaryExecutor executor) { + m_executor = executor; + } + + public void setHeavyReportService(HeavyReportService heavyReportService) { + m_heavyReportService = heavyReportService; + } + + public void setJarReportService(JarReportService jarReportService) { + m_jarReportService = jarReportService; + } + + public void setJspViewer(JspViewer jspViewer) { + m_jspViewer = jspViewer; + } + + public void setNormalizePayload(PayloadNormalizer normalizePayload) { + m_normalizePayload = normalizePayload; + } + + public void setProjectService(ProjectService projectService) { + m_projectService = projectService; + } + + public void setServiceReportService(ServiceReportService serviceReportService) { + m_serviceReportService = serviceReportService; + } + + public void setUtilizationReportService(UtilizationReportService utilizationReportService) { + m_utilizationReportService = utilizationReportService; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java index bb5e8be997..9485921889 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java @@ -24,7 +24,6 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -36,7 +35,6 @@ import com.dianping.cat.home.service.client.transform.DefaultNativeParser; import com.dianping.cat.report.service.AbstractReportService; -@Named public class ClientReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(ClientReportService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java index 3e98456060..510d8bbde8 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java @@ -25,7 +25,6 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -51,7 +50,6 @@ import com.dianping.cat.report.page.statistics.task.heavy.HeavyReportMerger; import com.dianping.cat.report.service.AbstractReportService; -@Named public class HeavyReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(HeavyReportService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java index df139fe3a6..da5c619954 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java @@ -24,7 +24,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -37,7 +36,6 @@ import com.dianping.cat.home.jar.transform.DefaultNativeParser; import com.dianping.cat.report.service.AbstractReportService; -@Named public class JarReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(JarReportService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java index 159c99eceb..ec61e78c7e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java @@ -25,7 +25,6 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -51,7 +50,6 @@ import com.dianping.cat.report.page.statistics.task.service.ServiceReportMerger; import com.dianping.cat.report.service.AbstractReportService; -@Named public class ServiceReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(ServiceReportService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java index 4cfc027d7c..0fcd23e26f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java @@ -25,7 +25,6 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -51,7 +50,6 @@ import com.dianping.cat.report.page.statistics.task.utilization.UtilizationReportMerger; import com.dianping.cat.report.service.AbstractReportService; -@Named public class UtilizationReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(UtilizationReportService.class); diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 79bd1d5cec..88d5e8b126 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -689,6 +689,57 @@ + + com.dianping.cat.report.page.statistics.Handler + com.dianping.cat.report.page.statistics.Handler + + + com.dianping.cat.report.page.statistics.JspViewer + m_jspViewer + + + com.dianping.cat.report.page.statistics.service.HeavyReportService + m_heavyReportService + + + com.dianping.cat.report.page.statistics.service.UtilizationReportService + m_utilizationReportService + + + com.dianping.cat.report.page.statistics.service.ServiceReportService + m_serviceReportService + + + com.dianping.cat.report.page.statistics.service.ClientReportService + m_clientReportService + + + com.dianping.cat.report.page.statistics.service.JarReportService + m_jarReportService + + + com.dianping.cat.service.ProjectService + m_projectService + + + com.dianping.cat.mvc.PayloadNormalizer + m_normalizePayload + + + com.dianping.cat.report.alert.summary.AlertSummaryExecutor + m_executor + + + + + com.dianping.cat.report.page.statistics.JspViewer + com.dianping.cat.report.page.statistics.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + com.dianping.cat.report.page.business.Handler com.dianping.cat.report.page.business.Handler @@ -1924,27 +1975,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -1954,27 +2013,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -1984,27 +2051,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -2113,27 +2188,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -2143,27 +2226,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -3016,48 +3107,6 @@ com.dianping.cat.report.page.model.Handler com.dianping.cat.report.page.model.Handler - - com.dianping.cat.report.page.statistics.Handler - com.dianping.cat.report.page.statistics.Handler - - - com.dianping.cat.report.page.statistics.JspViewer - - - com.dianping.cat.report.page.statistics.service.HeavyReportService - - - com.dianping.cat.report.page.statistics.service.UtilizationReportService - - - com.dianping.cat.report.page.statistics.service.ServiceReportService - - - com.dianping.cat.report.page.statistics.service.ClientReportService - - - com.dianping.cat.report.page.statistics.service.JarReportService - - - com.dianping.cat.service.ProjectService - - - com.dianping.cat.mvc.PayloadNormalizer - - - com.dianping.cat.report.alert.summary.AlertSummaryExecutor - - - - - com.dianping.cat.report.page.statistics.JspViewer - com.dianping.cat.report.page.statistics.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - com.dianping.cat.report.page.monitor.Handler com.dianping.cat.report.page.monitor.Handler From 6978e90cd3973aff2dafd611470d524978422152 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 12 Jun 2026 22:54:21 +0800 Subject: [PATCH 066/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E4=B8=8E=E4=BB=BB=E5=8A=A1=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=20Unidal=20=E6=B3=A8=E8=A7=A3=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/ComponentsConfigurator.java | 8 +- .../report/EventComponentConfigurator.java | 30 ++++- .../HeartbeatComponentConfigurator.java | 33 ++++- .../report/MetricComponentConfigurator.java | 44 ++++-- .../report/ProblemComponentConfigurator.java | 33 ++++- .../report/ReportComponentConfigurator.java | 30 +++-- .../report/StorageComponentConfigurator.java | 37 +++++- .../TransactionComponentConfigurator.java | 32 ++++- .../graph/metric/impl/DataExtractorImpl.java | 3 - .../report/graph/svg/DefaultGraphBuilder.java | 5 - .../graph/svg/DefaultValueTranslater.java | 3 - .../service/BusinessReportService.java | 2 - .../service/LocalBusinessService.java | 3 - .../page/business/task/BusinessKeyHelper.java | 3 - .../business/task/BusinessPointParser.java | 3 - .../cross/service/CrossReportService.java | 2 - .../page/cross/service/LocalCrossService.java | 5 - .../event/service/EventReportService.java | 2 - .../page/event/service/LocalEventService.java | 5 - .../service/HeartbeatReportService.java | 2 - .../service/HistoricalHeartbeatService.java | 3 - .../service/LocalHeartbeatService.java | 4 - .../matrix/service/LocalMatrixService.java | 5 - .../matrix/service/MatrixReportService.java | 2 - .../service/DefaultBaselineService.java | 4 - .../metric/task/BaselineConfigManager.java | 3 - .../metric/task/DefaultBaselineCreator.java | 3 - .../service/HistoricalProblemService.java | 3 - .../problem/service/LocalProblemService.java | 5 - .../problem/service/ProblemReportService.java | 2 - .../report/page/state/StateGraphBuilder.java | 2 - .../page/state/service/LocalStateService.java | 5 - .../state/service/StateReportService.java | 2 - .../display/StorageAlertInfoBuilder.java | 2 - .../storage/service/LocalStorageService.java | 4 - .../storage/task/StorageReportService.java | 2 - .../page/top/service/LocalTopService.java | 5 - .../page/top/service/TopReportService.java | 2 - .../service/LocalTransactionService.java | 4 - .../service/TransactionReportService.java | 2 - .../transform/TransactionMergeHelper.java | 2 - .../task/reload/AbstractReportReloader.java | 4 - .../report/task/reload/ReportReloadTask.java | 4 - .../reload/impl/BusinessReportReloader.java | 5 - .../task/reload/impl/CrossReportReloader.java | 5 - .../reload/impl/DependencyReportReloader.java | 5 - .../task/reload/impl/EventReportReloader.java | 5 - .../reload/impl/HeartbeatReportReloader.java | 5 - .../reload/impl/MatrixReportReloader.java | 5 - .../reload/impl/ProblemReportReloader.java | 5 - .../task/reload/impl/StateReportReloader.java | 5 - .../reload/impl/StorageReportReloader.java | 5 - .../task/reload/impl/TopReportReloader.java | 5 - .../impl/TransactionReportReloader.java | 5 - .../resources/META-INF/plexus/components.xml | 125 ++++++++++++++++-- 55 files changed, 324 insertions(+), 215 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 59ad438e46..b303972ee1 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -77,6 +77,7 @@ import com.dianping.cat.report.graph.svg.DefaultGraphBuilder; import com.dianping.cat.report.graph.svg.DefaultValueTranslater; import com.dianping.cat.report.graph.svg.GraphBuilder; +import com.dianping.cat.report.graph.svg.ValueTranslater; import com.dianping.cat.report.page.DomainGroupConfigManager; import com.dianping.cat.report.page.event.service.EventReportService; import com.dianping.cat.report.page.event.transform.EventMergeHelper; @@ -110,9 +111,10 @@ private List defineCommonComponents() { all.add(A(JsonBuilder.class)); - all.add(A(DefaultValueTranslater.class)); - - all.add(A(DefaultGraphBuilder.class)); + all.add(C(ValueTranslater.class, DefaultValueTranslater.class)); + + all.add(C(GraphBuilder.class, DefaultGraphBuilder.class) // + .req(ValueTranslater.class, (String) null, "m_translater")); all.add(C(EventMergeHelper.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java index b9b68ae047..92bef6eb34 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java @@ -24,11 +24,21 @@ import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; +import com.dianping.cat.analysis.MessageConsumer; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.consumer.event.EventAnalyzer; +import com.dianping.cat.report.ReportBucketManager; import com.dianping.cat.report.alert.event.EventAlert; import com.dianping.cat.report.alert.event.EventContactor; import com.dianping.cat.report.alert.event.EventDecorator; @@ -38,6 +48,7 @@ import com.dianping.cat.report.page.event.service.HistoricalEventService; import com.dianping.cat.report.page.event.service.LocalEventService; import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.service.ProjectService; @@ -53,9 +64,12 @@ public List defineComponents() { all.add(C(Decorator.class, EventDecorator.ID, EventDecorator.class)); all.add(A(EventAlert.class)); - all.add(A(EventReportService.class)); + all.add(reportService(EventReportService.class)); - all.add(A(LocalEventService.class)); + all.add(C(LocalModelService.class, LocalEventService.ID, LocalEventService.class) // + .req(ReportBucketManager.class, (String) null, "m_bucketManager") // + .req(ServerConfigManager.class, (String) null, "m_configManager") // + .req(MessageConsumer.class, (String) null, "m_consumer")); all.add(C(ModelService.class, "event-historical", HistoricalEventService.class) // .req(EventReportService.class, ServerConfigManager.class)); all.add(C(ModelService.class, EventAnalyzer.ID, CompositeEventService.class) // @@ -64,4 +78,16 @@ public List defineComponents() { return all; } + + private Component reportService(Class implementation) { + return C(implementation) // + .req(HourlyReportRepository.class, (String) null, "m_hourlyReportDao") // + .req(HourlyReportContentRepository.class, (String) null, "m_hourlyReportContentDao") // + .req(DailyReportRepository.class, (String) null, "m_dailyReportDao") // + .req(DailyReportContentRepository.class, (String) null, "m_dailyReportContentDao") // + .req(WeeklyReportRepository.class, (String) null, "m_weeklyReportDao") // + .req(WeeklyReportContentRepository.class, (String) null, "m_weeklyReportContentDao") // + .req(MonthlyReportRepository.class, (String) null, "m_monthlyReportDao") // + .req(MonthlyReportContentRepository.class, (String) null, "m_monthlyReportContentDao"); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java index b9a3a5b402..0e82d5c5ce 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java @@ -24,11 +24,21 @@ import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; +import com.dianping.cat.analysis.MessageConsumer; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; +import com.dianping.cat.report.ReportBucketManager; import com.dianping.cat.report.alert.heartbeat.HeartbeatAlert; import com.dianping.cat.report.alert.heartbeat.HeartbeatContactor; import com.dianping.cat.report.alert.heartbeat.HeartbeatDecorator; @@ -38,6 +48,7 @@ import com.dianping.cat.report.page.heartbeat.service.HistoricalHeartbeatService; import com.dianping.cat.report.page.heartbeat.service.LocalHeartbeatService; import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.service.ProjectService; @@ -48,11 +59,15 @@ public List defineComponents() { all.add(A(HeartbeatRuleConfigManager.class)); - all.add(A(HeartbeatReportService.class)); + all.add(reportService(HeartbeatReportService.class)); - all.add(A(LocalHeartbeatService.class)); + all.add(C(LocalModelService.class, LocalHeartbeatService.ID, LocalHeartbeatService.class) // + .req(ReportBucketManager.class, (String) null, "m_bucketManager") // + .req(ServerConfigManager.class, (String) null, "m_configManager") // + .req(MessageConsumer.class, (String) null, "m_consumer")); all.add(C(ModelService.class, "heartbeat-historical", HistoricalHeartbeatService.class) // - .req(HeartbeatReportService.class, ServerConfigManager.class)); + .req(HeartbeatReportService.class, (String) null, "m_reportService") // + .req(ServerConfigManager.class, (String) null, "m_configManager")); all.add(C(ModelService.class, HeartbeatAnalyzer.ID, CompositeHeartbeatService.class) // .req(ServerConfigManager.class, RemoteServersManager.class) // .req(ModelService.class, new String[] { "heartbeat-historical" }, "m_services")); @@ -65,4 +80,16 @@ public List defineComponents() { return all; } + + private Component reportService(Class implementation) { + return C(implementation) // + .req(HourlyReportRepository.class, (String) null, "m_hourlyReportDao") // + .req(HourlyReportContentRepository.class, (String) null, "m_hourlyReportContentDao") // + .req(DailyReportRepository.class, (String) null, "m_dailyReportDao") // + .req(DailyReportContentRepository.class, (String) null, "m_dailyReportContentDao") // + .req(WeeklyReportRepository.class, (String) null, "m_weeklyReportDao") // + .req(WeeklyReportContentRepository.class, (String) null, "m_weeklyReportContentDao") // + .req(MonthlyReportRepository.class, (String) null, "m_monthlyReportDao") // + .req(MonthlyReportContentRepository.class, (String) null, "m_monthlyReportContentDao"); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java index 213669ea8b..df2e99080e 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java @@ -30,21 +30,33 @@ import com.dianping.cat.analysis.MessageConsumer; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.consumer.business.BusinessAnalyzer; +import com.dianping.cat.core.mybatis.repository.baseline.BaselineRepository; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.report.alert.business.BusinessAlert; import com.dianping.cat.report.alert.business.BusinessContactor; import com.dianping.cat.report.alert.business.BusinessDecorator; import com.dianping.cat.report.alert.business.BusinessReportGroupService; import com.dianping.cat.report.alert.business.BusinessRuleConfigManager; import com.dianping.cat.report.alert.summary.AlertSummaryExecutor; +import com.dianping.cat.report.graph.metric.DataExtractor; import com.dianping.cat.report.graph.metric.impl.DataExtractorImpl; +import com.dianping.cat.report.ReportBucketManager; import com.dianping.cat.report.page.business.service.BusinessReportService; import com.dianping.cat.report.page.business.service.CompositeBusinessService; import com.dianping.cat.report.page.business.service.HistoricalBusinessService; import com.dianping.cat.report.page.business.service.LocalBusinessService; import com.dianping.cat.report.page.business.task.BusinessKeyHelper; import com.dianping.cat.report.page.business.task.BusinessPointParser; -import com.dianping.cat.report.ReportBucketManager; +import com.dianping.cat.report.page.metric.service.BaselineService; import com.dianping.cat.report.page.metric.service.DefaultBaselineService; +import com.dianping.cat.report.page.metric.task.BaselineCreator; import com.dianping.cat.report.page.metric.task.BaselineConfigManager; import com.dianping.cat.report.page.metric.task.DefaultBaselineCreator; import com.dianping.cat.report.server.RemoteServersManager; @@ -59,9 +71,9 @@ public List defineComponents() { all.add(A(BusinessRuleConfigManager.class)); - all.add(A(BusinessReportService.class)); + all.add(reportService(BusinessReportService.class)); - all.add(A(DataExtractorImpl.class)); + all.add(C(DataExtractor.class, DataExtractorImpl.class)); all.add(A(BusinessReportGroupService.class)); @@ -70,16 +82,18 @@ public List defineComponents() { .req(ServerConfigManager.class, (String) null, "m_configManager") // .req(MessageConsumer.class, (String) null, "m_consumer")); all.add(C(ModelService.class, "business-historical", HistoricalBusinessService.class) // - .req(BusinessReportService.class, ServerConfigManager.class)); + .req(BusinessReportService.class, (String) null, "m_reportService") // + .req(ServerConfigManager.class, (String) null, "m_configManager")); all.add(C(ModelService.class, BusinessAnalyzer.ID, CompositeBusinessService.class) // .req(ServerConfigManager.class, RemoteServersManager.class) // .req(ModelService.class, new String[] { "business-historical" }, "m_services")); - all.add(A(BaselineConfigManager.class)); - all.add(A(BusinessPointParser.class)); - all.add(A(BusinessKeyHelper.class)); - all.add(A(DefaultBaselineCreator.class)); - all.add(A(DefaultBaselineService.class)); + all.add(C(BaselineConfigManager.class)); + all.add(C(BusinessPointParser.class)); + all.add(C(BusinessKeyHelper.class)); + all.add(C(BaselineCreator.class, DefaultBaselineCreator.class)); + all.add(C(BaselineService.class, DefaultBaselineService.class) // + .req(BaselineRepository.class, (String) null, "m_baselineDao")); all.add(C(Contactor.class, BusinessContactor.ID, BusinessContactor.class) .req(ProjectService.class, AlertConfigManager.class)); @@ -91,4 +105,16 @@ public List defineComponents() { return all; } + + private Component reportService(Class implementation) { + return C(implementation) // + .req(HourlyReportRepository.class, (String) null, "m_hourlyReportDao") // + .req(HourlyReportContentRepository.class, (String) null, "m_hourlyReportContentDao") // + .req(DailyReportRepository.class, (String) null, "m_dailyReportDao") // + .req(DailyReportContentRepository.class, (String) null, "m_dailyReportContentDao") // + .req(WeeklyReportRepository.class, (String) null, "m_weeklyReportDao") // + .req(WeeklyReportContentRepository.class, (String) null, "m_weeklyReportContentDao") // + .req(MonthlyReportRepository.class, (String) null, "m_monthlyReportDao") // + .req(MonthlyReportContentRepository.class, (String) null, "m_monthlyReportContentDao"); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java index bc625053c8..5eb4509c93 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java @@ -24,11 +24,21 @@ import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; +import com.dianping.cat.analysis.MessageConsumer; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.consumer.problem.ProblemAnalyzer; +import com.dianping.cat.report.ReportBucketManager; import com.dianping.cat.report.alert.exception.AlertExceptionBuilder; import com.dianping.cat.report.alert.exception.ExceptionAlert; import com.dianping.cat.report.alert.exception.ExceptionContactor; @@ -45,6 +55,7 @@ import com.dianping.cat.report.page.problem.service.LocalProblemService; import com.dianping.cat.report.page.problem.service.ProblemReportService; import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.service.ProjectService; @@ -55,11 +66,15 @@ public List defineComponents() { all.add(A(ExceptionRuleConfigManager.class)); - all.add(A(ProblemReportService.class)); + all.add(reportService(ProblemReportService.class)); - all.add(A(LocalProblemService.class)); + all.add(C(LocalModelService.class, LocalProblemService.ID, LocalProblemService.class) // + .req(ReportBucketManager.class, (String) null, "m_bucketManager") // + .req(ServerConfigManager.class, (String) null, "m_configManager") // + .req(MessageConsumer.class, (String) null, "m_consumer")); all.add(C(ModelService.class, "problem-historical", HistoricalProblemService.class) // - .req(ProblemReportService.class, ServerConfigManager.class)); + .req(ProblemReportService.class, (String) null, "m_reportService") // + .req(ServerConfigManager.class, (String) null, "m_configManager")); all.add(C(ModelService.class, ProblemAnalyzer.ID, CompositeProblemService.class) // .req(ServerConfigManager.class, RemoteServersManager.class) // .req(ModelService.class, new String[] { "problem-historical" }, "m_services")); @@ -81,4 +96,16 @@ public List defineComponents() { return all; } + + private Component reportService(Class implementation) { + return C(implementation) // + .req(HourlyReportRepository.class, (String) null, "m_hourlyReportDao") // + .req(HourlyReportContentRepository.class, (String) null, "m_hourlyReportContentDao") // + .req(DailyReportRepository.class, (String) null, "m_dailyReportDao") // + .req(DailyReportContentRepository.class, (String) null, "m_dailyReportContentDao") // + .req(WeeklyReportRepository.class, (String) null, "m_weeklyReportDao") // + .req(WeeklyReportContentRepository.class, (String) null, "m_weeklyReportContentDao") // + .req(MonthlyReportRepository.class, (String) null, "m_monthlyReportDao") // + .req(MonthlyReportContentRepository.class, (String) null, "m_monthlyReportContentDao"); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java index 9cab9e4bd3..edc54f04d8 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java @@ -29,6 +29,7 @@ import com.dianping.cat.analysis.MessageConsumer; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; @@ -44,6 +45,7 @@ import com.dianping.cat.consumer.top.TopAnalyzer; import com.dianping.cat.hadoop.hdfs.HdfsMessageBucketManager; import com.dianping.cat.message.storage.MessageBucketManager; +import com.dianping.cat.report.ReportBucketManager; import com.dianping.cat.report.page.cross.service.CompositeCrossService; import com.dianping.cat.report.page.cross.service.CrossReportService; import com.dianping.cat.report.page.cross.service.HistoricalCrossService; @@ -100,9 +102,12 @@ public List defineComponents() { all.add(reportService(ClientReportService.class)); // cross report - all.add(A(CrossReportService.class)); + all.add(reportService(CrossReportService.class)); - all.add(A(LocalCrossService.class)); + all.add(C(LocalModelService.class, LocalCrossService.ID, LocalCrossService.class) // + .req(ReportBucketManager.class, (String) null, "m_bucketManager") // + .req(ServerConfigManager.class, (String) null, "m_configManager") // + .req(MessageConsumer.class, (String) null, "m_consumer")); all.add(C(ModelService.class, "cross-historical", HistoricalCrossService.class) // .req(CrossReportService.class, ServerConfigManager.class)); all.add(C(ModelService.class, CrossAnalyzer.ID, CompositeCrossService.class) // @@ -110,9 +115,12 @@ public List defineComponents() { .req(ModelService.class, new String[] { "cross-historical" }, "m_services")); // matrix report - all.add(A(MatrixReportService.class)); + all.add(reportService(MatrixReportService.class)); - all.add(A(LocalMatrixService.class)); + all.add(C(LocalModelService.class, LocalMatrixService.ID, LocalMatrixService.class) // + .req(ReportBucketManager.class, (String) null, "m_bucketManager") // + .req(ServerConfigManager.class, (String) null, "m_configManager") // + .req(MessageConsumer.class, (String) null, "m_consumer")); all.add(C(ModelService.class, "matrix-historical", HistoricalMatrixService.class) // .req(MatrixReportService.class, ServerConfigManager.class)); all.add(C(ModelService.class, MatrixAnalyzer.ID, CompositeMatrixService.class) // @@ -120,10 +128,13 @@ public List defineComponents() { .req(ModelService.class, new String[] { "matrix-historical" }, "m_services")); // state report - all.add(A(StateReportService.class)); - all.add(A(StateGraphBuilder.class)); + all.add(reportService(StateReportService.class)); + all.add(C(StateGraphBuilder.class) // + .req(StateReportService.class, (String) null, "m_reportService") // + .req(ServerFilterConfigManager.class, (String) null, "m_serverFilterConfigManager")); - all.add(A(LocalStateService.class)); + all.add(C(LocalModelService.class, LocalStateService.ID, LocalStateService.class) // + .req(ReportBucketManager.class, (String) null, "m_bucketManager")); all.add(C(ModelService.class, "state-historical", HistoricalStateService.class) // .req(StateReportService.class, ServerConfigManager.class)); all.add(C(ModelService.class, StateAnalyzer.ID, CompositeStateService.class) // @@ -131,9 +142,10 @@ public List defineComponents() { .req(ModelService.class, new String[] { "state-historical" }, "m_services")); // top report - all.add(A(TopReportService.class)); + all.add(reportService(TopReportService.class)); - all.add(A(LocalTopService.class)); + all.add(C(LocalModelService.class, LocalTopService.ID, LocalTopService.class) // + .req(ReportBucketManager.class, (String) null, "m_bucketManager")); all.add(C(ModelService.class, "top-historical", HistoricalTopService.class) // .req(TopReportService.class, ServerConfigManager.class)); all.add(C(ModelService.class, TopAnalyzer.ID, CompositeTopService.class) // diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/StorageComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/StorageComponentConfigurator.java index 60a8b6f2b0..92f1b0725b 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/StorageComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/StorageComponentConfigurator.java @@ -24,8 +24,19 @@ import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; +import com.dianping.cat.analysis.MessageConsumer; +import com.dianping.cat.alarm.service.AlertService; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.consumer.storage.StorageAnalyzer; +import com.dianping.cat.report.ReportBucketManager; import com.dianping.cat.report.page.storage.config.StorageGroupConfigManager; import com.dianping.cat.report.page.storage.display.StorageAlertInfoBuilder; import com.dianping.cat.report.page.storage.service.CompositeStorageService; @@ -33,6 +44,7 @@ import com.dianping.cat.report.page.storage.service.LocalStorageService; import com.dianping.cat.report.page.storage.task.StorageReportService; import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; public class StorageComponentConfigurator extends AbstractResourceConfigurator { @@ -42,17 +54,34 @@ public List defineComponents() { all.add(C(StorageGroupConfigManager.class)); - all.add(A(LocalStorageService.class)); + all.add(C(LocalModelService.class, LocalStorageService.ID, LocalStorageService.class) // + .req(ReportBucketManager.class, (String) null, "m_bucketManager") // + .req(ServerConfigManager.class, (String) null, "m_configManager") // + .req(MessageConsumer.class, (String) null, "m_consumer")); all.add(C(ModelService.class, "storage-historical", HistoricalStorageService.class) // - .req(StorageReportService.class, ServerConfigManager.class)); + .req(StorageReportService.class, (String) null, "m_reportService") // + .req(ServerConfigManager.class, (String) null, "m_configManager")); all.add(C(ModelService.class, StorageAnalyzer.ID, CompositeStorageService.class) // .req(ServerConfigManager.class, RemoteServersManager.class) // .req(ModelService.class, new String[] { "storage-historical" }, "m_services")); - all.add(A(StorageReportService.class)); + all.add(reportService(StorageReportService.class)); - all.add(A(StorageAlertInfoBuilder.class)); + all.add(C(StorageAlertInfoBuilder.class) // + .req(AlertService.class, (String) null, "m_alertService")); return all; } + + private Component reportService(Class implementation) { + return C(implementation) // + .req(HourlyReportRepository.class, (String) null, "m_hourlyReportDao") // + .req(HourlyReportContentRepository.class, (String) null, "m_hourlyReportContentDao") // + .req(DailyReportRepository.class, (String) null, "m_dailyReportDao") // + .req(DailyReportContentRepository.class, (String) null, "m_dailyReportContentDao") // + .req(WeeklyReportRepository.class, (String) null, "m_weeklyReportDao") // + .req(WeeklyReportContentRepository.class, (String) null, "m_weeklyReportContentDao") // + .req(MonthlyReportRepository.class, (String) null, "m_monthlyReportDao") // + .req(MonthlyReportContentRepository.class, (String) null, "m_monthlyReportContentDao"); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java index 0cacdaeede..2c709bc6de 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java @@ -24,11 +24,21 @@ import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; +import com.dianping.cat.analysis.MessageConsumer; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; +import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; +import com.dianping.cat.report.ReportBucketManager; import com.dianping.cat.report.alert.transaction.TransactionAlert; import com.dianping.cat.report.alert.transaction.TransactionContactor; import com.dianping.cat.report.alert.transaction.TransactionDecorator; @@ -39,6 +49,7 @@ import com.dianping.cat.report.page.transaction.service.TransactionReportService; import com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper; import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.service.ProjectService; @@ -47,8 +58,8 @@ public class TransactionComponentConfigurator extends AbstractResourceConfigurat public List defineComponents() { List all = new ArrayList(); - all.add(A(TransactionMergeHelper.class)); - all.add(A(TransactionReportService.class)); + all.add(C(TransactionMergeHelper.class)); + all.add(reportService(TransactionReportService.class)); all.add(A(TransactionRuleConfigManager.class)); all.add(C(Contactor.class, TransactionContactor.ID, TransactionContactor.class) @@ -56,7 +67,10 @@ public List defineComponents() { all.add(C(Decorator.class, TransactionDecorator.ID, TransactionDecorator.class)); all.add(A(TransactionAlert.class)); - all.add(A(LocalTransactionService.class)); + all.add(C(LocalModelService.class, LocalTransactionService.ID, LocalTransactionService.class) // + .req(ReportBucketManager.class, (String) null, "m_bucketManager") // + .req(ServerConfigManager.class, (String) null, "m_configManager") // + .req(MessageConsumer.class, (String) null, "m_consumer")); all.add(C(ModelService.class, "transaction-historical", HistoricalTransactionService.class) // .req(TransactionReportService.class, ServerConfigManager.class)); all.add(C(ModelService.class, TransactionAnalyzer.ID, CompositeTransactionService.class) // @@ -65,4 +79,16 @@ public List defineComponents() { return all; } + + private Component reportService(Class implementation) { + return C(implementation) // + .req(HourlyReportRepository.class, (String) null, "m_hourlyReportDao") // + .req(HourlyReportContentRepository.class, (String) null, "m_hourlyReportContentDao") // + .req(DailyReportRepository.class, (String) null, "m_dailyReportDao") // + .req(DailyReportContentRepository.class, (String) null, "m_dailyReportContentDao") // + .req(WeeklyReportRepository.class, (String) null, "m_weeklyReportDao") // + .req(WeeklyReportContentRepository.class, (String) null, "m_weeklyReportContentDao") // + .req(MonthlyReportRepository.class, (String) null, "m_monthlyReportDao") // + .req(MonthlyReportContentRepository.class, (String) null, "m_monthlyReportContentDao"); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/graph/metric/impl/DataExtractorImpl.java b/cat-home/src/main/java/com/dianping/cat/report/graph/metric/impl/DataExtractorImpl.java index f7382b137d..5a3193f227 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/graph/metric/impl/DataExtractorImpl.java +++ b/cat-home/src/main/java/com/dianping/cat/report/graph/metric/impl/DataExtractorImpl.java @@ -22,11 +22,8 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.report.graph.metric.DataExtractor; -@Named(type = DataExtractor.class) public class DataExtractorImpl implements DataExtractor { private static final int MIN_POINT_NUMBER = 60; diff --git a/cat-home/src/main/java/com/dianping/cat/report/graph/svg/DefaultGraphBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/graph/svg/DefaultGraphBuilder.java index 3d3b025470..58d960d13d 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/graph/svg/DefaultGraphBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/graph/svg/DefaultGraphBuilder.java @@ -20,16 +20,11 @@ import java.text.DecimalFormat; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - -@Named(type = GraphBuilder.class) public class DefaultGraphBuilder implements GraphBuilder { private static final int BAR = 1; private static final int LINE = 2; - @Inject private ValueTranslater m_translater; private int m_type = BAR; diff --git a/cat-home/src/main/java/com/dianping/cat/report/graph/svg/DefaultValueTranslater.java b/cat-home/src/main/java/com/dianping/cat/report/graph/svg/DefaultValueTranslater.java index eec64e188d..5671fc3b64 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/graph/svg/DefaultValueTranslater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/graph/svg/DefaultValueTranslater.java @@ -18,9 +18,6 @@ */ package com.dianping.cat.report.graph.svg; -import org.unidal.lookup.annotation.Named; - -@Named(type = ValueTranslater.class) public class DefaultValueTranslater implements ValueTranslater { @Override public double getMaxValue(double[] values) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java index 5188d8c5ec..7539e5ff3f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java @@ -23,7 +23,6 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.consumer.business.BusinessAnalyzer; @@ -37,7 +36,6 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; -@Named public class BusinessReportService extends AbstractReportService { @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/LocalBusinessService.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/LocalBusinessService.java index 2cbd40172d..c215aa82cb 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/LocalBusinessService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/LocalBusinessService.java @@ -21,8 +21,6 @@ import java.util.Date; import java.util.List; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.consumer.business.BusinessAnalyzer; import com.dianping.cat.consumer.business.BusinessReportMerger; import com.dianping.cat.consumer.business.model.entity.BusinessReport; @@ -37,7 +35,6 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.spring.CatSpringContext; -@Named(type = LocalModelService.class, value = LocalBusinessService.ID) public class LocalBusinessService extends LocalModelService { public static final String ID = BusinessAnalyzer.ID; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessKeyHelper.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessKeyHelper.java index 3b5d4a2112..f6524bb82d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessKeyHelper.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessKeyHelper.java @@ -18,9 +18,6 @@ */ package com.dianping.cat.report.page.business.task; -import org.unidal.lookup.annotation.Named; - -@Named public class BusinessKeyHelper { public final String SPLITTER = ":"; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessPointParser.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessPointParser.java index d22bf53159..8aa02b16e6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessPointParser.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/task/BusinessPointParser.java @@ -22,13 +22,10 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.consumer.business.model.entity.BusinessItem; import com.dianping.cat.consumer.business.model.entity.Segment; import com.dianping.cat.helper.MetricType; -@Named public class BusinessPointParser { private static final int POINT_NUMBER = 60; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java index 6635270390..3258d40c10 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java @@ -25,7 +25,6 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.consumer.cross.CrossAnalyzer; @@ -51,7 +50,6 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; -@Named public class CrossReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(CrossReportService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/LocalCrossService.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/LocalCrossService.java index 564529e866..1b4f75070e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/LocalCrossService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/LocalCrossService.java @@ -21,9 +21,6 @@ import java.util.Date; import java.util.List; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.consumer.cross.CrossAnalyzer; import com.dianping.cat.consumer.cross.CrossReportMerger; import com.dianping.cat.consumer.cross.model.entity.CrossReport; @@ -37,12 +34,10 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.spring.CatSpringContext; -@Named(type = LocalModelService.class, value = LocalCrossService.ID) public class LocalCrossService extends LocalModelService { public static final String ID = CrossAnalyzer.ID; - @Inject private ReportBucketManager m_bucketManager; public LocalCrossService() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java index e7206e6810..2450e8e3c8 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java @@ -26,7 +26,6 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -56,7 +55,6 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; -@Named public class EventReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(EventReportService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/LocalEventService.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/LocalEventService.java index fac2768030..b9b74dbdec 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/LocalEventService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/LocalEventService.java @@ -21,9 +21,6 @@ import java.util.Date; import java.util.List; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.Constants; import com.dianping.cat.consumer.event.EventAnalyzer; import com.dianping.cat.consumer.event.EventReportMerger; @@ -40,12 +37,10 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.spring.CatSpringContext; -@Named(type = LocalModelService.class, value = LocalEventService.ID) public class LocalEventService extends LocalModelService { public static final String ID = EventAnalyzer.ID; - @Inject private ReportBucketManager m_bucketManager; public LocalEventService() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java index 99d7a38654..ee7f13f81f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java @@ -25,7 +25,6 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; @@ -47,7 +46,6 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; -@Named public class HeartbeatReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(HeartbeatReportService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HistoricalHeartbeatService.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HistoricalHeartbeatService.java index 7dae9bd02c..92134315cb 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HistoricalHeartbeatService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HistoricalHeartbeatService.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; import com.dianping.cat.helper.TimeHelper; @@ -30,7 +28,6 @@ public class HistoricalHeartbeatService extends BaseHistoricalModelService { - @Inject private HeartbeatReportService m_reportService; public HistoricalHeartbeatService() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/LocalHeartbeatService.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/LocalHeartbeatService.java index a94bdff58c..a01a8729be 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/LocalHeartbeatService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/LocalHeartbeatService.java @@ -22,8 +22,6 @@ import java.util.List; import java.util.Set; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.lookup.util.StringUtils; import com.dianping.cat.Constants; @@ -42,12 +40,10 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.spring.CatSpringContext; -@Named(type = LocalModelService.class, value = LocalHeartbeatService.ID) public class LocalHeartbeatService extends LocalModelService { public static final String ID = HeartbeatAnalyzer.ID; - @Inject private ReportBucketManager m_bucketManager; public LocalHeartbeatService() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/LocalMatrixService.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/LocalMatrixService.java index c7d0211b01..1b3c78d5fb 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/LocalMatrixService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/LocalMatrixService.java @@ -21,9 +21,6 @@ import java.util.Date; import java.util.List; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.consumer.matrix.MatrixAnalyzer; import com.dianping.cat.consumer.matrix.MatrixReportMerger; import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; @@ -37,12 +34,10 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.spring.CatSpringContext; -@Named(type = LocalModelService.class, value = LocalMatrixService.ID) public class LocalMatrixService extends LocalModelService { public static final String ID = MatrixAnalyzer.ID; - @Inject private ReportBucketManager m_bucketManager; public LocalMatrixService() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java index df951ef647..039a25be30 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java @@ -25,7 +25,6 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.consumer.matrix.MatrixAnalyzer; @@ -51,7 +50,6 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; -@Named public class MatrixReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(MatrixReportService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java b/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java index 0c88f64fe2..a8fa9ab1e5 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java @@ -29,8 +29,6 @@ import java.util.Map.Entry; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.helper.TimeHelper; @@ -41,10 +39,8 @@ import com.dianping.cat.report.task.TaskHelper; import com.dianping.cat.spring.CatSpringContext; -@Named(type = BaselineService.class) public class DefaultBaselineService implements BaselineService { - @Inject private BaselineRepository m_baselineDao; private Map m_baselines = new LinkedHashMap() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/metric/task/BaselineConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/metric/task/BaselineConfigManager.java index f82a9598bf..3c1a0f0911 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/metric/task/BaselineConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/metric/task/BaselineConfigManager.java @@ -20,9 +20,6 @@ import java.util.Arrays; -import org.unidal.lookup.annotation.Named; - -@Named public class BaselineConfigManager { public BaselineConfig queryBaseLineConfig(String key) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/metric/task/DefaultBaselineCreator.java b/cat-home/src/main/java/com/dianping/cat/report/page/metric/task/DefaultBaselineCreator.java index 05c365131f..eddca50a76 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/metric/task/DefaultBaselineCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/metric/task/DefaultBaselineCreator.java @@ -22,9 +22,6 @@ import java.util.Collections; import java.util.List; -import org.unidal.lookup.annotation.Named; - -@Named(type = BaselineCreator.class) public class DefaultBaselineCreator implements BaselineCreator { public double computeAvg(List data) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/HistoricalProblemService.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/HistoricalProblemService.java index ea1f87d0d7..e034ba09b2 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/HistoricalProblemService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/HistoricalProblemService.java @@ -20,8 +20,6 @@ import java.util.Date; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; import com.dianping.cat.helper.TimeHelper; @@ -31,7 +29,6 @@ public class HistoricalProblemService extends BaseHistoricalModelService { - @Inject private ProblemReportService m_reportService; public HistoricalProblemService() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/LocalProblemService.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/LocalProblemService.java index 3bc4dda318..2afd6ce8a6 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/LocalProblemService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/LocalProblemService.java @@ -21,9 +21,6 @@ import java.util.Date; import java.util.List; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.problem.ProblemReportMerger; import com.dianping.cat.consumer.problem.model.entity.Entry; @@ -41,12 +38,10 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.spring.CatSpringContext; -@Named(type = LocalModelService.class, value = LocalProblemService.ID) public class LocalProblemService extends LocalModelService { public static final String ID = ProblemAnalyzer.ID; - @Inject private ReportBucketManager m_bucketManager; public LocalProblemService() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java index 011e5a01f0..09c19ef0ba 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java @@ -25,7 +25,6 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.consumer.problem.ProblemAnalyzer; @@ -52,7 +51,6 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; -@Named public class ProblemReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(ProblemReportService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java index a94642cb9f..257a8d108e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java @@ -24,7 +24,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; import com.dianping.cat.config.server.ServerFilterConfigManager; @@ -36,7 +35,6 @@ import com.dianping.cat.report.page.state.service.StateReportService; import com.dianping.cat.spring.CatSpringContext; -@Named public class StateGraphBuilder { private StateReportService m_reportService; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/LocalStateService.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/LocalStateService.java index 9f409833da..94cb2e4cec 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/LocalStateService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/LocalStateService.java @@ -21,9 +21,6 @@ import java.util.Date; import java.util.List; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.consumer.state.StateAnalyzer; import com.dianping.cat.consumer.state.StateReportMerger; import com.dianping.cat.consumer.state.model.entity.StateReport; @@ -37,12 +34,10 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.spring.CatSpringContext; -@Named(type = LocalModelService.class, value = LocalStateService.ID) public class LocalStateService extends LocalModelService { public static final String ID = StateAnalyzer.ID; - @Inject private ReportBucketManager m_bucketManager; public LocalStateService() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java index ab7c3d1456..14849d012f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java @@ -25,7 +25,6 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.consumer.state.StateAnalyzer; @@ -51,7 +50,6 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; -@Named public class StateReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(StateReportService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/display/StorageAlertInfoBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/display/StorageAlertInfoBuilder.java index 57f10ca692..1d779d5481 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/display/StorageAlertInfoBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/display/StorageAlertInfoBuilder.java @@ -25,7 +25,6 @@ import java.util.Map; import org.unidal.helper.Splitters; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.alarm.Alert; @@ -41,7 +40,6 @@ import com.dianping.cat.report.page.storage.StorageConstants; import com.dianping.cat.spring.CatSpringContext; -@Named public class StorageAlertInfoBuilder { private AlertService m_alertService; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/LocalStorageService.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/LocalStorageService.java index 73a89fd112..2164234286 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/LocalStorageService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/LocalStorageService.java @@ -23,8 +23,6 @@ import java.util.List; import java.util.Set; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.lookup.util.StringUtils; import com.dianping.cat.Constants; @@ -41,12 +39,10 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.spring.CatSpringContext; -@Named(type = LocalModelService.class, value = LocalStorageService.ID) public class LocalStorageService extends LocalModelService { public static final String ID = StorageAnalyzer.ID; - @Inject private ReportBucketManager m_bucketManager; public LocalStorageService() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java index 756b049342..5b0ca8dfb5 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java @@ -27,7 +27,6 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.consumer.storage.StorageAnalyzer; @@ -53,7 +52,6 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; -@Named public class StorageReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(StorageReportService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/LocalTopService.java b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/LocalTopService.java index eb6eaacf91..808dc0e69a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/LocalTopService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/LocalTopService.java @@ -21,9 +21,6 @@ import java.util.Date; import java.util.List; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.consumer.top.TopAnalyzer; import com.dianping.cat.consumer.top.TopReportMerger; import com.dianping.cat.consumer.top.model.entity.TopReport; @@ -37,12 +34,10 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.spring.CatSpringContext; -@Named(type = LocalModelService.class, value = LocalTopService.ID) public class LocalTopService extends LocalModelService { public static final String ID = TopAnalyzer.ID; - @Inject private ReportBucketManager m_bucketManager; public LocalTopService() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java index 543447a843..930cd86b7d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java @@ -25,7 +25,6 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.consumer.top.TopAnalyzer; @@ -39,7 +38,6 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; -@Named public class TopReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(TopReportService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/LocalTransactionService.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/LocalTransactionService.java index 25d88f0431..96011e543a 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/LocalTransactionService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/LocalTransactionService.java @@ -31,18 +31,14 @@ import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.spring.CatSpringContext; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.Date; import java.util.List; -@Named(type = LocalModelService.class, value = LocalTransactionService.ID) public class LocalTransactionService extends LocalModelService { public static final String ID = TransactionAnalyzer.ID; - @Inject private ReportBucketManager m_bucketManager; public LocalTransactionService() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java index 2cf4c24b44..8c00271da4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java @@ -26,7 +26,6 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -59,7 +58,6 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; -@Named public class TransactionReportService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(TransactionReportService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/TransactionMergeHelper.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/TransactionMergeHelper.java index 5b3c7f1365..832e8f5dcb 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/TransactionMergeHelper.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/TransactionMergeHelper.java @@ -18,13 +18,11 @@ */ package com.dianping.cat.report.page.transaction.transform; -import org.unidal.lookup.annotation.Named; import org.unidal.lookup.util.StringUtils; import com.dianping.cat.Constants; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; -@Named public class TransactionMergeHelper { public TransactionReport mergeAllMachines(TransactionReport report, String ipAddress) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java index 62748af3de..2d1836303b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java @@ -23,7 +23,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -36,13 +35,10 @@ public abstract class AbstractReportReloader implements ReportReloader { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractReportReloader.class); - @Inject protected HourlyReportRepository m_hourlyReportDao; - @Inject protected HourlyReportContentRepository m_hourlyReportContentDao; - @Inject protected ServerConfigManager m_serverConfigManager; protected int getAnalyzerCount() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java index 6267f9c352..6c59cc7b1f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/ReportReloadTask.java @@ -28,14 +28,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.helper.Threads.Task; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.ReportReloadConfigManager; import com.dianping.cat.helper.TimeHelper; -@Named public class ReportReloadTask implements Initializable, Task { private static final Logger LOGGER = LoggerFactory.getLogger(ReportReloadTask.class); @@ -43,7 +40,6 @@ public class ReportReloadTask implements Initializable, Task { private static final int EXPECTED_RELOADER_COUNT = 11; - @Inject private ReportReloadConfigManager m_configManager; private Map m_reloaders; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/BusinessReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/BusinessReportReloader.java index 02d8967f66..eef8b5d01e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/BusinessReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/BusinessReportReloader.java @@ -25,9 +25,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.consumer.business.BusinessAnalyzer; import com.dianping.cat.consumer.business.BusinessReportMerger; @@ -40,10 +37,8 @@ import com.dianping.cat.report.task.reload.ReportReloader; import com.dianping.cat.spring.CatSpringContext; -@Named(type = ReportReloader.class, value = BusinessAnalyzer.ID) public class BusinessReportReloader extends AbstractReportReloader { - @Inject(BusinessAnalyzer.ID) protected ReportManager m_reportManager; private List buildMergedReports(Map> mergedReports) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/CrossReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/CrossReportReloader.java index f1e7949f65..4af7cfb5e3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/CrossReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/CrossReportReloader.java @@ -25,9 +25,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.consumer.cross.CrossAnalyzer; import com.dianping.cat.consumer.cross.CrossReportMerger; @@ -40,10 +37,8 @@ import com.dianping.cat.report.task.reload.ReportReloader; import com.dianping.cat.spring.CatSpringContext; -@Named(type = ReportReloader.class, value = CrossAnalyzer.ID) public class CrossReportReloader extends AbstractReportReloader { - @Inject(CrossAnalyzer.ID) protected ReportManager m_reportManager; private List buildMergedReports(Map> mergedReports) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/DependencyReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/DependencyReportReloader.java index a3fdb89a63..0841400281 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/DependencyReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/DependencyReportReloader.java @@ -25,9 +25,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.consumer.dependency.DependencyAnalyzer; import com.dianping.cat.consumer.dependency.DependencyReportMerger; @@ -40,10 +37,8 @@ import com.dianping.cat.report.task.reload.ReportReloader; import com.dianping.cat.spring.CatSpringContext; -@Named(type = ReportReloader.class, value = DependencyAnalyzer.ID) public class DependencyReportReloader extends AbstractReportReloader { - @Inject(DependencyAnalyzer.ID) protected ReportManager m_reportManager; private List buildMergedReports(Map> mergedReports) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/EventReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/EventReportReloader.java index a5975e8a60..9e14558b51 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/EventReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/EventReportReloader.java @@ -25,9 +25,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.consumer.event.EventAnalyzer; import com.dianping.cat.consumer.event.EventReportMerger; @@ -40,10 +37,8 @@ import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; -@Named(type = ReportReloader.class, value = EventAnalyzer.ID) public class EventReportReloader extends AbstractReportReloader { - @Inject(EventAnalyzer.ID) protected ReportManager m_reportManager; private List buildMergedReports(Map> mergedReports) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/HeartbeatReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/HeartbeatReportReloader.java index 76f9b1ce9d..0973576839 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/HeartbeatReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/HeartbeatReportReloader.java @@ -25,9 +25,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; import com.dianping.cat.consumer.heartbeat.HeartbeatReportMerger; @@ -40,10 +37,8 @@ import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; -@Named(type = ReportReloader.class, value = HeartbeatAnalyzer.ID) public class HeartbeatReportReloader extends AbstractReportReloader { - @Inject(HeartbeatAnalyzer.ID) protected ReportManager m_reportManager; private List buildMergedReports(Map> mergedReports) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/MatrixReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/MatrixReportReloader.java index edfcf73a26..21638e4415 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/MatrixReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/MatrixReportReloader.java @@ -25,9 +25,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.consumer.matrix.MatrixAnalyzer; import com.dianping.cat.consumer.matrix.MatrixReportMerger; @@ -40,10 +37,8 @@ import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; -@Named(type = ReportReloader.class, value = MatrixAnalyzer.ID) public class MatrixReportReloader extends AbstractReportReloader { - @Inject(MatrixAnalyzer.ID) protected ReportManager m_reportManager; private List buildMergedReports(Map> mergedReports) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/ProblemReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/ProblemReportReloader.java index e45e2c6754..6de07108f6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/ProblemReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/ProblemReportReloader.java @@ -25,9 +25,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.problem.ProblemReportMerger; @@ -40,10 +37,8 @@ import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; -@Named(type = ReportReloader.class, value = ProblemAnalyzer.ID) public class ProblemReportReloader extends AbstractReportReloader { - @Inject(ProblemAnalyzer.ID) protected ReportManager m_reportManager; private List buildMergedReports(Map> mergedReports) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StateReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StateReportReloader.java index 4b6e79bc9c..e9dff57cae 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StateReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StateReportReloader.java @@ -25,9 +25,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.consumer.state.StateAnalyzer; import com.dianping.cat.consumer.state.StateReportMerger; @@ -40,10 +37,8 @@ import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; -@Named(type = ReportReloader.class, value = StateAnalyzer.ID) public class StateReportReloader extends AbstractReportReloader { - @Inject(StateAnalyzer.ID) protected ReportManager m_reportManager; private List buildMergedReports(Map> mergedReports) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StorageReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StorageReportReloader.java index 379daf62ce..86aaf14be4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StorageReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/StorageReportReloader.java @@ -25,9 +25,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.consumer.storage.StorageAnalyzer; import com.dianping.cat.consumer.storage.StorageReportMerger; @@ -40,10 +37,8 @@ import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; -@Named(type = ReportReloader.class, value = StorageAnalyzer.ID) public class StorageReportReloader extends AbstractReportReloader { - @Inject(StorageAnalyzer.ID) protected ReportManager m_reportManager; private List buildMergedReports(Map> mergedReports) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TopReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TopReportReloader.java index 67d4cd7ac2..2df3a9694c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TopReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TopReportReloader.java @@ -25,9 +25,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.consumer.top.TopAnalyzer; import com.dianping.cat.consumer.top.TopReportMerger; @@ -40,10 +37,8 @@ import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; -@Named(type = ReportReloader.class, value = TopAnalyzer.ID) public class TopReportReloader extends AbstractReportReloader { - @Inject(TopAnalyzer.ID) protected ReportManager m_reportManager; private List buildMergedReports(Map> mergedReports) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TransactionReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TransactionReportReloader.java index 15050a7653..26749707e4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TransactionReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/impl/TransactionReportReloader.java @@ -25,9 +25,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.consumer.transaction.TransactionReportMerger; @@ -40,10 +37,8 @@ import com.dianping.cat.report.task.reload.ReportReloadEntity; import com.dianping.cat.report.task.reload.ReportReloader; -@Named(type = ReportReloader.class, value = TransactionAnalyzer.ID) public class TransactionReportReloader extends AbstractReportReloader { - @Inject(TransactionAnalyzer.ID) protected ReportManager m_reportManager; private List buildMergedReports(Map> mergedReports) { diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 88d5e8b126..9930398d84 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -15,6 +15,7 @@ com.dianping.cat.report.graph.svg.ValueTranslater + m_translater @@ -886,27 +887,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -975,12 +984,15 @@ com.dianping.cat.report.ReportBucketManager + m_bucketManager com.dianping.cat.config.server.ServerConfigManager + m_configManager com.dianping.cat.analysis.MessageConsumer + m_consumer @@ -1081,27 +1093,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -1112,12 +1132,15 @@ com.dianping.cat.report.ReportBucketManager + m_bucketManager com.dianping.cat.config.server.ServerConfigManager + m_configManager com.dianping.cat.analysis.MessageConsumer + m_consumer @@ -1169,27 +1192,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -1233,9 +1264,11 @@ com.dianping.cat.report.page.business.service.BusinessReportService + m_reportService com.dianping.cat.config.server.ServerConfigManager + m_configManager @@ -1281,6 +1314,7 @@ com.dianping.cat.core.mybatis.repository.baseline.BaselineRepository + m_baselineDao @@ -1373,27 +1407,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -1404,12 +1446,15 @@ com.dianping.cat.report.ReportBucketManager + m_bucketManager com.dianping.cat.config.server.ServerConfigManager + m_configManager com.dianping.cat.analysis.MessageConsumer + m_consumer @@ -1420,9 +1465,11 @@ com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService + m_reportService com.dianping.cat.config.server.ServerConfigManager + m_configManager @@ -1510,27 +1557,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -1541,12 +1596,15 @@ com.dianping.cat.report.ReportBucketManager + m_bucketManager com.dianping.cat.config.server.ServerConfigManager + m_configManager com.dianping.cat.analysis.MessageConsumer + m_consumer @@ -1557,9 +1615,11 @@ com.dianping.cat.report.page.problem.service.ProblemReportService + m_reportService com.dianping.cat.config.server.ServerConfigManager + m_configManager @@ -1727,12 +1787,15 @@ com.dianping.cat.report.ReportBucketManager + m_bucketManager com.dianping.cat.config.server.ServerConfigManager + m_configManager com.dianping.cat.analysis.MessageConsumer + m_consumer @@ -1743,9 +1806,11 @@ com.dianping.cat.report.page.storage.task.StorageReportService + m_reportService com.dianping.cat.config.server.ServerConfigManager + m_configManager @@ -1775,27 +1840,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -2264,27 +2337,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -2295,12 +2376,15 @@ com.dianping.cat.report.ReportBucketManager + m_bucketManager com.dianping.cat.config.server.ServerConfigManager + m_configManager com.dianping.cat.analysis.MessageConsumer + m_consumer @@ -2343,27 +2427,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -2374,12 +2466,15 @@ com.dianping.cat.report.ReportBucketManager + m_bucketManager com.dianping.cat.config.server.ServerConfigManager + m_configManager com.dianping.cat.analysis.MessageConsumer + m_consumer @@ -2422,27 +2517,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -2453,12 +2556,7 @@ com.dianping.cat.report.ReportBucketManager - - - com.dianping.cat.config.server.ServerConfigManager - - - com.dianping.cat.analysis.MessageConsumer + m_bucketManager @@ -2501,27 +2599,35 @@ com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao @@ -2532,12 +2638,7 @@ com.dianping.cat.report.ReportBucketManager - - - com.dianping.cat.config.server.ServerConfigManager - - - com.dianping.cat.analysis.MessageConsumer + m_bucketManager From 5e15b5d0b66cd4a6394677b28a07c33a958d8980 Mon Sep 17 00:00:00 2001 From: Shang Date: Sat, 13 Jun 2026 19:40:14 +0800 Subject: [PATCH 067/231] Migrate alert summary components to explicit Spring/Plexus wiring --- ...NG_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md | 105 ++++++++++++++++++ SPRING_CONTEXT_MIGRATION_PLAN.md | 88 +++++++++++++++ .../build/HomeAlarmComponentConfigurator.java | 2 +- .../report/ProblemComponentConfigurator.java | 29 ++++- .../spring/CatHomeSpringConfiguration.java | 10 +- .../report/alert/config/BaseRuleHelper.java | 2 - .../alert/summary/AlertSummaryExecutor.java | 7 -- .../alert/summary/AlertSummaryService.java | 8 +- .../alert/summary/build/AlertInfoBuilder.java | 5 - .../build/AlterationSummaryBuilder.java | 4 - .../summary/build/FailureSummaryBuilder.java | 4 - .../summary/build/RelatedSummaryBuilder.java | 5 - .../resources/META-INF/plexus/components.xml | 8 ++ 13 files changed, 236 insertions(+), 41 deletions(-) diff --git a/SPRING_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md b/SPRING_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md index 949db6ec32..1eb3feb028 100644 --- a/SPRING_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md +++ b/SPRING_CONTEXT_MIGRATION_HANDOFF_2026-06-07.md @@ -803,3 +803,108 @@ NoSuchBeanDefinitionException Address already in use 同一个任务或 SyncHandler 重复启动导致的重复执行 ``` + +## 12. 最新进度快照(2026-06-13 更新) + +本节记录 2026-06-12 至 2026-06-13 的最新迁移进度。下次继续前,优先阅读本节,再结合 `git status --short` 判断工作区状态。 + +### 12.1 当前 Git 状态 + +截至本节更新时,工作区为干净状态: + +```powershell +git status --short +``` + +输出为空。上一批代码已经由用户提交。 + +### 12.2 已完成的最新迁移范围 + +围绕“最终移除 Plexus / Unidal Lookup / Unidal 相关依赖”的目标,最近一批已经完成并提交的改动包括: + +1. `cat-home/src/main/java/com/dianping/cat/report/page` 下的 `@Named` / `@Inject` 已清空。 +2. 报表页面服务层已迁移到显式组件注册,覆盖:`transaction`、`event`、`problem`、`heartbeat`、`storage`、`cross`、`matrix`、`state`、`top`、`business`、`metric baseline`。 +3. 多个 `ReportService` 子类已经从注解注册迁移为 configurator 中的显式字段依赖注册。 +4. 多个 `LocalModelService` 子类已经从注解注册迁移为显式组件注册,并补齐 `m_bucketManager`、`m_configManager`、`m_consumer`。 +5. historical model service 的隐式依赖已经改为显式字段名依赖:`m_reportService`、`m_configManager`。 +6. 已迁移 `business` 相关组件:`BusinessReportService`、`LocalBusinessService`、`BusinessPointParser`、`BusinessKeyHelper`。 +7. 已迁移 `metric baseline` 相关组件:`DefaultBaselineService`、`BaselineConfigManager`、`DefaultBaselineCreator`。 +8. 已迁移 `report/graph/svg`:`GraphBuilder`、`ValueTranslater`、`DefaultGraphBuilder`、`DefaultValueTranslater`。 +9. 已迁移 `DataExtractorImpl`,改为 `DataExtractor` 接口显式注册。 +10. 已清理 `report/task/reload` 组的 Unidal 注解:`ReportReloadTask`、`AbstractReportReloader` 和所有 `*ReportReloader` 实现。 + +`report/task/reload` 这一组已经由 `CatHomeSpringConfiguration` 通过 Spring Bean 和 setter 注入组装;生成的 `components.xml` 中没有对应 `ReportReloadTask` / `ReportReloader` 条目,因此只做注解清理,没有新增 Plexus 显式注册。 + +### 12.3 最近验证结果 + +最近一批迁移完成后,以下命令均已通过: + +```powershell +mvn -pl cat-home -am -DskipTests compile +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +``` + +验证过程中 Maven 仍会出现已知 warning,例如 deprecated API、shade overlapping resource、plexus plugin 执行时的 SLF4J no provider warning。这些 warning 暂时不是当前迁移阻塞项。 + +### 12.4 当前剩余注解范围 + +`cat-home/src/main/java/com/dianping/cat/report/page` 已经清空 Unidal lookup 注解。 + +`cat-home` 里剩余 `@Named` / `@Inject` 主要集中在: + +```text +cat-home/src/main/java/com/dianping/cat/report/alert +cat-home/src/main/java/com/dianping/cat/system/page +cat-home/src/main/java/com/dianping/cat/report/task +cat-home/src/main/java/com/dianping/cat/report/graph/metric/AbstractGraphCreator.java +cat-home/src/main/java/com/dianping/cat/CatHomeModule.java +``` + +跨模块仍然存在 Unidal 注解和容器依赖,主要在 `cat-core`、`cat-consumer`、`cat-alarm`、`cat-hadoop`。 + +因此现在还不能删除 Unidal / Plexus 依赖、`plexus-maven-plugin`、`codegen-maven-plugin` 或任何 `META-INF/plexus/components.xml`。 + +### 12.5 当前完成度评估 + +按最终目标“移除 Plexus / Unidal 相关依赖”估算,当前整体完成度约为: + +```text +35% - 45% +``` + +判断依据: + +1. 报表页面服务层这一条主线已经基本清理完成。 +2. Spring 手工配置和旧 MVC 兼容桥接已经比较稳定。 +3. 但 alert、system page、core/consumer/alarm/hadoop、Unidal Web MVC、Unidal DAL/codegen、Plexus 插件链路仍未完成。 +4. `components.xml` 仍然需要生成,旧容器仍是兼容运行链路的一部分。 + +### 12.6 推荐下一步计划 + +下一步建议继续迁移 `cat-home/report/alert`,但要拆小批次,不要一次性迁移全部 alert 链路。 + +推荐顺序: + +1. 先迁移低风险、已在 configurator 中注册或 Spring 中已有替代链路的 alert helper / manager。 +2. 再迁移 alert summary builder:`AlertSummaryExecutor`、`AlertSummaryService`、`RelatedSummaryBuilder`、`FailureSummaryBuilder`、`AlterationSummaryBuilder`、`AlertInfoBuilder`。 +3. 再迁移各类 alert domain:`business`、`transaction`、`event`、`heartbeat`、`exception`。 +4. 暂缓直接迁移 Web Handler、Unidal MVC、`RuleFTLDecorator` 等复杂链路。 + +每一小批迁移后至少执行: + +```powershell +mvn -pl cat-home -am -DskipTests compile +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +``` + +如果涉及 `components.xml` 生成,必须检查生成结果中是否包含预期 role、role-hint 和 field-name。 + +### 12.7 重要注意事项 + +1. 不要删除任何 `META-INF/plexus/components.xml`。 +2. 不要删除根 POM 或模块 POM 中的 Unidal / Plexus 依赖。 +3. 不要全量 Spring 扫描 `com.dianping.cat`。 +4. 不要让 Spring 和 Plexus 同时创建会启动线程、注册定时任务或注册 sync handler 的同一个组件。 +5. 迁移 descriptor 兼容组件时,优先使用显式 `field-name`,不要依赖注解扫描。 +6. 对 analyzer ID 相关 bean,避免 Spring bean 名和 analyzer ID 冲突,例如 `business`、`matrix`、`transaction` 等。 +7. 用户已经多次要求:如果验证没问题,可以继续后面的计划;但遇到需要运行时页面验证或业务决策的问题,应停下来让用户确认。 diff --git a/SPRING_CONTEXT_MIGRATION_PLAN.md b/SPRING_CONTEXT_MIGRATION_PLAN.md index 1de05aeb88..38627f87ea 100644 --- a/SPRING_CONTEXT_MIGRATION_PLAN.md +++ b/SPRING_CONTEXT_MIGRATION_PLAN.md @@ -1114,3 +1114,91 @@ http://127.0.0.1:18080/cat/s/config 3. 暂不移除根 POM 中的 Unidal / Plexus 依赖。 4. 暂不迁移 `org.unidal.web.MVC`。 5. 暂不批量替换所有 DAL / codegen 相关代码。 + +## 18. 2026-06-13 当前进度更新 + +### 已完成 + +最近一批迁移已经完成并提交,重点是把 `cat-home` 报表页面服务层从 Unidal lookup 注解迁移到显式注册: + +```text +cat-home/src/main/java/com/dianping/cat/report/page +``` + +该目录下当前已经没有 `@Named` / `@Inject` 残留。 + +已覆盖的报表域: + +```text +transaction +event +problem +heartbeat +storage +cross +matrix +state +top +business +metric baseline +``` + +同时已完成: + +```text +report/graph/svg -> GraphBuilder / ValueTranslater 显式注册 +report/graph/metric/impl/DataExtractorImpl -> DataExtractor 显式注册 +report/task/reload -> 清理 Unidal 注解,保留 Spring setter 注入路径 +``` + +### 验证结果 + +最近一批迁移后已通过: + +```powershell +mvn -pl cat-home -am -DskipTests compile +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +``` + +### 当前阶段判断 + +项目仍然不能直接移除 Plexus / Unidal 依赖。当前大致完成度约为: + +```text +35% - 45% +``` + +主要剩余工作: + +```text +cat-home/report/alert +cat-home/system/page +cat-home/report/task +cat-core +cat-consumer +cat-alarm +cat-hadoop +Unidal Web MVC +Unidal DAL / codegen +Plexus components.xml 生成链路 +``` + +### 下一步推荐 + +下一步建议进入 `cat-home/report/alert` 的小批量迁移,优先迁移低风险 helper / manager / summary builder,不要直接迁移 Web Handler 或删除 `components.xml`。 + +推荐顺序: + +```text +1. Alert helper / config manager +2. Alert summary service / executor / builders +3. business / transaction / event / heartbeat / exception alert domain +4. 最后再考虑 system/page 和 Web MVC +``` + +每完成一小批后继续执行: + +```powershell +mvn -pl cat-home -am -DskipTests compile +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +``` diff --git a/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java index c6ea4142f4..0ef593585f 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java @@ -37,7 +37,7 @@ public List defineComponents() { all.add(A(AlarmManager.class)); all.add(A(AlertConfigManager.class)); - all.add(A(BaseRuleHelper.class)); + all.add(C(BaseRuleHelper.class)); all.add(A(UserDefinedRuleManager.class)); return all; } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java index 5eb4509c93..37b16d5b06 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java @@ -28,7 +28,11 @@ import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; +import com.dianping.cat.alarm.spi.sender.SenderManager; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; +import com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository; +import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; @@ -50,6 +54,8 @@ import com.dianping.cat.report.alert.summary.build.AlterationSummaryBuilder; import com.dianping.cat.report.alert.summary.build.FailureSummaryBuilder; import com.dianping.cat.report.alert.summary.build.RelatedSummaryBuilder; +import com.dianping.cat.report.alert.summary.build.SummaryBuilder; +import com.dianping.cat.report.page.dependency.graph.TopologyGraphManager; import com.dianping.cat.report.page.problem.service.CompositeProblemService; import com.dianping.cat.report.page.problem.service.HistoricalProblemService; import com.dianping.cat.report.page.problem.service.LocalProblemService; @@ -87,12 +93,23 @@ public List defineComponents() { all.add(A(AlertExceptionBuilder.class)); all.add(A(ExceptionAlert.class)); - all.add(A(AlertSummaryService.class)); - all.add(A(RelatedSummaryBuilder.class)); - all.add(A(FailureSummaryBuilder.class)); - all.add(A(AlterationSummaryBuilder.class)); - all.add(A(AlertSummaryExecutor.class)); - all.add(A(AlertInfoBuilder.class)); + all.add(C(AlertSummaryService.class) // + .req(AlertSummaryRepository.class, (String) null, "m_alertSummaryDao")); + all.add(C(SummaryBuilder.class, RelatedSummaryBuilder.ID, RelatedSummaryBuilder.class) // + .req(AlertInfoBuilder.class, (String) null, "m_alertSummaryManager") // + .req(AlertSummaryService.class, (String) null, "m_alertSummaryService")); + all.add(C(SummaryBuilder.class, FailureSummaryBuilder.ID, FailureSummaryBuilder.class) // + .req(ModelService.class, ProblemAnalyzer.ID, "m_service")); + all.add(C(SummaryBuilder.class, AlterationSummaryBuilder.ID, AlterationSummaryBuilder.class) // + .req(AlterationRepository.class, (String) null, "m_alterationDao")); + all.add(C(AlertSummaryExecutor.class) // + .req(SummaryBuilder.class, RelatedSummaryBuilder.ID, "m_relatedBuilder") // + .req(SummaryBuilder.class, FailureSummaryBuilder.ID, "m_failureBuilder") // + .req(SummaryBuilder.class, AlterationSummaryBuilder.ID, "m_alterationBuilder") // + .req(SenderManager.class, (String) null, "m_sendManager")); + all.add(C(AlertInfoBuilder.class) // + .req(AlertRepository.class, (String) null, "m_alertDao") // + .req(TopologyGraphManager.class, (String) null, "m_topologyManager")); return all; } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 97942404fc..96ac76d23e 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -2124,8 +2124,11 @@ public UserDefineRuleRepository userDefineRuleRepository(SqlSessionTemplate sqlS } @Bean - public AlertSummaryService alertSummaryService() { - return new AlertSummaryService(); + public AlertSummaryService alertSummaryService(AlertSummaryRepository alertSummaryRepository) { + AlertSummaryService service = new AlertSummaryService(); + + service.setAlertSummaryDao(alertSummaryRepository); + return service; } @Bean @@ -2629,10 +2632,11 @@ public Map localModelServices( } @Bean - public AlertInfoBuilder alertInfoBuilder(AlertRepository alertRepository) { + public AlertInfoBuilder alertInfoBuilder(AlertRepository alertRepository, TopologyGraphManager topologyGraphManager) { AlertInfoBuilder builder = new AlertInfoBuilder(); builder.setAlertDao(alertRepository); + builder.setTopologyManager(topologyGraphManager); return builder; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/config/BaseRuleHelper.java b/cat-home/src/main/java/com/dianping/cat/report/alert/config/BaseRuleHelper.java index a33c9fc4ba..0910610f6b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/config/BaseRuleHelper.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/config/BaseRuleHelper.java @@ -25,14 +25,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; import com.dianping.cat.Cat; import com.dianping.cat.alarm.rule.entity.Condition; import com.dianping.cat.alarm.rule.entity.Config; -@Named public class BaseRuleHelper { private static final Logger LOGGER = LoggerFactory.getLogger(BaseRuleHelper.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java index b9e3303153..04fe90f883 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java @@ -27,8 +27,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.helper.Splitters; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.alarm.spi.AlertChannel; @@ -42,7 +40,6 @@ import com.dianping.cat.report.alert.summary.build.SummaryBuilder; import com.dianping.cat.spring.CatSpringContext; -@Named public class AlertSummaryExecutor { private static final Logger LOGGER = LoggerFactory.getLogger(AlertSummaryExecutor.class); @@ -50,16 +47,12 @@ public class AlertSummaryExecutor { public static final long ALTERATION_DURATION = 30 * TimeHelper.ONE_MINUTE; - @Inject(type = SummaryBuilder.class, value = RelatedSummaryBuilder.ID) private SummaryBuilder m_relatedBuilder; - @Inject(type = SummaryBuilder.class, value = FailureSummaryBuilder.ID) private SummaryBuilder m_failureBuilder; - @Inject(type = SummaryBuilder.class, value = AlterationSummaryBuilder.ID) private SummaryBuilder m_alterationBuilder; - @Inject private SenderManager m_sendManager; private void refreshSpringBeans() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java index 3856a2f069..5845b44941 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java @@ -21,19 +21,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.home.dal.report.AlertSummary; import com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository; import com.dianping.cat.spring.CatSpringContext; -@Named public class AlertSummaryService { private static final Logger LOGGER = LoggerFactory.getLogger(AlertSummaryService.class); - @Inject private AlertSummaryRepository m_alertSummaryDao; public void insert(com.dianping.cat.home.alert.summary.entity.AlertSummary alertSummary) { @@ -62,4 +58,8 @@ private void refreshSpringBeans() { } } + public void setAlertSummaryDao(AlertSummaryRepository alertSummaryDao) { + m_alertSummaryDao = alertSummaryDao; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java index f3dc45f13e..1ab0addd2b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java @@ -29,8 +29,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.alarm.Alert; @@ -45,7 +43,6 @@ import com.dianping.cat.report.page.dependency.graph.TopologyGraphManager; import com.dianping.cat.spring.CatSpringContext; -@Named public class AlertInfoBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(AlertInfoBuilder.class); @@ -53,10 +50,8 @@ public class AlertInfoBuilder { public static final String PREFIX = "dependency_"; - @Inject private AlertRepository m_alertDao; - @Inject private TopologyGraphManager m_topologyManager; private AlertRepository getAlertDao() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java index 0abc18ecdc..aba72cfd55 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java @@ -26,8 +26,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.home.dal.report.Alteration; @@ -36,13 +34,11 @@ import com.dianping.cat.report.alert.summary.AlertSummaryExecutor; import com.dianping.cat.spring.CatSpringContext; -@Named(type = SummaryBuilder.class, value = AlterationSummaryBuilder.ID) public class AlterationSummaryBuilder extends SummaryBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(AlterationSummaryBuilder.class); public static final String ID = "AlterationSummaryContentGenerator"; - @Inject private AlterationRepository m_alterationDao; private AlterationRepository getAlterationDao() { diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java index f2ef9c0f65..de79c9f8d0 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/FailureSummaryBuilder.java @@ -25,8 +25,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.consumer.problem.ProblemAnalyzer; @@ -41,13 +39,11 @@ import com.dianping.cat.report.service.ModelService; import com.dianping.cat.spring.CatSpringContext; -@Named(type = SummaryBuilder.class, value = FailureSummaryBuilder.ID) public class FailureSummaryBuilder extends SummaryBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(FailureSummaryBuilder.class); public static final String ID = "FailureDecorator"; - @Inject(type = ModelService.class, value = ProblemAnalyzer.ID) private ModelService m_service; @SuppressWarnings("unchecked") diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java index 5c8be3a493..de8a4a2f85 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/RelatedSummaryBuilder.java @@ -26,24 +26,19 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.home.alert.summary.entity.AlertSummary; import com.dianping.cat.report.alert.summary.AlertSummaryService; import com.dianping.cat.spring.CatSpringContext; -@Named(type = SummaryBuilder.class, value = RelatedSummaryBuilder.ID) public class RelatedSummaryBuilder extends SummaryBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(RelatedSummaryBuilder.class); public static final String ID = "AlertSummaryContentGenerator"; - @Inject private AlertInfoBuilder m_alertSummaryManager; - @Inject private AlertSummaryService m_alertSummaryService; @SuppressWarnings("unchecked") diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 9930398d84..60b167585e 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -1703,6 +1703,7 @@ com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository + m_alertSummaryDao @@ -1713,9 +1714,11 @@ com.dianping.cat.report.alert.summary.build.AlertInfoBuilder + m_alertSummaryManager com.dianping.cat.report.alert.summary.AlertSummaryService + m_alertSummaryService @@ -1727,6 +1730,7 @@ com.dianping.cat.report.service.ModelService problem + m_service @@ -1737,6 +1741,7 @@ com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository + m_alterationDao @@ -1761,6 +1766,7 @@ com.dianping.cat.alarm.spi.sender.SenderManager + m_sendManager @@ -1770,9 +1776,11 @@ com.dianping.cat.core.mybatis.repository.alert.AlertRepository + m_alertDao com.dianping.cat.report.page.dependency.graph.TopologyGraphManager + m_topologyManager From 1842401c854b0bad8444516c4b055a49f2151929 Mon Sep 17 00:00:00 2001 From: Shang Date: Sat, 13 Jun 2026 19:58:12 +0800 Subject: [PATCH 068/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E8=A7=84=E5=88=99=E9=85=8D=E7=BD=AE=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/EventComponentConfigurator.java | 14 ++++++- .../HeartbeatComponentConfigurator.java | 14 ++++++- .../report/MetricComponentConfigurator.java | 4 +- .../report/ProblemComponentConfigurator.java | 6 ++- .../TransactionComponentConfigurator.java | 14 ++++++- .../business/BusinessRuleConfigManager.java | 4 -- .../alert/event/EventRuleConfigManager.java | 2 - .../exception/ExceptionRuleConfigManager.java | 5 --- .../heartbeat/HeartbeatRuleConfigManager.java | 2 - .../TransactionRuleConfigManager.java | 2 - .../resources/META-INF/plexus/components.xml | 42 +++++++++++++++---- 11 files changed, 80 insertions(+), 29 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java index 92bef6eb34..478ca2783c 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java @@ -28,7 +28,9 @@ import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; +import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; @@ -39,10 +41,12 @@ import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.consumer.event.EventAnalyzer; import com.dianping.cat.report.ReportBucketManager; +import com.dianping.cat.report.alert.config.BaseRuleHelper; import com.dianping.cat.report.alert.event.EventAlert; import com.dianping.cat.report.alert.event.EventContactor; import com.dianping.cat.report.alert.event.EventDecorator; import com.dianping.cat.report.alert.event.EventRuleConfigManager; +import com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager; import com.dianping.cat.report.page.event.service.CompositeEventService; import com.dianping.cat.report.page.event.service.EventReportService; import com.dianping.cat.report.page.event.service.HistoricalEventService; @@ -57,7 +61,7 @@ public class EventComponentConfigurator extends AbstractResourceConfigurator { public List defineComponents() { List all = new ArrayList(); - all.add(A(EventRuleConfigManager.class)); + all.add(ruleConfigManager(EventRuleConfigManager.class)); all.add(C(Contactor.class, EventContactor.ID, EventContactor.class) .req(ProjectService.class, AlertConfigManager.class)); @@ -90,4 +94,12 @@ private Component reportService(Class implementation) { .req(MonthlyReportRepository.class, (String) null, "m_monthlyReportDao") // .req(MonthlyReportContentRepository.class, (String) null, "m_monthlyReportContentDao"); } + + private Component ruleConfigManager(Class implementation) { + return C(implementation) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher") // + .req(UserDefinedRuleManager.class, (String) null, "m_manager") // + .req(BaseRuleHelper.class, (String) null, "m_helper"); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java index 0e82d5c5ce..e95ff2e6b9 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java @@ -28,7 +28,9 @@ import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; +import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; @@ -39,10 +41,12 @@ import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; import com.dianping.cat.report.ReportBucketManager; +import com.dianping.cat.report.alert.config.BaseRuleHelper; import com.dianping.cat.report.alert.heartbeat.HeartbeatAlert; import com.dianping.cat.report.alert.heartbeat.HeartbeatContactor; import com.dianping.cat.report.alert.heartbeat.HeartbeatDecorator; import com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager; +import com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager; import com.dianping.cat.report.page.heartbeat.service.CompositeHeartbeatService; import com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService; import com.dianping.cat.report.page.heartbeat.service.HistoricalHeartbeatService; @@ -57,7 +61,7 @@ public class HeartbeatComponentConfigurator extends AbstractResourceConfigurator public List defineComponents() { List all = new ArrayList(); - all.add(A(HeartbeatRuleConfigManager.class)); + all.add(ruleConfigManager(HeartbeatRuleConfigManager.class)); all.add(reportService(HeartbeatReportService.class)); @@ -92,4 +96,12 @@ private Component reportService(Class implementation) { .req(MonthlyReportRepository.class, (String) null, "m_monthlyReportDao") // .req(MonthlyReportContentRepository.class, (String) null, "m_monthlyReportContentDao"); } + + private Component ruleConfigManager(Class implementation) { + return C(implementation) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher") // + .req(UserDefinedRuleManager.class, (String) null, "m_manager") // + .req(BaseRuleHelper.class, (String) null, "m_helper"); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java index df2e99080e..8bb8306912 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java @@ -30,6 +30,7 @@ import com.dianping.cat.analysis.MessageConsumer; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.consumer.business.BusinessAnalyzer; +import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; import com.dianping.cat.core.mybatis.repository.baseline.BaselineRepository; import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; @@ -69,7 +70,8 @@ public class MetricComponentConfigurator extends AbstractResourceConfigurator { public List defineComponents() { List all = new ArrayList(); - all.add(A(BusinessRuleConfigManager.class)); + all.add(C(BusinessRuleConfigManager.class) // + .req(BusinessConfigRepository.class, (String) null, "m_configDao")); all.add(reportService(BusinessReportService.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java index 37b16d5b06..0bcfe8dd4b 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java @@ -29,7 +29,9 @@ import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; import com.dianping.cat.alarm.spi.sender.SenderManager; +import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; import com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository; import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; @@ -70,7 +72,9 @@ public class ProblemComponentConfigurator extends AbstractResourceConfigurator { public List defineComponents() { List all = new ArrayList(); - all.add(A(ExceptionRuleConfigManager.class)); + all.add(C(ExceptionRuleConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); all.add(reportService(ProblemReportService.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java index 2c709bc6de..9d0a08a242 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java @@ -28,7 +28,9 @@ import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; +import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; @@ -39,6 +41,8 @@ import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.report.ReportBucketManager; +import com.dianping.cat.report.alert.config.BaseRuleHelper; +import com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager; import com.dianping.cat.report.alert.transaction.TransactionAlert; import com.dianping.cat.report.alert.transaction.TransactionContactor; import com.dianping.cat.report.alert.transaction.TransactionDecorator; @@ -60,7 +64,7 @@ public List defineComponents() { all.add(C(TransactionMergeHelper.class)); all.add(reportService(TransactionReportService.class)); - all.add(A(TransactionRuleConfigManager.class)); + all.add(ruleConfigManager(TransactionRuleConfigManager.class)); all.add(C(Contactor.class, TransactionContactor.ID, TransactionContactor.class) .req(ProjectService.class, AlertConfigManager.class)); @@ -91,4 +95,12 @@ private Component reportService(Class implementation) { .req(MonthlyReportRepository.class, (String) null, "m_monthlyReportDao") // .req(MonthlyReportContentRepository.class, (String) null, "m_monthlyReportContentDao"); } + + private Component ruleConfigManager(Class implementation) { + return C(implementation) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher") // + .req(UserDefinedRuleManager.class, (String) null, "m_manager") // + .req(BaseRuleHelper.class, (String) null, "m_helper"); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java index 92d86247df..bf1df3d511 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java @@ -30,8 +30,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.alarm.rule.entity.Condition; @@ -50,7 +48,6 @@ import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; -@Named public class BusinessRuleConfigManager implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(BusinessRuleConfigManager.class); @@ -62,7 +59,6 @@ public class BusinessRuleConfigManager implements Initializable { Map m_rules = new ConcurrentHashMap(); - @Inject private BusinessConfigRepository m_configDao; public void setConfigDao(BusinessConfigRepository configDao) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventRuleConfigManager.java index 5982dbb685..d235f617d0 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventRuleConfigManager.java @@ -20,9 +20,7 @@ import com.dianping.cat.report.alert.spi.config.BaseRuleConfigManager; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.unidal.lookup.annotation.Named; -@Named public class EventRuleConfigManager extends BaseRuleConfigManager implements Initializable { private static final String CONFIG_NAME = "eventRule"; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java index 989db1f824..d639ab3594 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java @@ -26,8 +26,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -40,7 +38,6 @@ import com.dianping.cat.home.exception.transform.DefaultSaxParser; import com.dianping.cat.spring.CatSpringContext; -@Named public class ExceptionRuleConfigManager implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionRuleConfigManager.class); @@ -50,10 +47,8 @@ public class ExceptionRuleConfigManager implements Initializable { public static String TOTAL_STRING = "Total"; - @Inject private ConfigRepository m_configDao; - @Inject private ContentFetcher m_fetcher; private int m_configId; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatRuleConfigManager.java index ced3f1479c..8ef4d13a5d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatRuleConfigManager.java @@ -29,9 +29,7 @@ import java.util.Map; import java.util.Map.Entry; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.unidal.lookup.annotation.Named; -@Named public class HeartbeatRuleConfigManager extends BaseRuleConfigManager implements Initializable { private static final String CONFIG_NAME = "heartbeatRuleConfig"; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionRuleConfigManager.java index 0a85b2b0d2..fb6b2e24b7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionRuleConfigManager.java @@ -20,9 +20,7 @@ import com.dianping.cat.report.alert.spi.config.BaseRuleConfigManager; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.unidal.lookup.annotation.Named; -@Named public class TransactionRuleConfigManager extends BaseRuleConfigManager implements Initializable { private static final String CONFIG_NAME = "transactionRule"; diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 60b167585e..58ebdd8b0a 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -925,15 +925,19 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao - com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager + com.dianping.cat.config.content.ContentFetcher + m_fetcher - com.dianping.cat.report.alert.config.BaseRuleHelper + com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager + m_manager - com.dianping.cat.config.content.ContentFetcher + com.dianping.cat.report.alert.config.BaseRuleHelper + m_helper @@ -1035,15 +1039,19 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao - com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager + com.dianping.cat.config.content.ContentFetcher + m_fetcher - com.dianping.cat.report.alert.config.BaseRuleHelper + com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager + m_manager - com.dianping.cat.config.content.ContentFetcher + com.dianping.cat.report.alert.config.BaseRuleHelper + m_helper @@ -1183,6 +1191,7 @@ com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository + m_configDao @@ -1389,15 +1398,19 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao - com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager + com.dianping.cat.config.content.ContentFetcher + m_fetcher - com.dianping.cat.report.alert.config.BaseRuleHelper + com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager + m_manager - com.dianping.cat.config.content.ContentFetcher + com.dianping.cat.report.alert.config.BaseRuleHelper + m_helper @@ -1545,9 +1558,11 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher @@ -3418,6 +3433,15 @@ + + com.dianping.cat.core.config.repository.ConfigRepository + com.dianping.cat.core.config.repository.ConfigRepository + + + org.unidal.dal.jdbc.datasource.DataSourceManager + + + com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager From 3374c124a1cb07818f2d9cb75eb12893a5b3bd60 Mon Sep 17 00:00:00 2001 From: Shang Date: Sat, 13 Jun 2026 20:05:35 +0800 Subject: [PATCH 069/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E8=A7=84=E5=88=99=E5=9F=BA=E7=A1=80=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/HomeAlarmComponentConfigurator.java | 4 +++- .../cat/home/spring/CatHomeSpringConfiguration.java | 7 +++++-- .../report/alert/spi/config/BaseRuleConfigManager.java | 5 ----- .../alert/spi/config/UserDefinedRuleManager.java | 8 ++++---- .../src/main/resources/META-INF/plexus/components.xml | 10 +--------- 5 files changed, 13 insertions(+), 21 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java index 0ef593585f..be3ffb053d 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java @@ -25,6 +25,7 @@ import org.unidal.lookup.configuration.Component; import com.dianping.cat.alarm.spi.config.AlertConfigManager; +import com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository; import com.dianping.cat.report.alert.AlarmManager; import com.dianping.cat.report.alert.config.BaseRuleHelper; import com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager; @@ -38,7 +39,8 @@ public List defineComponents() { all.add(A(AlarmManager.class)); all.add(A(AlertConfigManager.class)); all.add(C(BaseRuleHelper.class)); - all.add(A(UserDefinedRuleManager.class)); + all.add(C(UserDefinedRuleManager.class) // + .req(UserDefineRuleRepository.class, (String) null, "m_dao")); return all; } } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 96ac76d23e..536cadd49b 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -2681,8 +2681,11 @@ public AlertSummaryExecutor alertSummaryExecutor(@Qualifier(RelatedSummaryBuilde } @Bean - public UserDefinedRuleManager userDefinedRuleManager() { - return new UserDefinedRuleManager(); + public UserDefinedRuleManager userDefinedRuleManager(UserDefineRuleRepository userDefineRuleRepository) { + UserDefinedRuleManager manager = new UserDefinedRuleManager(); + + manager.setDao(userDefineRuleRepository); + return manager; } @Bean diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java index ca4bb11be9..29821e96d3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java @@ -33,7 +33,6 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.tuple.Pair; import org.xml.sax.SAXException; @@ -62,16 +61,12 @@ public abstract class BaseRuleConfigManager { private static final Logger LOGGER = LoggerFactory.getLogger(BaseRuleConfigManager.class); - @Inject protected ConfigRepository m_configDao; - @Inject protected UserDefinedRuleManager m_manager; - @Inject protected BaseRuleHelper m_helper; - @Inject protected ContentFetcher m_fetcher; protected int m_configId; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java index b75e0de208..46226d38dd 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java @@ -19,18 +19,14 @@ package com.dianping.cat.report.alert.spi.config; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.alarm.UserDefineRule; import com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository; import com.dianping.cat.alarm.UserDefineRuleEntity; import com.dianping.cat.spring.CatSpringContext; -@Named public class UserDefinedRuleManager { - @Inject private UserDefineRuleRepository m_dao; public String addUserDefineText(String userDefinedText) throws DalException { @@ -73,4 +69,8 @@ private void refreshSpringBeans() { } } + public void setDao(UserDefineRuleRepository dao) { + m_dao = dao; + } + } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 58ebdd8b0a..94e7a8684b 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -3098,6 +3098,7 @@ com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository + m_dao @@ -3433,15 +3434,6 @@ - - com.dianping.cat.core.config.repository.ConfigRepository - com.dianping.cat.core.config.repository.ConfigRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - - com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager From 1202587eb0fe33f290af514664a50339f7ab94cc Mon Sep 17 00:00:00 2001 From: Shang Date: Sat, 13 Jun 2026 20:23:51 +0800 Subject: [PATCH 070/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E5=91=8A=E8=AD=A6=E5=88=86=E7=BB=84=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/alarm/spi/decorator/ProjectDecorator.java | 2 -- .../cat/alarm/spi/receiver/ProjectContactor.java | 3 --- .../cat/build/report/MetricComponentConfigurator.java | 3 ++- .../cat/home/spring/CatHomeSpringConfiguration.java | 10 ++++++++++ .../cat/report/alert/business/BusinessDecorator.java | 2 -- .../alert/business/BusinessReportGroupService.java | 10 ++++------ .../cat/report/alert/exception/ExceptionDecorator.java | 2 -- .../src/main/resources/META-INF/plexus/components.xml | 1 + 8 files changed, 17 insertions(+), 16 deletions(-) diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java index 8ec0ab6b19..4015b0806a 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java @@ -18,7 +18,6 @@ */ package com.dianping.cat.alarm.spi.decorator; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,7 +30,6 @@ public abstract class ProjectDecorator extends Decorator { private static final Logger LOGGER = LoggerFactory.getLogger(ProjectDecorator.class); - @Inject protected ProjectService m_projectService; public void setProjectService(ProjectService projectService) { diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ProjectContactor.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ProjectContactor.java index a839a93a2e..d152e28b5e 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ProjectContactor.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ProjectContactor.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import com.dianping.cat.alarm.receiver.entity.Receiver; @@ -32,10 +31,8 @@ public abstract class ProjectContactor extends DefaultContactor implements Contactor { - @Inject protected ProjectService m_projectService; - @Inject protected AlertConfigManager m_configManager; private AlertConfigManager getConfigManager() { diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java index 8bb8306912..134253d5b9 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java @@ -77,7 +77,8 @@ public List defineComponents() { all.add(C(DataExtractor.class, DataExtractorImpl.class)); - all.add(A(BusinessReportGroupService.class)); + all.add(C(BusinessReportGroupService.class) // + .req(ModelService.class, BusinessAnalyzer.ID, "m_service")); all.add(C(LocalModelService.class, LocalBusinessService.ID, LocalBusinessService.class) // .req(ReportBucketManager.class, (String) null, "m_bucketManager") // diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 536cadd49b..f39dc40a1d 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -143,6 +143,7 @@ import com.dianping.cat.report.alert.config.BaseRuleHelper; import com.dianping.cat.report.alert.business.BusinessContactor; import com.dianping.cat.report.alert.business.BusinessDecorator; +import com.dianping.cat.report.alert.business.BusinessReportGroupService; import com.dianping.cat.report.alert.business.BusinessRuleConfigManager; import com.dianping.cat.report.alert.event.EventContactor; import com.dianping.cat.report.alert.event.EventDecorator; @@ -2904,6 +2905,15 @@ public CachedBusinessReportService cachedBusinessReportService(BusinessReportSer return service; } + @Bean + public BusinessReportGroupService businessReportGroupService( + @Qualifier("businessModelService") ModelService businessModelService) { + BusinessReportGroupService service = new BusinessReportGroupService(); + + service.setService(businessModelService); + return service; + } + @Bean public CustomDataCalculator customDataCalculator(BusinessKeyHelper businessKeyHelper) { CustomDataCalculator calculator = new CustomDataCalculator(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessDecorator.java b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessDecorator.java index 1fd8e09b59..4e5adaaa6f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessDecorator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessDecorator.java @@ -23,7 +23,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.alarm.spi.AlertEntity; import com.dianping.cat.alarm.spi.AlertType; @@ -36,7 +35,6 @@ public class BusinessDecorator extends ProjectDecorator { public static final String ID = AlertType.Business.getName(); - @Inject private AlertSummaryExecutor m_executor; public void setExecutor(AlertSummaryExecutor executor) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessReportGroupService.java b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessReportGroupService.java index 625d8c1054..8b35131f9d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessReportGroupService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessReportGroupService.java @@ -18,20 +18,14 @@ */ package com.dianping.cat.report.alert.business; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - -import com.dianping.cat.consumer.business.BusinessAnalyzer; import com.dianping.cat.consumer.business.model.entity.BusinessReport; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; -@Named public class BusinessReportGroupService { - @Inject(BusinessAnalyzer.ID) private ModelService m_service; private BusinessReport fetchMetricReport(String product, ModelPeriod period, int min, int max) { @@ -88,4 +82,8 @@ public BusinessReportGroup prepareDatas(String domain, int minute, int duration) reports.setLast(lastReport).setCurrent(currentReport).setDataReady(dataReady); return reports; } + + public void setService(ModelService service) { + m_service = service; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java index d96c8a5619..5f14a8a690 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionDecorator.java @@ -30,7 +30,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.alarm.spi.AlertEntity; @@ -48,7 +47,6 @@ public class ExceptionDecorator extends ProjectDecorator implements Initializabl protected DateFormat m_linkFormat = new SimpleDateFormat("yyyyMMddHH"); - @Inject private AlertSummaryExecutor m_executor; public void setExecutor(AlertSummaryExecutor executor) { diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 94e7a8684b..73c0429099 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -1244,6 +1244,7 @@ com.dianping.cat.report.service.ModelService business + m_service From 9a567680fdf79dc3621fdacaea2d341403ed925e Mon Sep 17 00:00:00 2001 From: Shang Date: Sat, 13 Jun 2026 20:31:56 +0800 Subject: [PATCH 071/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=91=8A=E8=AD=A6=E6=9E=84=E5=BB=BA=E5=99=A8=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/report/ProblemComponentConfigurator.java | 3 ++- .../cat/home/spring/CatHomeSpringConfiguration.java | 9 +++++++++ .../report/alert/exception/AlertExceptionBuilder.java | 8 ++++---- .../src/main/resources/META-INF/plexus/components.xml | 1 + 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java index 0bcfe8dd4b..4abbe9e8e0 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java @@ -94,7 +94,8 @@ public List defineComponents() { all.add(C(Decorator.class, ExceptionDecorator.ID, ExceptionDecorator.class) .req(ProjectService.class, AlertSummaryExecutor.class)); - all.add(A(AlertExceptionBuilder.class)); + all.add(C(AlertExceptionBuilder.class) // + .req(ExceptionRuleConfigManager.class, (String) null, "m_exceptionConfigManager")); all.add(A(ExceptionAlert.class)); all.add(C(AlertSummaryService.class) // diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index f39dc40a1d..634bca2749 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -148,6 +148,7 @@ import com.dianping.cat.report.alert.event.EventContactor; import com.dianping.cat.report.alert.event.EventDecorator; import com.dianping.cat.report.alert.event.EventRuleConfigManager; +import com.dianping.cat.report.alert.exception.AlertExceptionBuilder; import com.dianping.cat.report.alert.exception.ExceptionContactor; import com.dianping.cat.report.alert.exception.ExceptionDecorator; import com.dianping.cat.report.alert.heartbeat.HeartbeatContactor; @@ -2807,6 +2808,14 @@ public ExceptionRuleConfigManager exceptionRuleConfigManager(ConfigRepository co return manager; } + @Bean + public AlertExceptionBuilder alertExceptionBuilder(ExceptionRuleConfigManager exceptionRuleConfigManager) { + AlertExceptionBuilder builder = new AlertExceptionBuilder(); + + builder.setExceptionConfigManager(exceptionRuleConfigManager); + return builder; + } + @Bean(initMethod = "initialize") public AlertConfigManager alertConfigManager(ConfigRepository configRepository, ContentFetcher contentFetcher) { AlertConfigManager manager = new AlertConfigManager(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/AlertExceptionBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/AlertExceptionBuilder.java index 5621a347d4..7da19fe928 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/AlertExceptionBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/AlertExceptionBuilder.java @@ -24,18 +24,14 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; import com.dianping.cat.alarm.spi.AlertLevel; import com.dianping.cat.home.exception.entity.ExceptionLimit; import com.dianping.cat.report.page.dependency.TopMetric.Item; -@Named public class AlertExceptionBuilder { - @Inject private ExceptionRuleConfigManager m_exceptionConfigManager; public Map> buildAlertExceptions(List items) { @@ -128,6 +124,10 @@ private Pair queryDomainTotalLimit(String domain) { return limits; } + public void setExceptionConfigManager(ExceptionRuleConfigManager exceptionConfigManager) { + m_exceptionConfigManager = exceptionConfigManager; + } + public class AlertException { private String m_name; diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 73c0429099..18f4cf58c4 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -1691,6 +1691,7 @@ com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager + m_exceptionConfigManager From fc977135ce6e9d05ef113d35872f618cdf54a779 Mon Sep 17 00:00:00 2001 From: Shang Date: Sat, 13 Jun 2026 20:45:59 +0800 Subject: [PATCH 072/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=20SPI=20=E9=9B=86=E5=90=88=E7=AE=A1=E7=90=86=E5=99=A8?= =?UTF-8?q?=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/alarm/spi/decorator/DecoratorManager.java | 2 -- .../cat/alarm/spi/receiver/ContactorManager.java | 2 -- .../com/dianping/cat/alarm/spi/sender/SenderManager.java | 4 ---- .../dianping/cat/alarm/spi/spliter/SpliterManager.java | 2 -- .../com/dianping/cat/build/ComponentsConfigurator.java | 9 +++++---- 5 files changed, 5 insertions(+), 14 deletions(-) diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java index f1a13502d3..48160c1c72 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java @@ -27,14 +27,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; import com.dianping.cat.alarm.spi.AlertEntity; import com.dianping.cat.alarm.spi.AlertType; import com.dianping.cat.spring.CatSpringContext; -@Named public class DecoratorManager extends ContainerHolder implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(DecoratorManager.class); diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ContactorManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ContactorManager.java index 829d046c26..03dd8357b0 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ContactorManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ContactorManager.java @@ -28,12 +28,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.alarm.spi.AlertChannel; import com.dianping.cat.spring.CatSpringContext; -@Named public class ContactorManager extends ContainerHolder implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(ContactorManager.class); diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SenderManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SenderManager.java index 3320af4868..c1229a4bfb 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SenderManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/SenderManager.java @@ -27,8 +27,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.alarm.spi.AlertChannel; @@ -36,11 +34,9 @@ import com.dianping.cat.message.Event; import com.dianping.cat.spring.CatSpringContext; -@Named public class SenderManager extends ContainerHolder implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(SenderManager.class); - @Inject private ServerConfigManager m_configManager; private Map m_senders = new HashMap(); diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/spliter/SpliterManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/spliter/SpliterManager.java index 5aa3581fab..38167c63a5 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/spliter/SpliterManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/spliter/SpliterManager.java @@ -27,12 +27,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.alarm.spi.AlertChannel; import com.dianping.cat.spring.CatSpringContext; -@Named public class SpliterManager extends ContainerHolder implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(SpliterManager.class); diff --git a/cat-alarm/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-alarm/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index aa68a0098c..7bded93c8b 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-alarm/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -28,6 +28,7 @@ import com.dianping.cat.alarm.spi.rule.DefaultDataChecker; import com.dianping.cat.alarm.spi.sender.*; import com.dianping.cat.alarm.spi.spliter.*; +import com.dianping.cat.config.server.ServerConfigManager; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -48,8 +49,8 @@ public List defineComponents() { all.add(A(SenderConfigManager.class)); all.add(A(DefaultDataChecker.class)); - all.add(A(DecoratorManager.class)); - all.add(A(ContactorManager.class)); + all.add(C(DecoratorManager.class)); + all.add(C(ContactorManager.class)); all.add(A(AlertPolicyManager.class)); @@ -61,7 +62,7 @@ public List defineComponents() { all.add(C(Spliter.class, DXSpliter.ID, DXSpliter.class)); - all.add(A(SpliterManager.class)); + all.add(C(SpliterManager.class)); all.add(C(Sender.class, MailSender.ID, MailSender.class).req(SenderConfigManager.class)); @@ -69,7 +70,7 @@ public List defineComponents() { all.add(C(Sender.class, WeixinSender.ID, WeixinSender.class).req(SenderConfigManager.class)); - all.add(A(SenderManager.class)); + all.add(C(SenderManager.class).req(ServerConfigManager.class)); all.add(A(AlertManager.class)); From 8af04c0872528370aac075d9fd7917ba6ddf0fa6 Mon Sep 17 00:00:00 2001 From: Shang Date: Sat, 13 Jun 2026 20:59:50 +0800 Subject: [PATCH 073/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E9=85=8D=E7=BD=AE=E7=AE=A1=E7=90=86=E5=99=A8=E5=92=8C?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=A3=80=E6=9F=A5=E5=99=A8=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/spi/config/AlertConfigManager.java | 5 ---- .../alarm/spi/config/AlertPolicyManager.java | 5 ---- .../alarm/spi/config/SenderConfigManager.java | 5 ---- .../alarm/spi/rule/DefaultDataChecker.java | 2 -- .../cat/build/ComponentsConfigurator.java | 17 ++++++++--- .../resources/META-INF/plexus/components.xml | 6 ++++ .../build/HomeAlarmComponentConfigurator.java | 14 ++++++++- .../resources/META-INF/plexus/components.xml | 30 +++++++++++++++++++ 8 files changed, 62 insertions(+), 22 deletions(-) diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java index 5c57f2b97a..1f2c8aa60c 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java @@ -23,8 +23,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.lookup.util.StringUtils; import com.dianping.cat.Cat; @@ -36,16 +34,13 @@ import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; -@Named public class AlertConfigManager implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(AlertConfigManager.class); private static final String CONFIG_NAME = "alertConfig"; - @Inject private ConfigRepository m_configDao; - @Inject private ContentFetcher m_fetcher; private int m_configId; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java index 035fe192cc..0e1971b812 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java @@ -26,8 +26,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.alarm.policy.entity.AlertPolicy; @@ -41,7 +39,6 @@ import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; -@Named public class AlertPolicyManager implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(AlertPolicyManager.class); @@ -51,10 +48,8 @@ public class AlertPolicyManager implements Initializable { private static final String DEFAULT_GROUP = "default"; - @Inject private ConfigRepository m_configDao; - @Inject private ContentFetcher m_fetcher; private int m_configId; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java index 6c101734cc..e5d083d3fb 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java @@ -25,8 +25,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.alarm.sender.entity.Par; @@ -39,16 +37,13 @@ import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.spring.CatSpringContext; -@Named public class SenderConfigManager implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(SenderConfigManager.class); private static final String CONFIG_NAME = "senderConfig"; - @Inject private ConfigRepository m_configDao; - @Inject private ContentFetcher m_fetcher; private int m_configId; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/DefaultDataChecker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/DefaultDataChecker.java index bd2205d767..2cafa87ab3 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/DefaultDataChecker.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/DefaultDataChecker.java @@ -23,13 +23,11 @@ import com.dianping.cat.alarm.rule.entity.SubCondition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; import java.util.ArrayList; import java.util.List; -@Named(type = DataChecker.class) public class DefaultDataChecker implements DataChecker { private static final Logger LOGGER = LoggerFactory.getLogger(DefaultDataChecker.class); diff --git a/cat-alarm/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-alarm/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 7bded93c8b..cd09208ae7 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-alarm/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -25,10 +25,13 @@ import com.dianping.cat.alarm.spi.config.SenderConfigManager; import com.dianping.cat.alarm.spi.decorator.DecoratorManager; import com.dianping.cat.alarm.spi.receiver.ContactorManager; +import com.dianping.cat.alarm.spi.rule.DataChecker; import com.dianping.cat.alarm.spi.rule.DefaultDataChecker; import com.dianping.cat.alarm.spi.sender.*; import com.dianping.cat.alarm.spi.spliter.*; +import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.core.config.repository.ConfigRepository; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -46,13 +49,17 @@ public List defineComponents() { all.addAll(new CatDatabaseConfigurator().defineComponents()); - all.add(A(SenderConfigManager.class)); + all.add(C(SenderConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); - all.add(A(DefaultDataChecker.class)); + all.add(C(DataChecker.class, DefaultDataChecker.class)); all.add(C(DecoratorManager.class)); all.add(C(ContactorManager.class)); - all.add(A(AlertPolicyManager.class)); + all.add(C(AlertPolicyManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); all.add(C(Spliter.class, MailSpliter.ID, MailSpliter.class)); @@ -76,7 +83,9 @@ public List defineComponents() { all.add(A(AlertService.class)); - all.add(A(AlertConfigManager.class)); + all.add(C(AlertConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); return all; } diff --git a/cat-alarm/src/main/resources/META-INF/plexus/components.xml b/cat-alarm/src/main/resources/META-INF/plexus/components.xml index c5e90d0373..08fa1d9ea6 100644 --- a/cat-alarm/src/main/resources/META-INF/plexus/components.xml +++ b/cat-alarm/src/main/resources/META-INF/plexus/components.xml @@ -61,9 +61,11 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher @@ -85,9 +87,11 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher @@ -196,9 +200,11 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher diff --git a/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java index be3ffb053d..bc03e2228e 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java @@ -25,6 +25,10 @@ import org.unidal.lookup.configuration.Component; import com.dianping.cat.alarm.spi.config.AlertConfigManager; +import com.dianping.cat.alarm.spi.config.AlertPolicyManager; +import com.dianping.cat.alarm.spi.config.SenderConfigManager; +import com.dianping.cat.config.content.ContentFetcher; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository; import com.dianping.cat.report.alert.AlarmManager; import com.dianping.cat.report.alert.config.BaseRuleHelper; @@ -37,7 +41,15 @@ public List defineComponents() { List all = new ArrayList(); all.add(A(AlarmManager.class)); - all.add(A(AlertConfigManager.class)); + all.add(C(AlertConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); + all.add(C(SenderConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); + all.add(C(AlertPolicyManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); all.add(C(BaseRuleHelper.class)); all.add(C(UserDefinedRuleManager.class) // .req(UserDefineRuleRepository.class, (String) null, "m_dao")); diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 18f4cf58c4..296b6d564b 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -3084,9 +3084,39 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao + + + com.dianping.cat.config.content.ContentFetcher + m_fetcher + + + + + com.dianping.cat.alarm.spi.config.SenderConfigManager + com.dianping.cat.alarm.spi.config.SenderConfigManager + + + com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher + + + + + com.dianping.cat.alarm.spi.config.AlertPolicyManager + com.dianping.cat.alarm.spi.config.AlertPolicyManager + + + com.dianping.cat.core.config.repository.ConfigRepository + m_configDao + + + com.dianping.cat.config.content.ContentFetcher + m_fetcher From de106507708e73d47383171f59e94f98b6df2aeb Mon Sep 17 00:00:00 2001 From: Shang Date: Sat, 13 Jun 2026 21:26:12 +0800 Subject: [PATCH 074/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=20SPI=20=E4=B8=8E=E5=91=8A=E8=AD=A6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/alarm/service/AlertService.java | 4 -- .../dianping/cat/alarm/spi/AlertManager.java | 38 ++++++++---- .../cat/alarm/spi/sender/AbstractSender.java | 2 - .../cat/build/ComponentsConfigurator.java | 21 +++++-- .../resources/META-INF/plexus/components.xml | 11 ++++ .../build/HomeAlarmComponentConfigurator.java | 12 +++- .../report/EventComponentConfigurator.java | 10 +++- .../HeartbeatComponentConfigurator.java | 13 ++++- .../report/MetricComponentConfigurator.java | 19 +++++- .../report/ProblemComponentConfigurator.java | 7 ++- .../TransactionComponentConfigurator.java | 9 ++- .../cat/report/alert/AlarmManager.java | 2 - .../report/alert/business/BusinessAlert.java | 58 ++++++++++++++----- .../cat/report/alert/event/EventAlert.java | 28 ++++++--- .../alert/exception/ExceptionAlert.java | 23 +++++--- .../alert/heartbeat/HeartbeatAlert.java | 38 ++++++++---- .../alert/transaction/TransactionAlert.java | 28 ++++++--- .../resources/META-INF/plexus/components.xml | 54 +++++++++++++++++ 18 files changed, 301 insertions(+), 76 deletions(-) diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java index d861bf65d1..c25d2ed269 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java @@ -24,8 +24,6 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,11 +33,9 @@ import com.dianping.cat.alarm.spi.AlertEntity; import com.dianping.cat.alarm.spi.sender.SendMessageEntity; -@Named public class AlertService { private static final Logger LOGGER = LoggerFactory.getLogger(AlertService.class); - @Inject private AlertRepository m_alertDao; private Alert buildAlert(AlertEntity alertEntity, SendMessageEntity message) { diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/AlertManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/AlertManager.java index 7add6e70dc..50f1bf262c 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/AlertManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/AlertManager.java @@ -35,8 +35,6 @@ import org.slf4j.LoggerFactory; import org.unidal.helper.Threads; import org.unidal.helper.Threads.Task; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; import java.text.DateFormat; @@ -49,31 +47,23 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; -@Named public class AlertManager implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(AlertManager.class); private static final int MILLIS1MINUTE = 60 * 1000; - @Inject protected SpliterManager m_splitterManager; - @Inject protected SenderManager m_senderManager; - @Inject protected AlertService m_alertService; - @Inject private AlertPolicyManager m_policyManager; - @Inject private DecoratorManager m_decoratorManager; - @Inject private ContactorManager m_contactorManager; - @Inject private ServerConfigManager m_configManager; private BlockingQueue m_alerts = new LinkedBlockingDeque(10000); @@ -128,6 +118,34 @@ public boolean isSuspend(String alertKey, int suspendMinute) { return false; } + public void setAlertService(AlertService alertService) { + m_alertService = alertService; + } + + public void setConfigManager(ServerConfigManager configManager) { + m_configManager = configManager; + } + + public void setContactorManager(ContactorManager contactorManager) { + m_contactorManager = contactorManager; + } + + public void setDecoratorManager(DecoratorManager decoratorManager) { + m_decoratorManager = decoratorManager; + } + + public void setPolicyManager(AlertPolicyManager policyManager) { + m_policyManager = policyManager; + } + + public void setSenderManager(SenderManager senderManager) { + m_senderManager = senderManager; + } + + public void setSplitterManager(SpliterManager splitterManager) { + m_splitterManager = splitterManager; + } + public List queryLastestAlarmKey(int minute) { List keys = new ArrayList(); long currentTimeMillis = System.currentTimeMillis(); diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java index b2fb551756..fa80ab7535 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java @@ -28,7 +28,6 @@ import org.codehaus.plexus.logging.Logger; import org.slf4j.LoggerFactory; import org.unidal.helper.Files; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.alarm.spi.config.SenderConfigManager; @@ -37,7 +36,6 @@ public abstract class AbstractSender implements Sender, LogEnabled { private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(AbstractSender.class); - @Inject protected SenderConfigManager m_senderConfigManager; protected Logger m_logger; diff --git a/cat-alarm/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-alarm/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index cd09208ae7..474a84f797 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-alarm/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -32,6 +32,7 @@ import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -71,17 +72,27 @@ public List defineComponents() { all.add(C(SpliterManager.class)); - all.add(C(Sender.class, MailSender.ID, MailSender.class).req(SenderConfigManager.class)); + all.add(C(Sender.class, MailSender.ID, MailSender.class) // + .req(SenderConfigManager.class, (String) null, "m_senderConfigManager")); - all.add(C(Sender.class, SmsSender.ID, SmsSender.class).req(SenderConfigManager.class)); + all.add(C(Sender.class, SmsSender.ID, SmsSender.class) // + .req(SenderConfigManager.class, (String) null, "m_senderConfigManager")); - all.add(C(Sender.class, WeixinSender.ID, WeixinSender.class).req(SenderConfigManager.class)); + all.add(C(Sender.class, WeixinSender.ID, WeixinSender.class) // + .req(SenderConfigManager.class, (String) null, "m_senderConfigManager")); all.add(C(SenderManager.class).req(ServerConfigManager.class)); - all.add(A(AlertManager.class)); + all.add(C(AlertManager.class) // + .req(SpliterManager.class, (String) null, "m_splitterManager") // + .req(SenderManager.class, (String) null, "m_senderManager") // + .req(AlertService.class, (String) null, "m_alertService") // + .req(AlertPolicyManager.class, (String) null, "m_policyManager") // + .req(DecoratorManager.class, (String) null, "m_decoratorManager") // + .req(ContactorManager.class, (String) null, "m_contactorManager") // + .req(ServerConfigManager.class, (String) null, "m_configManager")); - all.add(A(AlertService.class)); + all.add(C(AlertService.class).req(AlertRepository.class, (String) null, "m_alertDao")); all.add(C(AlertConfigManager.class) // .req(ConfigRepository.class, (String) null, "m_configDao") // diff --git a/cat-alarm/src/main/resources/META-INF/plexus/components.xml b/cat-alarm/src/main/resources/META-INF/plexus/components.xml index 08fa1d9ea6..9e3eefac4b 100644 --- a/cat-alarm/src/main/resources/META-INF/plexus/components.xml +++ b/cat-alarm/src/main/resources/META-INF/plexus/components.xml @@ -126,6 +126,7 @@ com.dianping.cat.alarm.spi.config.SenderConfigManager + m_senderConfigManager @@ -136,6 +137,7 @@ com.dianping.cat.alarm.spi.config.SenderConfigManager + m_senderConfigManager @@ -146,6 +148,7 @@ com.dianping.cat.alarm.spi.config.SenderConfigManager + m_senderConfigManager @@ -164,24 +167,31 @@ com.dianping.cat.alarm.spi.spliter.SpliterManager + m_splitterManager com.dianping.cat.alarm.spi.sender.SenderManager + m_senderManager com.dianping.cat.alarm.service.AlertService + m_alertService com.dianping.cat.alarm.spi.config.AlertPolicyManager + m_policyManager com.dianping.cat.alarm.spi.decorator.DecoratorManager + m_decoratorManager com.dianping.cat.alarm.spi.receiver.ContactorManager + m_contactorManager com.dianping.cat.config.server.ServerConfigManager + m_configManager @@ -191,6 +201,7 @@ com.dianping.cat.core.mybatis.repository.alert.AlertRepository + m_alertDao diff --git a/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java index bc03e2228e..4b3468855d 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/HomeAlarmComponentConfigurator.java @@ -31,8 +31,13 @@ import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository; import com.dianping.cat.report.alert.AlarmManager; +import com.dianping.cat.report.alert.business.BusinessAlert; import com.dianping.cat.report.alert.config.BaseRuleHelper; +import com.dianping.cat.report.alert.event.EventAlert; +import com.dianping.cat.report.alert.exception.ExceptionAlert; +import com.dianping.cat.report.alert.heartbeat.HeartbeatAlert; import com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager; +import com.dianping.cat.report.alert.transaction.TransactionAlert; public class HomeAlarmComponentConfigurator extends AbstractResourceConfigurator { @Override @@ -40,7 +45,12 @@ public List defineComponents() { List all = new ArrayList(); - all.add(A(AlarmManager.class)); + all.add(C(AlarmManager.class) // + .req(BusinessAlert.class, (String) null, "m_businessAlert") // + .req(EventAlert.class, (String) null, "m_eventAlert") // + .req(ExceptionAlert.class, (String) null, "m_exceptionAlert") // + .req(HeartbeatAlert.class, (String) null, "m_heartbeatAlert") // + .req(TransactionAlert.class, (String) null, "m_transactionAlert")); all.add(C(AlertConfigManager.class) // .req(ConfigRepository.class, (String) null, "m_configDao") // .req(ContentFetcher.class, (String) null, "m_fetcher")); diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java index 478ca2783c..f2368afdd8 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/EventComponentConfigurator.java @@ -25,9 +25,11 @@ import org.unidal.lookup.configuration.Component; import com.dianping.cat.analysis.MessageConsumer; +import com.dianping.cat.alarm.spi.AlertManager; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; +import com.dianping.cat.alarm.spi.rule.DataChecker; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.config.repository.ConfigRepository; @@ -51,6 +53,7 @@ import com.dianping.cat.report.page.event.service.EventReportService; import com.dianping.cat.report.page.event.service.HistoricalEventService; import com.dianping.cat.report.page.event.service.LocalEventService; +import com.dianping.cat.report.page.event.transform.EventMergeHelper; import com.dianping.cat.report.server.RemoteServersManager; import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; @@ -66,7 +69,12 @@ public List defineComponents() { all.add(C(Contactor.class, EventContactor.ID, EventContactor.class) .req(ProjectService.class, AlertConfigManager.class)); all.add(C(Decorator.class, EventDecorator.ID, EventDecorator.class)); - all.add(A(EventAlert.class)); + all.add(C(EventAlert.class) // + .req(EventRuleConfigManager.class, (String) null, "m_ruleConfigManager") // + .req(DataChecker.class, (String) null, "m_dataChecker") // + .req(AlertManager.class, (String) null, "m_sendManager") // + .req(ModelService.class, EventAnalyzer.ID, "m_service") // + .req(EventMergeHelper.class, (String) null, "m_mergeHelper")); all.add(reportService(EventReportService.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java index e95ff2e6b9..95f794432b 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java @@ -25,10 +25,13 @@ import org.unidal.lookup.configuration.Component; import com.dianping.cat.analysis.MessageConsumer; +import com.dianping.cat.alarm.spi.AlertManager; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; +import com.dianping.cat.alarm.spi.rule.DataChecker; import com.dianping.cat.config.content.ContentFetcher; +import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; @@ -47,6 +50,7 @@ import com.dianping.cat.report.alert.heartbeat.HeartbeatDecorator; import com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager; import com.dianping.cat.report.alert.spi.config.UserDefinedRuleManager; +import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; import com.dianping.cat.report.page.heartbeat.service.CompositeHeartbeatService; import com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService; import com.dianping.cat.report.page.heartbeat.service.HistoricalHeartbeatService; @@ -80,7 +84,14 @@ public List defineComponents() { .req(ProjectService.class, AlertConfigManager.class)); all.add(C(Decorator.class, HeartbeatDecorator.ID, HeartbeatDecorator.class)); - all.add(A(HeartbeatAlert.class)); + all.add(C(HeartbeatAlert.class) // + .req(HeartbeatRuleConfigManager.class, (String) null, "m_ruleConfigManager") // + .req(DataChecker.class, (String) null, "m_dataChecker") // + .req(AlertManager.class, (String) null, "m_sendManager") // + .req(ModelService.class, HeartbeatAnalyzer.ID, "m_heartbeatService") // + .req(HeartbeatDisplayPolicyManager.class, (String) null, "m_displayManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_serverFilterConfigManager") // + .req(ProjectService.class, (String) null, "m_projectService")); return all; } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java index 134253d5b9..67aebba92a 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/MetricComponentConfigurator.java @@ -24,10 +24,13 @@ import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; +import com.dianping.cat.alarm.spi.AlertManager; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; +import com.dianping.cat.alarm.spi.rule.DataChecker; import com.dianping.cat.analysis.MessageConsumer; +import com.dianping.cat.config.business.BusinessConfigManager; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.consumer.business.BusinessAnalyzer; import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; @@ -45,6 +48,7 @@ import com.dianping.cat.report.alert.business.BusinessDecorator; import com.dianping.cat.report.alert.business.BusinessReportGroupService; import com.dianping.cat.report.alert.business.BusinessRuleConfigManager; +import com.dianping.cat.report.alert.config.BaseRuleHelper; import com.dianping.cat.report.alert.summary.AlertSummaryExecutor; import com.dianping.cat.report.graph.metric.DataExtractor; import com.dianping.cat.report.graph.metric.impl.DataExtractorImpl; @@ -53,6 +57,7 @@ import com.dianping.cat.report.page.business.service.CompositeBusinessService; import com.dianping.cat.report.page.business.service.HistoricalBusinessService; import com.dianping.cat.report.page.business.service.LocalBusinessService; +import com.dianping.cat.report.page.business.graph.CustomDataCalculator; import com.dianping.cat.report.page.business.task.BusinessKeyHelper; import com.dianping.cat.report.page.business.task.BusinessPointParser; import com.dianping.cat.report.page.metric.service.BaselineService; @@ -64,6 +69,7 @@ import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; public class MetricComponentConfigurator extends AbstractResourceConfigurator { @Override @@ -104,7 +110,18 @@ public List defineComponents() { all.add(C(Decorator.class, BusinessDecorator.ID, BusinessDecorator.class) .req(ProjectService.class, AlertSummaryExecutor.class)); - all.add(A(BusinessAlert.class)); + all.add(C(BusinessAlert.class) // + .req(BaseRuleHelper.class, (String) null, "m_baseRuleHelper") // + .req(BusinessRuleConfigManager.class, (String) null, "m_alertConfigManager") // + .req(BusinessConfigManager.class, (String) null, "m_configManager") // + .req(BusinessTagConfigManager.class, (String) null, "m_tagConfigManager") // + .req(BusinessReportGroupService.class, (String) null, "m_service") // + .req(ProjectService.class, (String) null, "m_projectService") // + .req(AlertManager.class, (String) null, "m_sendManager") // + .req(BusinessKeyHelper.class, (String) null, "m_keyHelper") // + .req(BaselineService.class, (String) null, "m_baselineService") // + .req(DataChecker.class, (String) null, "m_dataChecker") // + .req(CustomDataCalculator.class, (String) null, "m_customDataCalculator")); return all; } diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java index 4abbe9e8e0..f7b3c0c72a 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/ProblemComponentConfigurator.java @@ -25,6 +25,7 @@ import org.unidal.lookup.configuration.Component; import com.dianping.cat.analysis.MessageConsumer; +import com.dianping.cat.alarm.spi.AlertManager; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; @@ -97,7 +98,11 @@ public List defineComponents() { all.add(C(AlertExceptionBuilder.class) // .req(ExceptionRuleConfigManager.class, (String) null, "m_exceptionConfigManager")); - all.add(A(ExceptionAlert.class)); + all.add(C(ExceptionAlert.class) // + .req(ExceptionRuleConfigManager.class, (String) null, "m_exceptionConfigManager") // + .req(AlertExceptionBuilder.class, (String) null, "m_alertBuilder") // + .req(ModelService.class, "top", "m_topService") // + .req(AlertManager.class, (String) null, "m_sendManager")); all.add(C(AlertSummaryService.class) // .req(AlertSummaryRepository.class, (String) null, "m_alertSummaryDao")); all.add(C(SummaryBuilder.class, RelatedSummaryBuilder.ID, RelatedSummaryBuilder.class) // diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java index 9d0a08a242..d5abba4d34 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/TransactionComponentConfigurator.java @@ -25,9 +25,11 @@ import org.unidal.lookup.configuration.Component; import com.dianping.cat.analysis.MessageConsumer; +import com.dianping.cat.alarm.spi.AlertManager; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.decorator.Decorator; import com.dianping.cat.alarm.spi.receiver.Contactor; +import com.dianping.cat.alarm.spi.rule.DataChecker; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.config.repository.ConfigRepository; @@ -69,7 +71,12 @@ public List defineComponents() { all.add(C(Contactor.class, TransactionContactor.ID, TransactionContactor.class) .req(ProjectService.class, AlertConfigManager.class)); all.add(C(Decorator.class, TransactionDecorator.ID, TransactionDecorator.class)); - all.add(A(TransactionAlert.class)); + all.add(C(TransactionAlert.class) // + .req(TransactionRuleConfigManager.class, (String) null, "m_ruleConfigManager") // + .req(DataChecker.class, (String) null, "m_dataChecker") // + .req(AlertManager.class, (String) null, "m_sendManager") // + .req(ModelService.class, TransactionAnalyzer.ID, "m_service") // + .req(TransactionMergeHelper.class, (String) null, "m_mergeHelper")); all.add(C(LocalModelService.class, LocalTransactionService.ID, LocalTransactionService.class) // .req(ReportBucketManager.class, (String) null, "m_bucketManager") // diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/AlarmManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/AlarmManager.java index 8dc2fea61d..d6314295f3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/AlarmManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/AlarmManager.java @@ -23,7 +23,6 @@ import org.unidal.helper.Threads; import org.unidal.helper.Threads.Task; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.report.alert.business.BusinessAlert; import com.dianping.cat.report.alert.event.EventAlert; @@ -32,7 +31,6 @@ import com.dianping.cat.report.alert.transaction.TransactionAlert; import com.dianping.cat.spring.CatSpringContext; -@Named public class AlarmManager extends ContainerHolder { private static final Logger LOGGER = LoggerFactory.getLogger(AlarmManager.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java index b9994ea712..0114bf5e61 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java @@ -29,8 +29,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.helper.Threads.Task; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; import com.dianping.cat.Cat; @@ -59,7 +57,6 @@ import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; -@Named public class BusinessAlert implements Task { private static final Logger LOGGER = LoggerFactory.getLogger(BusinessAlert.class); @@ -69,37 +66,26 @@ public class BusinessAlert implements Task { private static final int DATA_AREADY_MINUTE = 1; - @Inject protected BaseRuleHelper m_baseRuleHelper; - @Inject private BusinessRuleConfigManager m_alertConfigManager; - @Inject private BusinessConfigManager m_configManager; - @Inject private BusinessTagConfigManager m_tagConfigManager; - @Inject private BusinessReportGroupService m_service; - @Inject private ProjectService m_projectService; - @Inject private AlertManager m_sendManager; - @Inject private BusinessKeyHelper m_keyHelper; - @Inject private BaselineService m_baselineService; - @Inject private DataChecker m_dataChecker; - @Inject private CustomDataCalculator m_customDataCalculator; private void buidMonitorConfigs(String domain, String key, Map>> monitorConfigs, @@ -375,6 +361,50 @@ private void sendBusinessAlerts(String domain, String metricName, List m_service; - @Inject private EventMergeHelper m_mergeHelper; private double[] buildArrayData(int start, int end, String type, String name, String monitor, EventReport report) { @@ -312,4 +304,24 @@ public void run() { public void shutdown() { } + public void setDataChecker(DataChecker dataChecker) { + m_dataChecker = dataChecker; + } + + public void setMergeHelper(EventMergeHelper mergeHelper) { + m_mergeHelper = mergeHelper; + } + + public void setRuleConfigManager(EventRuleConfigManager ruleConfigManager) { + m_ruleConfigManager = ruleConfigManager; + } + + public void setSendManager(AlertManager sendManager) { + m_sendManager = sendManager; + } + + public void setService(ModelService service) { + m_service = service; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionAlert.java index 27a67441af..69531b0386 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionAlert.java @@ -28,8 +28,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.helper.Threads.Task; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -48,7 +46,6 @@ import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; -@Named public class ExceptionAlert implements Task { private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionAlert.class); @@ -56,16 +53,12 @@ public class ExceptionAlert implements Task { protected static final int ALERT_PERIOD = 1; - @Inject protected ExceptionRuleConfigManager m_exceptionConfigManager; - @Inject protected AlertExceptionBuilder m_alertBuilder; - @Inject(type = ModelService.class, value = TopAnalyzer.ID) protected ModelService m_topService; - @Inject protected AlertManager m_sendManager; protected TopMetric buildTopMetric(Date date) { @@ -177,4 +170,20 @@ public void run() { @Override public void shutdown() { } + + public void setAlertBuilder(AlertExceptionBuilder alertBuilder) { + m_alertBuilder = alertBuilder; + } + + public void setExceptionConfigManager(ExceptionRuleConfigManager exceptionConfigManager) { + m_exceptionConfigManager = exceptionConfigManager; + } + + public void setSendManager(AlertManager sendManager) { + m_sendManager = sendManager; + } + + public void setTopService(ModelService topService) { + m_topService = topService; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java index 73e279f744..ea0a0a539d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java @@ -28,8 +28,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.helper.Threads.Task; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.lookup.util.StringUtils; import org.unidal.tuple.Pair; @@ -59,7 +57,6 @@ import com.dianping.cat.service.ProjectService; import com.dianping.cat.spring.CatSpringContext; -@Named public class HeartbeatAlert implements Task { private static final Logger LOGGER = LoggerFactory.getLogger(HeartbeatAlert.class); @@ -67,25 +64,18 @@ public class HeartbeatAlert implements Task { private static final int DATA_ALREADY_MINUTE = 1; - @Inject protected HeartbeatRuleConfigManager m_ruleConfigManager; - @Inject protected DataChecker m_dataChecker; - @Inject protected AlertManager m_sendManager; - @Inject(type = ModelService.class, value = HeartbeatAnalyzer.ID) private ModelService m_heartbeatService; - @Inject private HeartbeatDisplayPolicyManager m_displayManager; - @Inject private ServerFilterConfigManager m_serverFilterConfigManager; - @Inject private ProjectService m_projectService; private Map buildArrayForExtensions(List periods) { @@ -425,6 +415,34 @@ public void shutdown() { } + public void setDataChecker(DataChecker dataChecker) { + m_dataChecker = dataChecker; + } + + public void setDisplayManager(HeartbeatDisplayPolicyManager displayManager) { + m_displayManager = displayManager; + } + + public void setHeartbeatService(ModelService heartbeatService) { + m_heartbeatService = heartbeatService; + } + + public void setProjectService(ProjectService projectService) { + m_projectService = projectService; + } + + public void setRuleConfigManager(HeartbeatRuleConfigManager ruleConfigManager) { + m_ruleConfigManager = ruleConfigManager; + } + + public void setSendManager(AlertManager sendManager) { + m_sendManager = sendManager; + } + + public void setServerFilterConfigManager(ServerFilterConfigManager serverFilterConfigManager) { + m_serverFilterConfigManager = serverFilterConfigManager; + } + private void refreshSpringBeans() { ServerFilterConfigManager serverFilterConfigManager = CatSpringContext .getBeanIfAvailable(ServerFilterConfigManager.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java index 9329c92ff7..2124e6dbd9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java @@ -47,8 +47,6 @@ import org.slf4j.LoggerFactory; import org.unidal.helper.Splitters; import org.unidal.helper.Threads.Task; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; import java.util.ArrayList; @@ -57,7 +55,6 @@ import java.util.Map; import java.util.Map.Entry; -@Named public class TransactionAlert implements Task, LogEnabled { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(TransactionAlert.class); @@ -73,21 +70,16 @@ public class TransactionAlert implements Task, LogEnabled { private static final String FAIL_RATIO = "failRatio"; - @Inject protected TransactionRuleConfigManager m_ruleConfigManager; - @Inject protected DataChecker m_dataChecker; - @Inject protected AlertManager m_sendManager; protected Logger m_logger; - @Inject(type = ModelService.class, value = TransactionAnalyzer.ID) private ModelService m_service; - @Inject private TransactionMergeHelper m_mergeHelper; private double[] buildArrayData(int start, int end, String type, String name, String monitor, @@ -317,4 +309,24 @@ public void run() { public void shutdown() { } + public void setDataChecker(DataChecker dataChecker) { + m_dataChecker = dataChecker; + } + + public void setMergeHelper(TransactionMergeHelper mergeHelper) { + m_mergeHelper = mergeHelper; + } + + public void setRuleConfigManager(TransactionRuleConfigManager ruleConfigManager) { + m_ruleConfigManager = ruleConfigManager; + } + + public void setSendManager(AlertManager sendManager) { + m_sendManager = sendManager; + } + + public void setService(ModelService service) { + m_service = service; + } + } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 296b6d564b..aac3da021c 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -965,19 +965,24 @@ com.dianping.cat.report.alert.transaction.TransactionRuleConfigManager + m_ruleConfigManager com.dianping.cat.alarm.spi.rule.DataChecker + m_dataChecker com.dianping.cat.alarm.spi.AlertManager + m_sendManager com.dianping.cat.report.service.ModelService transaction + m_service com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper + m_mergeHelper @@ -1079,19 +1084,24 @@ com.dianping.cat.report.alert.event.EventRuleConfigManager + m_ruleConfigManager com.dianping.cat.alarm.spi.rule.DataChecker + m_dataChecker com.dianping.cat.alarm.spi.AlertManager + m_sendManager com.dianping.cat.report.service.ModelService event + m_service com.dianping.cat.report.page.event.transform.EventMergeHelper + m_mergeHelper @@ -1360,36 +1370,47 @@ com.dianping.cat.report.alert.config.BaseRuleHelper + m_baseRuleHelper com.dianping.cat.report.alert.business.BusinessRuleConfigManager + m_alertConfigManager com.dianping.cat.config.business.BusinessConfigManager + m_configManager com.dianping.cat.system.page.business.config.BusinessTagConfigManager + m_tagConfigManager com.dianping.cat.report.alert.business.BusinessReportGroupService + m_service com.dianping.cat.service.ProjectService + m_projectService com.dianping.cat.alarm.spi.AlertManager + m_sendManager com.dianping.cat.report.page.business.task.BusinessKeyHelper + m_keyHelper com.dianping.cat.report.page.metric.service.BaselineService + m_baselineService com.dianping.cat.alarm.spi.rule.DataChecker + m_dataChecker com.dianping.cat.report.page.business.graph.CustomDataCalculator + m_customDataCalculator @@ -1531,25 +1552,32 @@ com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager + m_ruleConfigManager com.dianping.cat.alarm.spi.rule.DataChecker + m_dataChecker com.dianping.cat.alarm.spi.AlertManager + m_sendManager com.dianping.cat.report.service.ModelService heartbeat + m_heartbeatService com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager + m_displayManager com.dianping.cat.config.server.ServerFilterConfigManager + m_serverFilterConfigManager com.dianping.cat.service.ProjectService + m_projectService @@ -1701,16 +1729,20 @@ com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager + m_exceptionConfigManager com.dianping.cat.report.alert.exception.AlertExceptionBuilder + m_alertBuilder com.dianping.cat.report.service.ModelService top + m_topService com.dianping.cat.alarm.spi.AlertManager + m_sendManager @@ -3077,6 +3109,28 @@ com.dianping.cat.report.alert.AlarmManager com.dianping.cat.report.alert.AlarmManager + + + com.dianping.cat.report.alert.business.BusinessAlert + m_businessAlert + + + com.dianping.cat.report.alert.event.EventAlert + m_eventAlert + + + com.dianping.cat.report.alert.exception.ExceptionAlert + m_exceptionAlert + + + com.dianping.cat.report.alert.heartbeat.HeartbeatAlert + m_heartbeatAlert + + + com.dianping.cat.report.alert.transaction.TransactionAlert + m_transactionAlert + + com.dianping.cat.alarm.spi.config.AlertConfigManager From 27b5ff63f3080bea638d699a5e0d759afa5c83d3 Mon Sep 17 00:00:00 2001 From: Shang Date: Sat, 13 Jun 2026 21:55:10 +0800 Subject: [PATCH 075/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8=E4=BB=BB=E5=8A=A1=E3=80=81=E8=B7=AF=E7=94=B1=E4=B8=8E?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=9C=8D=E5=8A=A1=E7=BB=84=E4=BB=B6=E6=B3=A8?= =?UTF-8?q?=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/ComponentsConfigurator.java | 57 +++++- .../report/ReportComponentConfigurator.java | 27 ++- .../graph/metric/AbstractGraphCreator.java | 4 - .../task/DefaultRemoteServersUpdater.java | 5 - .../cat/report/task/DefaultTaskConsumer.java | 5 - .../report/task/cmdb/ProjectUpdateTask.java | 6 - .../config/BusinessTagConfigManager.java | 2 - .../page/login/service/SigninService.java | 32 ++-- .../page/login/service/TokenManager.java | 14 +- .../router/config/RouterConfigAdjustor.java | 8 - .../router/config/RouterConfigHandler.java | 7 - .../router/config/RouterConfigManager.java | 7 - .../service/CachedRouterConfigService.java | 7 +- .../router/service/RouterConfigService.java | 4 - .../resources/META-INF/plexus/components.xml | 167 ++++++++++++------ 15 files changed, 212 insertions(+), 140 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index b303972ee1..5bc29f9637 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -51,6 +51,7 @@ import com.dianping.cat.consumer.matrix.MatrixAnalyzer; import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.state.StateAnalyzer; +import com.dianping.cat.consumer.state.model.entity.StateReport; import com.dianping.cat.consumer.storage.StorageAnalyzer; import com.dianping.cat.consumer.top.TopAnalyzer; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; @@ -87,9 +88,22 @@ import com.dianping.cat.report.page.statistics.service.JarReportService; import com.dianping.cat.report.page.statistics.service.ServiceReportService; import com.dianping.cat.report.page.statistics.service.UtilizationReportService; +import com.dianping.cat.report.page.state.service.LocalStateService; import com.dianping.cat.report.page.transaction.service.TransactionReportService; +import com.dianping.cat.report.server.ServersUpdater; +import com.dianping.cat.report.service.LocalModelService; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.report.task.DefaultRemoteServersUpdater; +import com.dianping.cat.report.task.DefaultTaskConsumer; +import com.dianping.cat.report.task.ReportFacade; +import com.dianping.cat.report.task.cmdb.ProjectUpdateTask; +import com.dianping.cat.service.HostinfoService; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.system.page.login.service.CookieManager; +import com.dianping.cat.system.page.login.service.SessionManager; +import com.dianping.cat.system.page.login.service.SigninService; +import com.dianping.cat.system.page.login.service.TokenBuilder; +import com.dianping.cat.system.page.login.service.TokenManager; import com.dianping.cat.system.page.permission.ResourceConfigManager; import com.dianping.cat.system.page.permission.UserConfigManager; @@ -134,6 +148,8 @@ public List defineComponents() { // must define in home module instead of core all.addAll(defineTableProviderComponents()); + all.addAll(defineTaskComponents()); + all.add(C(com.dianping.cat.report.page.home.Handler.class) // .req(com.dianping.cat.report.page.home.JspViewer.class, (String) null, "m_jspViewer") // .req(TcpSocketReceiver.class, (String) null, "m_receiver") // @@ -359,9 +375,19 @@ public List defineComponents() { all.add(C(UserConfigManager.class)); all.add(C(ResourceConfigManager.class)); - - all.add(C(ModuleManager.class, DefaultModuleManager.class) // - .config(E("topLevelModules").value(CatHomeModule.ID))); + + all.add(C(SigninService.class) // + .req(TokenManager.class, (String) null, "m_tokenManager") // + .req(SessionManager.class, (String) null, "m_sessionManager")); + all.add(C(TokenManager.class) // + .req(CookieManager.class, (String) null, "m_cookieManager") // + .req(TokenBuilder.class, (String) null, "m_tokenBuilder")); + all.add(C(CookieManager.class)); + all.add(C(TokenBuilder.class)); + all.add(C(SessionManager.class)); + + all.add(C(ModuleManager.class, DefaultModuleManager.class) // + .config(E("topLevelModules").value(CatHomeModule.ID))); all.addAll(new TransactionComponentConfigurator().defineComponents()); @@ -416,15 +442,32 @@ private void addCoreRepositoryComponents(List components) { components.add(C(WeeklyReportContentRepository.class).req(DataSourceManager.class)); } - private List defineConfigComponents() { - List all = new ArrayList(); + private List defineConfigComponents() { + List all = new ArrayList(); all.add(C(DomainGroupConfigManager.class)); return all; } - - private List defineTableProviderComponents() { + + private List defineTaskComponents() { + List all = new ArrayList(); + + all.add(C(DefaultTaskConsumer.class) // + .req(ReportFacade.class, (String) null, "m_reportFacade") // + .req(TaskRepository.class, (String) null, "m_taskDao")); + all.add(C(ProjectUpdateTask.class) // + .req(HostinfoService.class, (String) null, "m_hostInfoService") // + .req(ProjectService.class, (String) null, "m_projectService") // + .req(TransactionReportService.class, (String) null, "m_reportService")); + all.add(C(ServersUpdater.class, DefaultRemoteServersUpdater.class) // + .req(LocalModelService.class, LocalStateService.ID, "m_localService") // + .req(ModelService.class, StateAnalyzer.ID, "m_service")); + + return all; + } + + private List defineTableProviderComponents() { List all = new ArrayList(); all.add(A(HourlyReportTableProvider.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java index edc54f04d8..752f842e6a 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/ReportComponentConfigurator.java @@ -28,8 +28,10 @@ import org.unidal.lookup.configuration.Component; import com.dianping.cat.analysis.MessageConsumer; +import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.config.server.ServerFilterConfigManager; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; @@ -91,11 +93,26 @@ public List defineComponents() { all.add(reportService(HeavyReportService.class)); - all.add(A(RouterConfigManager.class)); - all.add(A(RouterConfigHandler.class)); - all.add(A(RouterConfigService.class)); - all.add(A(CachedRouterConfigService.class)); - all.add(A(RouterConfigAdjustor.class)); + all.add(C(RouterConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher") // + .req(DailyReportRepository.class, (String) null, "m_dailyReportDao") // + .req(DailyReportContentRepository.class, (String) null, "m_dailyReportContentDao")); + all.add(C(RouterConfigHandler.class) // + .req(StateReportService.class, (String) null, "m_stateReportService") // + .req(RouterConfigManager.class, (String) null, "m_configManager") // + .req(RouterConfigService.class, (String) null, "m_reportService") // + .req(DailyReportRepository.class, (String) null, "m_dailyReportDao")); + all.add(reportService(RouterConfigService.class) // + .req(RouterConfigManager.class, (String) null, "m_routerConfigManager")); + all.add(C(CachedRouterConfigService.class) // + .req(RouterConfigService.class, (String) null, "m_routerConfigService")); + all.add(C(RouterConfigAdjustor.class) // + .req(StateReportService.class, (String) null, "m_stateReportService") // + .req(RouterConfigManager.class, (String) null, "m_configManager") // + .req(RouterConfigService.class, (String) null, "m_routerService") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager") // + .req(DailyReportRepository.class, (String) null, "m_dailyReportDao")); all.add(reportService(JarReportService.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/report/graph/metric/AbstractGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/graph/metric/AbstractGraphCreator.java index 87d8b06b70..e45fe066ec 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/graph/metric/AbstractGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/graph/metric/AbstractGraphCreator.java @@ -28,7 +28,6 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.alarm.spi.AlertManager; import com.dianping.cat.helper.TimeHelper; @@ -37,13 +36,10 @@ import com.dianping.cat.spring.CatSpringContext; public abstract class AbstractGraphCreator implements LogEnabled { - @Inject protected BaselineService m_baselineService; - @Inject protected DataExtractor m_dataExtractor; - @Inject protected AlertManager m_alertManager; protected int m_lastMinute = 6; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultRemoteServersUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultRemoteServersUpdater.java index 22ba4a0fd7..e558a5b480 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultRemoteServersUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultRemoteServersUpdater.java @@ -24,9 +24,6 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.Constants; import com.dianping.cat.consumer.state.StateAnalyzer; import com.dianping.cat.consumer.state.model.entity.Machine; @@ -42,10 +39,8 @@ import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; -@Named(type = ServersUpdater.class) public class DefaultRemoteServersUpdater implements ServersUpdater { - @Inject(type = ModelService.class, value = StateAnalyzer.ID) private ModelService m_service; private LocalModelService m_localService; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java index 07adcb3154..48d60de2e7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java @@ -27,8 +27,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; @@ -38,14 +36,11 @@ import com.dianping.cat.message.Transaction; import com.dianping.cat.spring.CatSpringContext; -@Named public class DefaultTaskConsumer extends TaskConsumer { private static final Logger LOGGER = LoggerFactory.getLogger(DefaultTaskConsumer.class); - @Inject private ReportFacade m_reportFacade; - @Inject private TaskRepository m_taskDao; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java index bb7cb4258f..5e6aa04ca0 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java @@ -33,8 +33,6 @@ import org.unidal.helper.Files; import org.unidal.helper.Threads.Task; import org.unidal.helper.Urls; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.lookup.util.StringUtils; import org.unidal.webres.json.JsonArray; import org.unidal.webres.json.JsonObject; @@ -52,7 +50,6 @@ import com.dianping.cat.service.ProjectService; import com.dianping.cat.spring.CatSpringContext; -@Named public class ProjectUpdateTask implements Task, LogEnabled { private static final String CMDB_DOMAIN_URL = "http://api.cmdb.dp/api/v0.1/projects/s?private_ip=%s"; @@ -67,13 +64,10 @@ public class ProjectUpdateTask implements Task, LogEnabled { protected Logger m_logger; - @Inject private HostinfoService m_hostInfoService; - @Inject private ProjectService m_projectService; - @Inject private TransactionReportService m_reportService; private boolean checkIfNullOrEqual(String source, int target) { diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java index a6ef839281..0b453d4ec0 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java @@ -29,7 +29,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -47,7 +46,6 @@ public class BusinessTagConfigManager implements Initializable { public final static String TAG_CONFIG = "tag"; - @Inject private BusinessConfigRepository m_configDao; private int m_configId; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/login/service/SigninService.java b/cat-home/src/main/java/com/dianping/cat/system/page/login/service/SigninService.java index 4e7516f164..8b386e6cb2 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/login/service/SigninService.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/login/service/SigninService.java @@ -18,17 +18,13 @@ */ package com.dianping.cat.system.page.login.service; -import org.unidal.lookup.annotation.Inject; - -import com.dianping.cat.system.page.login.spi.ISigninService; +import com.dianping.cat.system.page.login.spi.ISigninService; public class SigninService implements ISigninService { - @Inject - private TokenManager m_tokenManager; - - @Inject - private SessionManager m_sessionManager; + private TokenManager m_tokenManager; + + private SessionManager m_sessionManager; @Override public Session signin(SigninContext ctx, Credential credential) { @@ -52,15 +48,23 @@ public void signout(SigninContext ctx) { } @Override - public Session validate(SigninContext ctx) { - Token token = m_tokenManager.getToken(ctx, Token.TOKEN); + public Session validate(SigninContext ctx) { + Token token = m_tokenManager.getToken(ctx, Token.TOKEN); if (token != null) { Session session = m_sessionManager.validate(token); return session; } else { - return null; - } - } -} + return null; + } + } + + public void setSessionManager(SessionManager sessionManager) { + m_sessionManager = sessionManager; + } + + public void setTokenManager(TokenManager tokenManager) { + m_tokenManager = tokenManager; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/login/service/TokenManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/login/service/TokenManager.java index 2296149fdf..93b15a4895 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/login/service/TokenManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/login/service/TokenManager.java @@ -18,15 +18,11 @@ */ package com.dianping.cat.system.page.login.service; -import org.unidal.lookup.annotation.Inject; - -import com.dianping.cat.system.page.login.spi.ITokenManager; - -public class TokenManager implements ITokenManager { - @Inject - private CookieManager m_cookieManager; - - @Inject +import com.dianping.cat.system.page.login.spi.ITokenManager; + +public class TokenManager implements ITokenManager { + private CookieManager m_cookieManager; + private TokenBuilder m_tokenBuilder; public void setCookieManager(CookieManager cookieManager) { diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java index cf3244ef02..67fb1bec34 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java @@ -28,8 +28,6 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.helper.Splitters; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -54,22 +52,16 @@ import com.dianping.cat.system.page.router.service.RouterConfigService; import com.dianping.cat.system.page.router.task.RouterConfigBuilder; -@Named public class RouterConfigAdjustor { - @Inject private StateReportService m_stateReportService; - @Inject private RouterConfigManager m_configManager; - @Inject private RouterConfigService m_routerService; - @Inject private ServerConfigManager m_serverConfigManager; - @Inject private DailyReportRepository m_dailyReportDao; public void Adjust(Date period) { diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java index cf922a28b7..527c408935 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java @@ -29,8 +29,6 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -52,22 +50,17 @@ import com.dianping.cat.system.page.router.service.RouterConfigService; import com.dianping.cat.system.page.router.task.RouterConfigBuilder; -@Named public class RouterConfigHandler implements LogEnabled { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(RouterConfigHandler.class); protected Logger m_logger; - @Inject private StateReportService m_stateReportService; - @Inject private RouterConfigManager m_configManager; - @Inject private RouterConfigService m_reportService; - @Inject private DailyReportRepository m_dailyReportDao; private void addServerList(List servers, Server server) { diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java index 2253120940..3e549e6a93 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java @@ -44,8 +44,6 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; import org.xml.sax.SAXException; @@ -53,7 +51,6 @@ import java.util.*; import java.util.Map.Entry; -@Named public class RouterConfigManager implements Initializable, LogEnabled { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(RouterConfigManager.class); @@ -61,16 +58,12 @@ public class RouterConfigManager implements Initializable, LogEnabled { private static final String CONFIG_NAME = "routerConfig"; - @Inject private ConfigRepository m_configDao; - @Inject private ContentFetcher m_fetcher; - @Inject private DailyReportRepository m_dailyReportDao; - @Inject private DailyReportContentRepository m_dailyReportContentDao; private int m_configId; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/CachedRouterConfigService.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/CachedRouterConfigService.java index 6d6cca63e5..53237ddf0e 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/CachedRouterConfigService.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/CachedRouterConfigService.java @@ -20,18 +20,14 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Constants; import com.dianping.cat.home.router.entity.RouterConfig; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; -@Named public class CachedRouterConfigService implements Initializable { - @Inject private RouterConfigService m_routerConfigService; private volatile RouterConfig m_routerConfig; @@ -62,4 +58,7 @@ public void refresh() { m_routerConfig = m_routerConfigService.queryLastReport(Constants.CAT); } + public void setRouterConfigService(RouterConfigService routerConfigService) { + m_routerConfigService = routerConfigService; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java index f221a5bee8..51622a4902 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java @@ -24,8 +24,6 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,11 +39,9 @@ import com.dianping.cat.report.service.AbstractReportService; import com.dianping.cat.system.page.router.config.RouterConfigManager; -@Named public class RouterConfigService extends AbstractReportService { private static final Logger LOGGER = LoggerFactory.getLogger(RouterConfigService.class); - @Inject private RouterConfigManager m_routerConfigManager; @Override diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index aac3da021c..9fd85f713d 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -46,6 +46,54 @@ report-content com.dianping.cat.report.HourlyReportContentTableProvider + + com.dianping.cat.report.task.DefaultTaskConsumer + com.dianping.cat.report.task.DefaultTaskConsumer + + + com.dianping.cat.report.task.ReportFacade + m_reportFacade + + + com.dianping.cat.core.mybatis.repository.task.TaskRepository + m_taskDao + + + + + com.dianping.cat.report.task.cmdb.ProjectUpdateTask + com.dianping.cat.report.task.cmdb.ProjectUpdateTask + + + com.dianping.cat.service.HostinfoService + m_hostInfoService + + + com.dianping.cat.service.ProjectService + m_projectService + + + com.dianping.cat.report.page.transaction.service.TransactionReportService + m_reportService + + + + + com.dianping.cat.report.server.ServersUpdater + com.dianping.cat.report.task.DefaultRemoteServersUpdater + + + com.dianping.cat.report.service.LocalModelService + state + m_localService + + + com.dianping.cat.report.service.ModelService + state + m_service + + + com.dianping.cat.report.page.home.Handler com.dianping.cat.report.page.home.Handler @@ -870,6 +918,46 @@ com.dianping.cat.system.page.permission.ResourceConfigManager com.dianping.cat.system.page.permission.ResourceConfigManager + + com.dianping.cat.system.page.login.service.SigninService + com.dianping.cat.system.page.login.service.SigninService + + + com.dianping.cat.system.page.login.service.TokenManager + m_tokenManager + + + com.dianping.cat.system.page.login.service.SessionManager + m_sessionManager + + + + + com.dianping.cat.system.page.login.service.TokenManager + com.dianping.cat.system.page.login.service.TokenManager + + + com.dianping.cat.system.page.login.service.CookieManager + m_cookieManager + + + com.dianping.cat.system.page.login.service.TokenBuilder + m_tokenBuilder + + + + + com.dianping.cat.system.page.login.service.CookieManager + com.dianping.cat.system.page.login.service.CookieManager + + + com.dianping.cat.system.page.login.service.TokenBuilder + com.dianping.cat.system.page.login.service.TokenBuilder + + + com.dianping.cat.system.page.login.service.SessionManager + com.dianping.cat.system.page.login.service.SessionManager + org.unidal.initialization.ModuleManager org.unidal.initialization.DefaultModuleManager @@ -2219,15 +2307,19 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao @@ -2237,15 +2329,19 @@ com.dianping.cat.report.page.state.service.StateReportService + m_stateReportService com.dianping.cat.system.page.router.config.RouterConfigManager + m_configManager com.dianping.cat.system.page.router.service.RouterConfigService + m_reportService com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao @@ -2253,32 +2349,41 @@ com.dianping.cat.system.page.router.service.RouterConfigService com.dianping.cat.system.page.router.service.RouterConfigService - - com.dianping.cat.system.page.router.config.RouterConfigManager - com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository + m_hourlyReportDao com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository + m_hourlyReportContentDao com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository + m_dailyReportContentDao com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository + m_weeklyReportDao com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository + m_weeklyReportContentDao com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository + m_monthlyReportDao com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository + m_monthlyReportContentDao + + + com.dianping.cat.system.page.router.config.RouterConfigManager + m_routerConfigManager @@ -2288,6 +2393,7 @@ com.dianping.cat.system.page.router.service.RouterConfigService + m_routerConfigService @@ -2297,18 +2403,23 @@ com.dianping.cat.report.page.state.service.StateReportService + m_stateReportService com.dianping.cat.system.page.router.config.RouterConfigManager + m_configManager com.dianping.cat.system.page.router.service.RouterConfigService + m_routerService com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager com.dianping.cat.core.report.daily.repository.DailyReportRepository + m_dailyReportDao @@ -3348,42 +3459,6 @@ - - com.dianping.cat.system.page.login.service.SigninService - com.dianping.cat.system.page.login.service.SigninService - - - com.dianping.cat.system.page.login.service.TokenManager - - - com.dianping.cat.system.page.login.service.SessionManager - - - - - com.dianping.cat.system.page.login.service.TokenManager - com.dianping.cat.system.page.login.service.TokenManager - - - com.dianping.cat.system.page.login.service.CookieManager - - - com.dianping.cat.system.page.login.service.TokenBuilder - - - - - com.dianping.cat.system.page.login.service.CookieManager - com.dianping.cat.system.page.login.service.CookieManager - - - com.dianping.cat.system.page.login.service.TokenBuilder - com.dianping.cat.system.page.login.service.TokenBuilder - - - com.dianping.cat.system.page.login.service.SessionManager - com.dianping.cat.system.page.login.service.SessionManager - com.dianping.cat.system.page.config.Handler com.dianping.cat.system.page.config.Handler @@ -3675,20 +3750,6 @@ com.dianping.cat.system.page.business.config.BusinessTagConfigManager com.dianping.cat.system.page.business.config.BusinessTagConfigManager - - - com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository - - - - - com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository - com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository - - - org.unidal.dal.jdbc.datasource.DataSourceManager - - com.dianping.cat.system.page.permission.Handler From fcc0eeec3a66f782d05d8654e2a433aedbd178dd Mon Sep 17 00:00:00 2001 From: Shang Date: Sat, 13 Jun 2026 22:26:52 +0800 Subject: [PATCH 076/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=20Processor=20=E4=B8=8E=E6=A0=B8=E5=BF=83=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=20Manager=20=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../build/ComponentsConfigurator.java | 6 +- .../resources/META-INF/plexus/components.xml | 2 + .../cat/build/ComponentsConfigurator.java | 38 +- .../config/AtomicMessageConfigManager.java | 5 - .../cat/config/ReportReloadConfigManager.java | 5 - .../config/sample/SampleConfigManager.java | 5 - .../resources/META-INF/plexus/components.xml | 6 + .../cat/build/ComponentsConfigurator.java | 79 +++- .../HeartbeatComponentConfigurator.java | 3 + .../processor/AlertConfigProcessor.java | 16 +- .../page/config/processor/BaseProcesser.java | 6 +- .../processor/DependencyConfigProcessor.java | 21 +- .../processor/EventConfigProcessor.java | 7 +- .../processor/ExceptionConfigProcessor.java | 11 +- .../processor/GlobalConfigProcessor.java | 56 ++- .../processor/HeartbeatConfigProcessor.java | 15 +- .../processor/TransactionConfigProcessor.java | 7 +- .../resources/META-INF/plexus/components.xml | 337 ++++++++++-------- 18 files changed, 409 insertions(+), 216 deletions(-) diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java index 0cbbe1c9ed..f73ef8e0d4 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java @@ -28,6 +28,7 @@ import com.dianping.cat.analysis.MessageAnalyzer; import com.dianping.cat.config.AtomicMessageConfigManager; +import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; import com.dianping.cat.consumer.CatConsumerModule; @@ -66,6 +67,7 @@ import com.dianping.cat.consumer.top.TopDelegate; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.consumer.transaction.TransactionDelegate; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; import com.dianping.cat.message.PathBuilder; @@ -100,7 +102,9 @@ public List defineComponents() { all.addAll(defineStorageComponents()); all.addAll(defineBusinessComponents()); - all.add(A(AtomicMessageConfigManager.class)); + all.add(C(AtomicMessageConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); all.add(A(ServerConfigManager.class)); all.add(A(TpValueStatisticConfigManager.class)); all.add(A(AllReportConfigManager.class)); diff --git a/cat-consumer/src/main/resources/META-INF/plexus/components.xml b/cat-consumer/src/main/resources/META-INF/plexus/components.xml index c4325a741b..f377f0a7f4 100644 --- a/cat-consumer/src/main/resources/META-INF/plexus/components.xml +++ b/cat-consumer/src/main/resources/META-INF/plexus/components.xml @@ -782,9 +782,11 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher diff --git a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 9be0ea7626..7c1501a99a 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -23,22 +23,24 @@ import java.util.List; import org.unidal.dal.jdbc.configuration.AbstractJdbcResourceConfigurator; -import org.unidal.lookup.configuration.Component; -import com.dianping.cat.CatConstants; -import com.dianping.cat.CatCoreModule; +import org.unidal.lookup.configuration.Component; +import com.dianping.cat.CatConstants; +import com.dianping.cat.CatCoreModule; import com.dianping.cat.analysis.DefaultMessageAnalyzerManager; import com.dianping.cat.analysis.DefaultMessageHandler; import com.dianping.cat.analysis.PlexusMessageAnalyzerFactory; import com.dianping.cat.analysis.RealtimeConsumer; import com.dianping.cat.analysis.TcpSocketReceiver; -import com.dianping.cat.config.AtomicMessageConfigManager; -import com.dianping.cat.config.ReportReloadConfigManager; -import com.dianping.cat.config.business.BusinessConfigManager; -import com.dianping.cat.config.content.LocalResourceContentFetcher; -import com.dianping.cat.config.sample.SampleConfigManager; -import com.dianping.cat.config.server.ServerConfigManager; -import com.dianping.cat.config.server.ServerFilterConfigManager; -import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; +import com.dianping.cat.config.AtomicMessageConfigManager; +import com.dianping.cat.config.ReportReloadConfigManager; +import com.dianping.cat.config.business.BusinessConfigManager; +import com.dianping.cat.config.content.ContentFetcher; +import com.dianping.cat.config.content.LocalResourceContentFetcher; +import com.dianping.cat.config.sample.SampleConfigManager; +import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.config.server.ServerFilterConfigManager; +import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; +import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.message.DefaultPathBuilder; import com.dianping.cat.message.storage.LocalMessageBucket; import com.dianping.cat.report.DefaultReportBucketManager; @@ -82,9 +84,13 @@ public List defineComponents() { all.add(A(DefaultMessageHandler.class)); - all.add(A(SampleConfigManager.class)); - all.add(A(BusinessConfigManager.class)); - all.add(A(ReportReloadConfigManager.class)); + all.add(C(SampleConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); + all.add(A(BusinessConfigManager.class)); + all.add(C(ReportReloadConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); all.add(A(CatCoreModule.class)); @@ -94,7 +100,9 @@ public List defineComponents() { all.add(A(ServersUpdaterManager.class)); all.add(A(TpValueStatisticConfigManager.class)); - all.add(A(AtomicMessageConfigManager.class)); + all.add(C(AtomicMessageConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); all.add(defineJdbcDataSourceConfigurationManagerComponent("datasources.xml") .config(E("baseDirRef").value("CAT_HOME")) diff --git a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java index 85c1e4f352..9198bb6bfd 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java @@ -23,8 +23,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -37,7 +35,6 @@ import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.task.TimerSyncTask; -@Named public class AtomicMessageConfigManager implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(AtomicMessageConfigManager.class); @@ -45,10 +42,8 @@ public class AtomicMessageConfigManager implements Initializable { private static final String DEFAULT_DOMAIN = "default"; - @Inject protected ConfigRepository m_configDao; - @Inject protected ContentFetcher m_fetcher; private int m_configId; diff --git a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java index 7b3b1ba4e6..8f898d6539 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java @@ -29,8 +29,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -44,7 +42,6 @@ import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; -@Named public class ReportReloadConfigManager implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(ReportReloadConfigManager.class); @@ -52,10 +49,8 @@ public class ReportReloadConfigManager implements Initializable { private static final String DEFAULT = "default"; - @Inject protected ConfigRepository m_configDao; - @Inject protected ContentFetcher m_fetcher; private int m_configId; diff --git a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java index d75990bc39..7b24f5ae32 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java @@ -21,8 +21,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -34,15 +32,12 @@ import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; -@Named public class SampleConfigManager implements Initializable { private static final String CONFIG_NAME = "sampleConfig"; - @Inject protected ConfigRepository m_configDao; - @Inject protected ContentFetcher m_fetcher; private int m_configId; diff --git a/cat-core/src/main/resources/META-INF/plexus/components.xml b/cat-core/src/main/resources/META-INF/plexus/components.xml index 4d4fe73f0b..a673f2ab47 100644 --- a/cat-core/src/main/resources/META-INF/plexus/components.xml +++ b/cat-core/src/main/resources/META-INF/plexus/components.xml @@ -125,9 +125,11 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher @@ -146,9 +148,11 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher @@ -222,9 +226,11 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 5bc29f9637..0c59212ba2 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -97,8 +97,35 @@ import com.dianping.cat.report.task.DefaultTaskConsumer; import com.dianping.cat.report.task.ReportFacade; import com.dianping.cat.report.task.cmdb.ProjectUpdateTask; +import com.dianping.cat.alarm.spi.config.AlertConfigManager; +import com.dianping.cat.alarm.spi.config.AlertPolicyManager; +import com.dianping.cat.alarm.spi.config.SenderConfigManager; +import com.dianping.cat.report.alert.event.EventRuleConfigManager; +import com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager; +import com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager; +import com.dianping.cat.report.alert.transaction.TransactionRuleConfigManager; +import com.dianping.cat.config.ReportReloadConfigManager; +import com.dianping.cat.config.sample.SampleConfigManager; +import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.config.server.ServerFilterConfigManager; +import com.dianping.cat.consumer.config.AllReportConfigManager; +import com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager; +import com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager; +import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; +import com.dianping.cat.report.page.storage.config.StorageGroupConfigManager; import com.dianping.cat.service.HostinfoService; import com.dianping.cat.service.ProjectService; +import com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator; +import com.dianping.cat.system.page.config.ConfigHtmlParser; +import com.dianping.cat.system.page.config.processor.AlertConfigProcessor; +import com.dianping.cat.system.page.config.processor.DependencyConfigProcessor; +import com.dianping.cat.system.page.config.processor.EventConfigProcessor; +import com.dianping.cat.system.page.config.processor.ExceptionConfigProcessor; +import com.dianping.cat.system.page.config.processor.GlobalConfigProcessor; +import com.dianping.cat.system.page.config.processor.HeartbeatConfigProcessor; +import com.dianping.cat.system.page.config.processor.StorageConfigProcessor; +import com.dianping.cat.system.page.config.processor.TransactionConfigProcessor; +import com.dianping.cat.system.page.router.config.RouterConfigManager; import com.dianping.cat.system.page.login.service.CookieManager; import com.dianping.cat.system.page.login.service.SessionManager; import com.dianping.cat.system.page.login.service.SigninService; @@ -143,8 +170,10 @@ public List defineComponents() { all.addAll(defineCommonComponents()); - all.addAll(defineConfigComponents()); - + all.addAll(defineConfigComponents()); + + all.addAll(defineConfigProcessorComponents()); + // must define in home module instead of core all.addAll(defineTableProviderComponents()); @@ -450,6 +479,52 @@ private List defineConfigComponents() { return all; } + private List defineConfigProcessorComponents() { + List all = new ArrayList(); + + all.add(C(ConfigHtmlParser.class)); + all.add(C(RuleFTLDecorator.class)); + all.add(C(GlobalConfigProcessor.class) // + .req(ProjectService.class, (String) null, "m_projectService") // + .req(RouterConfigManager.class, (String) null, "m_routerConfigManager") // + .req(DomainGroupConfigManager.class, (String) null, "m_domainGroupConfigManger") // + .req(SenderConfigManager.class, (String) null, "m_senderConfigManager") // + .req(StorageGroupConfigManager.class, (String) null, "m_groupConfigManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_serverFilterConfigManager") // + .req(AllReportConfigManager.class, (String) null, "m_transactionConfigManager") // + .req(ConfigHtmlParser.class, (String) null, "m_configHtmlParser") // + .req(SampleConfigManager.class, (String) null, "m_sampleConfigManager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager") // + .req(ReportReloadConfigManager.class, (String) null, "m_reloadConfigManager")); + all.add(C(TransactionConfigProcessor.class) // + .req(TransactionRuleConfigManager.class, (String) null, "m_configManager") // + .req(RuleFTLDecorator.class, (String) null, "m_ruleDecorator")); + all.add(C(EventConfigProcessor.class) // + .req(EventRuleConfigManager.class, (String) null, "m_configManager") // + .req(RuleFTLDecorator.class, (String) null, "m_ruleDecorator")); + all.add(C(StorageConfigProcessor.class) // + .req(RuleFTLDecorator.class, (String) null, "m_ruleDecorator")); + all.add(C(HeartbeatConfigProcessor.class) // + .req(HeartbeatRuleConfigManager.class, (String) null, "m_heartbeatRuleConfigManager") // + .req(HeartbeatDisplayPolicyManager.class, (String) null, "m_displayPolicyManager") // + .req(ConfigHtmlParser.class, (String) null, "m_configHtmlParser") // + .req(RuleFTLDecorator.class, (String) null, "m_ruleDecorator")); + all.add(C(AlertConfigProcessor.class) // + .req(AlertConfigManager.class, (String) null, "m_alertConfigManager") // + .req(AlertPolicyManager.class, (String) null, "m_alertPolicyManager") // + .req(ConfigHtmlParser.class, (String) null, "m_configHtmlParser")); + all.add(C(ExceptionConfigProcessor.class) // + .req(GlobalConfigProcessor.class, (String) null, "m_globalConfigProcessor") // + .req(ExceptionRuleConfigManager.class, (String) null, "m_exceptionRuleConfigManager")); + all.add(C(DependencyConfigProcessor.class) // + .req(GlobalConfigProcessor.class, (String) null, "m_globalConfigManager") // + .req(TopologyGraphConfigManager.class, (String) null, "m_topologyConfigManager") // + .req(TopoGraphFormatConfigManager.class, (String) null, "m_formatConfigManager") // + .req(ConfigHtmlParser.class, (String) null, "m_configHtmlParser")); + + return all; + } + private List defineTaskComponents() { List all = new ArrayList(); diff --git a/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java index 95f794432b..1a9ba8929b 100644 --- a/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/report/HeartbeatComponentConfigurator.java @@ -66,6 +66,9 @@ public List defineComponents() { List all = new ArrayList(); all.add(ruleConfigManager(HeartbeatRuleConfigManager.class)); + all.add(C(HeartbeatDisplayPolicyManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); all.add(reportService(HeartbeatReportService.class)); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/AlertConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/AlertConfigProcessor.java index 5cb94e04cb..1f23896a85 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/AlertConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/AlertConfigProcessor.java @@ -19,7 +19,6 @@ package com.dianping.cat.system.page.config.processor; import org.codehaus.plexus.util.StringUtils; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.config.AlertPolicyManager; @@ -31,13 +30,10 @@ public class AlertConfigProcessor { - @Inject private AlertConfigManager m_alertConfigManager; - @Inject private AlertPolicyManager m_alertPolicyManager; - @Inject private ConfigHtmlParser m_configHtmlParser; public void process(Action action, Payload payload, Model model) { @@ -86,4 +82,16 @@ public void refreshSpringBeans() { m_configHtmlParser = configHtmlParser; } } + + public void setAlertConfigManager(AlertConfigManager alertConfigManager) { + m_alertConfigManager = alertConfigManager; + } + + public void setAlertPolicyManager(AlertPolicyManager alertPolicyManager) { + m_alertPolicyManager = alertPolicyManager; + } + + public void setConfigHtmlParser(ConfigHtmlParser configHtmlParser) { + m_configHtmlParser = configHtmlParser; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/BaseProcesser.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/BaseProcesser.java index 0d2cdccf91..e1d4bd5c76 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/BaseProcesser.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/BaseProcesser.java @@ -22,7 +22,6 @@ import java.util.Collection; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import com.dianping.cat.Cat; @@ -35,12 +34,15 @@ public class BaseProcesser { - @Inject protected RuleFTLDecorator m_ruleDecorator; protected void refreshSpringBeans() { } + public void setRuleDecorator(RuleFTLDecorator ruleDecorator) { + m_ruleDecorator = ruleDecorator; + } + public boolean addSubmitRule(BaseRuleConfigManager manager, String id, String metrics, String configs) { try { String xmlContent = manager.updateRule(id, metrics, configs); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/DependencyConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/DependencyConfigProcessor.java index 405d03002a..6b911a9a5b 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/DependencyConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/DependencyConfigProcessor.java @@ -18,7 +18,6 @@ */ package com.dianping.cat.system.page.config.processor; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import com.dianping.cat.Constants; @@ -34,16 +33,12 @@ public class DependencyConfigProcessor { - @Inject private GlobalConfigProcessor m_globalConfigManager; - @Inject private TopologyGraphConfigManager m_topologyConfigManager; - @Inject private TopoGraphFormatConfigManager m_formatConfigManager; - @Inject private ConfigHtmlParser m_configHtmlParser; public void refreshSpringBeans() { @@ -171,4 +166,20 @@ public void process(Action action, Payload payload, Model model) { } } + public void setConfigHtmlParser(ConfigHtmlParser configHtmlParser) { + m_configHtmlParser = configHtmlParser; + } + + public void setFormatConfigManager(TopoGraphFormatConfigManager formatConfigManager) { + m_formatConfigManager = formatConfigManager; + } + + public void setGlobalConfigManager(GlobalConfigProcessor globalConfigManager) { + m_globalConfigManager = globalConfigManager; + } + + public void setTopologyConfigManager(TopologyGraphConfigManager topologyConfigManager) { + m_topologyConfigManager = topologyConfigManager; + } + } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/EventConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/EventConfigProcessor.java index 63752895ad..090c9e7181 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/EventConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/EventConfigProcessor.java @@ -20,8 +20,6 @@ import java.util.Map; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.alarm.rule.entity.Rule; import com.dianping.cat.report.alert.event.EventRuleConfigManager; import com.dianping.cat.system.page.config.Action; @@ -31,7 +29,6 @@ public class EventConfigProcessor extends BaseProcesser { - @Inject private EventRuleConfigManager m_configManager; @Override @@ -82,4 +79,8 @@ private void rulesAvailableBuild(Map ruleMap) { } } } + + public void setConfigManager(EventRuleConfigManager configManager) { + m_configManager = configManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/ExceptionConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/ExceptionConfigProcessor.java index 5bca68d657..03a17cc142 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/ExceptionConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/ExceptionConfigProcessor.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import com.dianping.cat.home.exception.entity.ExceptionExclude; @@ -34,10 +33,8 @@ public class ExceptionConfigProcessor { - @Inject private GlobalConfigProcessor m_globalConfigProcessor; - @Inject private ExceptionRuleConfigManager m_exceptionRuleConfigManager; public void refreshSpringBeans() { @@ -134,6 +131,14 @@ private List queryExceptionList() { return new ArrayList(); } + public void setExceptionRuleConfigManager(ExceptionRuleConfigManager exceptionRuleConfigManager) { + m_exceptionRuleConfigManager = exceptionRuleConfigManager; + } + + public void setGlobalConfigProcessor(GlobalConfigProcessor globalConfigProcessor) { + m_globalConfigProcessor = globalConfigProcessor; + } + private void updateExceptionExclude(Payload payload) { ExceptionExclude exclude = payload.getExceptionExclude(); exclude.setDomain(exclude.getDomain().trim()); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java index a1eb0b545e..15a6b53a3a 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java @@ -23,7 +23,6 @@ import java.util.Comparator; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import com.dianping.cat.Cat; @@ -48,37 +47,26 @@ public class GlobalConfigProcessor { - @Inject public ProjectService m_projectService; - @Inject private RouterConfigManager m_routerConfigManager; - @Inject private DomainGroupConfigManager m_domainGroupConfigManger; - @Inject private SenderConfigManager m_senderConfigManager; - @Inject private StorageGroupConfigManager m_groupConfigManager; - @Inject private ServerFilterConfigManager m_serverFilterConfigManager; - @Inject private AllReportConfigManager m_transactionConfigManager; - @Inject private ConfigHtmlParser m_configHtmlParser; - @Inject private SampleConfigManager m_sampleConfigManager; - @Inject private ServerConfigManager m_serverConfigManager; - @Inject private ReportReloadConfigManager m_reloadConfigManager; private boolean deleteProject(Payload payload) { @@ -284,6 +272,50 @@ public List queryDoaminList() { return result; } + public void setConfigHtmlParser(ConfigHtmlParser configHtmlParser) { + m_configHtmlParser = configHtmlParser; + } + + public void setDomainGroupConfigManger(DomainGroupConfigManager domainGroupConfigManger) { + m_domainGroupConfigManger = domainGroupConfigManger; + } + + public void setGroupConfigManager(StorageGroupConfigManager groupConfigManager) { + m_groupConfigManager = groupConfigManager; + } + + public void setProjectService(ProjectService projectService) { + m_projectService = projectService; + } + + public void setReloadConfigManager(ReportReloadConfigManager reloadConfigManager) { + m_reloadConfigManager = reloadConfigManager; + } + + public void setRouterConfigManager(RouterConfigManager routerConfigManager) { + m_routerConfigManager = routerConfigManager; + } + + public void setSampleConfigManager(SampleConfigManager sampleConfigManager) { + m_sampleConfigManager = sampleConfigManager; + } + + public void setSenderConfigManager(SenderConfigManager senderConfigManager) { + m_senderConfigManager = senderConfigManager; + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + m_serverConfigManager = serverConfigManager; + } + + public void setServerFilterConfigManager(ServerFilterConfigManager serverFilterConfigManager) { + m_serverFilterConfigManager = serverFilterConfigManager; + } + + public void setTransactionConfigManager(AllReportConfigManager transactionConfigManager) { + m_transactionConfigManager = transactionConfigManager; + } + private boolean updateProject(Payload payload) { Project project = payload.getProject(); String domain = project.getDomain(); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/HeartbeatConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/HeartbeatConfigProcessor.java index 39c341f8c0..932f8b0016 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/HeartbeatConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/HeartbeatConfigProcessor.java @@ -19,7 +19,6 @@ package com.dianping.cat.system.page.config.processor; import org.codehaus.plexus.util.StringUtils; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager; import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; @@ -31,13 +30,10 @@ public class HeartbeatConfigProcessor extends BaseProcesser { - @Inject private HeartbeatRuleConfigManager m_heartbeatRuleConfigManager; - @Inject private HeartbeatDisplayPolicyManager m_displayPolicyManager; - @Inject private ConfigHtmlParser m_configHtmlParser; public void process(Action action, Payload payload, Model model) { @@ -96,4 +92,15 @@ protected void refreshSpringBeans() { } } + public void setConfigHtmlParser(ConfigHtmlParser configHtmlParser) { + m_configHtmlParser = configHtmlParser; + } + + public void setDisplayPolicyManager(HeartbeatDisplayPolicyManager displayPolicyManager) { + m_displayPolicyManager = displayPolicyManager; + } + + public void setHeartbeatRuleConfigManager(HeartbeatRuleConfigManager heartbeatRuleConfigManager) { + m_heartbeatRuleConfigManager = heartbeatRuleConfigManager; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/TransactionConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/TransactionConfigProcessor.java index d7a4720484..88db774bcb 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/TransactionConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/TransactionConfigProcessor.java @@ -20,8 +20,6 @@ import java.util.Map; -import org.unidal.lookup.annotation.Inject; - import com.dianping.cat.alarm.rule.entity.Rule; import com.dianping.cat.report.alert.transaction.TransactionRuleConfigManager; import com.dianping.cat.system.page.config.Action; @@ -31,7 +29,6 @@ public class TransactionConfigProcessor extends BaseProcesser { - @Inject private TransactionRuleConfigManager m_configManager; @Override @@ -82,4 +79,8 @@ private void rulesAvailableBuild(Map ruleMap) { } } } + + public void setConfigManager(TransactionRuleConfigManager configManager) { + m_configManager = configManager; + } } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 9fd85f713d..64b8e1acb6 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -36,6 +36,178 @@ com.dianping.cat.report.page.DomainGroupConfigManager com.dianping.cat.report.page.DomainGroupConfigManager + + com.dianping.cat.system.page.config.ConfigHtmlParser + com.dianping.cat.system.page.config.ConfigHtmlParser + + + com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator + com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator + + + com.dianping.cat.system.page.config.processor.GlobalConfigProcessor + com.dianping.cat.system.page.config.processor.GlobalConfigProcessor + + + com.dianping.cat.service.ProjectService + m_projectService + + + com.dianping.cat.system.page.router.config.RouterConfigManager + m_routerConfigManager + + + com.dianping.cat.report.page.DomainGroupConfigManager + m_domainGroupConfigManger + + + com.dianping.cat.alarm.spi.config.SenderConfigManager + m_senderConfigManager + + + com.dianping.cat.report.page.storage.config.StorageGroupConfigManager + m_groupConfigManager + + + com.dianping.cat.config.server.ServerFilterConfigManager + m_serverFilterConfigManager + + + com.dianping.cat.consumer.config.AllReportConfigManager + m_transactionConfigManager + + + com.dianping.cat.system.page.config.ConfigHtmlParser + m_configHtmlParser + + + com.dianping.cat.config.sample.SampleConfigManager + m_sampleConfigManager + + + com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager + + + com.dianping.cat.config.ReportReloadConfigManager + m_reloadConfigManager + + + + + com.dianping.cat.system.page.config.processor.TransactionConfigProcessor + com.dianping.cat.system.page.config.processor.TransactionConfigProcessor + + + com.dianping.cat.report.alert.transaction.TransactionRuleConfigManager + m_configManager + + + com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator + m_ruleDecorator + + + + + com.dianping.cat.system.page.config.processor.EventConfigProcessor + com.dianping.cat.system.page.config.processor.EventConfigProcessor + + + com.dianping.cat.report.alert.event.EventRuleConfigManager + m_configManager + + + com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator + m_ruleDecorator + + + + + com.dianping.cat.system.page.config.processor.StorageConfigProcessor + com.dianping.cat.system.page.config.processor.StorageConfigProcessor + + + com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator + m_ruleDecorator + + + + + com.dianping.cat.system.page.config.processor.HeartbeatConfigProcessor + com.dianping.cat.system.page.config.processor.HeartbeatConfigProcessor + + + com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager + m_heartbeatRuleConfigManager + + + com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager + m_displayPolicyManager + + + com.dianping.cat.system.page.config.ConfigHtmlParser + m_configHtmlParser + + + com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator + m_ruleDecorator + + + + + com.dianping.cat.system.page.config.processor.AlertConfigProcessor + com.dianping.cat.system.page.config.processor.AlertConfigProcessor + + + com.dianping.cat.alarm.spi.config.AlertConfigManager + m_alertConfigManager + + + com.dianping.cat.alarm.spi.config.AlertPolicyManager + m_alertPolicyManager + + + com.dianping.cat.system.page.config.ConfigHtmlParser + m_configHtmlParser + + + + + com.dianping.cat.system.page.config.processor.ExceptionConfigProcessor + com.dianping.cat.system.page.config.processor.ExceptionConfigProcessor + + + com.dianping.cat.system.page.config.processor.GlobalConfigProcessor + m_globalConfigProcessor + + + com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager + m_exceptionRuleConfigManager + + + + + com.dianping.cat.system.page.config.processor.DependencyConfigProcessor + com.dianping.cat.system.page.config.processor.DependencyConfigProcessor + + + com.dianping.cat.system.page.config.processor.GlobalConfigProcessor + m_globalConfigManager + + + com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager + m_topologyConfigManager + + + com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager + m_formatConfigManager + + + com.dianping.cat.system.page.config.ConfigHtmlParser + m_configHtmlParser + + + org.unidal.dal.jdbc.mapping.TableProvider report @@ -1524,6 +1696,20 @@ + + com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager + com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager + + + com.dianping.cat.core.config.repository.ConfigRepository + m_configDao + + + com.dianping.cat.config.content.ContentFetcher + m_fetcher + + + com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService com.dianping.cat.report.page.heartbeat.service.HeartbeatReportService @@ -3504,153 +3690,6 @@ - - com.dianping.cat.system.page.config.processor.GlobalConfigProcessor - com.dianping.cat.system.page.config.processor.GlobalConfigProcessor - - - com.dianping.cat.service.ProjectService - - - com.dianping.cat.system.page.router.config.RouterConfigManager - - - com.dianping.cat.report.page.DomainGroupConfigManager - - - com.dianping.cat.alarm.spi.config.SenderConfigManager - - - com.dianping.cat.report.page.storage.config.StorageGroupConfigManager - - - com.dianping.cat.config.server.ServerFilterConfigManager - - - com.dianping.cat.consumer.config.AllReportConfigManager - - - com.dianping.cat.system.page.config.ConfigHtmlParser - - - com.dianping.cat.config.sample.SampleConfigManager - - - com.dianping.cat.config.server.ServerConfigManager - - - com.dianping.cat.config.ReportReloadConfigManager - - - - - com.dianping.cat.system.page.config.ConfigHtmlParser - com.dianping.cat.system.page.config.ConfigHtmlParser - - - com.dianping.cat.system.page.config.processor.DependencyConfigProcessor - com.dianping.cat.system.page.config.processor.DependencyConfigProcessor - - - com.dianping.cat.system.page.config.processor.GlobalConfigProcessor - - - com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager - - - com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager - - - com.dianping.cat.system.page.config.ConfigHtmlParser - - - - - com.dianping.cat.system.page.config.processor.ExceptionConfigProcessor - com.dianping.cat.system.page.config.processor.ExceptionConfigProcessor - - - com.dianping.cat.system.page.config.processor.GlobalConfigProcessor - - - com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager - - - - - com.dianping.cat.system.page.config.processor.HeartbeatConfigProcessor - com.dianping.cat.system.page.config.processor.HeartbeatConfigProcessor - - - com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager - - - com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager - - - com.dianping.cat.system.page.config.ConfigHtmlParser - - - com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator - - - - - com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager - com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager - - - com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator - com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator - - - com.dianping.cat.system.page.config.processor.AlertConfigProcessor - com.dianping.cat.system.page.config.processor.AlertConfigProcessor - - - com.dianping.cat.alarm.spi.config.AlertConfigManager - - - com.dianping.cat.alarm.spi.config.AlertPolicyManager - - - com.dianping.cat.system.page.config.ConfigHtmlParser - - - - - com.dianping.cat.system.page.config.processor.TransactionConfigProcessor - com.dianping.cat.system.page.config.processor.TransactionConfigProcessor - - - com.dianping.cat.report.alert.transaction.TransactionRuleConfigManager - - - com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator - - - - - com.dianping.cat.system.page.config.processor.EventConfigProcessor - com.dianping.cat.system.page.config.processor.EventConfigProcessor - - - com.dianping.cat.report.alert.event.EventRuleConfigManager - - - com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator - - - - - com.dianping.cat.system.page.config.processor.StorageConfigProcessor - com.dianping.cat.system.page.config.processor.StorageConfigProcessor - - - com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator - - - com.dianping.cat.system.page.plugin.Handler com.dianping.cat.system.page.plugin.Handler @@ -3690,6 +3729,10 @@ + + com.dianping.cat.config.sample.SampleConfigManager + com.dianping.cat.config.sample.SampleConfigManager + com.dianping.cat.system.page.project.Handler com.dianping.cat.system.page.project.Handler From d62d338f63a13220d7d373d18127eaa6898ca622 Mon Sep 17 00:00:00 2001 From: Shang Date: Sat, 13 Jun 2026 22:52:32 +0800 Subject: [PATCH 077/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=E6=A0=B8?= =?UTF-8?q?=E5=BF=83=E9=85=8D=E7=BD=AE=E4=B8=8E=E5=9F=BA=E7=A1=80=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../build/ComponentsConfigurator.java | 5 +- .../resources/META-INF/plexus/components.xml | 3 ++ .../cat/build/ComponentsConfigurator.java | 31 ++++++++----- .../business/BusinessConfigManager.java | 4 -- .../content/LocalResourceContentFetcher.java | 2 - .../server/ServerFilterConfigManager.java | 5 -- .../TpValueStatisticConfigManager.java | 6 --- .../com/dianping/cat/helper/JsonBuilder.java | 2 - .../cat/message/DefaultPathBuilder.java | 11 ++--- .../dianping/cat/report/DomainValidator.java | 3 -- .../report/server/RemoteServersManager.java | 3 -- .../com/dianping/cat/service/IpService.java | 2 - .../com/dianping/cat/service/IpService2.java | 2 - .../cat/statistic/ServerStatisticManager.java | 3 -- .../resources/META-INF/plexus/components.xml | 10 ++++ .../cat/build/ComponentsConfigurator.java | 12 ++++- .../resources/META-INF/plexus/components.xml | 46 +++++++++++++++++-- 17 files changed, 94 insertions(+), 56 deletions(-) diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java index f73ef8e0d4..7f56d0e572 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java @@ -106,7 +106,10 @@ public List defineComponents() { .req(ConfigRepository.class, (String) null, "m_configDao") // .req(ContentFetcher.class, (String) null, "m_fetcher")); all.add(A(ServerConfigManager.class)); - all.add(A(TpValueStatisticConfigManager.class)); + all.add(C(TpValueStatisticConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(AllReportConfigManager.class)); all.add(C(Module.class, CatConsumerModule.ID, CatConsumerModule.class)); diff --git a/cat-consumer/src/main/resources/META-INF/plexus/components.xml b/cat-consumer/src/main/resources/META-INF/plexus/components.xml index f377f0a7f4..3482ec2f2b 100644 --- a/cat-consumer/src/main/resources/META-INF/plexus/components.xml +++ b/cat-consumer/src/main/resources/META-INF/plexus/components.xml @@ -808,12 +808,15 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager diff --git a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 7c1501a99a..c7d3d4ee57 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -40,8 +40,10 @@ import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; +import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.message.DefaultPathBuilder; +import com.dianping.cat.message.DefaultPathBuilder; +import com.dianping.cat.message.PathBuilder; import com.dianping.cat.message.storage.LocalMessageBucket; import com.dianping.cat.report.DefaultReportBucketManager; import com.dianping.cat.report.DomainValidator; @@ -67,15 +69,17 @@ public List defineComponents() { all.add(A(ServerConfigManager.class)); all.add(A(HostinfoService.class)); - all.add(A(IpService.class)); - all.add(A(IpService2.class)); + all.add(C(IpService.class)); + all.add(C(IpService2.class)); all.add(A(TaskManager.class)); - all.add(A(ServerStatisticManager.class)); - all.add(A(DomainValidator.class)); - all.add(A(LocalResourceContentFetcher.class)); - all.add(A(ServerFilterConfigManager.class)); + all.add(C(ServerStatisticManager.class)); + all.add(C(DomainValidator.class)); + all.add(C(ContentFetcher.class, LocalResourceContentFetcher.class)); + all.add(C(ServerFilterConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); - all.add(A(DefaultPathBuilder.class)); + all.add(C(PathBuilder.class, DefaultPathBuilder.class)); all.add(A(PlexusMessageAnalyzerFactory.class)); all.add(A(DefaultMessageAnalyzerManager.class)); @@ -87,7 +91,9 @@ public List defineComponents() { all.add(C(SampleConfigManager.class) // .req(ConfigRepository.class, (String) null, "m_configDao") // .req(ContentFetcher.class, (String) null, "m_fetcher")); - all.add(A(BusinessConfigManager.class)); + all.add(C(BusinessConfigManager.class) // + .req(BusinessConfigRepository.class, (String) null, "m_configDao") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(C(ReportReloadConfigManager.class) // .req(ConfigRepository.class, (String) null, "m_configDao") // .req(ContentFetcher.class, (String) null, "m_fetcher")); @@ -96,10 +102,13 @@ public List defineComponents() { all.addAll(defineStorageComponents()); - all.add(A(RemoteServersManager.class)); + all.add(C(RemoteServersManager.class)); all.add(A(ServersUpdaterManager.class)); - all.add(A(TpValueStatisticConfigManager.class)); + all.add(C(TpValueStatisticConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(C(AtomicMessageConfigManager.class) // .req(ConfigRepository.class, (String) null, "m_configDao") // .req(ContentFetcher.class, (String) null, "m_fetcher")); diff --git a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java index f461ff1eba..5af4802a40 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java @@ -32,8 +32,6 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -47,13 +45,11 @@ import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; -@Named public class BusinessConfigManager extends ContainerHolder implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(BusinessConfigManager.class); public final static String BASE_CONFIG = "base"; - @Inject private BusinessConfigRepository m_configDao; private ServerConfigManager m_serverConfigManager; diff --git a/cat-core/src/main/java/com/dianping/cat/config/content/LocalResourceContentFetcher.java b/cat-core/src/main/java/com/dianping/cat/config/content/LocalResourceContentFetcher.java index ca703f9ed0..e0147e05cb 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/content/LocalResourceContentFetcher.java +++ b/cat-core/src/main/java/com/dianping/cat/config/content/LocalResourceContentFetcher.java @@ -21,11 +21,9 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; import org.unidal.helper.Files; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; -@Named(type = ContentFetcher.class) public class LocalResourceContentFetcher implements ContentFetcher, LogEnabled { private final String PATH = "/config/"; diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java index 1dbfef98b3..9ca2093497 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java @@ -26,8 +26,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.xml.sax.SAXException; import com.dianping.cat.Cat; @@ -41,15 +39,12 @@ import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; -@Named(type = ServerFilterConfigManager.class) public class ServerFilterConfigManager implements Initializable { private static final String CONFIG_NAME = "serverFilter"; - @Inject protected ConfigRepository m_configDao; - @Inject protected ContentFetcher m_fetcher; private volatile ServerFilterConfig m_config; diff --git a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java index 97faa0f1d7..a88ba4c2ff 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java @@ -24,8 +24,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -38,20 +36,16 @@ import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.task.TimerSyncTask; -@Named public class TpValueStatisticConfigManager implements Initializable { public static final String DEFAULT = "default"; private static final String CONFIG_NAME = "tp-value-statistic-config"; - @Inject protected ConfigRepository m_configDao; - @Inject protected ContentFetcher m_fetcher; - @Inject private ServerConfigManager m_serverConfigManager; private int m_configId; diff --git a/cat-core/src/main/java/com/dianping/cat/helper/JsonBuilder.java b/cat-core/src/main/java/com/dianping/cat/helper/JsonBuilder.java index b81503ed5e..7709b25c12 100644 --- a/cat-core/src/main/java/com/dianping/cat/helper/JsonBuilder.java +++ b/cat-core/src/main/java/com/dianping/cat/helper/JsonBuilder.java @@ -36,9 +36,7 @@ import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; -import org.unidal.lookup.annotation.Named; -@Named public class JsonBuilder { private FieldNamingStrategy m_fieldNamingStrategy = new FieldNamingStrategy() { diff --git a/cat-core/src/main/java/com/dianping/cat/message/DefaultPathBuilder.java b/cat-core/src/main/java/com/dianping/cat/message/DefaultPathBuilder.java index da4530dc75..bb3231520d 100644 --- a/cat-core/src/main/java/com/dianping/cat/message/DefaultPathBuilder.java +++ b/cat-core/src/main/java/com/dianping/cat/message/DefaultPathBuilder.java @@ -18,13 +18,10 @@ */ package com.dianping.cat.message; -import java.text.MessageFormat; -import java.util.Date; - -import org.unidal.lookup.annotation.Named; - -@Named(type = PathBuilder.class) -public class DefaultPathBuilder implements PathBuilder { +import java.text.MessageFormat; +import java.util.Date; + +public class DefaultPathBuilder implements PathBuilder { @Override public String getLogviewPath(Date timestamp, String name) { diff --git a/cat-core/src/main/java/com/dianping/cat/report/DomainValidator.java b/cat-core/src/main/java/com/dianping/cat/report/DomainValidator.java index 580e8d9144..48718e73f5 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/DomainValidator.java +++ b/cat-core/src/main/java/com/dianping/cat/report/DomainValidator.java @@ -18,11 +18,8 @@ */ package com.dianping.cat.report; -import org.unidal.lookup.annotation.Named; - import java.util.concurrent.ConcurrentHashMap; -@Named public class DomainValidator { private ConcurrentHashMap m_valids = new ConcurrentHashMap(); diff --git a/cat-core/src/main/java/com/dianping/cat/report/server/RemoteServersManager.java b/cat-core/src/main/java/com/dianping/cat/report/server/RemoteServersManager.java index 6cc6109073..efc1b4d47a 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/server/RemoteServersManager.java +++ b/cat-core/src/main/java/com/dianping/cat/report/server/RemoteServersManager.java @@ -22,11 +22,8 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.report.service.ModelPeriod; -@Named public class RemoteServersManager { private volatile Map> m_currentServers = new ConcurrentHashMap>(); diff --git a/cat-core/src/main/java/com/dianping/cat/service/IpService.java b/cat-core/src/main/java/com/dianping/cat/service/IpService.java index cf28a6c706..d38559b13a 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/IpService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/IpService.java @@ -29,11 +29,9 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; -@Named public class IpService implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(IpService.class); diff --git a/cat-core/src/main/java/com/dianping/cat/service/IpService2.java b/cat-core/src/main/java/com/dianping/cat/service/IpService2.java index bfebe1dea2..a37d8c7eaa 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/IpService2.java +++ b/cat-core/src/main/java/com/dianping/cat/service/IpService2.java @@ -28,12 +28,10 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.helper.Files; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.service.IpService.IpInfo; -@Named public class IpService2 implements Initializable { private int m_offset; diff --git a/cat-core/src/main/java/com/dianping/cat/statistic/ServerStatisticManager.java b/cat-core/src/main/java/com/dianping/cat/statistic/ServerStatisticManager.java index 3e698f8f25..41e19c132c 100644 --- a/cat-core/src/main/java/com/dianping/cat/statistic/ServerStatisticManager.java +++ b/cat-core/src/main/java/com/dianping/cat/statistic/ServerStatisticManager.java @@ -18,11 +18,8 @@ */ package com.dianping.cat.statistic; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.statistic.ServerStatistic.Statistic; -@Named public class ServerStatisticManager { public ServerStatistic m_serverState = new ServerStatistic(); diff --git a/cat-core/src/main/resources/META-INF/plexus/components.xml b/cat-core/src/main/resources/META-INF/plexus/components.xml index a673f2ab47..9cf1f4c97d 100644 --- a/cat-core/src/main/resources/META-INF/plexus/components.xml +++ b/cat-core/src/main/resources/META-INF/plexus/components.xml @@ -72,9 +72,11 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher @@ -139,6 +141,11 @@ com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository + m_configDao + + + com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager @@ -211,12 +218,15 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 0c59212ba2..7dc5e72784 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -100,6 +100,7 @@ import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.config.AlertPolicyManager; import com.dianping.cat.alarm.spi.config.SenderConfigManager; +import com.dianping.cat.config.business.BusinessConfigManager; import com.dianping.cat.report.alert.event.EventRuleConfigManager; import com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager; import com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager; @@ -150,7 +151,7 @@ public static void main(String[] args) { private List defineCommonComponents() { List all = new ArrayList(); - all.add(A(JsonBuilder.class)); + all.add(C(JsonBuilder.class)); all.add(C(ValueTranslater.class, DefaultValueTranslater.class)); @@ -475,6 +476,15 @@ private List defineConfigComponents() { List all = new ArrayList(); all.add(C(DomainGroupConfigManager.class)); + all.add(C(SampleConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(com.dianping.cat.config.content.ContentFetcher.class, (String) null, "m_fetcher")); + all.add(C(ServerFilterConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(com.dianping.cat.config.content.ContentFetcher.class, (String) null, "m_fetcher")); + all.add(C(BusinessConfigManager.class) // + .req(BusinessConfigRepository.class, (String) null, "m_configDao") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); return all; } diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 64b8e1acb6..a24a402895 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -36,6 +36,48 @@ com.dianping.cat.report.page.DomainGroupConfigManager com.dianping.cat.report.page.DomainGroupConfigManager + + com.dianping.cat.config.sample.SampleConfigManager + com.dianping.cat.config.sample.SampleConfigManager + + + com.dianping.cat.core.config.repository.ConfigRepository + m_configDao + + + com.dianping.cat.config.content.ContentFetcher + m_fetcher + + + + + com.dianping.cat.config.server.ServerFilterConfigManager + com.dianping.cat.config.server.ServerFilterConfigManager + + + com.dianping.cat.core.config.repository.ConfigRepository + m_configDao + + + com.dianping.cat.config.content.ContentFetcher + m_fetcher + + + + + com.dianping.cat.config.business.BusinessConfigManager + com.dianping.cat.config.business.BusinessConfigManager + + + com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository + m_configDao + + + com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager + + + com.dianping.cat.system.page.config.ConfigHtmlParser com.dianping.cat.system.page.config.ConfigHtmlParser @@ -3729,10 +3771,6 @@ - - com.dianping.cat.config.sample.SampleConfigManager - com.dianping.cat.config.sample.SampleConfigManager - com.dianping.cat.system.page.project.Handler com.dianping.cat.system.page.project.Handler From da5157d958f8fc2c5966a1a54a9fa022b6bce48c Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 04:58:14 +0800 Subject: [PATCH 078/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E6=9C=8D=E5=8A=A1=E4=B8=8E=E6=8A=A5=E8=A1=A8=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../build/ComponentsConfigurator.java | 5 +++- .../resources/META-INF/plexus/components.xml | 2 ++ .../java/com/dianping/cat/CatCoreModule.java | 2 -- .../cat/build/ComponentsConfigurator.java | 14 +++++---- .../dianping/cat/mvc/PayloadNormalizer.java | 9 +++--- .../HourlyReportContentTableProvider.java | 4 +-- .../cat/report/HourlyReportTableProvider.java | 4 +-- .../report/service/AbstractReportService.java | 9 ------ .../service/BaseCompositeModelService.java | 4 --- .../service/BaseHistoricalModelService.java | 2 -- .../service/BaseRemoteModelService.java | 2 -- .../cat/report/service/LocalModelService.java | 3 -- .../dianping/cat/service/HostinfoService.java | 5 ---- .../dianping/cat/service/ProjectService.java | 5 ---- .../resources/META-INF/plexus/components.xml | 2 ++ .../java/com/dianping/cat/CatHomeModule.java | 2 -- .../cat/build/ComponentsConfigurator.java | 29 ++++++++++++------- .../resources/META-INF/plexus/components.xml | 15 ++++++++++ 18 files changed, 56 insertions(+), 62 deletions(-) diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java index 7f56d0e572..cf0e01b13e 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java @@ -70,6 +70,7 @@ import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.repository.project.ProjectRepository; import com.dianping.cat.message.PathBuilder; import com.dianping.cat.message.storage.MessageBucketManager; import com.dianping.cat.report.DefaultReportManager; @@ -248,7 +249,9 @@ private Collection defineStateComponents() { all.add(A(StateAnalyzer.class)); all.add(A(StateDelegate.class)); - all.add(A(ProjectService.class)); + all.add(C(ProjectService.class) // + .req(ProjectRepository.class, (String) null, "m_projectDao") // + .req(ServerConfigManager.class, (String) null, "m_manager")); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // .req(ReportBucketManager.class, HourlyReportRepository.class, HourlyReportContentRepository.class, DomainValidator.class) // diff --git a/cat-consumer/src/main/resources/META-INF/plexus/components.xml b/cat-consumer/src/main/resources/META-INF/plexus/components.xml index 3482ec2f2b..d9ad8506f1 100644 --- a/cat-consumer/src/main/resources/META-INF/plexus/components.xml +++ b/cat-consumer/src/main/resources/META-INF/plexus/components.xml @@ -417,9 +417,11 @@ com.dianping.cat.core.mybatis.repository.project.ProjectRepository + m_projectDao com.dianping.cat.config.server.ServerConfigManager + m_manager diff --git a/cat-core/src/main/java/com/dianping/cat/CatCoreModule.java b/cat-core/src/main/java/com/dianping/cat/CatCoreModule.java index b90c4e7546..b80309caab 100644 --- a/cat-core/src/main/java/com/dianping/cat/CatCoreModule.java +++ b/cat-core/src/main/java/com/dianping/cat/CatCoreModule.java @@ -21,12 +21,10 @@ import org.unidal.initialization.AbstractModule; import org.unidal.initialization.Module; import org.unidal.initialization.ModuleContext; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.report.server.ServersUpdaterManager; import com.dianping.cat.spring.CatSpringContext; -@Named(type = Module.class, value = CatCoreModule.ID) public class CatCoreModule extends AbstractModule { public static final String ID = "cat-core"; diff --git a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index c7d3d4ee57..128972f63e 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -20,9 +20,10 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.List; - -import org.unidal.dal.jdbc.configuration.AbstractJdbcResourceConfigurator; +import java.util.List; + +import org.unidal.dal.jdbc.configuration.AbstractJdbcResourceConfigurator; +import org.unidal.initialization.Module; import org.unidal.lookup.configuration.Component; import com.dianping.cat.CatConstants; import com.dianping.cat.CatCoreModule; @@ -42,6 +43,7 @@ import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository; import com.dianping.cat.message.DefaultPathBuilder; import com.dianping.cat.message.PathBuilder; import com.dianping.cat.message.storage.LocalMessageBucket; @@ -68,7 +70,9 @@ public List defineComponents() { all.add(A(RealtimeConsumer.class)); all.add(A(ServerConfigManager.class)); - all.add(A(HostinfoService.class)); + all.add(C(HostinfoService.class) // + .req(HostinfoRepository.class, (String) null, "m_hostinfoDao") // + .req(ServerConfigManager.class, (String) null, "m_manager")); all.add(C(IpService.class)); all.add(C(IpService2.class)); all.add(A(TaskManager.class)); @@ -98,7 +102,7 @@ public List defineComponents() { .req(ConfigRepository.class, (String) null, "m_configDao") // .req(ContentFetcher.class, (String) null, "m_fetcher")); - all.add(A(CatCoreModule.class)); + all.add(C(Module.class, CatCoreModule.ID, CatCoreModule.class)); all.addAll(defineStorageComponents()); diff --git a/cat-core/src/main/java/com/dianping/cat/mvc/PayloadNormalizer.java b/cat-core/src/main/java/com/dianping/cat/mvc/PayloadNormalizer.java index 84c9c557b6..e43b08c6f8 100644 --- a/cat-core/src/main/java/com/dianping/cat/mvc/PayloadNormalizer.java +++ b/cat-core/src/main/java/com/dianping/cat/mvc/PayloadNormalizer.java @@ -20,17 +20,12 @@ import java.util.Date; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.spring.CatSpringContext; -@Named public class PayloadNormalizer { - @Inject protected ServerConfigManager m_manager; @SuppressWarnings("rawtypes") @@ -65,4 +60,8 @@ public void normalize(AbstractReportModel model, AbstractReportPayload payload) } } + public void setManager(ServerConfigManager manager) { + m_manager = manager; + } + } diff --git a/cat-core/src/main/java/com/dianping/cat/report/HourlyReportContentTableProvider.java b/cat-core/src/main/java/com/dianping/cat/report/HourlyReportContentTableProvider.java index 4cef3b0464..197bcd9ecd 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/HourlyReportContentTableProvider.java +++ b/cat-core/src/main/java/com/dianping/cat/report/HourlyReportContentTableProvider.java @@ -23,9 +23,7 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.dal.jdbc.mapping.TableProvider; -import org.unidal.lookup.annotation.Named; -@Named(type = TableProvider.class, value = HourlyReportContentTableProvider.LOGIC_TABLE_NAME) public class HourlyReportContentTableProvider implements TableProvider, Initializable { public final static String LOGIC_TABLE_NAME = "report-content"; @@ -50,4 +48,4 @@ public void setLogicalTableName(String logicalTableName) { m_logicalTableName = logicalTableName; } -} \ No newline at end of file +} diff --git a/cat-core/src/main/java/com/dianping/cat/report/HourlyReportTableProvider.java b/cat-core/src/main/java/com/dianping/cat/report/HourlyReportTableProvider.java index abc67543c4..a81cb36f55 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/HourlyReportTableProvider.java +++ b/cat-core/src/main/java/com/dianping/cat/report/HourlyReportTableProvider.java @@ -23,9 +23,7 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.dal.jdbc.mapping.TableProvider; -import org.unidal.lookup.annotation.Named; -@Named(type = TableProvider.class, value = HourlyReportTableProvider.LOGIC_TABLE_NAME) public class HourlyReportTableProvider implements TableProvider, Initializable { public final static String LOGIC_TABLE_NAME = "report"; @@ -52,4 +50,4 @@ public String getPhysicalTableName(Map hints, String logicalTabl return "hourlyreport"; } -} \ No newline at end of file +} diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java index c4d5b96e6f..bfe51a230a 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java @@ -32,7 +32,6 @@ import org.codehaus.plexus.logging.Logger; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; @@ -70,28 +69,20 @@ public abstract class AbstractReportService implements LogEnabled, ReportServ public static final int s_customer = 5; - @Inject protected HourlyReportRepository m_hourlyReportDao; - @Inject protected HourlyReportContentRepository m_hourlyReportContentDao; - @Inject protected DailyReportRepository m_dailyReportDao; - @Inject protected DailyReportContentRepository m_dailyReportContentDao; - @Inject protected WeeklyReportRepository m_weeklyReportDao; - @Inject protected WeeklyReportContentRepository m_weeklyReportContentDao; - @Inject protected MonthlyReportRepository m_monthlyReportDao; - @Inject protected MonthlyReportContentRepository m_monthlyReportContentDao; protected Logger m_logger; diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java b/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java index 0a27adf280..c98d020e86 100755 --- a/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java @@ -27,7 +27,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.helper.Splitters; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -41,13 +40,10 @@ public abstract class BaseCompositeModelService extends ModelServiceWithCalSupport implements ModelService, Initializable { - @Inject protected ServerConfigManager m_configManager; - @Inject private RemoteServersManager m_serverManager; - @Inject private List> m_services; private List> m_allServices = new ArrayList>(); diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/BaseHistoricalModelService.java b/cat-core/src/main/java/com/dianping/cat/report/service/BaseHistoricalModelService.java index 3c729aa9d5..09ecdc7127 100755 --- a/cat-core/src/main/java/com/dianping/cat/report/service/BaseHistoricalModelService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/BaseHistoricalModelService.java @@ -20,7 +20,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.message.Message; @@ -30,7 +29,6 @@ public abstract class BaseHistoricalModelService extends ModelServiceWithCalSupport implements ModelService, Initializable { - @Inject protected ServerConfigManager m_configManager; private boolean m_localMode = true; diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/BaseRemoteModelService.java b/cat-core/src/main/java/com/dianping/cat/report/service/BaseRemoteModelService.java index ab5b2bbe6b..e948afbc7d 100755 --- a/cat-core/src/main/java/com/dianping/cat/report/service/BaseRemoteModelService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/BaseRemoteModelService.java @@ -25,7 +25,6 @@ import com.dianping.cat.report.server.RemoteServersManager; import org.unidal.helper.Files; import org.unidal.helper.Urls; -import org.unidal.lookup.annotation.Inject; import org.xml.sax.SAXException; import java.io.IOException; @@ -49,7 +48,6 @@ public abstract class BaseRemoteModelService extends ModelServiceWithCalSuppo private int m_port = 2281; // default admin port - @Inject private String m_serviceUri = "/cat/r/model"; public BaseRemoteModelService(String name) { diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/LocalModelService.java b/cat-core/src/main/java/com/dianping/cat/report/service/LocalModelService.java index a853de13a5..f30f6ec638 100755 --- a/cat-core/src/main/java/com/dianping/cat/report/service/LocalModelService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/LocalModelService.java @@ -26,7 +26,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Constants; import com.dianping.cat.analysis.AbstractMessageAnalyzer; @@ -41,10 +40,8 @@ public abstract class LocalModelService implements Initializable { public static final int DEFAULT_SIZE = 32 * 1024; - @Inject protected ServerConfigManager m_configManager; - @Inject private MessageConsumer m_consumer; private int m_analyzerCount = 2; diff --git a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java index 73e21a2c74..d764574010 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java @@ -34,8 +34,6 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.helper.Threads; import org.unidal.helper.Threads.Task; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.lookup.util.StringUtils; import com.dianping.cat.Cat; @@ -46,7 +44,6 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.spring.CatSpringContext; -@Named(type = HostinfoService.class) public class HostinfoService implements Initializable, LogEnabled { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(HostinfoService.class); @@ -54,10 +51,8 @@ public class HostinfoService implements Initializable, LogEnabled { protected Logger m_logger; - @Inject private HostinfoRepository m_hostinfoDao; - @Inject private ServerConfigManager m_manager; private Map m_ipDomains = new ConcurrentHashMap(); diff --git a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java index 1b4cb89e0b..2139f34918 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java @@ -28,23 +28,18 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.*; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; -@Named public class ProjectService implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(ProjectService.class); public static final String DEFAULT = "Default"; - @Inject private ProjectRepository m_projectDao; - @Inject private ServerConfigManager m_manager; private ConcurrentHashMap m_domains = new ConcurrentHashMap(); diff --git a/cat-core/src/main/resources/META-INF/plexus/components.xml b/cat-core/src/main/resources/META-INF/plexus/components.xml index 9cf1f4c97d..1039363c14 100644 --- a/cat-core/src/main/resources/META-INF/plexus/components.xml +++ b/cat-core/src/main/resources/META-INF/plexus/components.xml @@ -31,9 +31,11 @@ com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository + m_hostinfoDao com.dianping.cat.config.server.ServerConfigManager + m_manager diff --git a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java index 373fccb413..14b2ee5952 100644 --- a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java +++ b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java @@ -22,7 +22,6 @@ import org.unidal.initialization.AbstractModule; import org.unidal.initialization.Module; import org.unidal.initialization.ModuleContext; -import org.unidal.lookup.annotation.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,7 +35,6 @@ import com.dianping.cat.report.task.reload.ReportReloadTask; import com.dianping.cat.spring.CatSpringContext; -@Named(type = Module.class, value = CatHomeModule.ID) public class CatHomeModule extends AbstractModule { private static final Logger LOGGER = LoggerFactory.getLogger(CatHomeModule.class); diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 7dc5e72784..be85aa88f9 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -23,9 +23,11 @@ import java.util.List; import java.util.Set; -import org.unidal.dal.jdbc.configuration.AbstractJdbcResourceConfigurator; -import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.dal.jdbc.configuration.AbstractJdbcResourceConfigurator; +import org.unidal.dal.jdbc.datasource.DataSourceManager; +import org.unidal.dal.jdbc.mapping.TableProvider; import org.unidal.initialization.DefaultModuleManager; +import org.unidal.initialization.Module; import org.unidal.initialization.ModuleManager; import org.unidal.lookup.configuration.Component; import org.unidal.web.mvc.view.model.ModelHandler; @@ -160,7 +162,8 @@ private List defineCommonComponents() { all.add(C(EventMergeHelper.class)); - all.add(A(PayloadNormalizer.class)); + all.add(C(PayloadNormalizer.class) // + .req(ServerConfigManager.class, (String) null, "m_manager")); return all; } @@ -400,7 +403,7 @@ public List defineComponents() { .req(com.dianping.cat.report.page.business.task.BusinessKeyHelper.class, (String) null, "m_keyHelper")); - all.add(A(CatHomeModule.class)); + all.add(C(Module.class, CatHomeModule.ID, CatHomeModule.class)); all.add(C(UserConfigManager.class)); @@ -485,6 +488,9 @@ private List defineConfigComponents() { all.add(C(BusinessConfigManager.class) // .req(BusinessConfigRepository.class, (String) null, "m_configDao") // .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); + all.add(C(ProjectService.class) // + .req(ProjectRepository.class, (String) null, "m_projectDao") // + .req(ServerConfigManager.class, (String) null, "m_manager")); return all; } @@ -553,13 +559,14 @@ private List defineTaskComponents() { } private List defineTableProviderComponents() { - List all = new ArrayList(); - - all.add(A(HourlyReportTableProvider.class)); - all.add(A(HourlyReportContentTableProvider.class)); - - return all; - } + List all = new ArrayList(); + + all.add(C(TableProvider.class, HourlyReportTableProvider.LOGIC_TABLE_NAME, HourlyReportTableProvider.class)); + all.add(C(TableProvider.class, HourlyReportContentTableProvider.LOGIC_TABLE_NAME, + HourlyReportContentTableProvider.class)); + + return all; + } private void removeReplacedDaoComponents(List components) { components.removeIf(component -> isCoreReplacedDaoRole(component.getModel().getRole())); diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index a24a402895..38702ea93e 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -29,6 +29,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_manager @@ -78,6 +79,20 @@ + + com.dianping.cat.service.ProjectService + com.dianping.cat.service.ProjectService + + + com.dianping.cat.core.mybatis.repository.project.ProjectRepository + m_projectDao + + + com.dianping.cat.config.server.ServerConfigManager + m_manager + + + com.dianping.cat.system.page.config.ConfigHtmlParser com.dianping.cat.system.page.config.ConfigHtmlParser From 962172d580bfba5cd3325a2b0ee324df8f73ebcd Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 05:22:34 +0800 Subject: [PATCH 079/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=20cat-core?= =?UTF-8?q?=20Repository=20=E4=B8=8E=E5=AD=98=E5=82=A8=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../build/CatCoreDatabaseConfigurator.java | 26 +++++------ .../cat/build/CatDatabaseConfigurator.java | 26 +++++------ .../cat/build/ComponentsConfigurator.java | 45 ++++++++++++------- .../config/repository/ConfigRepository.java | 2 - .../SpringBackedRepositorySupport.java | 2 - .../config/BusinessConfigRepository.java | 2 - .../content/DailyReportContentRepository.java | 3 -- .../hostinfo/HostinfoRepository.java | 2 - .../HourlyReportContentRepository.java | 3 -- .../hourlyreport/HourlyReportRepository.java | 3 -- .../MonthlyReportContentRepository.java | 3 -- .../monthreport/MonthlyReportRepository.java | 3 -- .../repository/project/ProjectRepository.java | 3 -- .../repository/task/TaskRepository.java | 2 - .../WeeklyReportContentRepository.java | 3 -- .../weeklyreport/WeeklyReportRepository.java | 3 -- .../repository/DailyReportRepository.java | 2 - .../message/storage/LocalMessageBucket.java | 2 - .../report/DefaultReportBucketManager.java | 4 -- .../cat/report/DefaultReportManager.java | 6 --- .../cat/report/LocalReportBucket.java | 5 --- .../report/server/ServersUpdaterManager.java | 5 --- .../com/dianping/cat/task/TaskManager.java | 4 -- .../resources/META-INF/plexus/components.xml | 32 +++++++++++++ 24 files changed, 86 insertions(+), 105 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/build/CatCoreDatabaseConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/CatCoreDatabaseConfigurator.java index 287440f6fe..da25108795 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/CatCoreDatabaseConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/CatCoreDatabaseConfigurator.java @@ -65,19 +65,19 @@ public List defineComponents() { } private void addRepositoryComponents(List components) { - components.add(C(ConfigRepository.class).req(DataSourceManager.class)); - components.add(C(DailyReportRepository.class).req(DataSourceManager.class)); - components.add(C(BusinessConfigRepository.class).req(DataSourceManager.class)); - components.add(C(DailyReportContentRepository.class).req(DataSourceManager.class)); - components.add(C(HostinfoRepository.class).req(DataSourceManager.class)); - components.add(C(HourlyReportRepository.class).req(DataSourceManager.class)); - components.add(C(HourlyReportContentRepository.class).req(DataSourceManager.class)); - components.add(C(MonthlyReportRepository.class).req(DataSourceManager.class)); - components.add(C(MonthlyReportContentRepository.class).req(DataSourceManager.class)); - components.add(C(ProjectRepository.class).req(DataSourceManager.class)); - components.add(C(TaskRepository.class).req(DataSourceManager.class)); - components.add(C(WeeklyReportRepository.class).req(DataSourceManager.class)); - components.add(C(WeeklyReportContentRepository.class).req(DataSourceManager.class)); + components.add(C(ConfigRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(DailyReportRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(BusinessConfigRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(DailyReportContentRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(HostinfoRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(HourlyReportRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(HourlyReportContentRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(MonthlyReportRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(MonthlyReportContentRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(ProjectRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(TaskRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(WeeklyReportRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(WeeklyReportContentRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); } private boolean isReplacedDaoRole(String role) { diff --git a/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java index 3bf41822b7..aad9ea5e39 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/CatDatabaseConfigurator.java @@ -66,19 +66,19 @@ public List defineComponents() { } private void addRepositoryComponents(List components) { - components.add(C(ConfigRepository.class).req(DataSourceManager.class)); - components.add(C(DailyReportRepository.class).req(DataSourceManager.class)); - components.add(C(BusinessConfigRepository.class).req(DataSourceManager.class)); - components.add(C(DailyReportContentRepository.class).req(DataSourceManager.class)); - components.add(C(HostinfoRepository.class).req(DataSourceManager.class)); - components.add(C(HourlyReportRepository.class).req(DataSourceManager.class)); - components.add(C(HourlyReportContentRepository.class).req(DataSourceManager.class)); - components.add(C(MonthlyReportRepository.class).req(DataSourceManager.class)); - components.add(C(MonthlyReportContentRepository.class).req(DataSourceManager.class)); - components.add(C(ProjectRepository.class).req(DataSourceManager.class)); - components.add(C(TaskRepository.class).req(DataSourceManager.class)); - components.add(C(WeeklyReportRepository.class).req(DataSourceManager.class)); - components.add(C(WeeklyReportContentRepository.class).req(DataSourceManager.class)); + components.add(C(ConfigRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(DailyReportRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(BusinessConfigRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(DailyReportContentRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(HostinfoRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(HourlyReportRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(HourlyReportContentRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(MonthlyReportRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(MonthlyReportContentRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(ProjectRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(TaskRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(WeeklyReportRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); + components.add(C(WeeklyReportContentRepository.class).req(DataSourceManager.class, (String) null, "m_dataSourceManager")); } private boolean isReplacedDaoRole(String role) { diff --git a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 128972f63e..e3fc8efd76 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -44,14 +44,19 @@ import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository; +import com.dianping.cat.core.mybatis.repository.task.TaskRepository; import com.dianping.cat.message.DefaultPathBuilder; import com.dianping.cat.message.PathBuilder; -import com.dianping.cat.message.storage.LocalMessageBucket; -import com.dianping.cat.report.DefaultReportBucketManager; -import com.dianping.cat.report.DomainValidator; -import com.dianping.cat.report.LocalReportBucket; -import com.dianping.cat.report.server.RemoteServersManager; -import com.dianping.cat.report.server.ServersUpdaterManager; +import com.dianping.cat.message.storage.LocalMessageBucket; +import com.dianping.cat.message.storage.MessageBucket; +import com.dianping.cat.report.DefaultReportBucketManager; +import com.dianping.cat.report.DomainValidator; +import com.dianping.cat.report.LocalReportBucket; +import com.dianping.cat.report.ReportBucket; +import com.dianping.cat.report.ReportBucketManager; +import com.dianping.cat.report.server.RemoteServersManager; +import com.dianping.cat.report.server.ServersUpdater; +import com.dianping.cat.report.server.ServersUpdaterManager; import com.dianping.cat.service.HostinfoService; import com.dianping.cat.service.IpService; import com.dianping.cat.service.IpService2; @@ -75,7 +80,8 @@ public List defineComponents() { .req(ServerConfigManager.class, (String) null, "m_manager")); all.add(C(IpService.class)); all.add(C(IpService2.class)); - all.add(A(TaskManager.class)); + all.add(C(TaskManager.class) // + .req(TaskRepository.class, (String) null, "m_taskDao")); all.add(C(ServerStatisticManager.class)); all.add(C(DomainValidator.class)); all.add(C(ContentFetcher.class, LocalResourceContentFetcher.class)); @@ -107,7 +113,9 @@ public List defineComponents() { all.addAll(defineStorageComponents()); all.add(C(RemoteServersManager.class)); - all.add(A(ServersUpdaterManager.class)); + all.add(C(ServersUpdaterManager.class) // + .req(ServersUpdater.class, (String) null, "m_remoteServerUpdater") // + .req(RemoteServersManager.class, (String) null, "m_remoteServersManager")); all.add(C(TpValueStatisticConfigManager.class) // .req(ConfigRepository.class, (String) null, "m_configDao") // @@ -127,14 +135,17 @@ public List defineComponents() { return all; } - private Collection defineStorageComponents() { - List all = new ArrayList(); - - all.add(A(DefaultReportBucketManager.class)); - all.add(A(LocalReportBucket.class)); - all.add(A(LocalMessageBucket.class)); - - return all; - } + private Collection defineStorageComponents() { + List all = new ArrayList(); + + all.add(C(ReportBucketManager.class, DefaultReportBucketManager.class) // + .req(ServerConfigManager.class, (String) null, "m_configManager")); + all.add(C(ReportBucket.class, LocalReportBucket.class).is(PER_LOOKUP) // + .req(PathBuilder.class, (String) null, "m_pathBuilder") // + .req(ServerConfigManager.class, (String) null, "m_configManager")); + all.add(C(MessageBucket.class, LocalMessageBucket.ID, LocalMessageBucket.class).is(PER_LOOKUP)); + + return all; + } } diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java index 46f1264483..c1c562566d 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java @@ -26,7 +26,6 @@ import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.dao.ConfigMapper; @@ -42,7 +41,6 @@ public class ConfigRepository { private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Inject private DataSourceManager m_dataSourceManager; private SqlSessionTemplate m_sqlSessionTemplate; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java index 52f6fb0ce2..6e88248541 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java @@ -9,12 +9,10 @@ import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; public abstract class SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(SpringBackedRepositorySupport.class); - @Inject private DataSourceManager m_dataSourceManager; private final Class m_mapperClass; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java index a8ebd0dc6f..2130d52001 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java @@ -15,7 +15,6 @@ import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.core.config.BusinessConfig; import com.dianping.cat.core.mybatis.generated.business.config.dao.BusinessConfigMapper; @@ -29,7 +28,6 @@ public class BusinessConfigRepository { private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Inject private DataSourceManager m_dataSourceManager; private SqlSessionTemplate m_sqlSessionTemplate; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java index 3a09f34c7c..0e88c0f93b 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java @@ -14,7 +14,6 @@ import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.core.dal.DailyReportContent; import com.dianping.cat.core.mybatis.generated.daily.report.content.dao.DailyReportContentMapper; @@ -27,8 +26,6 @@ public class DailyReportContentRepository { private static final String MAPPER_RESOURCE = "mybatis/mapper/DailyReportContentMapper.xml"; private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - - @Inject private DataSourceManager m_dataSourceManager; private volatile SqlSessionFactory m_sqlSessionFactory; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java index b31bb4b5e2..3b9e7a0037 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java @@ -26,7 +26,6 @@ import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.core.dal.Hostinfo; import com.dianping.cat.core.mybatis.generated.hostinfo.dao.HostinfoMapper; @@ -42,7 +41,6 @@ public class HostinfoRepository { private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Inject private DataSourceManager m_dataSourceManager; private SqlSessionTemplate m_sqlSessionTemplate; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java index 30265bf91e..69d8b3bc11 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java @@ -14,7 +14,6 @@ import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.core.dal.HourlyReportContent; import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.HourlyReportContentMapper; @@ -27,8 +26,6 @@ public class HourlyReportContentRepository { private static final String MAPPER_RESOURCE = "mybatis/mapper/HourlyReportContentMapper.xml"; private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - - @Inject private DataSourceManager m_dataSourceManager; private volatile SqlSessionFactory m_sqlSessionFactory; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java index 711279002c..05a8caf66e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java @@ -26,7 +26,6 @@ import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.HourlyreportMapper; @@ -41,8 +40,6 @@ public class HourlyReportRepository { private static final String MAPPER_RESOURCE = "mybatis/mapper/HourlyreportMapper.xml"; private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - - @Inject private DataSourceManager m_dataSourceManager; private volatile SqlSessionFactory m_sqlSessionFactory; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java index 8a708045fb..cf10490927 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java @@ -14,7 +14,6 @@ import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.core.dal.MonthlyReportContent; import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.MonthlyReportContentMapper; @@ -27,8 +26,6 @@ public class MonthlyReportContentRepository { private static final String MAPPER_RESOURCE = "mybatis/mapper/MonthlyReportContentMapper.xml"; private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - - @Inject private DataSourceManager m_dataSourceManager; private volatile SqlSessionFactory m_sqlSessionFactory; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java index c39efbfcc3..dc3ae96147 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java @@ -24,7 +24,6 @@ import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.mybatis.generated.monthreport.dao.MonthreportMapper; @@ -39,8 +38,6 @@ public class MonthlyReportRepository { private static final String MAPPER_RESOURCE = "mybatis/mapper/MonthreportMapper.xml"; private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - - @Inject private DataSourceManager m_dataSourceManager; private volatile SqlSessionFactory m_sqlSessionFactory; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java index 203e9d0820..f665180db6 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java @@ -26,7 +26,6 @@ import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.core.dal.Project; import com.dianping.cat.core.mybatis.generated.project.dao.ProjectMapper; @@ -41,8 +40,6 @@ public class ProjectRepository { private static final String MAPPER_RESOURCE = "mybatis/mapper/ProjectMapper.xml"; private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - - @Inject private DataSourceManager m_dataSourceManager; private SqlSessionTemplate m_sqlSessionTemplate; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java index 5abaf553af..9315876db4 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java @@ -12,7 +12,6 @@ import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.core.dal.Task; import com.dianping.cat.core.mybatis.generated.task.dao.TaskMapper; @@ -26,7 +25,6 @@ public class TaskRepository { private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Inject private DataSourceManager m_dataSourceManager; private volatile SqlSessionFactory m_sqlSessionFactory; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java index 7083e0a92e..3feaac503b 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java @@ -14,7 +14,6 @@ import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.core.dal.WeeklyReportContent; import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.WeeklyReportContentMapper; @@ -27,8 +26,6 @@ public class WeeklyReportContentRepository { private static final String MAPPER_RESOURCE = "mybatis/mapper/WeeklyReportContentMapper.xml"; private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - - @Inject private DataSourceManager m_dataSourceManager; private volatile SqlSessionFactory m_sqlSessionFactory; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java index 154b194c9d..b7d9a609fa 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java @@ -24,7 +24,6 @@ import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.WeeklyreportMapper; @@ -39,8 +38,6 @@ public class WeeklyReportRepository { private static final String MAPPER_RESOURCE = "mybatis/mapper/WeeklyreportMapper.xml"; private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - - @Inject private DataSourceManager m_dataSourceManager; private volatile SqlSessionFactory m_sqlSessionFactory; diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java index 6d2540cef2..3ccce0f49f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java @@ -26,7 +26,6 @@ import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.report.daily.dao.DailyReportMapper; @@ -42,7 +41,6 @@ public class DailyReportRepository { private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - @Inject private DataSourceManager m_dataSourceManager; private volatile SqlSessionFactory m_sqlSessionFactory; diff --git a/cat-core/src/main/java/com/dianping/cat/message/storage/LocalMessageBucket.java b/cat-core/src/main/java/com/dianping/cat/message/storage/LocalMessageBucket.java index 2f6e26784f..c80b6a86ed 100644 --- a/cat-core/src/main/java/com/dianping/cat/message/storage/LocalMessageBucket.java +++ b/cat-core/src/main/java/com/dianping/cat/message/storage/LocalMessageBucket.java @@ -28,14 +28,12 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; -import org.unidal.lookup.annotation.Named; import org.xerial.snappy.SnappyOutputStream; import com.dianping.cat.message.CodecHandler; import com.dianping.cat.message.spi.MessageTree; import com.dianping.cat.message.tree.MessageId; -@Named(type = MessageBucket.class, value = LocalMessageBucket.ID, instantiationStrategy = Named.PER_LOOKUP) public class LocalMessageBucket implements MessageBucket { public static final String ID = "local"; diff --git a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportBucketManager.java b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportBucketManager.java index e2602a4b19..e78c02cd72 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportBucketManager.java +++ b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportBucketManager.java @@ -36,8 +36,6 @@ import org.unidal.helper.Scanners; import org.unidal.helper.Scanners.FileMatcher; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -45,11 +43,9 @@ import com.dianping.cat.message.Transaction; import com.dianping.cat.spring.CatSpringContext; -@Named(type = ReportBucketManager.class) public class DefaultReportBucketManager extends ContainerHolder implements ReportBucketManager, Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(DefaultReportBucketManager.class); - @Inject private ServerConfigManager m_configManager; private ReportBucketFactory m_bucketFactory; diff --git a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java index a761b419f6..fd9cf956cc 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java +++ b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java @@ -32,7 +32,6 @@ import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; @@ -50,19 +49,14 @@ * for a couple of hours. */ public class DefaultReportManager extends ContainerHolder implements ReportManager, Initializable, LogEnabled { - @Inject private ReportDelegate m_reportDelegate; - @Inject private ReportBucketManager m_bucketManager; - @Inject private HourlyReportRepository m_reportDao; - @Inject private HourlyReportContentRepository m_reportContentDao; - @Inject private DomainValidator m_validator; private String m_name; diff --git a/cat-core/src/main/java/com/dianping/cat/report/LocalReportBucket.java b/cat-core/src/main/java/com/dianping/cat/report/LocalReportBucket.java index 65e3618bfd..3d860a907e 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/LocalReportBucket.java +++ b/cat-core/src/main/java/com/dianping/cat/report/LocalReportBucket.java @@ -38,21 +38,16 @@ import org.slf4j.LoggerFactory; import org.unidal.helper.Splitters; import org.unidal.helper.Splitters.StringSplitter; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.message.PathBuilder; -@Named(type = ReportBucket.class, instantiationStrategy = Named.PER_LOOKUP) public class LocalReportBucket implements ReportBucket, LogEnabled { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(LocalReportBucket.class); - @Inject private PathBuilder m_pathBuilder; - @Inject private ServerConfigManager m_configManager; private File m_baseDir = new File("target/bucket/report"); diff --git a/cat-core/src/main/java/com/dianping/cat/report/server/ServersUpdaterManager.java b/cat-core/src/main/java/com/dianping/cat/report/server/ServersUpdaterManager.java index 7453e83b81..5324b73076 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/server/ServersUpdaterManager.java +++ b/cat-core/src/main/java/com/dianping/cat/report/server/ServersUpdaterManager.java @@ -24,21 +24,16 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; -@Named public class ServersUpdaterManager implements Initializable { - @Inject private ServersUpdater m_remoteServerUpdater; - @Inject private RemoteServersManager m_remoteServersManager; @Override diff --git a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java index 72e410bb8a..e2e0cbe13b 100644 --- a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java +++ b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java @@ -24,13 +24,10 @@ import com.dianping.cat.core.mybatis.repository.task.TaskRepository; import com.dianping.cat.spring.CatSpringContext; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.Calendar; import java.util.Date; -@Named public class TaskManager { public static final int REPORT_HOUR = 0; @@ -47,7 +44,6 @@ public class TaskManager { private static final int STATUS_TODO = 1; - @Inject private TaskRepository m_taskDao; public boolean createTask(Date period, String domain, String name, TaskCreationPolicy prolicy) { diff --git a/cat-core/src/main/resources/META-INF/plexus/components.xml b/cat-core/src/main/resources/META-INF/plexus/components.xml index 1039363c14..2a641131d4 100644 --- a/cat-core/src/main/resources/META-INF/plexus/components.xml +++ b/cat-core/src/main/resources/META-INF/plexus/components.xml @@ -53,6 +53,7 @@ com.dianping.cat.core.mybatis.repository.task.TaskRepository + m_taskDao @@ -176,6 +177,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_configManager @@ -186,9 +188,11 @@ com.dianping.cat.message.PathBuilder + m_pathBuilder com.dianping.cat.config.server.ServerConfigManager + m_configManager @@ -208,9 +212,11 @@ com.dianping.cat.report.server.ServersUpdater + m_remoteServerUpdater com.dianping.cat.report.server.RemoteServersManager + m_remoteServersManager @@ -279,6 +285,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -288,6 +295,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -297,6 +305,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -306,6 +315,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -315,6 +325,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -324,6 +335,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -333,6 +345,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -342,6 +355,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -351,6 +365,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -360,6 +375,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -369,6 +385,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -378,6 +395,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -387,6 +405,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -612,6 +631,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -621,6 +641,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -630,6 +651,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -639,6 +661,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -648,6 +671,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -657,6 +681,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -666,6 +691,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -675,6 +701,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -684,6 +711,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -693,6 +721,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -702,6 +731,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -711,6 +741,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager @@ -720,6 +751,7 @@ org.unidal.dal.jdbc.datasource.DataSourceManager + m_dataSourceManager From 42be211d71a5b4e7699072042780975ddf4f4bef Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 05:57:04 +0800 Subject: [PATCH 080/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=E5=AE=9E?= =?UTF-8?q?=E6=97=B6=E5=88=86=E6=9E=90=E9=93=BE=E8=B7=AF=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../build/ComponentsConfigurator.java | 31 +++++++++++-------- .../resources/META-INF/plexus/components.xml | 14 +++++++++ .../cat/analysis/AbstractMessageAnalyzer.java | 2 -- .../DefaultMessageAnalyzerManager.java | 4 --- .../cat/analysis/DefaultMessageHandler.java | 4 --- .../com/dianping/cat/analysis/Period.java | 4 --- .../dianping/cat/analysis/PeriodManager.java | 6 +--- .../PlexusMessageAnalyzerFactory.java | 2 -- .../cat/analysis/RealtimeConsumer.java | 5 --- .../cat/analysis/TcpSocketReceiver.java | 6 ---- .../cat/build/ComponentsConfigurator.java | 26 ++++++++++++---- .../config/server/ServerConfigManager.java | 5 --- .../resources/META-INF/plexus/components.xml | 13 ++++++++ 13 files changed, 66 insertions(+), 56 deletions(-) diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java index cf0e01b13e..6024916c46 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java @@ -106,7 +106,9 @@ public List defineComponents() { all.add(C(AtomicMessageConfigManager.class) // .req(ConfigRepository.class, (String) null, "m_configDao") // .req(ContentFetcher.class, (String) null, "m_fetcher")); - all.add(A(ServerConfigManager.class)); + all.add(C(ServerConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); all.add(C(TpValueStatisticConfigManager.class) // .req(ConfigRepository.class, (String) null, "m_configDao") // .req(ContentFetcher.class, (String) null, "m_fetcher") // @@ -121,7 +123,7 @@ private Collection defineCrossComponents() { final List all = new ArrayList(); final String ID = CrossAnalyzer.ID; - all.add(A(CrossAnalyzer.class)); + all.add(A(CrossAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(CrossDelegate.class)); all.add(C(IpConvertManager.class)); @@ -137,7 +139,7 @@ private Collection defineDependencyComponents() { final List all = new ArrayList(); final String ID = DependencyAnalyzer.ID; - all.add(A(DependencyAnalyzer.class)); + all.add(A(DependencyAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(DependencyDelegate.class)); all.add(C(DatabaseParser.class)); @@ -151,7 +153,7 @@ private Collection defineDependencyComponents() { private Collection defineDumpComponents() { final List all = new ArrayList(); - all.add(A(DumpAnalyzer.class)); + all.add(A(DumpAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(C(MessageBucketManager.class, LocalMessageBucketManager.ID, LocalMessageBucketManager.class) // .req(ServerConfigManager.class, PathBuilder.class, ServerStatisticManager.class)); @@ -163,7 +165,7 @@ private Collection defineEventComponents() { final List all = new ArrayList(); final String ID = EventAnalyzer.ID; - all.add(A(EventAnalyzer.class)); + all.add(A(EventAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(EventDelegate.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // @@ -178,7 +180,7 @@ private Collection defineHeartbeatComponents() { final List all = new ArrayList(); final String ID = HeartbeatAnalyzer.ID; - all.add(A(HeartbeatAnalyzer.class)); + all.add(A(HeartbeatAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(HeartbeatDelegate.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // @@ -193,7 +195,7 @@ private Collection defineMatrixComponents() { final List all = new ArrayList(); final String ID = MatrixAnalyzer.ID; - all.add(A(MatrixAnalyzer.class)); + all.add(A(MatrixAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(MatrixDelegate.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // @@ -208,7 +210,7 @@ private Collection defineBusinessComponents() { final List all = new ArrayList(); final String ID = BusinessAnalyzer.ID; - all.add(A(BusinessAnalyzer.class)); + all.add(A(BusinessAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(BusinessDelegate.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // @@ -230,7 +232,9 @@ private Collection defineProblemComponents() { .req(ServerConfigManager.class)); all.add(C(MessageAnalyzer.class, ID, ProblemAnalyzer.class).is(PER_LOOKUP) // - .req(ReportManager.class, ID).req(ServerConfigManager.class).req(ProblemHandler.class, // + .req(ReportManager.class, ID) + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager") + .req(ProblemHandler.class, // new String[] { DefaultProblemHandler.ID, LongExecutionProblemHandler.ID }, "m_handlers")); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // @@ -246,7 +250,7 @@ private Collection defineStateComponents() { final List all = new ArrayList(); final String ID = StateAnalyzer.ID; - all.add(A(StateAnalyzer.class)); + all.add(A(StateAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(StateDelegate.class)); all.add(C(ProjectService.class) // @@ -264,7 +268,8 @@ private Collection defineTopComponents() { final List all = new ArrayList(); final String ID = TopAnalyzer.ID; - all.add(A(TopAnalyzer.class).config(E("errorType").value("Error,RuntimeException,Exception"))); + all.add(A(TopAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager") + .config(E("errorType").value("Error,RuntimeException,Exception"))); all.add(A(TopDelegate.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // @@ -279,7 +284,7 @@ private Collection defineTransactionComponents() { final List all = new ArrayList(); final String ID = TransactionAnalyzer.ID; - all.add(A(TransactionAnalyzer.class)); + all.add(A(TransactionAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(TransactionDelegate.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // @@ -300,7 +305,7 @@ private Collection defineStorageComponents() { all.add(A(StorageCacheBuilder.class)); all.add(A(StorageRPCBuilder.class)); - all.add(A(StorageAnalyzer.class)); + all.add(A(StorageAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(StorageDelegate.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // diff --git a/cat-consumer/src/main/resources/META-INF/plexus/components.xml b/cat-consumer/src/main/resources/META-INF/plexus/components.xml index d9ad8506f1..9331ca95a5 100644 --- a/cat-consumer/src/main/resources/META-INF/plexus/components.xml +++ b/cat-consumer/src/main/resources/META-INF/plexus/components.xml @@ -22,6 +22,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager @@ -89,6 +90,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager @@ -176,6 +178,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager com.dianping.cat.consumer.problem.ProblemHandler @@ -242,6 +245,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager @@ -303,6 +307,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager @@ -355,6 +360,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager @@ -395,6 +401,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager @@ -467,6 +474,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager @@ -526,6 +534,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager @@ -587,6 +596,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager @@ -677,6 +687,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager @@ -738,6 +749,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager @@ -798,9 +810,11 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/AbstractMessageAnalyzer.java b/cat-core/src/main/java/com/dianping/cat/analysis/AbstractMessageAnalyzer.java index 92b9539f42..2eaa28cd5e 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/AbstractMessageAnalyzer.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/AbstractMessageAnalyzer.java @@ -22,7 +22,6 @@ import org.codehaus.plexus.logging.Logger; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -36,7 +35,6 @@ public abstract class AbstractMessageAnalyzer extends ContainerHolder impleme public static final long ONE_DAY = 24 * ONE_HOUR; - @Inject protected ServerConfigManager m_serverConfigManager; protected long m_startTime; diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java b/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java index d2822223e4..6347588e38 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageAnalyzerManager.java @@ -30,14 +30,11 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.spring.CatSpringContext; -@Named(type = MessageAnalyzerManager.class) public class DefaultMessageAnalyzerManager extends ContainerHolder implements MessageAnalyzerManager, Initializable, LogEnabled { private static final long MINUTE = 60 * 1000L; @@ -50,7 +47,6 @@ public class DefaultMessageAnalyzerManager extends ContainerHolder private List m_analyzerNames; - @Inject private MessageAnalyzerFactory m_analyzerFactory; private ServerConfigManager m_configManager; diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageHandler.java b/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageHandler.java index 3c966f9a09..d74cfa6bca 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageHandler.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/DefaultMessageHandler.java @@ -22,17 +22,13 @@ import org.codehaus.plexus.logging.Logger; import org.slf4j.LoggerFactory; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.message.spi.MessageTree; import com.dianping.cat.spring.CatSpringContext; -@Named(type = MessageHandler.class) public class DefaultMessageHandler extends ContainerHolder implements MessageHandler, LogEnabled { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(DefaultMessageHandler.class); - @Inject private MessageConsumer m_consumer; private Logger m_logger; diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/Period.java b/cat-core/src/main/java/com/dianping/cat/analysis/Period.java index 7bb0ff628e..c9d4f81e4e 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/Period.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/Period.java @@ -28,7 +28,6 @@ import org.codehaus.plexus.logging.Logger; import org.unidal.helper.Threads; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.message.spi.MessageTree; @@ -43,13 +42,10 @@ public class Period { private Map> m_tasks; - @Inject private MessageAnalyzerManager m_analyzerManager; - @Inject private ServerStatisticManager m_serverStateManager; - @Inject private Logger m_logger; public Period(long startTime, long endTime, MessageAnalyzerManager analyzerManager, diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/PeriodManager.java b/cat-core/src/main/java/com/dianping/cat/analysis/PeriodManager.java index 39bc10873d..f40a461dcb 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/PeriodManager.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/PeriodManager.java @@ -24,7 +24,6 @@ import org.codehaus.plexus.logging.Logger; import org.unidal.helper.Threads; import org.unidal.helper.Threads.Task; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.statistic.ServerStatisticManager; @@ -38,13 +37,10 @@ public class PeriodManager implements Task { private boolean m_active; - @Inject private MessageAnalyzerManager m_analyzerManager; - @Inject private ServerStatisticManager m_serverStateManager; - @Inject private Logger m_logger; public PeriodManager(long duration, MessageAnalyzerManager analyzerManager, ServerStatisticManager serverStateManager, @@ -151,4 +147,4 @@ public void run() { public void shutdown() { } } -} \ No newline at end of file +} diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/PlexusMessageAnalyzerFactory.java b/cat-core/src/main/java/com/dianping/cat/analysis/PlexusMessageAnalyzerFactory.java index 5443726eaf..05ad2d707a 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/PlexusMessageAnalyzerFactory.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/PlexusMessageAnalyzerFactory.java @@ -3,9 +3,7 @@ import java.util.Map; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Named; -@Named(type = MessageAnalyzerFactory.class) public class PlexusMessageAnalyzerFactory extends ContainerHolder implements MessageAnalyzerFactory { @Override diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/RealtimeConsumer.java b/cat-core/src/main/java/com/dianping/cat/analysis/RealtimeConsumer.java index dd8197e002..114fc49766 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/RealtimeConsumer.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/RealtimeConsumer.java @@ -27,8 +27,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.helper.Threads; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.message.Message; @@ -36,7 +34,6 @@ import com.dianping.cat.message.spi.MessageTree; import com.dianping.cat.statistic.ServerStatisticManager; -@Named(type = MessageConsumer.class) public class RealtimeConsumer extends ContainerHolder implements MessageConsumer, Initializable, LogEnabled { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(RealtimeConsumer.class); @@ -44,10 +41,8 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer public static final long HOUR = 60 * MINUTE; - @Inject private MessageAnalyzerManager m_analyzerManager; - @Inject private ServerStatisticManager m_serverStateManager; private PeriodManager m_periodManager; diff --git a/cat-core/src/main/java/com/dianping/cat/analysis/TcpSocketReceiver.java b/cat-core/src/main/java/com/dianping/cat/analysis/TcpSocketReceiver.java index 3a82caa65b..9226b23bd0 100644 --- a/cat-core/src/main/java/com/dianping/cat/analysis/TcpSocketReceiver.java +++ b/cat-core/src/main/java/com/dianping/cat/analysis/TcpSocketReceiver.java @@ -23,8 +23,6 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.CatConstants; import com.dianping.cat.config.server.ServerConfigManager; @@ -49,17 +47,13 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.ByteToMessageDecoder; -@Named(type = TcpSocketReceiver.class) public final class TcpSocketReceiver implements LogEnabled { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(TcpSocketReceiver.class); - @Inject protected ServerConfigManager m_serverConfigManager; - @Inject private MessageHandler m_handler; - @Inject private ServerStatisticManager m_serverStateManager; private ChannelFuture m_future; diff --git a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index e3fc8efd76..22faf82688 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -29,6 +29,10 @@ import com.dianping.cat.CatCoreModule; import com.dianping.cat.analysis.DefaultMessageAnalyzerManager; import com.dianping.cat.analysis.DefaultMessageHandler; +import com.dianping.cat.analysis.MessageConsumer; +import com.dianping.cat.analysis.MessageAnalyzerFactory; +import com.dianping.cat.analysis.MessageAnalyzerManager; +import com.dianping.cat.analysis.MessageHandler; import com.dianping.cat.analysis.PlexusMessageAnalyzerFactory; import com.dianping.cat.analysis.RealtimeConsumer; import com.dianping.cat.analysis.TcpSocketReceiver; @@ -72,9 +76,13 @@ public static void main(String[] args) { public List defineComponents() { List all = new ArrayList(); - all.add(A(RealtimeConsumer.class)); + all.add(C(MessageConsumer.class, RealtimeConsumer.class) // + .req(MessageAnalyzerManager.class, (String) null, "m_analyzerManager") // + .req(ServerStatisticManager.class, (String) null, "m_serverStateManager")); - all.add(A(ServerConfigManager.class)); + all.add(C(ServerConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); all.add(C(HostinfoService.class) // .req(HostinfoRepository.class, (String) null, "m_hostinfoDao") // .req(ServerConfigManager.class, (String) null, "m_manager")); @@ -91,12 +99,18 @@ public List defineComponents() { all.add(C(PathBuilder.class, DefaultPathBuilder.class)); - all.add(A(PlexusMessageAnalyzerFactory.class)); - all.add(A(DefaultMessageAnalyzerManager.class)); + all.add(C(MessageAnalyzerFactory.class, PlexusMessageAnalyzerFactory.class)); + all.add(C(MessageAnalyzerManager.class, DefaultMessageAnalyzerManager.class) // + .req(MessageAnalyzerFactory.class, (String) null, "m_analyzerFactory") // + .req(ServerConfigManager.class, (String) null, "m_configManager")); - all.add(A(TcpSocketReceiver.class)); + all.add(C(TcpSocketReceiver.class) // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager") // + .req(MessageHandler.class, (String) null, "m_handler") // + .req(ServerStatisticManager.class, (String) null, "m_serverStateManager")); - all.add(A(DefaultMessageHandler.class)); + all.add(C(MessageHandler.class, DefaultMessageHandler.class) // + .req(MessageConsumer.class, (String) null, "m_consumer")); all.add(C(SampleConfigManager.class) // .req(ConfigRepository.class, (String) null, "m_configDao") // diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java index d57fc4768e..0727c58086 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java @@ -39,8 +39,6 @@ import org.unidal.helper.Files; import org.unidal.helper.Splitters; import org.unidal.helper.Threads; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; import org.xml.sax.SAXException; @@ -63,7 +61,6 @@ import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; -@Named public class ServerConfigManager implements LogEnabled, Initializable { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(ServerConfigManager.class); @@ -91,10 +88,8 @@ public class ServerConfigManager implements LogEnabled, Initializable { public ExecutorService m_threadPool; - @Inject protected ConfigRepository m_configDao; - @Inject protected ContentFetcher m_fetcher; private int m_configId; diff --git a/cat-core/src/main/resources/META-INF/plexus/components.xml b/cat-core/src/main/resources/META-INF/plexus/components.xml index 2a641131d4..3e7a5c0b2e 100644 --- a/cat-core/src/main/resources/META-INF/plexus/components.xml +++ b/cat-core/src/main/resources/META-INF/plexus/components.xml @@ -7,9 +7,11 @@ com.dianping.cat.analysis.MessageAnalyzerManager + m_analyzerManager com.dianping.cat.statistic.ServerStatisticManager + m_serverStateManager @@ -19,9 +21,11 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher @@ -97,6 +101,11 @@ com.dianping.cat.analysis.MessageAnalyzerFactory + m_analyzerFactory + + + com.dianping.cat.config.server.ServerConfigManager + m_configManager @@ -106,12 +115,15 @@ com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager com.dianping.cat.analysis.MessageHandler + m_handler com.dianping.cat.statistic.ServerStatisticManager + m_serverStateManager @@ -121,6 +133,7 @@ com.dianping.cat.analysis.MessageConsumer + m_consumer From b0e38ff18bc5b9c5eee0c6d7a9709abb97a8544f Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 06:06:12 +0800 Subject: [PATCH 081/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=20consumer?= =?UTF-8?q?=20=E5=AE=9E=E6=97=B6=20Analyzer=20=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../build/ComponentsConfigurator.java | 67 +++++++++++++++---- .../consumer/business/BusinessAnalyzer.java | 5 -- .../cat/consumer/cross/CrossAnalyzer.java | 5 -- .../dependency/DependencyAnalyzer.java | 6 -- .../cat/consumer/dump/DumpAnalyzer.java | 6 -- .../cat/consumer/event/EventAnalyzer.java | 5 -- .../consumer/heartbeat/HeartbeatAnalyzer.java | 5 -- .../cat/consumer/matrix/MatrixAnalyzer.java | 4 -- .../cat/consumer/problem/ProblemAnalyzer.java | 5 -- .../cat/consumer/state/StateAnalyzer.java | 7 -- .../cat/consumer/storage/StorageAnalyzer.java | 6 -- .../cat/consumer/top/TopAnalyzer.java | 7 +- .../transaction/TransactionAnalyzer.java | 7 -- .../resources/META-INF/plexus/components.xml | 29 ++++++++ 14 files changed, 85 insertions(+), 79 deletions(-) diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java index 6024916c46..438d973cfc 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java @@ -28,8 +28,10 @@ import com.dianping.cat.analysis.MessageAnalyzer; import com.dianping.cat.config.AtomicMessageConfigManager; +import com.dianping.cat.config.business.BusinessConfigManager; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; import com.dianping.cat.consumer.CatConsumerModule; import com.dianping.cat.consumer.DatabaseParser; @@ -80,6 +82,8 @@ import com.dianping.cat.report.ReportManager; import com.dianping.cat.service.ProjectService; import com.dianping.cat.statistic.ServerStatisticManager; +import org.unidal.cat.message.storage.MessageDumperManager; +import org.unidal.cat.message.storage.MessageFinderManager; public class ComponentsConfigurator extends AbstractResourceConfigurator { public static void main(String[] args) { @@ -123,7 +127,10 @@ private Collection defineCrossComponents() { final List all = new ArrayList(); final String ID = CrossAnalyzer.ID; - all.add(A(CrossAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); + all.add(C(MessageAnalyzer.class, ID, CrossAnalyzer.class).is(PER_LOOKUP) // + .req(ReportManager.class, ID, "m_reportManager") // + .req(IpConvertManager.class, (String) null, "m_ipConvertManager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(CrossDelegate.class)); all.add(C(IpConvertManager.class)); @@ -139,7 +146,11 @@ private Collection defineDependencyComponents() { final List all = new ArrayList(); final String ID = DependencyAnalyzer.ID; - all.add(A(DependencyAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); + all.add(C(MessageAnalyzer.class, ID, DependencyAnalyzer.class).is(PER_LOOKUP) // + .req(ReportManager.class, ID, "m_reportManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_serverFilterConfigManager") // + .req(DatabaseParser.class, (String) null, "m_parser") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(DependencyDelegate.class)); all.add(C(DatabaseParser.class)); @@ -153,7 +164,11 @@ private Collection defineDependencyComponents() { private Collection defineDumpComponents() { final List all = new ArrayList(); - all.add(A(DumpAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); + all.add(C(MessageAnalyzer.class, DumpAnalyzer.ID, DumpAnalyzer.class).is(PER_LOOKUP) // + .req(ServerStatisticManager.class, (String) null, "m_serverStateManager") // + .req(MessageDumperManager.class, (String) null, "m_dumperManager") // + .req(MessageFinderManager.class, (String) null, "m_finderManager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(C(MessageBucketManager.class, LocalMessageBucketManager.ID, LocalMessageBucketManager.class) // .req(ServerConfigManager.class, PathBuilder.class, ServerStatisticManager.class)); @@ -165,7 +180,10 @@ private Collection defineEventComponents() { final List all = new ArrayList(); final String ID = EventAnalyzer.ID; - all.add(A(EventAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); + all.add(C(MessageAnalyzer.class, ID, EventAnalyzer.class).is(PER_LOOKUP) // + .req(ReportManager.class, ID, "m_reportManager") // + .req(AtomicMessageConfigManager.class, (String) null, "m_atomicMessageConfigManager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(EventDelegate.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // @@ -180,7 +198,10 @@ private Collection defineHeartbeatComponents() { final List all = new ArrayList(); final String ID = HeartbeatAnalyzer.ID; - all.add(A(HeartbeatAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); + all.add(C(MessageAnalyzer.class, ID, HeartbeatAnalyzer.class).is(PER_LOOKUP) // + .req(ReportManager.class, ID, "m_reportManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_serverFilterConfigManager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(HeartbeatDelegate.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // @@ -195,7 +216,9 @@ private Collection defineMatrixComponents() { final List all = new ArrayList(); final String ID = MatrixAnalyzer.ID; - all.add(A(MatrixAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); + all.add(C(MessageAnalyzer.class, ID, MatrixAnalyzer.class).is(PER_LOOKUP) // + .req(ReportManager.class, ID, "m_reportManager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(MatrixDelegate.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // @@ -210,7 +233,10 @@ private Collection defineBusinessComponents() { final List all = new ArrayList(); final String ID = BusinessAnalyzer.ID; - all.add(A(BusinessAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); + all.add(C(MessageAnalyzer.class, ID, BusinessAnalyzer.class).is(PER_LOOKUP) // + .req(ReportManager.class, ID, "m_reportManager") // + .req(BusinessConfigManager.class, (String) null, "m_configManager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(BusinessDelegate.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // @@ -232,7 +258,7 @@ private Collection defineProblemComponents() { .req(ServerConfigManager.class)); all.add(C(MessageAnalyzer.class, ID, ProblemAnalyzer.class).is(PER_LOOKUP) // - .req(ReportManager.class, ID) + .req(ReportManager.class, ID, "m_reportManager") .req(ServerConfigManager.class, (String) null, "m_serverConfigManager") .req(ProblemHandler.class, // new String[] { DefaultProblemHandler.ID, LongExecutionProblemHandler.ID }, "m_handlers")); @@ -250,7 +276,12 @@ private Collection defineStateComponents() { final List all = new ArrayList(); final String ID = StateAnalyzer.ID; - all.add(A(StateAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); + all.add(C(MessageAnalyzer.class, ID, StateAnalyzer.class).is(PER_LOOKUP) // + .req(ReportManager.class, ID, "m_reportManager") // + .req(ServerStatisticManager.class, (String) null, "m_serverStateManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_serverFilterConfigManager") // + .req(ProjectService.class, (String) null, "m_projectService") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(StateDelegate.class)); all.add(C(ProjectService.class) // @@ -268,7 +299,10 @@ private Collection defineTopComponents() { final List all = new ArrayList(); final String ID = TopAnalyzer.ID; - all.add(A(TopAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager") + all.add(C(MessageAnalyzer.class, ID, TopAnalyzer.class).is(PER_LOOKUP) // + .req(ReportManager.class, ID, "m_reportManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_serverFilterConfigManager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager") .config(E("errorType").value("Error,RuntimeException,Exception"))); all.add(A(TopDelegate.class)); @@ -284,7 +318,12 @@ private Collection defineTransactionComponents() { final List all = new ArrayList(); final String ID = TransactionAnalyzer.ID; - all.add(A(TransactionAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); + all.add(C(MessageAnalyzer.class, ID, TransactionAnalyzer.class).is(PER_LOOKUP) // + .req(ReportManager.class, ID, "m_reportManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_filterConfigManager") // + .req(TpValueStatisticConfigManager.class, (String) null, "m_statisticManager") // + .req(AtomicMessageConfigManager.class, (String) null, "m_atomicMessageConfigManager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(TransactionDelegate.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // @@ -305,7 +344,11 @@ private Collection defineStorageComponents() { all.add(A(StorageCacheBuilder.class)); all.add(A(StorageRPCBuilder.class)); - all.add(A(StorageAnalyzer.class).req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); + all.add(C(MessageAnalyzer.class, ID, StorageAnalyzer.class).is(PER_LOOKUP) // + .req(ReportManager.class, ID, "m_reportManager") // + .req(DatabaseParser.class, (String) null, "m_databaseParser") // + .req(StorageReportUpdater.class, (String) null, "m_updater") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(A(StorageDelegate.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/BusinessAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/BusinessAnalyzer.java index 0668d20a58..d06c90e550 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/BusinessAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/BusinessAnalyzer.java @@ -22,8 +22,6 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.analysis.AbstractMessageAnalyzer; import com.dianping.cat.analysis.MessageAnalyzer; @@ -38,15 +36,12 @@ import com.dianping.cat.report.DefaultReportManager.StoragePolicy; import com.dianping.cat.report.ReportManager; -@Named(type = MessageAnalyzer.class, value = BusinessAnalyzer.ID, instantiationStrategy = Named.PER_LOOKUP) public class BusinessAnalyzer extends AbstractMessageAnalyzer implements LogEnabled { public static final String ID = "business"; - @Inject(ID) private ReportManager m_reportManager; - @Inject private BusinessConfigManager m_configManager; @Override diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossAnalyzer.java index 86cbc85a49..74ea2c9447 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossAnalyzer.java @@ -30,22 +30,17 @@ import com.dianping.cat.report.ReportManager; import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.lookup.util.StringUtils; import java.util.List; -@Named(type = MessageAnalyzer.class, value = CrossAnalyzer.ID, instantiationStrategy = Named.PER_LOOKUP) public class CrossAnalyzer extends AbstractMessageAnalyzer implements LogEnabled { public static final String ID = "cross"; public static final String DEFAULT = "unknown"; - @Inject(ID) protected ReportManager m_reportManager; - @Inject protected IpConvertManager m_ipConvertManager; private int m_discardLogs = 0; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/DependencyAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/DependencyAnalyzer.java index 0aa364d4f4..8e94f7ce84 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/DependencyAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/DependencyAnalyzer.java @@ -35,25 +35,19 @@ import com.dianping.cat.report.ReportManager; import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; -@Named(type = MessageAnalyzer.class, value = DependencyAnalyzer.ID, instantiationStrategy = Named.PER_LOOKUP) public class DependencyAnalyzer extends AbstractMessageAnalyzer implements LogEnabled { public static final String ID = "dependency"; - @Inject(ID) private ReportManager m_reportManager; - @Inject private ServerFilterConfigManager m_serverFilterConfigManager; - @Inject private DatabaseParser m_parser; private Set m_types = new HashSet( diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dump/DumpAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dump/DumpAnalyzer.java index 8ad40e945f..0bdba0c853 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/dump/DumpAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dump/DumpAnalyzer.java @@ -32,22 +32,16 @@ import org.unidal.cat.message.storage.MessageDumperManager; import org.unidal.cat.message.storage.MessageFinderManager; import org.unidal.helper.Threads; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.concurrent.TimeUnit; -@Named(type = MessageAnalyzer.class, value = DumpAnalyzer.ID, instantiationStrategy = Named.PER_LOOKUP) public class DumpAnalyzer extends AbstractMessageAnalyzer implements LogEnabled { public static final String ID = "dump"; - @Inject private ServerStatisticManager m_serverStateManager; - @Inject private MessageDumperManager m_dumperManager; - @Inject private MessageFinderManager m_finderManager; private Logger m_logger; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/EventAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/EventAnalyzer.java index a153118047..c7c8fd5d1e 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/EventAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/EventAnalyzer.java @@ -33,21 +33,16 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; import org.unidal.helper.Threads; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.List; import java.util.Set; -@Named(type = MessageAnalyzer.class, value = EventAnalyzer.ID, instantiationStrategy = Named.PER_LOOKUP) public class EventAnalyzer extends AbstractMessageAnalyzer implements LogEnabled { public static final String ID = "event"; - @Inject(ID) private ReportManager m_reportManager; - @Inject private AtomicMessageConfigManager m_atomicMessageConfigManager; private final EventTpsStatisticsComputer m_computer = new EventTpsStatisticsComputer(); diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzer.java index 35bcd4191f..290bbd3eea 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzer.java @@ -33,21 +33,16 @@ import com.dianping.cat.status.model.entity.*; import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.List; import java.util.Map; import java.util.Map.Entry; -@Named(type = MessageAnalyzer.class, value = HeartbeatAnalyzer.ID, instantiationStrategy = Named.PER_LOOKUP) public class HeartbeatAnalyzer extends AbstractMessageAnalyzer implements LogEnabled { public static final String ID = "heartbeat"; - @Inject(ID) private ReportManager m_reportManager; - @Inject private ServerFilterConfigManager m_serverFilterConfigManager; private Period buildHeartBeatInfo(Machine machine, Heartbeat heartbeat, long timestamp) { diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/MatrixAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/MatrixAnalyzer.java index 3fe35ae5b3..16fd6e2ceb 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/MatrixAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/MatrixAnalyzer.java @@ -30,19 +30,15 @@ import com.dianping.cat.report.ReportManager; import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; -@Named(type = MessageAnalyzer.class, value = MatrixAnalyzer.ID, instantiationStrategy = Named.PER_LOOKUP) public class MatrixAnalyzer extends AbstractMessageAnalyzer implements LogEnabled { public static final String ID = "matrix"; - @Inject(ID) private ReportManager m_reportManager; @Override diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemAnalyzer.java index cb20b650a3..815e98a893 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemAnalyzer.java @@ -29,21 +29,16 @@ import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.ArrayList; import java.util.List; import java.util.Set; -@Named(type = MessageAnalyzer.class, value = ProblemAnalyzer.ID, instantiationStrategy = Named.PER_LOOKUP) public class ProblemAnalyzer extends AbstractMessageAnalyzer implements LogEnabled, Initializable { public static final String ID = "problem"; - @Inject(ID) private ReportManager m_reportManager; - @Inject private List m_handlers; @Override diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateAnalyzer.java index 30603a7bcf..a569a68305 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateAnalyzer.java @@ -34,8 +34,6 @@ import com.dianping.cat.statistic.ServerStatisticManager; import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.Date; import java.util.List; @@ -43,20 +41,15 @@ import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicLong; -@Named(type = MessageAnalyzer.class, value = StateAnalyzer.ID, instantiationStrategy = Named.PER_LOOKUP) public class StateAnalyzer extends AbstractMessageAnalyzer implements LogEnabled { public static final String ID = "state"; - @Inject(ID) private ReportManager m_reportManager; - @Inject private ServerStatisticManager m_serverStateManager; - @Inject private ServerFilterConfigManager m_serverFilterConfigManager; - @Inject private ProjectService m_projectService; private String m_ip = NetworkInterfaceManager.INSTANCE.getLocalHostAddress(); diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageAnalyzer.java index 73862a00f2..6c50fdf238 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageAnalyzer.java @@ -26,8 +26,6 @@ import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.unidal.lookup.util.StringUtils; import com.dianping.cat.analysis.AbstractMessageAnalyzer; @@ -42,18 +40,14 @@ import com.dianping.cat.report.DefaultReportManager.StoragePolicy; import com.dianping.cat.report.ReportManager; -@Named(type = MessageAnalyzer.class, value = StorageAnalyzer.ID, instantiationStrategy = Named.PER_LOOKUP) public class StorageAnalyzer extends AbstractMessageAnalyzer implements LogEnabled, Initializable { public static final String ID = "storage"; - @Inject(ID) private ReportManager m_reportManager; - @Inject private DatabaseParser m_databaseParser; - @Inject private StorageReportUpdater m_updater; private Map m_storageBuilders; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/TopAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/TopAnalyzer.java index 375fef450c..e53e5c6b68 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/TopAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/TopAnalyzer.java @@ -25,8 +25,6 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; import org.unidal.helper.Splitters; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Constants; import com.dianping.cat.analysis.AbstractMessageAnalyzer; @@ -39,14 +37,11 @@ import com.dianping.cat.report.DefaultReportManager.StoragePolicy; import com.dianping.cat.report.ReportManager; -@Named(type = MessageAnalyzer.class, value = TopAnalyzer.ID, instantiationStrategy = Named.PER_LOOKUP) public class TopAnalyzer extends AbstractMessageAnalyzer implements LogEnabled { public static final String ID = "top"; - @Inject(ID) private ReportManager m_reportManager; - @Inject private ServerFilterConfigManager m_serverFilterConfigManager; private Set m_errorTypes; @@ -125,4 +120,4 @@ private void processEvent(TopReport report, MessageTree tree, Event event) { public void setErrorType(String type) { m_errorTypes = new HashSet(Splitters.by(',').noEmptyItem().split(type)); } -} \ No newline at end of file +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/TransactionAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/TransactionAnalyzer.java index ba474f77c0..6c9244b68d 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/TransactionAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/TransactionAnalyzer.java @@ -27,8 +27,6 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; import org.unidal.helper.Threads; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.CatConstants; @@ -54,23 +52,18 @@ import com.dianping.cat.report.DefaultReportManager.StoragePolicy; import com.dianping.cat.report.ReportManager; -@Named(type = MessageAnalyzer.class, value = TransactionAnalyzer.ID, instantiationStrategy = Named.PER_LOOKUP) public class TransactionAnalyzer extends AbstractMessageAnalyzer implements LogEnabled { public static final String ID = "transaction"; private static final int m_statusCodeCountLimit = 100; - @Inject(ID) private ReportManager m_reportManager; - @Inject private ServerFilterConfigManager m_filterConfigManager; - @Inject private TpValueStatisticConfigManager m_statisticManager; - @Inject private AtomicMessageConfigManager m_atomicMessageConfigManager; private final TransactionStatisticsComputer m_computer = new TransactionStatisticsComputer(); diff --git a/cat-consumer/src/main/resources/META-INF/plexus/components.xml b/cat-consumer/src/main/resources/META-INF/plexus/components.xml index 9331ca95a5..d5334d4ce0 100644 --- a/cat-consumer/src/main/resources/META-INF/plexus/components.xml +++ b/cat-consumer/src/main/resources/META-INF/plexus/components.xml @@ -10,15 +10,19 @@ com.dianping.cat.report.ReportManager transaction + m_reportManager com.dianping.cat.config.server.ServerFilterConfigManager + m_filterConfigManager com.dianping.cat.config.transaction.TpValueStatisticConfigManager + m_statisticManager com.dianping.cat.config.AtomicMessageConfigManager + m_atomicMessageConfigManager com.dianping.cat.config.server.ServerConfigManager @@ -84,9 +88,11 @@ com.dianping.cat.report.ReportManager event + m_reportManager com.dianping.cat.config.AtomicMessageConfigManager + m_atomicMessageConfigManager com.dianping.cat.config.server.ServerConfigManager @@ -175,6 +181,7 @@ com.dianping.cat.report.ReportManager problem + m_reportManager com.dianping.cat.config.server.ServerConfigManager @@ -239,9 +246,11 @@ com.dianping.cat.report.ReportManager heartbeat + m_reportManager com.dianping.cat.config.server.ServerFilterConfigManager + m_serverFilterConfigManager com.dianping.cat.config.server.ServerConfigManager @@ -301,9 +310,11 @@ com.dianping.cat.report.ReportManager top + m_reportManager com.dianping.cat.config.server.ServerFilterConfigManager + m_serverFilterConfigManager com.dianping.cat.config.server.ServerConfigManager @@ -351,12 +362,15 @@ com.dianping.cat.statistic.ServerStatisticManager + m_serverStateManager org.unidal.cat.message.storage.MessageDumperManager + m_dumperManager org.unidal.cat.message.storage.MessageFinderManager + m_finderManager com.dianping.cat.config.server.ServerConfigManager @@ -389,15 +403,19 @@ com.dianping.cat.report.ReportManager state + m_reportManager com.dianping.cat.statistic.ServerStatisticManager + m_serverStateManager com.dianping.cat.config.server.ServerFilterConfigManager + m_serverFilterConfigManager com.dianping.cat.service.ProjectService + m_projectService com.dianping.cat.config.server.ServerConfigManager @@ -468,9 +486,11 @@ com.dianping.cat.report.ReportManager cross + m_reportManager com.dianping.cat.consumer.cross.IpConvertManager + m_ipConvertManager com.dianping.cat.config.server.ServerConfigManager @@ -531,6 +551,7 @@ com.dianping.cat.report.ReportManager matrix + m_reportManager com.dianping.cat.config.server.ServerConfigManager @@ -587,12 +608,15 @@ com.dianping.cat.report.ReportManager dependency + m_reportManager com.dianping.cat.config.server.ServerFilterConfigManager + m_serverFilterConfigManager com.dianping.cat.consumer.DatabaseParser + m_parser com.dianping.cat.config.server.ServerConfigManager @@ -678,12 +702,15 @@ com.dianping.cat.report.ReportManager storage + m_reportManager com.dianping.cat.consumer.DatabaseParser + m_databaseParser com.dianping.cat.consumer.storage.StorageReportUpdater + m_updater com.dianping.cat.config.server.ServerConfigManager @@ -743,9 +770,11 @@ com.dianping.cat.report.ReportManager business + m_reportManager com.dianping.cat.config.business.BusinessConfigManager + m_configManager com.dianping.cat.config.server.ServerConfigManager From 8d23b8572b9fe9be227be4285dd2d9ebf150fdca Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 06:15:03 +0800 Subject: [PATCH 082/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=20consumer?= =?UTF-8?q?=20ReportDelegate=20=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../build/ComponentsConfigurator.java | 48 ++++++++++++++----- .../consumer/business/BusinessDelegate.java | 5 -- .../cat/consumer/cross/CrossDelegate.java | 5 -- .../dependency/DependencyDelegate.java | 4 -- .../cat/consumer/event/EventDelegate.java | 8 ---- .../consumer/heartbeat/HeartbeatDelegate.java | 5 -- .../cat/consumer/matrix/MatrixDelegate.java | 6 --- .../cat/consumer/problem/ProblemDelegate.java | 5 -- .../cat/consumer/state/StateDelegate.java | 5 -- .../cat/consumer/storage/StorageDelegate.java | 6 --- .../cat/consumer/top/TopDelegate.java | 2 - .../transaction/TransactionDelegate.java | 8 ---- .../resources/META-INF/plexus/components.xml | 25 ++++++++++ 13 files changed, 62 insertions(+), 70 deletions(-) diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java index 438d973cfc..af2a5520d4 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java @@ -82,6 +82,7 @@ import com.dianping.cat.report.ReportManager; import com.dianping.cat.service.ProjectService; import com.dianping.cat.statistic.ServerStatisticManager; +import com.dianping.cat.task.TaskManager; import org.unidal.cat.message.storage.MessageDumperManager; import org.unidal.cat.message.storage.MessageFinderManager; @@ -131,7 +132,9 @@ private Collection defineCrossComponents() { .req(ReportManager.class, ID, "m_reportManager") // .req(IpConvertManager.class, (String) null, "m_ipConvertManager") // .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); - all.add(A(CrossDelegate.class)); + all.add(C(ReportDelegate.class, ID, CrossDelegate.class) // + .req(TaskManager.class, (String) null, "m_taskManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_serverFilterConfigManager")); all.add(C(IpConvertManager.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // @@ -151,7 +154,8 @@ private Collection defineDependencyComponents() { .req(ServerFilterConfigManager.class, (String) null, "m_serverFilterConfigManager") // .req(DatabaseParser.class, (String) null, "m_parser") // .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); - all.add(A(DependencyDelegate.class)); + all.add(C(ReportDelegate.class, ID, DependencyDelegate.class) // + .req(TaskManager.class, (String) null, "m_taskManager")); all.add(C(DatabaseParser.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // @@ -184,7 +188,12 @@ private Collection defineEventComponents() { .req(ReportManager.class, ID, "m_reportManager") // .req(AtomicMessageConfigManager.class, (String) null, "m_atomicMessageConfigManager") // .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); - all.add(A(EventDelegate.class)); + all.add(C(ReportDelegate.class, ID, EventDelegate.class) // + .req(TaskManager.class, (String) null, "m_taskManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_configManager") // + .req(AllReportConfigManager.class, (String) null, "m_allManager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager") // + .req(AtomicMessageConfigManager.class, (String) null, "m_atomicMessageConfigManager")); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // @@ -202,7 +211,9 @@ private Collection defineHeartbeatComponents() { .req(ReportManager.class, ID, "m_reportManager") // .req(ServerFilterConfigManager.class, (String) null, "m_serverFilterConfigManager") // .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); - all.add(A(HeartbeatDelegate.class)); + all.add(C(ReportDelegate.class, ID, HeartbeatDelegate.class) // + .req(TaskManager.class, (String) null, "m_taskManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_manager")); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // @@ -219,7 +230,9 @@ private Collection defineMatrixComponents() { all.add(C(MessageAnalyzer.class, ID, MatrixAnalyzer.class).is(PER_LOOKUP) // .req(ReportManager.class, ID, "m_reportManager") // .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); - all.add(A(MatrixDelegate.class)); + all.add(C(ReportDelegate.class, ID, MatrixDelegate.class) // + .req(TaskManager.class, (String) null, "m_taskManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_configManager")); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // @@ -237,7 +250,8 @@ private Collection defineBusinessComponents() { .req(ReportManager.class, ID, "m_reportManager") // .req(BusinessConfigManager.class, (String) null, "m_configManager") // .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); - all.add(A(BusinessDelegate.class)); + all.add(C(ReportDelegate.class, ID, BusinessDelegate.class) // + .req(TaskManager.class, (String) null, "m_taskManager")); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // @@ -267,7 +281,9 @@ private Collection defineProblemComponents() { .req(ReportBucketManager.class, HourlyReportRepository.class, HourlyReportContentRepository.class, DomainValidator.class) // .config(E("name").value(ID))); - all.add(A(ProblemDelegate.class)); + all.add(C(ReportDelegate.class, ID, ProblemDelegate.class) // + .req(TaskManager.class, (String) null, "m_taskManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_configManager")); return all; } @@ -282,7 +298,9 @@ private Collection defineStateComponents() { .req(ServerFilterConfigManager.class, (String) null, "m_serverFilterConfigManager") // .req(ProjectService.class, (String) null, "m_projectService") // .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); - all.add(A(StateDelegate.class)); + all.add(C(ReportDelegate.class, ID, StateDelegate.class) // + .req(TaskManager.class, (String) null, "m_taskManager") // + .req(ReportBucketManager.class, (String) null, "m_bucketManager")); all.add(C(ProjectService.class) // .req(ProjectRepository.class, (String) null, "m_projectDao") // @@ -304,7 +322,7 @@ private Collection defineTopComponents() { .req(ServerFilterConfigManager.class, (String) null, "m_serverFilterConfigManager") // .req(ServerConfigManager.class, (String) null, "m_serverConfigManager") .config(E("errorType").value("Error,RuntimeException,Exception"))); - all.add(A(TopDelegate.class)); + all.add(C(ReportDelegate.class, ID, TopDelegate.class)); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // @@ -324,7 +342,12 @@ private Collection defineTransactionComponents() { .req(TpValueStatisticConfigManager.class, (String) null, "m_statisticManager") // .req(AtomicMessageConfigManager.class, (String) null, "m_atomicMessageConfigManager") // .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); - all.add(A(TransactionDelegate.class)); + all.add(C(ReportDelegate.class, ID, TransactionDelegate.class) // + .req(TaskManager.class, (String) null, "m_taskManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_configManager") // + .req(AllReportConfigManager.class, (String) null, "m_transactionManager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager") // + .req(AtomicMessageConfigManager.class, (String) null, "m_atomicMessageConfigManager")); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // @@ -349,7 +372,10 @@ private Collection defineStorageComponents() { .req(DatabaseParser.class, (String) null, "m_databaseParser") // .req(StorageReportUpdater.class, (String) null, "m_updater") // .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); - all.add(A(StorageDelegate.class)); + all.add(C(ReportDelegate.class, ID, StorageDelegate.class) // + .req(TaskManager.class, (String) null, "m_taskManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_configManager") // + .req(StorageReportUpdater.class, (String) null, "m_reportUpdater")); all.add(C(ReportManager.class, ID, DefaultReportManager.class).is(PER_LOOKUP) // .req(ReportDelegate.class, ID) // diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/BusinessDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/BusinessDelegate.java index eab9f543c8..7a7e27e421 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/BusinessDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/BusinessDelegate.java @@ -21,9 +21,6 @@ import java.util.Date; import java.util.Map; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.consumer.business.model.entity.BusinessReport; import com.dianping.cat.consumer.business.model.transform.DefaultNativeBuilder; import com.dianping.cat.consumer.business.model.transform.DefaultNativeParser; @@ -33,10 +30,8 @@ import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; -@Named(type = ReportDelegate.class, value = BusinessAnalyzer.ID) public class BusinessDelegate implements ReportDelegate { - @Inject private TaskManager m_taskManager; @Override diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossDelegate.java index 2bf7d559f2..cdd0e5b945 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossDelegate.java @@ -27,19 +27,14 @@ import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.Date; import java.util.Map; -@Named(type = ReportDelegate.class, value = CrossAnalyzer.ID) public class CrossDelegate implements ReportDelegate { - @Inject private TaskManager m_taskManager; - @Inject private ServerFilterConfigManager m_serverFilterConfigManager; @Override diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/DependencyDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/DependencyDelegate.java index ec18ffbfad..719b3501a5 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/DependencyDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/DependencyDelegate.java @@ -27,16 +27,12 @@ import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.Date; import java.util.Map; -@Named(type = ReportDelegate.class, value = DependencyAnalyzer.ID) public class DependencyDelegate implements ReportDelegate { - @Inject private TaskManager m_taskManager; @Override diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/EventDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/EventDelegate.java index 6f536cab83..1d00b340d8 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/EventDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/EventDelegate.java @@ -32,28 +32,20 @@ import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.Date; import java.util.Map; -@Named(type = ReportDelegate.class, value = EventAnalyzer.ID) public class EventDelegate implements ReportDelegate { - @Inject private TaskManager m_taskManager; - @Inject private ServerFilterConfigManager m_configManager; - @Inject private AllReportConfigManager m_allManager; - @Inject private ServerConfigManager m_serverConfigManager; - @Inject private AtomicMessageConfigManager m_atomicMessageConfigManager; private final EventTpsStatisticsComputer m_computer = new EventTpsStatisticsComputer(); diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatDelegate.java index b61a6731a8..3d4e34840c 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatDelegate.java @@ -27,19 +27,14 @@ import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.Date; import java.util.Map; -@Named(type = ReportDelegate.class, value = HeartbeatAnalyzer.ID) public class HeartbeatDelegate implements ReportDelegate { - @Inject private TaskManager m_taskManager; - @Inject private ServerFilterConfigManager m_manager; @Override diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/MatrixDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/MatrixDelegate.java index b6befaef85..17ee82efa2 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/MatrixDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/MatrixDelegate.java @@ -21,9 +21,6 @@ import java.util.Date; import java.util.Map; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; import com.dianping.cat.consumer.matrix.model.transform.DefaultNativeBuilder; @@ -34,13 +31,10 @@ import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; -@Named(type = ReportDelegate.class, value = MatrixAnalyzer.ID) public class MatrixDelegate implements ReportDelegate { - @Inject private TaskManager m_taskManager; - @Inject private ServerFilterConfigManager m_configManager; @Override diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemDelegate.java index a5882d60c6..cb61e3278f 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/ProblemDelegate.java @@ -28,20 +28,15 @@ import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.Date; import java.util.Map; import java.util.Map.Entry; -@Named(type = ReportDelegate.class, value = ProblemAnalyzer.ID) public class ProblemDelegate implements ReportDelegate { - @Inject private TaskManager m_taskManager; - @Inject private ServerFilterConfigManager m_configManager; @Override diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateDelegate.java index be04809199..222b255198 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/StateDelegate.java @@ -28,20 +28,15 @@ import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.Calendar; import java.util.Date; import java.util.Map; -@Named(type = ReportDelegate.class, value = StateAnalyzer.ID) public class StateDelegate implements ReportDelegate { - @Inject private TaskManager m_taskManager; - @Inject private ReportBucketManager m_bucketManager; @Override diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageDelegate.java index 0e52ab2928..d7fdaccfcb 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageDelegate.java @@ -27,25 +27,19 @@ import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; import java.util.Map; -@Named(type = ReportDelegate.class, value = StorageAnalyzer.ID) public class StorageDelegate implements ReportDelegate { private static final Logger LOGGER = LoggerFactory.getLogger(StorageDelegate.class); - @Inject private TaskManager m_taskManager; - @Inject private ServerFilterConfigManager m_configManager; - @Inject private StorageReportUpdater m_reportUpdater; @Override diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/TopDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/TopDelegate.java index 5941f08ad6..4da47d94d4 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/TopDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/TopDelegate.java @@ -23,12 +23,10 @@ import com.dianping.cat.consumer.top.model.transform.DefaultNativeParser; import com.dianping.cat.consumer.top.model.transform.DefaultSaxParser; import com.dianping.cat.report.ReportDelegate; -import org.unidal.lookup.annotation.Named; import java.util.Date; import java.util.Map; -@Named(type = ReportDelegate.class, value = TopAnalyzer.ID) public class TopDelegate implements ReportDelegate { @Override diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/TransactionDelegate.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/TransactionDelegate.java index 9e39f2583e..7605dac805 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/TransactionDelegate.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/TransactionDelegate.java @@ -31,28 +31,20 @@ import com.dianping.cat.spring.CatSpringContext; import com.dianping.cat.task.TaskManager; import com.dianping.cat.task.TaskManager.TaskProlicy; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import java.util.Date; import java.util.Map; -@Named(type = ReportDelegate.class, value = TransactionAnalyzer.ID) public class TransactionDelegate implements ReportDelegate { - @Inject private TaskManager m_taskManager; - @Inject private ServerFilterConfigManager m_configManager; - @Inject private AllReportConfigManager m_transactionManager; - @Inject private ServerConfigManager m_serverConfigManager; - @Inject private AtomicMessageConfigManager m_atomicMessageConfigManager; private TransactionStatisticsComputer m_computer = new TransactionStatisticsComputer(); diff --git a/cat-consumer/src/main/resources/META-INF/plexus/components.xml b/cat-consumer/src/main/resources/META-INF/plexus/components.xml index d5334d4ce0..8b470b4cb7 100644 --- a/cat-consumer/src/main/resources/META-INF/plexus/components.xml +++ b/cat-consumer/src/main/resources/META-INF/plexus/components.xml @@ -37,18 +37,23 @@ com.dianping.cat.task.TaskManager + m_taskManager com.dianping.cat.config.server.ServerFilterConfigManager + m_configManager com.dianping.cat.consumer.config.AllReportConfigManager + m_transactionManager com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager com.dianping.cat.config.AtomicMessageConfigManager + m_atomicMessageConfigManager @@ -107,18 +112,23 @@ com.dianping.cat.task.TaskManager + m_taskManager com.dianping.cat.config.server.ServerFilterConfigManager + m_configManager com.dianping.cat.consumer.config.AllReportConfigManager + m_allManager com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager com.dianping.cat.config.AtomicMessageConfigManager + m_atomicMessageConfigManager @@ -231,9 +241,11 @@ com.dianping.cat.task.TaskManager + m_taskManager com.dianping.cat.config.server.ServerFilterConfigManager + m_configManager @@ -265,9 +277,11 @@ com.dianping.cat.task.TaskManager + m_taskManager com.dianping.cat.config.server.ServerFilterConfigManager + m_manager @@ -430,9 +444,11 @@ com.dianping.cat.task.TaskManager + m_taskManager com.dianping.cat.report.ReportBucketManager + m_bucketManager @@ -505,9 +521,11 @@ com.dianping.cat.task.TaskManager + m_taskManager com.dianping.cat.config.server.ServerFilterConfigManager + m_serverFilterConfigManager @@ -566,9 +584,11 @@ com.dianping.cat.task.TaskManager + m_taskManager com.dianping.cat.config.server.ServerFilterConfigManager + m_configManager @@ -631,6 +651,7 @@ com.dianping.cat.task.TaskManager + m_taskManager @@ -725,12 +746,15 @@ com.dianping.cat.task.TaskManager + m_taskManager com.dianping.cat.config.server.ServerFilterConfigManager + m_configManager com.dianping.cat.consumer.storage.StorageReportUpdater + m_reportUpdater @@ -789,6 +813,7 @@ com.dianping.cat.task.TaskManager + m_taskManager From 0234f8b2f9dc14112f08f83fcf1fdb214a9e1e0e Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 06:34:14 +0800 Subject: [PATCH 083/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=20consumer?= =?UTF-8?q?=20=E4=B8=8E=20hadoop=20hdfs=20=E7=BB=84=E4=BB=B6=E6=B3=A8?= =?UTF-8?q?=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../build/ComponentsConfigurator.java | 25 ++++++++++------- .../config/AllReportConfigManager.java | 5 ---- .../dump/LocalMessageBucketManager.java | 4 --- .../problem/DefaultProblemHandler.java | 8 +----- .../problem/LongExecutionProblemHandler.java | 2 -- .../storage/StorageReportUpdater.java | 3 --- .../builder/StorageBuilderManager.java | 2 -- .../storage/builder/StorageCacheBuilder.java | 3 --- .../storage/builder/StorageRPCBuilder.java | 3 --- .../storage/builder/StorageSQLBuilder.java | 5 ---- .../resources/META-INF/plexus/components.xml | 12 +++++---- .../hadoop/build/ComponentsConfigurator.java | 27 ++++++++++--------- .../cat/hadoop/hdfs/FileSystemManager.java | 2 -- .../hadoop/hdfs/HdfsMessageBucketManager.java | 4 --- .../bucket/AbstractHdfsMessageBucket.java | 2 -- .../resources/META-INF/plexus/components.xml | 6 +++++ 16 files changed, 43 insertions(+), 70 deletions(-) diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java index af2a5520d4..f62de6f278 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/build/ComponentsConfigurator.java @@ -61,6 +61,7 @@ import com.dianping.cat.consumer.storage.StorageAnalyzer; import com.dianping.cat.consumer.storage.StorageDelegate; import com.dianping.cat.consumer.storage.StorageReportUpdater; +import com.dianping.cat.consumer.storage.builder.StorageBuilder; import com.dianping.cat.consumer.storage.builder.StorageBuilderManager; import com.dianping.cat.consumer.storage.builder.StorageCacheBuilder; import com.dianping.cat.consumer.storage.builder.StorageRPCBuilder; @@ -118,7 +119,9 @@ public List defineComponents() { .req(ConfigRepository.class, (String) null, "m_configDao") // .req(ContentFetcher.class, (String) null, "m_fetcher") // .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); - all.add(A(AllReportConfigManager.class)); + all.add(C(AllReportConfigManager.class) // + .req(ConfigRepository.class, (String) null, "m_configDao") // + .req(ContentFetcher.class, (String) null, "m_fetcher")); all.add(C(Module.class, CatConsumerModule.ID, CatConsumerModule.class)); return all; @@ -175,7 +178,9 @@ private Collection defineDumpComponents() { .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); all.add(C(MessageBucketManager.class, LocalMessageBucketManager.ID, LocalMessageBucketManager.class) // - .req(ServerConfigManager.class, PathBuilder.class, ServerStatisticManager.class)); + .req(ServerConfigManager.class, (String) null, "m_configManager") // + .req(PathBuilder.class, (String) null, "m_pathBuilder") // + .req(ServerStatisticManager.class, (String) null, "m_serverStateManager")); return all; } @@ -265,11 +270,10 @@ private Collection defineProblemComponents() { final String ID = ProblemAnalyzer.ID; all.add(C(ProblemHandler.class, DefaultProblemHandler.ID, DefaultProblemHandler.class)// - .config(E("errorType").value("Error,RuntimeException,Exception"))// - .req(ServerConfigManager.class)); + .config(E("errorType").value("Error,RuntimeException,Exception"))); all.add(C(ProblemHandler.class, LongExecutionProblemHandler.ID, LongExecutionProblemHandler.class) // - .req(ServerConfigManager.class)); + .req(ServerConfigManager.class, (String) null, "m_configManager")); all.add(C(MessageAnalyzer.class, ID, ProblemAnalyzer.class).is(PER_LOOKUP) // .req(ReportManager.class, ID, "m_reportManager") @@ -361,11 +365,12 @@ private Collection defineStorageComponents() { final List all = new ArrayList(); final String ID = StorageAnalyzer.ID; - all.add(A(StorageReportUpdater.class)); - all.add(A(StorageBuilderManager.class)); - all.add(A(StorageSQLBuilder.class)); - all.add(A(StorageCacheBuilder.class)); - all.add(A(StorageRPCBuilder.class)); + all.add(C(StorageReportUpdater.class)); + all.add(C(StorageBuilderManager.class)); + all.add(C(StorageBuilder.class, StorageSQLBuilder.ID, StorageSQLBuilder.class) // + .req(DatabaseParser.class, (String) null, "m_databaseParser")); + all.add(C(StorageBuilder.class, StorageCacheBuilder.ID, StorageCacheBuilder.class)); + all.add(C(StorageBuilder.class, StorageRPCBuilder.ID, StorageRPCBuilder.class)); all.add(C(MessageAnalyzer.class, ID, StorageAnalyzer.class).is(PER_LOOKUP) // .req(ReportManager.class, ID, "m_reportManager") // diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java index f5eda78f5f..319d8e7495 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java @@ -29,8 +29,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.xml.sax.SAXException; import com.dianping.cat.Cat; @@ -47,15 +45,12 @@ import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; -@Named public class AllReportConfigManager implements Initializable, LogEnabled { private static final String CONFIG_NAME = "all-report-config"; - @Inject private ConfigRepository m_configDao; - @Inject private ContentFetcher m_fetcher; private int m_configId; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dump/LocalMessageBucketManager.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dump/LocalMessageBucketManager.java index 612f2feb34..19eedc062d 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/dump/LocalMessageBucketManager.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dump/LocalMessageBucketManager.java @@ -42,7 +42,6 @@ import org.unidal.helper.Threads; import org.unidal.helper.Threads.Task; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; @@ -73,13 +72,10 @@ public class LocalMessageBucketManager extends ContainerHolder protected Logger m_logger; - @Inject private ServerConfigManager m_configManager; - @Inject private ServerStatisticManager m_serverStateManager; - @Inject private PathBuilder m_pathBuilder; private MessageBucketFactory m_bucketFactory; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/DefaultProblemHandler.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/DefaultProblemHandler.java index 296e48c5a6..559070f603 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/DefaultProblemHandler.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/DefaultProblemHandler.java @@ -23,9 +23,7 @@ import java.util.Set; import org.unidal.helper.Splitters; -import org.unidal.lookup.annotation.Inject; -import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.consumer.problem.model.entity.Entity; import com.dianping.cat.consumer.problem.model.entity.Machine; import com.dianping.cat.message.Event; @@ -37,10 +35,6 @@ public class DefaultProblemHandler extends ProblemHandler { public static final String ID = "default-problem"; - @Inject - private ServerConfigManager m_configManager; - - @Inject private Set m_errorTypes; @Override @@ -105,4 +99,4 @@ public void setErrorType(String type) { m_errorTypes = new HashSet(Splitters.by(',').noEmptyItem().split(type)); } -} \ No newline at end of file +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/LongExecutionProblemHandler.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/LongExecutionProblemHandler.java index c5b86f1852..e7bd64cd1c 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/LongExecutionProblemHandler.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/LongExecutionProblemHandler.java @@ -24,7 +24,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.configuration.server.entity.Domain; @@ -37,7 +36,6 @@ public class LongExecutionProblemHandler extends ProblemHandler implements Initializable { public static final String ID = "long-execution"; - @Inject private ServerConfigManager m_configManager; private int[] m_defaultLongServiceDuration = { 50, 100, 500, 1000, 3000, 5000 }; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageReportUpdater.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageReportUpdater.java index dba13c5c01..e81d8d5959 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageReportUpdater.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageReportUpdater.java @@ -20,15 +20,12 @@ import java.util.Set; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.consumer.storage.model.entity.Domain; import com.dianping.cat.consumer.storage.model.entity.Operation; import com.dianping.cat.consumer.storage.model.entity.Segment; import com.dianping.cat.consumer.storage.model.entity.StorageReport; import com.dianping.cat.message.Transaction; -@Named public class StorageReportUpdater { public void updateStorageIds(String id, Set ids, StorageReport report) { diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageBuilderManager.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageBuilderManager.java index 428877b31a..1abb9f8890 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageBuilderManager.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageBuilderManager.java @@ -25,9 +25,7 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Named; -@Named public class StorageBuilderManager extends ContainerHolder implements Initializable { private Map m_storageBuilders; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageCacheBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageCacheBuilder.java index f6d1026980..03ef52a77a 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageCacheBuilder.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageCacheBuilder.java @@ -21,13 +21,10 @@ import java.util.Arrays; import java.util.List; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.message.Event; import com.dianping.cat.message.Message; import com.dianping.cat.message.Transaction; -@Named(type = StorageBuilder.class, value = StorageCacheBuilder.ID) public class StorageCacheBuilder implements StorageBuilder { public final static String ID = "Cache"; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageRPCBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageRPCBuilder.java index b07ffb7f94..4ab2642cba 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageRPCBuilder.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageRPCBuilder.java @@ -21,13 +21,10 @@ import java.util.Arrays; import java.util.List; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.message.Event; import com.dianping.cat.message.Message; import com.dianping.cat.message.Transaction; -@Named(type = StorageBuilder.class, value = StorageRPCBuilder.ID) public class StorageRPCBuilder implements StorageBuilder { public final static String ID = "RPC"; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageSQLBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageSQLBuilder.java index 04fcf63184..1042c1484b 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageSQLBuilder.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/builder/StorageSQLBuilder.java @@ -21,16 +21,12 @@ import java.util.Arrays; import java.util.List; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; - import com.dianping.cat.consumer.DatabaseParser; import com.dianping.cat.consumer.DatabaseParser.Database; import com.dianping.cat.message.Event; import com.dianping.cat.message.Message; import com.dianping.cat.message.Transaction; -@Named(type = StorageBuilder.class, value = StorageSQLBuilder.ID) public class StorageSQLBuilder implements StorageBuilder { public final static String ID = "SQL"; @@ -39,7 +35,6 @@ public class StorageSQLBuilder implements StorageBuilder { public final static List DEFAULT_METHODS = Arrays.asList("select", "delete", "insert", "update"); - @Inject private DatabaseParser m_databaseParser; @Override diff --git a/cat-consumer/src/main/resources/META-INF/plexus/components.xml b/cat-consumer/src/main/resources/META-INF/plexus/components.xml index 8b470b4cb7..2f64b075e7 100644 --- a/cat-consumer/src/main/resources/META-INF/plexus/components.xml +++ b/cat-consumer/src/main/resources/META-INF/plexus/components.xml @@ -166,11 +166,6 @@ Error,RuntimeException,Exception - - - com.dianping.cat.config.server.ServerConfigManager - - com.dianping.cat.consumer.problem.ProblemHandler @@ -179,6 +174,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_configManager @@ -399,12 +395,15 @@ com.dianping.cat.config.server.ServerConfigManager + m_configManager com.dianping.cat.message.PathBuilder + m_pathBuilder com.dianping.cat.statistic.ServerStatisticManager + m_serverStateManager @@ -701,6 +700,7 @@ com.dianping.cat.consumer.DatabaseParser + m_databaseParser @@ -896,9 +896,11 @@ com.dianping.cat.core.config.repository.ConfigRepository + m_configDao com.dianping.cat.config.content.ContentFetcher + m_fetcher diff --git a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java index a9af47c2be..d653d184ef 100644 --- a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java +++ b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java @@ -80,22 +80,23 @@ public List defineLastStorage() { List all = new ArrayList(); - all.add(C(FileSystemManager.class) // - .req(ServerConfigManager.class)); + all.add(C(FileSystemManager.class) // + .req(ServerConfigManager.class, (String) null, "m_configManager")); all.add(C(Module.class, CatHadoopModule.ID, CatHadoopModule.class)); - all.add(C(MessageBucket.class, HdfsMessageBucket.ID, HdfsMessageBucket.class) // - .is(PER_LOOKUP) // - .req(FileSystemManager.class)); - - all.add(C(MessageBucket.class, HarfsMessageBucket.ID, HarfsMessageBucket.class) // - .is(PER_LOOKUP) // - .req(FileSystemManager.class)); - - all.add(C(MessageBucketManager.class, HdfsMessageBucketManager.ID, HdfsMessageBucketManager.class) // - .req(FileSystemManager.class, ServerConfigManager.class) // - .req(PathBuilder.class)); + all.add(C(MessageBucket.class, HdfsMessageBucket.ID, HdfsMessageBucket.class) // + .is(PER_LOOKUP) // + .req(FileSystemManager.class, (String) null, "m_manager")); + + all.add(C(MessageBucket.class, HarfsMessageBucket.ID, HarfsMessageBucket.class) // + .is(PER_LOOKUP) // + .req(FileSystemManager.class, (String) null, "m_manager")); + + all.add(C(MessageBucketManager.class, HdfsMessageBucketManager.ID, HdfsMessageBucketManager.class) // + .req(FileSystemManager.class, (String) null, "m_manager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager") // + .req(PathBuilder.class, (String) null, "m_pathBuilder")); return all; diff --git a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/FileSystemManager.java b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/FileSystemManager.java index d8eacb6187..fce44822a3 100644 --- a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/FileSystemManager.java +++ b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/FileSystemManager.java @@ -31,13 +31,11 @@ import org.apache.hadoop.security.UserGroupInformation; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; public class FileSystemManager implements Initializable { - @Inject private ServerConfigManager m_configManager; private String m_defaultBaseDir; diff --git a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/HdfsMessageBucketManager.java b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/HdfsMessageBucketManager.java index c34b14ed11..f277a97829 100644 --- a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/HdfsMessageBucketManager.java +++ b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/HdfsMessageBucketManager.java @@ -37,7 +37,6 @@ import org.unidal.helper.Threads; import org.unidal.helper.Threads.Task; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; import org.unidal.tuple.Pair; import java.io.IOException; @@ -52,13 +51,10 @@ public class HdfsMessageBucketManager extends ContainerHolder implements Message public static final String HARFS_BUCKET = "HarfsMessageBucket"; - @Inject private FileSystemManager m_manager; - @Inject private PathBuilder m_pathBuilder; - @Inject private ServerConfigManager m_serverConfigManager; private Map m_buckets = new ConcurrentHashMap(); diff --git a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/bucket/AbstractHdfsMessageBucket.java b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/bucket/AbstractHdfsMessageBucket.java index 7b6e62ce03..1afef3835d 100644 --- a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/bucket/AbstractHdfsMessageBucket.java +++ b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/bucket/AbstractHdfsMessageBucket.java @@ -24,7 +24,6 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.hadoop.hdfs.FileSystemManager; @@ -36,7 +35,6 @@ public abstract class AbstractHdfsMessageBucket implements MessageBucket { - @Inject protected FileSystemManager m_manager; protected MessageBlockReader m_reader; diff --git a/cat-hadoop/src/main/resources/META-INF/plexus/components.xml b/cat-hadoop/src/main/resources/META-INF/plexus/components.xml index b962b128ae..9f444e4b91 100644 --- a/cat-hadoop/src/main/resources/META-INF/plexus/components.xml +++ b/cat-hadoop/src/main/resources/META-INF/plexus/components.xml @@ -7,6 +7,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_configManager @@ -23,6 +24,7 @@ com.dianping.cat.hadoop.hdfs.FileSystemManager + m_manager @@ -34,6 +36,7 @@ com.dianping.cat.hadoop.hdfs.FileSystemManager + m_manager @@ -44,12 +47,15 @@ com.dianping.cat.hadoop.hdfs.FileSystemManager + m_manager com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager com.dianping.cat.message.PathBuilder + m_pathBuilder From 9b9c93d2b6d4cef766f9ec66d8b6ed3193ffab6d Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 10:02:54 +0800 Subject: [PATCH 084/231] =?UTF-8?q?=E5=AE=8C=E6=88=90=20cat-hadoop=20stora?= =?UTF-8?q?ge.local=20=E5=B0=8F=E7=BB=84=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hadoop/build/ComponentsConfigurator.java | 84 +++++++++++-------- .../message/storage/local/LocalBucket.java | 6 -- .../storage/local/LocalBucketManager.java | 4 - .../storage/local/LocalFileBuilder.java | 4 - .../cat/message/storage/local/LocalIndex.java | 6 -- .../storage/local/LocalIndexManager.java | 4 - .../storage/local/LocalTokenMapping.java | 4 - .../local/LocalTokenMappingManager.java | 2 - .../resources/META-INF/plexus/components.xml | 10 +++ 9 files changed, 61 insertions(+), 63 deletions(-) diff --git a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java index d653d184ef..65640ad323 100644 --- a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java +++ b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java @@ -18,23 +18,28 @@ */ package com.dianping.cat.hadoop.build; -import java.util.ArrayList; -import java.util.List; - -import org.unidal.cat.message.storage.clean.HdfsUploader; -import org.unidal.cat.message.storage.clean.LogviewProcessor; -import org.unidal.cat.message.storage.hdfs.HdfsBucket; +import java.util.ArrayList; +import java.util.List; + +import org.unidal.cat.message.storage.Bucket; +import org.unidal.cat.message.storage.BucketManager; +import org.unidal.cat.message.storage.clean.HdfsUploader; +import org.unidal.cat.message.storage.clean.LogviewProcessor; +import org.unidal.cat.message.storage.hdfs.HdfsBucket; import org.unidal.cat.message.storage.hdfs.HdfsBucketManager; import org.unidal.cat.message.storage.hdfs.HdfsFileBuilder; import org.unidal.cat.message.storage.hdfs.HdfsIndex; import org.unidal.cat.message.storage.hdfs.HdfsIndexManager; -import org.unidal.cat.message.storage.hdfs.HdfsMessageConsumerFinder; -import org.unidal.cat.message.storage.hdfs.HdfsSystemManager; -import org.unidal.cat.message.storage.hdfs.HdfsTokenMapping; -import org.unidal.cat.message.storage.hdfs.HdfsTokenMappingManager; -import org.unidal.cat.message.storage.internals.DefaultBlockDumper; -import org.unidal.cat.message.storage.internals.DefaultBlockDumperManager; -import org.unidal.cat.message.storage.internals.DefaultBlockWriter; +import org.unidal.cat.message.storage.hdfs.HdfsMessageConsumerFinder; +import org.unidal.cat.message.storage.hdfs.HdfsSystemManager; +import org.unidal.cat.message.storage.hdfs.HdfsTokenMapping; +import org.unidal.cat.message.storage.hdfs.HdfsTokenMappingManager; +import org.unidal.cat.message.storage.Index; +import org.unidal.cat.message.storage.IndexManager; +import org.unidal.cat.message.storage.internals.ByteBufCache; +import org.unidal.cat.message.storage.internals.DefaultBlockDumper; +import org.unidal.cat.message.storage.internals.DefaultBlockDumperManager; +import org.unidal.cat.message.storage.internals.DefaultBlockWriter; import org.unidal.cat.message.storage.internals.DefaultByteBufCache; import org.unidal.cat.message.storage.internals.DefaultMessageDumper; import org.unidal.cat.message.storage.internals.DefaultMessageDumperManager; @@ -44,10 +49,13 @@ import org.unidal.cat.message.storage.local.LocalBucket; import org.unidal.cat.message.storage.local.LocalBucketManager; import org.unidal.cat.message.storage.local.LocalFileBuilder; -import org.unidal.cat.message.storage.local.LocalIndex; -import org.unidal.cat.message.storage.local.LocalIndexManager; -import org.unidal.cat.message.storage.local.LocalTokenMapping; -import org.unidal.cat.message.storage.local.LocalTokenMappingManager; +import org.unidal.cat.message.storage.local.LocalIndex; +import org.unidal.cat.message.storage.local.LocalIndexManager; +import org.unidal.cat.message.storage.local.LocalTokenMapping; +import org.unidal.cat.message.storage.local.LocalTokenMappingManager; +import org.unidal.cat.message.storage.StorageConfiguration; +import org.unidal.cat.message.storage.TokenMapping; +import org.unidal.cat.message.storage.TokenMappingManager; import org.unidal.initialization.Module; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -117,22 +125,32 @@ public List defineLocalComponents() { all.add(A(HdfsMessageConsumerFinder.class)); - all.add(A(LocalBucket.class)); - all.add(A(LocalBucketManager.class)); - all.add(A(HdfsBucket.class)); - all.add(A(HdfsBucketManager.class)); - - all.add(A(LocalIndex.class)); - all.add(A(LocalIndexManager.class)); - all.add(A(HdfsIndex.class)); - all.add(A(HdfsIndexManager.class)); - - all.add(A(LocalFileBuilder.class)); - all.add(A(HdfsFileBuilder.class)); - all.add(A(LocalTokenMapping.class)); - all.add(A(HdfsTokenMapping.class)); - all.add(A(LocalTokenMappingManager.class)); - all.add(A(HdfsTokenMappingManager.class)); + all.add(C(Bucket.class, "local", LocalBucket.class).is(PER_LOOKUP) // + .req(org.unidal.cat.message.storage.PathBuilder.class, "local", "m_builder") // + .req(ByteBufCache.class, (String) null, "m_bufCache") // + .req(ServerConfigManager.class, (String) null, "m_config")); + all.add(C(BucketManager.class, "local", LocalBucketManager.class) // + .req(org.unidal.cat.message.storage.PathBuilder.class, "local", "m_builder")); + all.add(A(HdfsBucket.class)); + all.add(A(HdfsBucketManager.class)); + + all.add(C(Index.class, "local", LocalIndex.class).is(PER_LOOKUP) // + .req(org.unidal.cat.message.storage.PathBuilder.class, "local", "m_bulider") // + .req(TokenMappingManager.class, "local", "m_manager") // + .req(ByteBufCache.class, (String) null, "m_bufCache")); + all.add(C(IndexManager.class, "local", LocalIndexManager.class) // + .req(org.unidal.cat.message.storage.PathBuilder.class, "local", "m_bulider")); + all.add(A(HdfsIndex.class)); + all.add(A(HdfsIndexManager.class)); + + all.add(C(org.unidal.cat.message.storage.PathBuilder.class, "local", LocalFileBuilder.class) // + .req(StorageConfiguration.class, (String) null, "m_config")); + all.add(A(HdfsFileBuilder.class)); + all.add(C(TokenMapping.class, "local", LocalTokenMapping.class).is(PER_LOOKUP) // + .req(org.unidal.cat.message.storage.PathBuilder.class, "local", "m_bulider")); + all.add(A(HdfsTokenMapping.class)); + all.add(C(TokenMappingManager.class, "local", LocalTokenMappingManager.class)); + all.add(A(HdfsTokenMappingManager.class)); all.add(A(DefaultStorageConfiguration.class)); all.add(A(DefaultByteBufCache.class)); diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucket.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucket.java index 0d9e541560..63293e100d 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucket.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucket.java @@ -40,23 +40,17 @@ import org.unidal.cat.message.storage.PathBuilder; import org.unidal.cat.message.storage.internals.ByteBufCache; import org.unidal.cat.message.storage.internals.DefaultBlock; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.message.tree.MessageId; -@Named(type = Bucket.class, value = "local", instantiationStrategy = Named.PER_LOOKUP) public class LocalBucket implements Bucket { - @Inject("local") private PathBuilder m_builder; - @Inject private ByteBufCache m_bufCache; - @Inject private ServerConfigManager m_config; private DataHelper m_data = new DataHelper(); diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucketManager.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucketManager.java index fd82be3932..cfe648800d 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucketManager.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalBucketManager.java @@ -37,19 +37,15 @@ import org.unidal.cat.message.storage.FileType; import org.unidal.cat.message.storage.PathBuilder; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; -@Named(type = BucketManager.class, value = "local") public class LocalBucketManager extends ContainerHolder implements BucketManager, LogEnabled { private static final org.slf4j.Logger SLF4J_LOGGER = LoggerFactory.getLogger(LocalBucketManager.class); protected Logger m_logger; - @Inject("local") private PathBuilder m_builder; private BucketFactory m_bucketFactory; diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalFileBuilder.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalFileBuilder.java index 0ef51cc646..ed4be186c7 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalFileBuilder.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalFileBuilder.java @@ -24,12 +24,8 @@ import org.unidal.cat.message.storage.FileType; import org.unidal.cat.message.storage.PathBuilder; import org.unidal.cat.message.storage.StorageConfiguration; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; -@Named(type = PathBuilder.class, value = "local") public class LocalFileBuilder implements PathBuilder { - @Inject private StorageConfiguration m_config; @Override diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalIndex.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalIndex.java index 1fb98f3d37..5fa8611d0b 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalIndex.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalIndex.java @@ -38,24 +38,18 @@ import org.unidal.cat.message.storage.TokenMapping; import org.unidal.cat.message.storage.TokenMappingManager; import org.unidal.cat.message.storage.internals.ByteBufCache; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.message.Event; import com.dianping.cat.message.tree.MessageId; -@Named(type = Index.class, value = "local", instantiationStrategy = Named.PER_LOOKUP) public class LocalIndex implements Index { private static final int SEGMENT_SIZE = 32 * 1024; - @Inject("local") private PathBuilder m_bulider; - @Inject("local") private TokenMappingManager m_manager; - @Inject private ByteBufCache m_bufCache; private TokenMapping m_mapping; diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalIndexManager.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalIndexManager.java index bf1c866e72..2a34e5877c 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalIndexManager.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalIndexManager.java @@ -33,16 +33,12 @@ import org.unidal.cat.message.storage.IndexManager; import org.unidal.cat.message.storage.PathBuilder; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; -@Named(type = IndexManager.class, value = "local") public class LocalIndexManager extends ContainerHolder implements IndexManager { protected Logger m_logger; private Map> m_indexes = new LinkedHashMap>(); - @Inject("local") private PathBuilder m_bulider; private boolean bucketFilesExsits(String domain, String ip, int hour) { diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalTokenMapping.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalTokenMapping.java index 8ea263ff5d..82e4160cc0 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalTokenMapping.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalTokenMapping.java @@ -32,8 +32,6 @@ import org.unidal.cat.message.storage.FileType; import org.unidal.cat.message.storage.PathBuilder; import org.unidal.cat.message.storage.TokenMapping; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.helper.TimeHelper; @@ -41,13 +39,11 @@ /** * Supports up to 64K tokens mapping from String to int, or reverse by local file system. */ -@Named(type = TokenMapping.class, value = "local", instantiationStrategy = Named.PER_LOOKUP) public class LocalTokenMapping implements TokenMapping { private static final int BLOCK_SIZE = 32 * 1024; private static final String MAGIC_CODE = "TokenMapping"; // token mapping - @Inject("local") private PathBuilder m_bulider; private RandomAccessFile m_file; diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalTokenMappingManager.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalTokenMappingManager.java index bee1802f31..7c925beea1 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalTokenMappingManager.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/local/LocalTokenMappingManager.java @@ -28,10 +28,8 @@ import org.unidal.cat.message.storage.TokenMapping; import org.unidal.cat.message.storage.TokenMappingManager; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; -@Named(type = TokenMappingManager.class, value = "local") public class LocalTokenMappingManager extends ContainerHolder implements TokenMappingManager { private Map, TokenMapping> m_cache = new HashMap, TokenMapping>(); diff --git a/cat-hadoop/src/main/resources/META-INF/plexus/components.xml b/cat-hadoop/src/main/resources/META-INF/plexus/components.xml index 9f444e4b91..5f28dbbb27 100644 --- a/cat-hadoop/src/main/resources/META-INF/plexus/components.xml +++ b/cat-hadoop/src/main/resources/META-INF/plexus/components.xml @@ -162,12 +162,15 @@ org.unidal.cat.message.storage.PathBuilder local + m_builder org.unidal.cat.message.storage.internals.ByteBufCache + m_bufCache com.dianping.cat.config.server.ServerConfigManager + m_config @@ -179,6 +182,7 @@ org.unidal.cat.message.storage.PathBuilder local + m_builder @@ -225,13 +229,16 @@ org.unidal.cat.message.storage.PathBuilder local + m_bulider org.unidal.cat.message.storage.TokenMappingManager local + m_manager org.unidal.cat.message.storage.internals.ByteBufCache + m_bufCache @@ -243,6 +250,7 @@ org.unidal.cat.message.storage.PathBuilder local + m_bulider @@ -291,6 +299,7 @@ org.unidal.cat.message.storage.StorageConfiguration + m_config @@ -313,6 +322,7 @@ org.unidal.cat.message.storage.PathBuilder local + m_bulider From 1d49571949bccd2e13617be4e36a7de4434a4936 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 10:11:09 +0800 Subject: [PATCH 085/231] =?UTF-8?q?=E5=AE=8C=E6=88=90=20cat-hadoop=20stora?= =?UTF-8?q?ge.hdfs=20=E5=B0=8F=E7=BB=84=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hadoop/build/ComponentsConfigurator.java | 45 +++++++++++++------ .../cat/message/storage/hdfs/HdfsBucket.java | 6 --- .../storage/hdfs/HdfsBucketManager.java | 6 --- .../message/storage/hdfs/HdfsFileBuilder.java | 4 -- .../cat/message/storage/hdfs/HdfsIndex.java | 7 --- .../storage/hdfs/HdfsIndexManager.java | 6 --- .../hdfs/HdfsMessageConsumerFinder.java | 4 -- .../storage/hdfs/HdfsSystemManager.java | 4 -- .../storage/hdfs/HdfsTokenMapping.java | 5 --- .../storage/hdfs/HdfsTokenMappingManager.java | 2 - .../resources/META-INF/plexus/components.xml | 18 ++++++++ 11 files changed, 50 insertions(+), 57 deletions(-) diff --git a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java index 65640ad323..def34c5f4b 100644 --- a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java +++ b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java @@ -27,9 +27,10 @@ import org.unidal.cat.message.storage.clean.LogviewProcessor; import org.unidal.cat.message.storage.hdfs.HdfsBucket; import org.unidal.cat.message.storage.hdfs.HdfsBucketManager; -import org.unidal.cat.message.storage.hdfs.HdfsFileBuilder; -import org.unidal.cat.message.storage.hdfs.HdfsIndex; -import org.unidal.cat.message.storage.hdfs.HdfsIndexManager; +import org.unidal.cat.message.storage.hdfs.HdfsFileBuilder; +import org.unidal.cat.message.storage.hdfs.HdfsIndex; +import org.unidal.cat.message.storage.hdfs.HdfsIndexManager; +import org.unidal.cat.message.storage.hdfs.MessageConsumerFinder; import org.unidal.cat.message.storage.hdfs.HdfsMessageConsumerFinder; import org.unidal.cat.message.storage.hdfs.HdfsSystemManager; import org.unidal.cat.message.storage.hdfs.HdfsTokenMapping; @@ -121,9 +122,11 @@ public List defineLocalComponents() { all.add(A(DefaultBlockDumper.class)); all.add(A(DefaultBlockWriter.class)); - all.add(A(HdfsSystemManager.class)); - - all.add(A(HdfsMessageConsumerFinder.class)); + all.add(C(HdfsSystemManager.class) // + .req(ServerConfigManager.class, (String) null, "m_configManager")); + + all.add(C(MessageConsumerFinder.class, "hdfs", HdfsMessageConsumerFinder.class) // + .req(HdfsSystemManager.class, (String) null, "m_fileSystemManager")); all.add(C(Bucket.class, "local", LocalBucket.class).is(PER_LOOKUP) // .req(org.unidal.cat.message.storage.PathBuilder.class, "local", "m_builder") // @@ -131,8 +134,14 @@ public List defineLocalComponents() { .req(ServerConfigManager.class, (String) null, "m_config")); all.add(C(BucketManager.class, "local", LocalBucketManager.class) // .req(org.unidal.cat.message.storage.PathBuilder.class, "local", "m_builder")); - all.add(A(HdfsBucket.class)); - all.add(A(HdfsBucketManager.class)); + all.add(C(Bucket.class, HdfsBucket.ID, HdfsBucket.class).is(PER_LOOKUP) // + .req(HdfsSystemManager.class, (String) null, "m_manager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager") // + .req(org.unidal.cat.message.storage.PathBuilder.class, "hdfs", "m_bulider")); + all.add(C(HdfsBucketManager.class) // + .req(ServerConfigManager.class, (String) null, "m_configManager") // + .req(HdfsSystemManager.class, (String) null, "m_fileSystemManager") // + .req(MessageConsumerFinder.class, "hdfs", "m_consumerFinder")); all.add(C(Index.class, "local", LocalIndex.class).is(PER_LOOKUP) // .req(org.unidal.cat.message.storage.PathBuilder.class, "local", "m_bulider") // @@ -140,17 +149,27 @@ public List defineLocalComponents() { .req(ByteBufCache.class, (String) null, "m_bufCache")); all.add(C(IndexManager.class, "local", LocalIndexManager.class) // .req(org.unidal.cat.message.storage.PathBuilder.class, "local", "m_bulider")); - all.add(A(HdfsIndex.class)); - all.add(A(HdfsIndexManager.class)); + all.add(C(Index.class, HdfsBucket.ID, HdfsIndex.class).is(PER_LOOKUP) // + .req(HdfsSystemManager.class, (String) null, "m_manager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager") // + .req(org.unidal.cat.message.storage.PathBuilder.class, "hdfs", "m_bulider") // + .req(TokenMappingManager.class, "hdfs", "m_hdfsTokenManager")); + all.add(C(HdfsIndexManager.class) // + .req(ServerConfigManager.class, (String) null, "m_configManager") // + .req(HdfsSystemManager.class, (String) null, "m_fileSystemManager") // + .req(MessageConsumerFinder.class, "hdfs", "m_consumerFinder")); all.add(C(org.unidal.cat.message.storage.PathBuilder.class, "local", LocalFileBuilder.class) // .req(StorageConfiguration.class, (String) null, "m_config")); - all.add(A(HdfsFileBuilder.class)); + all.add(C(org.unidal.cat.message.storage.PathBuilder.class, "hdfs", HdfsFileBuilder.class) // + .req(HdfsSystemManager.class, (String) null, "m_fileSystemManager")); all.add(C(TokenMapping.class, "local", LocalTokenMapping.class).is(PER_LOOKUP) // .req(org.unidal.cat.message.storage.PathBuilder.class, "local", "m_bulider")); - all.add(A(HdfsTokenMapping.class)); + all.add(C(TokenMapping.class, "hdfs", HdfsTokenMapping.class).is(PER_LOOKUP) // + .req(HdfsSystemManager.class, (String) null, "m_manager") // + .req(org.unidal.cat.message.storage.PathBuilder.class, "hdfs", "m_bulider")); all.add(C(TokenMappingManager.class, "local", LocalTokenMappingManager.class)); - all.add(A(HdfsTokenMappingManager.class)); + all.add(C(TokenMappingManager.class, "hdfs", HdfsTokenMappingManager.class)); all.add(A(DefaultStorageConfiguration.class)); all.add(A(DefaultByteBufCache.class)); diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsBucket.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsBucket.java index 8d1457675a..deb2f5804c 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsBucket.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsBucket.java @@ -33,26 +33,20 @@ import org.unidal.cat.message.storage.FileType; import org.unidal.cat.message.storage.PathBuilder; import org.unidal.cat.message.storage.internals.DefaultBlock; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.message.tree.MessageId; -@Named(type = Bucket.class, value = HdfsBucket.ID, instantiationStrategy = Named.PER_LOOKUP) public class HdfsBucket implements Bucket { public static final String ID = "hdfs"; private static final int SEGMENT_SIZE = 32 * 1024; - @Inject protected HdfsSystemManager m_manager; - @Inject private ServerConfigManager m_serverConfigManager; - @Inject("hdfs") private PathBuilder m_bulider; private DataHelper m_data = new DataHelper(); diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsBucketManager.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsBucketManager.java index 5dd7f0eb14..1e23fd7a06 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsBucketManager.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsBucketManager.java @@ -30,8 +30,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.cat.message.storage.Bucket; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -41,18 +39,14 @@ import com.dianping.cat.message.spi.MessageTree; import com.dianping.cat.message.tree.MessageId; -@Named public class HdfsBucketManager extends ContainerHolder implements Initializable, LogEnabled { protected Logger m_logger; - @Inject private ServerConfigManager m_configManager; - @Inject private HdfsSystemManager m_fileSystemManager; - @Inject(value = "hdfs") private MessageConsumerFinder m_consumerFinder; private Map m_buckets = new LinkedHashMap() { diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsFileBuilder.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsFileBuilder.java index 2b1f7dc902..694ee424b7 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsFileBuilder.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsFileBuilder.java @@ -23,13 +23,9 @@ import org.unidal.cat.message.storage.FileType; import org.unidal.cat.message.storage.PathBuilder; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; -@Named(type = PathBuilder.class, value = "hdfs") public class HdfsFileBuilder implements PathBuilder { - @Inject private HdfsSystemManager m_fileSystemManager; @Override diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsIndex.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsIndex.java index 203e800a79..674f6a12a8 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsIndex.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsIndex.java @@ -33,28 +33,21 @@ import org.unidal.cat.message.storage.PathBuilder; import org.unidal.cat.message.storage.TokenMapping; import org.unidal.cat.message.storage.TokenMappingManager; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.message.tree.MessageId; -@Named(type = Index.class, value = HdfsBucket.ID, instantiationStrategy = Named.PER_LOOKUP) public class HdfsIndex implements Index { public static final String ID = "hdfs"; private static final int SEGMENT_SIZE = 32 * 1024; - @Inject protected HdfsSystemManager m_manager; - @Inject private ServerConfigManager m_serverConfigManager; - @Inject("hdfs") private PathBuilder m_bulider; - @Inject("hdfs") private TokenMappingManager m_hdfsTokenManager; private TokenMapping m_mapping; diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsIndexManager.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsIndexManager.java index f03ff641bc..2bd2d959ab 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsIndexManager.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsIndexManager.java @@ -29,8 +29,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.cat.message.storage.Index; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -38,18 +36,14 @@ import com.dianping.cat.message.Transaction; import com.dianping.cat.message.tree.MessageId; -@Named public class HdfsIndexManager extends ContainerHolder implements Initializable, LogEnabled { protected Logger m_logger; - @Inject private ServerConfigManager m_configManager; - @Inject private HdfsSystemManager m_fileSystemManager; - @Inject(value = "hdfs") private MessageConsumerFinder m_consumerFinder; private Map m_buckets = new LinkedHashMap() { diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsMessageConsumerFinder.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsMessageConsumerFinder.java index 999e83315f..4894f5ad69 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsMessageConsumerFinder.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsMessageConsumerFinder.java @@ -29,16 +29,12 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.PathFilter; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.helper.TimeHelper; -@Named(type = MessageConsumerFinder.class, value = "hdfs") public class HdfsMessageConsumerFinder implements MessageConsumerFinder { - @Inject private HdfsSystemManager m_fileSystemManager; private Map> m_caches = new HashMap>(); diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsSystemManager.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsSystemManager.java index c3f8f5f47f..f32f2287de 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsSystemManager.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsSystemManager.java @@ -28,17 +28,13 @@ import org.apache.hadoop.security.UserGroupInformation; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; -@Named public class HdfsSystemManager implements Initializable { public static final String DUMP = "dump"; - @Inject private ServerConfigManager m_configManager; private FileSystem m_fileSystem; diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsTokenMapping.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsTokenMapping.java index 6e8cf47de8..8c6340d13e 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsTokenMapping.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsTokenMapping.java @@ -33,8 +33,6 @@ import org.unidal.cat.message.storage.FileType; import org.unidal.cat.message.storage.PathBuilder; import org.unidal.cat.message.storage.TokenMapping; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.helper.TimeHelper; @@ -42,16 +40,13 @@ /** * Supports up to 64K tokens mapping from String to int, or reverse by local file system. */ -@Named(type = TokenMapping.class, value = "hdfs", instantiationStrategy = Named.PER_LOOKUP) public class HdfsTokenMapping implements TokenMapping { private static final int BLOCK_SIZE = 32 * 1024; private static final String MAGIC_CODE = "TokenMapping"; // token mapping - @Inject protected HdfsSystemManager m_manager; - @Inject("hdfs") private PathBuilder m_bulider; private FSDataInputStream m_file; diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsTokenMappingManager.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsTokenMappingManager.java index 7c2d5c934f..188555900d 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsTokenMappingManager.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/hdfs/HdfsTokenMappingManager.java @@ -28,10 +28,8 @@ import org.unidal.cat.message.storage.TokenMapping; import org.unidal.cat.message.storage.TokenMappingManager; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Named; import org.unidal.tuple.Pair; -@Named(type = TokenMappingManager.class, value = "hdfs") public class HdfsTokenMappingManager extends ContainerHolder implements TokenMappingManager { private Map, TokenMapping> m_cache = new LinkedHashMap, TokenMapping>() { diff --git a/cat-hadoop/src/main/resources/META-INF/plexus/components.xml b/cat-hadoop/src/main/resources/META-INF/plexus/components.xml index 5f28dbbb27..48234c1b03 100644 --- a/cat-hadoop/src/main/resources/META-INF/plexus/components.xml +++ b/cat-hadoop/src/main/resources/META-INF/plexus/components.xml @@ -140,6 +140,7 @@ com.dianping.cat.config.server.ServerConfigManager + m_configManager @@ -150,6 +151,7 @@ org.unidal.cat.message.storage.hdfs.HdfsSystemManager + m_fileSystemManager @@ -194,13 +196,16 @@ org.unidal.cat.message.storage.hdfs.HdfsSystemManager + m_manager com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager org.unidal.cat.message.storage.PathBuilder hdfs + m_bulider @@ -210,13 +215,16 @@ com.dianping.cat.config.server.ServerConfigManager + m_configManager org.unidal.cat.message.storage.hdfs.HdfsSystemManager + m_fileSystemManager org.unidal.cat.message.storage.hdfs.MessageConsumerFinder hdfs + m_consumerFinder @@ -262,17 +270,21 @@ org.unidal.cat.message.storage.hdfs.HdfsSystemManager + m_manager com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager org.unidal.cat.message.storage.PathBuilder hdfs + m_bulider org.unidal.cat.message.storage.TokenMappingManager hdfs + m_hdfsTokenManager @@ -282,13 +294,16 @@ com.dianping.cat.config.server.ServerConfigManager + m_configManager org.unidal.cat.message.storage.hdfs.HdfsSystemManager + m_fileSystemManager org.unidal.cat.message.storage.hdfs.MessageConsumerFinder hdfs + m_consumerFinder @@ -310,6 +325,7 @@ org.unidal.cat.message.storage.hdfs.HdfsSystemManager + m_fileSystemManager @@ -334,10 +350,12 @@ org.unidal.cat.message.storage.hdfs.HdfsSystemManager + m_manager org.unidal.cat.message.storage.PathBuilder hdfs + m_bulider From cbb358cc51fd6b243199a75b6be3b2a49fe0ef5f Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 10:22:12 +0800 Subject: [PATCH 086/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=20cat-hadoop=20?= =?UTF-8?q?=E7=9A=84=20storage.internals=20=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hadoop/build/ComponentsConfigurator.java | 43 +++++++++++++------ .../storage/internals/DefaultBlockDumper.java | 5 --- .../internals/DefaultBlockDumperManager.java | 2 - .../storage/internals/DefaultBlockWriter.java | 5 --- .../internals/DefaultByteBufCache.java | 2 - .../internals/DefaultMessageDumper.java | 7 --- .../DefaultMessageDumperManager.java | 2 - .../DefaultMessageFinderManager.java | 2 - .../internals/DefaultMessageProcessor.java | 6 --- .../DefaultStorageConfiguration.java | 2 - .../resources/META-INF/plexus/components.xml | 11 +++++ 11 files changed, 42 insertions(+), 45 deletions(-) diff --git a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java index def34c5f4b..2db78c5c4f 100644 --- a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java +++ b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java @@ -23,6 +23,9 @@ import org.unidal.cat.message.storage.Bucket; import org.unidal.cat.message.storage.BucketManager; +import org.unidal.cat.message.storage.BlockDumper; +import org.unidal.cat.message.storage.BlockDumperManager; +import org.unidal.cat.message.storage.BlockWriter; import org.unidal.cat.message.storage.clean.HdfsUploader; import org.unidal.cat.message.storage.clean.LogviewProcessor; import org.unidal.cat.message.storage.hdfs.HdfsBucket; @@ -54,6 +57,10 @@ import org.unidal.cat.message.storage.local.LocalIndexManager; import org.unidal.cat.message.storage.local.LocalTokenMapping; import org.unidal.cat.message.storage.local.LocalTokenMappingManager; +import org.unidal.cat.message.storage.MessageDumper; +import org.unidal.cat.message.storage.MessageDumperManager; +import org.unidal.cat.message.storage.MessageFinderManager; +import org.unidal.cat.message.storage.MessageProcessor; import org.unidal.cat.message.storage.StorageConfiguration; import org.unidal.cat.message.storage.TokenMapping; import org.unidal.cat.message.storage.TokenMappingManager; @@ -67,9 +74,10 @@ import com.dianping.cat.hadoop.hdfs.HdfsMessageBucketManager; import com.dianping.cat.hadoop.hdfs.bucket.HarfsMessageBucket; import com.dianping.cat.hadoop.hdfs.bucket.HdfsMessageBucket; -import com.dianping.cat.message.PathBuilder; -import com.dianping.cat.message.storage.MessageBucket; -import com.dianping.cat.message.storage.MessageBucketManager; +import com.dianping.cat.message.PathBuilder; +import com.dianping.cat.message.storage.MessageBucket; +import com.dianping.cat.message.storage.MessageBucketManager; +import com.dianping.cat.statistic.ServerStatisticManager; public class ComponentsConfigurator extends AbstractResourceConfigurator { public static void main(String[] args) { @@ -114,13 +122,24 @@ public List defineLastStorage() { public List defineLocalComponents() { List all = new ArrayList(); - all.add(A(DefaultMessageDumperManager.class)); - all.add(A(DefaultMessageFinderManager.class)); - all.add(A(DefaultMessageDumper.class)); - all.add(A(DefaultMessageProcessor.class)); - all.add(A(DefaultBlockDumperManager.class)); - all.add(A(DefaultBlockDumper.class)); - all.add(A(DefaultBlockWriter.class)); + all.add(C(MessageDumperManager.class, DefaultMessageDumperManager.class)); + all.add(C(MessageFinderManager.class, DefaultMessageFinderManager.class)); + all.add(C(MessageDumper.class, DefaultMessageDumper.class).is(PER_LOOKUP) // + .req(BlockDumperManager.class, (String) null, "m_blockDumperManager") // + .req(BucketManager.class, "local", "m_bucketManager") // + .req(ServerStatisticManager.class, (String) null, "m_statisticManager") // + .req(ServerConfigManager.class, (String) null, "m_configManager")); + all.add(C(MessageProcessor.class, DefaultMessageProcessor.class).is(PER_LOOKUP) // + .req(BlockDumperManager.class, (String) null, "m_blockDumperManager") // + .req(MessageFinderManager.class, (String) null, "m_finderManager") // + .req(ServerConfigManager.class, (String) null, "m_configManger")); + all.add(C(BlockDumperManager.class, DefaultBlockDumperManager.class)); + all.add(C(BlockDumper.class, DefaultBlockDumper.class).is(PER_LOOKUP) // + .req(ServerStatisticManager.class, (String) null, "m_statisticManager") // + .req(ServerConfigManager.class, (String) null, "m_configManager")); + all.add(C(BlockWriter.class, DefaultBlockWriter.class).is(PER_LOOKUP) // + .req(BucketManager.class, "local", "m_bucketManager") // + .req(ServerStatisticManager.class, (String) null, "m_statisticManager")); all.add(C(HdfsSystemManager.class) // .req(ServerConfigManager.class, (String) null, "m_configManager")); @@ -171,8 +190,8 @@ public List defineLocalComponents() { all.add(C(TokenMappingManager.class, "local", LocalTokenMappingManager.class)); all.add(C(TokenMappingManager.class, "hdfs", HdfsTokenMappingManager.class)); - all.add(A(DefaultStorageConfiguration.class)); - all.add(A(DefaultByteBufCache.class)); + all.add(C(StorageConfiguration.class, DefaultStorageConfiguration.class)); + all.add(C(ByteBufCache.class, DefaultByteBufCache.class)); all.add(A(HdfsUploader.class)); all.add(A(LogviewProcessor.class)); diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultBlockDumper.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultBlockDumper.java index 215235b5ac..649c18996e 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultBlockDumper.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultBlockDumper.java @@ -33,20 +33,15 @@ import org.unidal.cat.message.storage.exception.BlockQueueFullException; import org.unidal.helper.Threads; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.statistic.ServerStatisticManager; -@Named(type = BlockDumper.class, instantiationStrategy = Named.PER_LOOKUP) public class DefaultBlockDumper extends ContainerHolder implements BlockDumper, LogEnabled { - @Inject private ServerStatisticManager m_statisticManager; - @Inject private ServerConfigManager m_configManager; private List> m_queues = new ArrayList>(); diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultBlockDumperManager.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultBlockDumperManager.java index b74f605739..33b49ce881 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultBlockDumperManager.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultBlockDumperManager.java @@ -29,9 +29,7 @@ import org.unidal.cat.message.storage.BlockDumper; import org.unidal.cat.message.storage.BlockDumperManager; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Named; -@Named(type = BlockDumperManager.class) public class DefaultBlockDumperManager extends ContainerHolder implements LogEnabled, BlockDumperManager { private Map m_map = new LinkedHashMap(); diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultBlockWriter.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultBlockWriter.java index e47b34651f..57fbbd0d30 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultBlockWriter.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultBlockWriter.java @@ -29,21 +29,16 @@ import org.unidal.cat.message.storage.BlockWriter; import org.unidal.cat.message.storage.Bucket; import org.unidal.cat.message.storage.BucketManager; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.message.Transaction; import com.dianping.cat.statistic.ServerStatisticManager; -@Named(type = BlockWriter.class, instantiationStrategy = Named.PER_LOOKUP) public class DefaultBlockWriter implements BlockWriter { - @Inject("local") private BucketManager m_bucketManager; - @Inject private ServerStatisticManager m_statisticManager; private int m_index; diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultByteBufCache.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultByteBufCache.java index c01d61631a..6cae778dbf 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultByteBufCache.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultByteBufCache.java @@ -28,11 +28,9 @@ import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; -@Named(type = ByteBufCache.class) public class DefaultByteBufCache implements ByteBufCache, Initializable, LogEnabled { private BlockingQueue m_bufs = new ArrayBlockingQueue(8000); diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageDumper.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageDumper.java index 9ac63835e4..adb987d42e 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageDumper.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageDumper.java @@ -36,8 +36,6 @@ import org.unidal.cat.message.storage.exception.MessageQueueFullException; import org.unidal.helper.Threads; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.CatConstants; @@ -47,18 +45,13 @@ import com.dianping.cat.message.tree.MessageId; import com.dianping.cat.statistic.ServerStatisticManager; -@Named(type = MessageDumper.class, instantiationStrategy = Named.PER_LOOKUP) public class DefaultMessageDumper extends ContainerHolder implements MessageDumper, LogEnabled { - @Inject private BlockDumperManager m_blockDumperManager; - @Inject("local") private BucketManager m_bucketManager; - @Inject private ServerStatisticManager m_statisticManager; - @Inject private ServerConfigManager m_configManager; private List> m_queues = new ArrayList>(); diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageDumperManager.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageDumperManager.java index 59dd7c3c2f..1ad77ff36c 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageDumperManager.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageDumperManager.java @@ -31,9 +31,7 @@ import org.unidal.cat.message.storage.MessageDumper; import org.unidal.cat.message.storage.MessageDumperManager; import org.unidal.lookup.ContainerHolder; -import org.unidal.lookup.annotation.Named; -@Named(type = MessageDumperManager.class) public class DefaultMessageDumperManager extends ContainerHolder implements LogEnabled, MessageDumperManager, Initializable { diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageFinderManager.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageFinderManager.java index 5881b22f1d..21aa6e855c 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageFinderManager.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageFinderManager.java @@ -26,11 +26,9 @@ import io.netty.buffer.ByteBuf; import org.unidal.cat.message.storage.MessageFinder; import org.unidal.cat.message.storage.MessageFinderManager; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.message.tree.MessageId; -@Named(type = MessageFinderManager.class) public class DefaultMessageFinderManager implements MessageFinderManager { private Map> m_map = new HashMap>(); diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageProcessor.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageProcessor.java index da5b9841e6..99d65684c4 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageProcessor.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultMessageProcessor.java @@ -35,8 +35,6 @@ import org.unidal.cat.message.storage.MessageFinder; import org.unidal.cat.message.storage.MessageFinderManager; import org.unidal.cat.message.storage.MessageProcessor; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -44,15 +42,11 @@ import com.dianping.cat.message.spi.MessageTree; import com.dianping.cat.message.tree.MessageId; -@Named(type = MessageProcessor.class, instantiationStrategy = Named.PER_LOOKUP) public class DefaultMessageProcessor implements MessageProcessor, MessageFinder { - @Inject private BlockDumperManager m_blockDumperManager; - @Inject private MessageFinderManager m_finderManager; - @Inject private ServerConfigManager m_configManger; private BlockDumper m_dumper; diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultStorageConfiguration.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultStorageConfiguration.java index d3f360ee3a..414301c787 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultStorageConfiguration.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/internals/DefaultStorageConfiguration.java @@ -23,11 +23,9 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.unidal.cat.message.storage.StorageConfiguration; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; -@Named(type = StorageConfiguration.class) public class DefaultStorageConfiguration implements Initializable, StorageConfiguration { private String m_baseDataDir; diff --git a/cat-hadoop/src/main/resources/META-INF/plexus/components.xml b/cat-hadoop/src/main/resources/META-INF/plexus/components.xml index 48234c1b03..08a89f33ca 100644 --- a/cat-hadoop/src/main/resources/META-INF/plexus/components.xml +++ b/cat-hadoop/src/main/resources/META-INF/plexus/components.xml @@ -74,16 +74,20 @@ org.unidal.cat.message.storage.BlockDumperManager + m_blockDumperManager org.unidal.cat.message.storage.BucketManager local + m_bucketManager com.dianping.cat.statistic.ServerStatisticManager + m_statisticManager com.dianping.cat.config.server.ServerConfigManager + m_configManager @@ -94,12 +98,15 @@ org.unidal.cat.message.storage.BlockDumperManager + m_blockDumperManager org.unidal.cat.message.storage.MessageFinderManager + m_finderManager com.dianping.cat.config.server.ServerConfigManager + m_configManger @@ -114,9 +121,11 @@ com.dianping.cat.statistic.ServerStatisticManager + m_statisticManager com.dianping.cat.config.server.ServerConfigManager + m_configManager @@ -128,9 +137,11 @@ org.unidal.cat.message.storage.BucketManager local + m_bucketManager com.dianping.cat.statistic.ServerStatisticManager + m_statisticManager From 1e8ceaf90ca4a49fa3923543a5ab92dd9d630683 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 10:29:02 +0800 Subject: [PATCH 087/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=20cat-hadoop=20?= =?UTF-8?q?=E7=9A=84=20storage.internals?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dianping/cat/hadoop/build/ComponentsConfigurator.java | 8 ++++++-- .../unidal/cat/message/storage/clean/HdfsUploader.java | 5 ----- .../cat/message/storage/clean/LogviewProcessor.java | 7 +------ .../src/main/resources/META-INF/plexus/components.xml | 4 ++++ 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java index 2db78c5c4f..4676b2e1a5 100644 --- a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java +++ b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/build/ComponentsConfigurator.java @@ -193,8 +193,12 @@ public List defineLocalComponents() { all.add(C(StorageConfiguration.class, DefaultStorageConfiguration.class)); all.add(C(ByteBufCache.class, DefaultByteBufCache.class)); - all.add(A(HdfsUploader.class)); - all.add(A(LogviewProcessor.class)); + all.add(C(HdfsUploader.class) // + .req(HdfsSystemManager.class, (String) null, "m_fileSystemManager") // + .req(ServerConfigManager.class, (String) null, "m_serverConfigManager")); + all.add(C(LogviewProcessor.class) // + .req(HdfsUploader.class, (String) null, "m_hdfsUploader") // + .req(ServerConfigManager.class, (String) null, "m_configManager")); return all; } diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/clean/HdfsUploader.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/clean/HdfsUploader.java index e7ad9cf24c..187d6c8120 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/clean/HdfsUploader.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/clean/HdfsUploader.java @@ -40,21 +40,16 @@ import org.unidal.helper.Files.AutoClose; import org.unidal.helper.Formats; import org.unidal.helper.Threads.Task; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.message.Message; import com.dianping.cat.message.Transaction; -@Named public class HdfsUploader implements LogEnabled, Initializable { - @Inject private HdfsSystemManager m_fileSystemManager; - @Inject private ServerConfigManager m_serverConfigManager; private ThreadPoolExecutor m_executors; diff --git a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/clean/LogviewProcessor.java b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/clean/LogviewProcessor.java index fa4a4b1553..82a8d01a94 100644 --- a/cat-hadoop/src/main/java/org/unidal/cat/message/storage/clean/LogviewProcessor.java +++ b/cat-hadoop/src/main/java/org/unidal/cat/message/storage/clean/LogviewProcessor.java @@ -32,8 +32,6 @@ import org.unidal.helper.Scanners; import org.unidal.helper.Scanners.FileMatcher; import org.unidal.helper.Threads.Task; -import org.unidal.lookup.annotation.Inject; -import org.unidal.lookup.annotation.Named; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -42,13 +40,10 @@ import com.dianping.cat.message.Message; import com.dianping.cat.message.Transaction; -@Named public class LogviewProcessor implements Task, Initializable { - @Inject private HdfsUploader m_hdfsUploader; - @Inject private ServerConfigManager m_configManager; private File m_baseDir; @@ -226,4 +221,4 @@ private void uploadFileToHdfs(String path) { m_hdfsUploader.uploadLogviewFile(path, file); } -} \ No newline at end of file +} diff --git a/cat-hadoop/src/main/resources/META-INF/plexus/components.xml b/cat-hadoop/src/main/resources/META-INF/plexus/components.xml index 08a89f33ca..1ec94b6d4f 100644 --- a/cat-hadoop/src/main/resources/META-INF/plexus/components.xml +++ b/cat-hadoop/src/main/resources/META-INF/plexus/components.xml @@ -394,9 +394,11 @@ org.unidal.cat.message.storage.hdfs.HdfsSystemManager + m_fileSystemManager com.dianping.cat.config.server.ServerConfigManager + m_serverConfigManager @@ -406,9 +408,11 @@ org.unidal.cat.message.storage.clean.HdfsUploader + m_hdfsUploader com.dianping.cat.config.server.ServerConfigManager + m_configManager From 492cc3aea24ac2f162220f985e3c5aba79b63aef Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 10:45:09 +0800 Subject: [PATCH 088/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E4=B8=80=E6=89=B9Han?= =?UTF-8?q?dler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/WebComponentConfigurator.java | 28 ++++ .../cat/system/page/login/Handler.java | 3 - .../cat/system/page/plugin/Handler.java | 2 - .../cat/system/page/project/Handler.java | 3 - .../resources/META-INF/plexus/components.xml | 125 +++++++++--------- 5 files changed, 93 insertions(+), 68 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java index b2ccba663d..5b3f8d0f33 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java @@ -43,10 +43,13 @@ import org.unidal.web.mvc.payload.UrlEncodedParameterProvider; import org.unidal.web.mvc.view.model.DefaultModelHandler; import org.unidal.web.mvc.view.model.JsonModelBuilder; +import org.unidal.web.mvc.view.model.ModelHandler; import org.unidal.web.mvc.view.model.XmlModelBuilder; import com.dianping.cat.report.ReportModule; +import com.dianping.cat.service.ProjectService; import com.dianping.cat.system.SystemModule; +import com.dianping.cat.system.page.login.service.SigninService; class WebComponentConfigurator extends AbstractWebComponentsConfigurator { @SuppressWarnings("unchecked") @@ -56,6 +59,7 @@ public List defineComponents() { defineWebMvcComponents(all); defineModuleRegistry(all, ReportModule.class, ReportModule.class, SystemModule.class); + replaceSmallSystemPageHandlers(all); return all; } @@ -82,4 +86,28 @@ private void defineWebMvcComponents(List all) { all.add(A(XmlModelBuilder.class)); all.add(A(JsonModelBuilder.class)); } + + private void replaceSmallSystemPageHandlers(List all) { + removeComponent(all, com.dianping.cat.system.page.login.Handler.class); + removeComponent(all, com.dianping.cat.system.page.plugin.Handler.class); + removeComponent(all, com.dianping.cat.system.page.project.Handler.class); + + all.add(C(com.dianping.cat.system.page.login.Handler.class) // + .req(com.dianping.cat.system.page.login.JspViewer.class, (String) null, "m_jspViewer") // + .req(SigninService.class, (String) null, "m_signinService")); + all.add(C(com.dianping.cat.system.page.login.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.system.page.plugin.Handler.class) // + .req(com.dianping.cat.system.page.plugin.JspViewer.class, (String) null, "m_jspViewer")); + all.add(C(com.dianping.cat.system.page.plugin.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.system.page.project.Handler.class) // + .req(ProjectService.class, (String) null, "m_projectService") // + .req(com.dianping.cat.system.page.project.JspViewer.class, (String) null, "m_jspViewer")); + all.add(C(com.dianping.cat.system.page.project.JspViewer.class).req(ModelHandler.class)); + } + + private void removeComponent(List all, Class role) { + String roleName = role.getName(); + + all.removeIf(component -> roleName.equals(component.getModel().getRole())); + } } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/login/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/login/Handler.java index 3e31205b8d..991e55f5e6 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/login/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/login/Handler.java @@ -27,7 +27,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import org.unidal.web.jsp.function.CodecFunction; import org.unidal.web.mvc.ActionContext; import org.unidal.web.mvc.ErrorObject; @@ -48,10 +47,8 @@ public class Handler implements PageHandler { private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); - @Inject private JspViewer m_jspViewer; - @Inject private SigninService m_signinService; private SigninContext createSigninContext(Context ctx) { diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/plugin/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/plugin/Handler.java index 30e80ed1e3..dde0beb2ae 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/plugin/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/plugin/Handler.java @@ -30,7 +30,6 @@ import org.codehaus.plexus.util.StringUtils; import org.unidal.helper.Files; import org.unidal.helper.Files.AutoClose; -import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -39,7 +38,6 @@ import com.dianping.cat.system.SystemPage; public class Handler implements PageHandler { - @Inject private JspViewer m_jspViewer; // TODO make it configurable in database diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/project/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/project/Handler.java index 984eca6f8a..a7c72b2ab9 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/project/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/project/Handler.java @@ -26,7 +26,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -43,10 +42,8 @@ public class Handler implements PageHandler { private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); - @Inject public ProjectService m_projectService; - @Inject private JspViewer m_jspViewer; @Override diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 38702ea93e..a301dd9880 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -3681,27 +3681,6 @@ com.dianping.cat.system.SystemModule com.dianping.cat.system.SystemModule - - com.dianping.cat.system.page.login.Handler - com.dianping.cat.system.page.login.Handler - - - com.dianping.cat.system.page.login.JspViewer - - - com.dianping.cat.system.page.login.service.SigninService - - - - - com.dianping.cat.system.page.login.JspViewer - com.dianping.cat.system.page.login.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - com.dianping.cat.system.page.config.Handler com.dianping.cat.system.page.config.Handler @@ -3747,24 +3726,6 @@ - - com.dianping.cat.system.page.plugin.Handler - com.dianping.cat.system.page.plugin.Handler - - - com.dianping.cat.system.page.plugin.JspViewer - - - - - com.dianping.cat.system.page.plugin.JspViewer - com.dianping.cat.system.page.plugin.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - com.dianping.cat.system.page.router.Handler com.dianping.cat.system.page.router.Handler @@ -3786,27 +3747,6 @@ - - com.dianping.cat.system.page.project.Handler - com.dianping.cat.system.page.project.Handler - - - com.dianping.cat.service.ProjectService - - - com.dianping.cat.system.page.project.JspViewer - - - - - com.dianping.cat.system.page.project.JspViewer - com.dianping.cat.system.page.project.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - com.dianping.cat.system.page.business.Handler com.dianping.cat.system.page.business.Handler @@ -3874,6 +3814,71 @@ + + com.dianping.cat.system.page.login.Handler + com.dianping.cat.system.page.login.Handler + + + com.dianping.cat.system.page.login.JspViewer + m_jspViewer + + + com.dianping.cat.system.page.login.service.SigninService + m_signinService + + + + + com.dianping.cat.system.page.login.JspViewer + com.dianping.cat.system.page.login.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + + + com.dianping.cat.system.page.plugin.Handler + com.dianping.cat.system.page.plugin.Handler + + + com.dianping.cat.system.page.plugin.JspViewer + m_jspViewer + + + + + com.dianping.cat.system.page.plugin.JspViewer + com.dianping.cat.system.page.plugin.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + + + com.dianping.cat.system.page.project.Handler + com.dianping.cat.system.page.project.Handler + + + com.dianping.cat.service.ProjectService + m_projectService + + + com.dianping.cat.system.page.project.JspViewer + m_jspViewer + + + + + com.dianping.cat.system.page.project.JspViewer + com.dianping.cat.system.page.project.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.core.config.repository.ConfigRepository From 33ce07e4a43dc0a4de10c52a4426462ae9ae90f8 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 10:51:11 +0800 Subject: [PATCH 089/231] =?UTF-8?q?=E5=AE=8C=E6=88=90=20permission.Handler?= =?UTF-8?q?=20=E5=92=8C=20router.Handler=20=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/WebComponentConfigurator.java | 26 ++++- .../cat/system/page/permission/Handler.java | 5 - .../cat/system/page/router/Handler.java | 6 - .../resources/META-INF/plexus/components.xml | 105 ++++++++++-------- 4 files changed, 81 insertions(+), 61 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java index 5b3f8d0f33..2171ea094a 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java @@ -47,9 +47,17 @@ import org.unidal.web.mvc.view.model.XmlModelBuilder; import com.dianping.cat.report.ReportModule; +import com.dianping.cat.config.sample.SampleConfigManager; +import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.service.ProjectService; import com.dianping.cat.system.SystemModule; +import com.dianping.cat.system.page.config.ConfigHtmlParser; import com.dianping.cat.system.page.login.service.SigninService; +import com.dianping.cat.system.page.permission.ResourceConfigManager; +import com.dianping.cat.system.page.permission.UserConfigManager; +import com.dianping.cat.system.page.router.config.RouterConfigHandler; +import com.dianping.cat.system.page.router.config.RouterConfigManager; +import com.dianping.cat.system.page.router.service.CachedRouterConfigService; class WebComponentConfigurator extends AbstractWebComponentsConfigurator { @SuppressWarnings("unchecked") @@ -59,7 +67,7 @@ public List defineComponents() { defineWebMvcComponents(all); defineModuleRegistry(all, ReportModule.class, ReportModule.class, SystemModule.class); - replaceSmallSystemPageHandlers(all); + replaceSystemPageHandlers(all); return all; } @@ -87,10 +95,12 @@ private void defineWebMvcComponents(List all) { all.add(A(JsonModelBuilder.class)); } - private void replaceSmallSystemPageHandlers(List all) { + private void replaceSystemPageHandlers(List all) { removeComponent(all, com.dianping.cat.system.page.login.Handler.class); removeComponent(all, com.dianping.cat.system.page.plugin.Handler.class); removeComponent(all, com.dianping.cat.system.page.project.Handler.class); + removeComponent(all, com.dianping.cat.system.page.permission.Handler.class); + removeComponent(all, com.dianping.cat.system.page.router.Handler.class); all.add(C(com.dianping.cat.system.page.login.Handler.class) // .req(com.dianping.cat.system.page.login.JspViewer.class, (String) null, "m_jspViewer") // @@ -103,6 +113,18 @@ private void replaceSmallSystemPageHandlers(List all) { .req(ProjectService.class, (String) null, "m_projectService") // .req(com.dianping.cat.system.page.project.JspViewer.class, (String) null, "m_jspViewer")); all.add(C(com.dianping.cat.system.page.project.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.system.page.permission.Handler.class) // + .req(com.dianping.cat.system.page.permission.JspViewer.class, (String) null, "m_jspViewer") // + .req(UserConfigManager.class, (String) null, "m_userConfigManager") // + .req(ResourceConfigManager.class, (String) null, "m_resourceConfigManager") // + .req(ConfigHtmlParser.class, (String) null, "m_configHtmlParser")); + all.add(C(com.dianping.cat.system.page.permission.JspViewer.class).req(ModelHandler.class)); + all.add(C(com.dianping.cat.system.page.router.Handler.class) // + .req(CachedRouterConfigService.class, (String) null, "m_cachedReportService") // + .req(RouterConfigManager.class, (String) null, "m_configManager") // + .req(SampleConfigManager.class, (String) null, "m_sampleConfigManager") // + .req(ServerFilterConfigManager.class, (String) null, "m_filterManager") // + .req(RouterConfigHandler.class, (String) null, "m_routerConfigHandler")); } private void removeComponent(List all, Class role) { diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/Handler.java index 280c4a5206..91424b6355 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/Handler.java @@ -22,7 +22,6 @@ import java.io.IOException; import org.codehaus.plexus.util.StringUtils; -import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -34,16 +33,12 @@ public class Handler implements PageHandler { - @Inject private JspViewer m_jspViewer; - @Inject private UserConfigManager m_userConfigManager; - @Inject private ResourceConfigManager m_resourceConfigManager; - @Inject private ConfigHtmlParser m_configHtmlParser; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java index 58b8e897a4..1645cb7933 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/Handler.java @@ -29,7 +29,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -50,19 +49,14 @@ public class Handler implements PageHandler { private static final Logger LOGGER = LoggerFactory.getLogger(Handler.class); - @Inject private CachedRouterConfigService m_cachedReportService; - @Inject private RouterConfigManager m_configManager; - @Inject private SampleConfigManager m_sampleConfigManager; - @Inject private ServerFilterConfigManager m_filterManager; - @Inject private RouterConfigHandler m_routerConfigHandler; private String buildRouterInfo(String ip, String domain, RouterConfig config) { diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index a301dd9880..989f3c7c82 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -3726,27 +3726,6 @@ - - com.dianping.cat.system.page.router.Handler - com.dianping.cat.system.page.router.Handler - - - com.dianping.cat.system.page.router.service.CachedRouterConfigService - - - com.dianping.cat.system.page.router.config.RouterConfigManager - - - com.dianping.cat.config.sample.SampleConfigManager - - - com.dianping.cat.config.server.ServerFilterConfigManager - - - com.dianping.cat.system.page.router.config.RouterConfigHandler - - - com.dianping.cat.system.page.business.Handler com.dianping.cat.system.page.business.Handler @@ -3787,33 +3766,6 @@ com.dianping.cat.system.page.business.config.BusinessTagConfigManager com.dianping.cat.system.page.business.config.BusinessTagConfigManager - - com.dianping.cat.system.page.permission.Handler - com.dianping.cat.system.page.permission.Handler - - - com.dianping.cat.system.page.permission.JspViewer - - - com.dianping.cat.system.page.permission.UserConfigManager - - - com.dianping.cat.system.page.permission.ResourceConfigManager - - - com.dianping.cat.system.page.config.ConfigHtmlParser - - - - - com.dianping.cat.system.page.permission.JspViewer - com.dianping.cat.system.page.permission.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - com.dianping.cat.system.page.login.Handler com.dianping.cat.system.page.login.Handler @@ -3879,6 +3831,63 @@ + + com.dianping.cat.system.page.permission.Handler + com.dianping.cat.system.page.permission.Handler + + + com.dianping.cat.system.page.permission.JspViewer + m_jspViewer + + + com.dianping.cat.system.page.permission.UserConfigManager + m_userConfigManager + + + com.dianping.cat.system.page.permission.ResourceConfigManager + m_resourceConfigManager + + + com.dianping.cat.system.page.config.ConfigHtmlParser + m_configHtmlParser + + + + + com.dianping.cat.system.page.permission.JspViewer + com.dianping.cat.system.page.permission.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + + + com.dianping.cat.system.page.router.Handler + com.dianping.cat.system.page.router.Handler + + + com.dianping.cat.system.page.router.service.CachedRouterConfigService + m_cachedReportService + + + com.dianping.cat.system.page.router.config.RouterConfigManager + m_configManager + + + com.dianping.cat.config.sample.SampleConfigManager + m_sampleConfigManager + + + com.dianping.cat.config.server.ServerFilterConfigManager + m_filterManager + + + com.dianping.cat.system.page.router.config.RouterConfigHandler + m_routerConfigHandler + + + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.core.config.repository.ConfigRepository From a7fa6e85ea13369f7d23a8bac3d676266e960256 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 11:02:31 +0800 Subject: [PATCH 090/231] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E5=8C=96=20system=20?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=20Handler=20=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/build/WebComponentConfigurator.java | 37 ++++ .../cat/system/page/business/Handler.java | 8 - .../cat/system/page/config/Handler.java | 11 -- .../resources/META-INF/plexus/components.xml | 187 ++++++++++-------- 4 files changed, 139 insertions(+), 104 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java index 2171ea094a..4f075d51d1 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/WebComponentConfigurator.java @@ -47,11 +47,24 @@ import org.unidal.web.mvc.view.model.XmlModelBuilder; import com.dianping.cat.report.ReportModule; +import com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator; +import com.dianping.cat.config.business.BusinessConfigManager; import com.dianping.cat.config.sample.SampleConfigManager; import com.dianping.cat.config.server.ServerFilterConfigManager; +import com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository; +import com.dianping.cat.report.alert.business.BusinessRuleConfigManager; import com.dianping.cat.service.ProjectService; import com.dianping.cat.system.SystemModule; +import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; import com.dianping.cat.system.page.config.ConfigHtmlParser; +import com.dianping.cat.system.page.config.processor.AlertConfigProcessor; +import com.dianping.cat.system.page.config.processor.DependencyConfigProcessor; +import com.dianping.cat.system.page.config.processor.EventConfigProcessor; +import com.dianping.cat.system.page.config.processor.ExceptionConfigProcessor; +import com.dianping.cat.system.page.config.processor.GlobalConfigProcessor; +import com.dianping.cat.system.page.config.processor.HeartbeatConfigProcessor; +import com.dianping.cat.system.page.config.processor.StorageConfigProcessor; +import com.dianping.cat.system.page.config.processor.TransactionConfigProcessor; import com.dianping.cat.system.page.login.service.SigninService; import com.dianping.cat.system.page.permission.ResourceConfigManager; import com.dianping.cat.system.page.permission.UserConfigManager; @@ -101,6 +114,8 @@ private void replaceSystemPageHandlers(List all) { removeComponent(all, com.dianping.cat.system.page.project.Handler.class); removeComponent(all, com.dianping.cat.system.page.permission.Handler.class); removeComponent(all, com.dianping.cat.system.page.router.Handler.class); + removeComponent(all, com.dianping.cat.system.page.business.Handler.class); + removeComponent(all, com.dianping.cat.system.page.config.Handler.class); all.add(C(com.dianping.cat.system.page.login.Handler.class) // .req(com.dianping.cat.system.page.login.JspViewer.class, (String) null, "m_jspViewer") // @@ -125,6 +140,28 @@ private void replaceSystemPageHandlers(List all) { .req(SampleConfigManager.class, (String) null, "m_sampleConfigManager") // .req(ServerFilterConfigManager.class, (String) null, "m_filterManager") // .req(RouterConfigHandler.class, (String) null, "m_routerConfigHandler")); + all.add(C(com.dianping.cat.system.page.business.Handler.class) // + .req(RuleFTLDecorator.class, (String) null, "m_ruleDecorator") // + .req(com.dianping.cat.system.page.business.JspViewer.class, (String) null, "m_jspViewer") // + .req(ProjectService.class, (String) null, "m_projectService") // + .req(BusinessConfigManager.class, (String) null, "m_configManager") // + .req(BusinessTagConfigManager.class, (String) null, "m_tagConfigManger") // + .req(BusinessRuleConfigManager.class, (String) null, "m_alertConfigManager") // + .req(ConfigHtmlParser.class, (String) null, "m_configHtmlParser")); + all.add(C(com.dianping.cat.system.page.business.JspViewer.class).req(ModelHandler.class)); + all.add(C(BusinessTagConfigManager.class)); + all.add(C(com.dianping.cat.system.page.config.Handler.class) // + .req(com.dianping.cat.system.page.config.JspViewer.class, (String) null, "m_jspViewer") // + .req(GlobalConfigProcessor.class, (String) null, "m_globalConfigProcessor") // + .req(DependencyConfigProcessor.class, (String) null, "m_topologyConfigProcessor") // + .req(ExceptionConfigProcessor.class, (String) null, "m_exceptionConfigProcessor") // + .req(HeartbeatConfigProcessor.class, (String) null, "m_heartbeatConfigProcessor") // + .req(AlertConfigProcessor.class, (String) null, "m_alertConfigProcessor") // + .req(TransactionConfigProcessor.class, (String) null, "m_transactionConfigProcessor") // + .req(EventConfigProcessor.class, (String) null, "m_eventConfigProcessor") // + .req(StorageConfigProcessor.class, (String) null, "m_storageConfigProcessor") // + .req(ConfigModificationRepository.class, (String) null, "m_configModificationDao")); + all.add(C(com.dianping.cat.system.page.config.JspViewer.class).req(ModelHandler.class)); } private void removeComponent(List all, Class role) { diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java index 44e16f7298..b275c9a32a 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java @@ -27,7 +27,6 @@ import java.util.Map; import java.util.Set; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.util.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; @@ -52,25 +51,18 @@ public class Handler implements PageHandler { - @Inject protected RuleFTLDecorator m_ruleDecorator; - @Inject private JspViewer m_jspViewer; - @Inject private ProjectService m_projectService; - @Inject private BusinessConfigManager m_configManager; - @Inject private BusinessTagConfigManager m_tagConfigManger; - @Inject private BusinessRuleConfigManager m_alertConfigManager; - @Inject private ConfigHtmlParser m_configHtmlParser; @Override diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java index 7a44dbefa0..e5eec6a67b 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java @@ -24,7 +24,6 @@ import java.net.URLDecoder; import java.util.Date; -import org.unidal.lookup.annotation.Inject; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -47,34 +46,24 @@ import com.dianping.cat.spring.CatSpringContext; public class Handler implements PageHandler { - @Inject private JspViewer m_jspViewer; - @Inject private GlobalConfigProcessor m_globalConfigProcessor; - @Inject private DependencyConfigProcessor m_topologyConfigProcessor; - @Inject private ExceptionConfigProcessor m_exceptionConfigProcessor; - @Inject private HeartbeatConfigProcessor m_heartbeatConfigProcessor; - @Inject private AlertConfigProcessor m_alertConfigProcessor; - @Inject private TransactionConfigProcessor m_transactionConfigProcessor; - @Inject private EventConfigProcessor m_eventConfigProcessor; - @Inject private StorageConfigProcessor m_storageConfigProcessor; - @Inject private ConfigModificationRepository m_configModificationDao; @Override diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 989f3c7c82..ddf3d619fa 100644 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -3681,91 +3681,6 @@ com.dianping.cat.system.SystemModule com.dianping.cat.system.SystemModule - - com.dianping.cat.system.page.config.Handler - com.dianping.cat.system.page.config.Handler - - - com.dianping.cat.system.page.config.JspViewer - - - com.dianping.cat.system.page.config.processor.GlobalConfigProcessor - - - com.dianping.cat.system.page.config.processor.DependencyConfigProcessor - - - com.dianping.cat.system.page.config.processor.ExceptionConfigProcessor - - - com.dianping.cat.system.page.config.processor.HeartbeatConfigProcessor - - - com.dianping.cat.system.page.config.processor.AlertConfigProcessor - - - com.dianping.cat.system.page.config.processor.TransactionConfigProcessor - - - com.dianping.cat.system.page.config.processor.EventConfigProcessor - - - com.dianping.cat.system.page.config.processor.StorageConfigProcessor - - - com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository - - - - - com.dianping.cat.system.page.config.JspViewer - com.dianping.cat.system.page.config.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - - - com.dianping.cat.system.page.business.Handler - com.dianping.cat.system.page.business.Handler - - - com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator - - - com.dianping.cat.system.page.business.JspViewer - - - com.dianping.cat.service.ProjectService - - - com.dianping.cat.config.business.BusinessConfigManager - - - com.dianping.cat.system.page.business.config.BusinessTagConfigManager - - - com.dianping.cat.report.alert.business.BusinessRuleConfigManager - - - com.dianping.cat.system.page.config.ConfigHtmlParser - - - - - com.dianping.cat.system.page.business.JspViewer - com.dianping.cat.system.page.business.JspViewer - - - org.unidal.web.mvc.view.model.ModelHandler - - - - - com.dianping.cat.system.page.business.config.BusinessTagConfigManager - com.dianping.cat.system.page.business.config.BusinessTagConfigManager - com.dianping.cat.system.page.login.Handler com.dianping.cat.system.page.login.Handler @@ -3888,6 +3803,108 @@ + + com.dianping.cat.system.page.business.Handler + com.dianping.cat.system.page.business.Handler + + + com.dianping.cat.alarm.spi.decorator.RuleFTLDecorator + m_ruleDecorator + + + com.dianping.cat.system.page.business.JspViewer + m_jspViewer + + + com.dianping.cat.service.ProjectService + m_projectService + + + com.dianping.cat.config.business.BusinessConfigManager + m_configManager + + + com.dianping.cat.system.page.business.config.BusinessTagConfigManager + m_tagConfigManger + + + com.dianping.cat.report.alert.business.BusinessRuleConfigManager + m_alertConfigManager + + + com.dianping.cat.system.page.config.ConfigHtmlParser + m_configHtmlParser + + + + + com.dianping.cat.system.page.business.JspViewer + com.dianping.cat.system.page.business.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + + + com.dianping.cat.system.page.business.config.BusinessTagConfigManager + com.dianping.cat.system.page.business.config.BusinessTagConfigManager + + + com.dianping.cat.system.page.config.Handler + com.dianping.cat.system.page.config.Handler + + + com.dianping.cat.system.page.config.JspViewer + m_jspViewer + + + com.dianping.cat.system.page.config.processor.GlobalConfigProcessor + m_globalConfigProcessor + + + com.dianping.cat.system.page.config.processor.DependencyConfigProcessor + m_topologyConfigProcessor + + + com.dianping.cat.system.page.config.processor.ExceptionConfigProcessor + m_exceptionConfigProcessor + + + com.dianping.cat.system.page.config.processor.HeartbeatConfigProcessor + m_heartbeatConfigProcessor + + + com.dianping.cat.system.page.config.processor.AlertConfigProcessor + m_alertConfigProcessor + + + com.dianping.cat.system.page.config.processor.TransactionConfigProcessor + m_transactionConfigProcessor + + + com.dianping.cat.system.page.config.processor.EventConfigProcessor + m_eventConfigProcessor + + + com.dianping.cat.system.page.config.processor.StorageConfigProcessor + m_storageConfigProcessor + + + com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository + m_configModificationDao + + + + + com.dianping.cat.system.page.config.JspViewer + com.dianping.cat.system.page.config.JspViewer + + + org.unidal.web.mvc.view.model.ModelHandler + + + com.dianping.cat.core.config.repository.ConfigRepository com.dianping.cat.core.config.repository.ConfigRepository From 63fb86d30ef68ec4d150826308143f97ed88f796 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 11:08:58 +0800 Subject: [PATCH 091/231] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BA=86=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=BA=90=E7=A0=81=E9=87=8C=E5=89=A9=E4=BD=99=E7=9A=84?= =?UTF-8?q?=20Unidal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/com/dianping/cat/consumer/cross/Configurator.java | 2 -- .../test/java/com/dianping/cat/consumer/event/Configurator.java | 2 -- .../java/com/dianping/cat/consumer/heartbeat/Configurator.java | 2 -- .../java/com/dianping/cat/consumer/matrix/Configurator.java | 2 -- .../dianping/cat/consumer/performance/CrossConfigurator.java | 2 -- .../dianping/cat/consumer/performance/EventConfigurator.java | 2 -- .../dianping/cat/consumer/performance/MatrixConfigurator.java | 2 -- .../dianping/cat/consumer/performance/ProblemConfigurator.java | 2 -- .../cat/consumer/performance/TransactionConfigurator.java | 2 -- .../java/com/dianping/cat/consumer/problem/Configurator.java | 2 -- .../test/java/com/dianping/cat/consumer/state/Configurator.java | 2 -- .../test/java/com/dianping/cat/consumer/top/Configurator.java | 2 -- .../com/dianping/cat/consumer/transaction/Configurator.java | 2 -- .../com/dianping/cat/report/analyzer/MonthlyMaxTpsAnalyzer.java | 2 -- 14 files changed, 28 deletions(-) diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/Configurator.java index 1065d7e53b..789a0722dd 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/Configurator.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/Configurator.java @@ -23,7 +23,6 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -64,7 +63,6 @@ public static class MockCrossReportManager extends MockReportManager m_delegate; @Override diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/event/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/event/Configurator.java index eca3b6fd86..88108fb7ef 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/event/Configurator.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/event/Configurator.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -59,7 +58,6 @@ public static class ExtendedEventDelegate extends EventDelegate { public static class MockEventReportManager extends MockReportManager { private EventReport m_report; - @Inject private ReportDelegate m_delegate; @Override diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/Configurator.java index e48518caf6..8a899ebae0 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/Configurator.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/Configurator.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -59,7 +58,6 @@ public static class ExtendedHeartbeatDelegate extends HeartbeatDelegate { public static class MockHeartbeatReportManager extends MockReportManager { private HeartbeatReport m_report; - @Inject private ReportDelegate m_delegate; @Override diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/Configurator.java index e6fc27ec1d..b941413f81 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/Configurator.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/Configurator.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -59,7 +58,6 @@ public static class ExtendedMatrixDelegate extends MatrixDelegate { public static class MockMatrixReportManager extends MockReportManager { private MatrixReport m_report; - @Inject private ReportDelegate m_delegate; @Override diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/CrossConfigurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/CrossConfigurator.java index 1325471cc8..014a2b79fc 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/CrossConfigurator.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/CrossConfigurator.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -61,7 +60,6 @@ public static class ExtendedCrossDelegate extends CrossDelegate { public static class MockCrossReportManager extends MockReportManager { private CrossReport m_report; - @Inject private ReportDelegate m_delegate; @Override diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/EventConfigurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/EventConfigurator.java index a679324fd9..ae12aa53fb 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/EventConfigurator.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/EventConfigurator.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -61,7 +60,6 @@ public static class ExtendedEventDelegate extends EventDelegate { public static class MockEventReportManager extends MockReportManager { private EventReport m_report; - @Inject private ReportDelegate m_delegate; @Override diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/MatrixConfigurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/MatrixConfigurator.java index 452b8a3b0e..621d3eed8b 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/MatrixConfigurator.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/MatrixConfigurator.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -61,7 +60,6 @@ public static class ExtendedMatrixDelegate extends MatrixDelegate { public static class MockMatrixReportManager extends MockReportManager { private MatrixReport m_report; - @Inject private ReportDelegate m_delegate; @Override diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/ProblemConfigurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/ProblemConfigurator.java index 414ab1e4fc..8d7ad504e0 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/ProblemConfigurator.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/ProblemConfigurator.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -61,7 +60,6 @@ public static class ExtendedProblemDelegate extends ProblemDelegate { public static class MockProblemReportManager extends MockReportManager { private ProblemReport m_report; - @Inject private ReportDelegate m_delegate; @Override diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/TransactionConfigurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/TransactionConfigurator.java index e11c5fdbab..5a9fb7e711 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/TransactionConfigurator.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/TransactionConfigurator.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -61,7 +60,6 @@ public static class ExtendedTransactionDelegate extends TransactionDelegate { public static class MockTransactionReportManager extends MockReportManager { private TransactionReport m_report; - @Inject private ReportDelegate m_delegate; @Override diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/Configurator.java index c03a3d42d2..01c5274bbb 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/Configurator.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/Configurator.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -59,7 +58,6 @@ public static class ExtendedProblemDelegate extends ProblemDelegate { public static class MockProblemReportManager extends MockReportManager { private ProblemReport m_report; - @Inject private ReportDelegate m_delegate; @Override diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/state/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/state/Configurator.java index 71905fb01c..d32d3d4838 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/state/Configurator.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/state/Configurator.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -64,7 +63,6 @@ public static class ExtendedStateDelegate extends StateDelegate { public static class MockStateReportManager extends MockReportManager { private StateReport m_report; - @Inject private ReportDelegate m_delegate; @Override diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/top/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/top/Configurator.java index 750d2a79d3..30205aef92 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/top/Configurator.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/top/Configurator.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -59,7 +58,6 @@ public static class ExtendedTopDelegate extends TopDelegate { public static class MockTopReportManager extends MockReportManager { private TopReport m_report; - @Inject private ReportDelegate m_delegate; @Override diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/Configurator.java index 33cacf406e..8c8b45f9c9 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/Configurator.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/Configurator.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.configuration.AbstractResourceConfigurator; import org.unidal.lookup.configuration.Component; @@ -59,7 +58,6 @@ public static class ExtendedTransactionDelegate extends TransactionDelegate { public static class MockTransactionReportManager extends MockReportManager { private TransactionReport m_report; - @Inject private ReportDelegate m_delegate; @Override diff --git a/cat-home/src/test/java/com/dianping/cat/report/analyzer/MonthlyMaxTpsAnalyzer.java b/cat-home/src/test/java/com/dianping/cat/report/analyzer/MonthlyMaxTpsAnalyzer.java index c93ee6e7c1..f2726bd978 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/analyzer/MonthlyMaxTpsAnalyzer.java +++ b/cat-home/src/test/java/com/dianping/cat/report/analyzer/MonthlyMaxTpsAnalyzer.java @@ -27,7 +27,6 @@ import org.junit.Test; import org.unidal.lookup.ComponentTestCase; -import org.unidal.lookup.annotation.Inject; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.consumer.transaction.model.entity.Machine; @@ -45,7 +44,6 @@ public class MonthlyMaxTpsAnalyzer extends ComponentTestCase { private SimpleDateFormat m_sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - @Inject private TransactionReportService m_reportService; private Map m_infos = new LinkedHashMap(); From d8ae8f1da69d55c99996d252ace80b0be6dc9372 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 11:43:47 +0800 Subject: [PATCH 092/231] =?UTF-8?q?=E6=B8=85=E7=90=86=E4=BD=8E=E9=A3=8E?= =?UTF-8?q?=E9=99=A9=20Unidal=20=E5=B7=A5=E5=85=B7=E7=B1=BB=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SPRING_CONTEXT_MIGRATION_PLAN.md | 185 ++++++++++++++++++ .../business/BusinessAnalyzerTest.java | 3 +- .../business/BusinessReportMergerTest.java | 7 +- .../cat/consumer/cross/CrossAnalyzerTest.java | 5 +- .../consumer/cross/CrossReportMergerTest.java | 7 +- .../consumer/dump/StoragePerformanceTest.java | 19 +- .../cat/consumer/event/EventAnalyzerTest.java | 3 +- .../consumer/event/EventReportMergerTest.java | 7 +- .../heartbeat/HeartbeatAnalyzerTest.java | 5 +- .../heartbeat/HeartbeatReportMergerTest.java | 7 +- .../consumer/matrix/MatrixAnalyzerTest.java | 3 +- .../cat/consumer/matrix/MatrixModelTest.java | 5 +- .../matrix/MatrixReportMergerTest.java | 7 +- .../consumer/problem/ProblemAnalyzerTest.java | 3 +- .../consumer/problem/ProblemFilterTest.java | 5 +- .../problem/ProblemReportConvertorTest.java | 5 +- .../problem/ProblemReportMergerTest.java | 7 +- .../consumer/problem/ProblemReportTest.java | 3 +- .../cat/consumer/state/StateAnalyzerTest.java | 3 +- .../consumer/state/StateReportMergerTest.java | 7 +- .../cat/consumer/top/TopAnalyzerTest.java | 3 +- .../cat/consumer/top/TopReportMergerTest.java | 7 +- .../transaction/TransactionAnalyzerTest.java | 3 +- .../TransactionReportMergerTest.java | 9 +- .../transaction/TransactionReportTest.java | 3 +- .../DefaultMessagePathBuilderTest.java | 6 +- .../cat/server/ServerConfigVisitorTest.java | 10 +- .../unidal/cat/message/storage/IndexTest.java | 17 +- .../cat/message/storage/TokenMappingTest.java | 18 +- .../cat/report/alert/event/EventAlert.java | 2 +- .../alert/transaction/TransactionAlert.java | 2 +- .../business/graph/BusinessGraphCreator.java | 2 +- .../report/page/cross/display/HostInfo.java | 2 +- .../graph/TopologyGraphBuilder.java | 2 +- .../task/EventReportDailyGraphCreator.java | 2 +- .../task/EventReportHourlyGraphCreator.java | 2 +- .../transform/DistributionDetailVisitor.java | 2 +- .../event/transform/PieGraphChartVisitor.java | 2 +- .../task/ProblemReportDailyGraphCreator.java | 2 +- .../task/ProblemReportHourlyGraphCreator.java | 2 +- .../problem/transform/DetailStatistics.java | 2 +- .../transform/HourlyLineChartVisitor.java | 2 +- .../transform/PieGraphChartVisitor.java | 2 +- .../transform/HourlyLineChartVisitor.java | 2 +- .../TransactionReportDailyGraphCreator.java | 2 +- .../TransactionReportHourlyGraphCreator.java | 2 +- .../transform/DistributionDetailVisitor.java | 2 +- .../transform/PieGraphChartVisitor.java | 2 +- .../transform/TransactionMergeHelper.java | 2 +- .../processor/AlertConfigProcessor.java | 2 +- .../processor/HeartbeatConfigProcessor.java | 2 +- .../cat/system/page/permission/Handler.java | 2 +- .../cat/system/page/plugin/Handler.java | 2 +- .../src/test/java/com/dianping/cat/Api.java | 2 +- .../test/java/com/dianping/cat/TestApi.java | 2 +- .../cat/demo/DatabaseDataFetcher.java | 3 +- .../java/com/dianping/cat/demo/TestCode.java | 2 +- .../java/com/dianping/cat/demo/TestHttp.java | 3 +- .../alert/MetricIdAndRuleMappingTest.java | 3 +- .../cat/report/alert/RuleConfigTest.java | 3 +- .../report/analyzer/TopologyGraphTest.java | 3 +- .../page/cross/CrossReportMergerTest.java | 7 +- .../page/event/EventReportFilterTest.java | 7 +- .../event/EventTrendGraphBuilderTest.java | 5 +- .../page/problem/ProblemReportMergerTest.java | 9 +- .../problem/ProblemTrendGraphBuilderTest.java | 3 +- .../page/state/StateReportMergerTest.java | 7 +- .../TransactionReportFilterTest.java | 7 +- .../TransactionTrendGraphBuilderTest.java | 5 +- .../cat/report/task/ConfigsBackupTest.java | 3 +- .../task/event/EventGraphCreatorTest.java | 11 +- .../task/event/HistoryEventMergerTest.java | 5 +- .../heartbeat/HeartbeatDailyMergerTest.java | 5 +- .../task/heavy/HeavyReportBuilderTest.java | 7 +- .../report/task/metric/AlertConfigTest.java | 3 +- .../ProblemReportDailyGraphCreatorTest.java | 9 +- .../ProblemReportHourlyGraphCreatorTest.java | 7 +- .../service/ClientReportStatisticsTest.java | 7 +- .../task/service/ServiceReportMergerTest.java | 7 +- .../HistoryStorageReportMergerTest.java | 5 +- .../HistoryTransactionMergerTest.java | 7 +- .../TransactionReportGraphCreatorTest.java | 15 +- .../UtilizationReportMergerTest.java | 7 +- pom.xml | 44 +++++ 84 files changed, 426 insertions(+), 207 deletions(-) diff --git a/SPRING_CONTEXT_MIGRATION_PLAN.md b/SPRING_CONTEXT_MIGRATION_PLAN.md index 38627f87ea..2420222964 100644 --- a/SPRING_CONTEXT_MIGRATION_PLAN.md +++ b/SPRING_CONTEXT_MIGRATION_PLAN.md @@ -1160,6 +1160,191 @@ mvn -pl cat-home -am -DskipTests compile mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" ``` +## 19. 终极目标:移除 Unidal / Plexus 相关依赖的后续路线 + +本节记录 2026-06-14 之后的后续操作计划。当前 `@Named` / `@Inject` lookup 注解已经基本清空,但项目距离彻底移除 Unidal / Plexus 依赖仍有明显距离。后续重点需要从“注解迁移”切换到“依赖拆解”。 + +### 19.1 当前依赖面分层 + +当前剩余依赖大致分为四层: + +1. 构建期依赖 + +```text +org.unidal.maven.plugins:codegen-maven-plugin +org.unidal.maven.plugins:plexus-maven-plugin +``` + +这两类插件仍负责生成 DAL model、DAL JDBC 代码,以及 `META-INF/plexus/components.xml`。在 DAL、MVC、运行时容器完全替换前,不应直接删除。 + +2. 运行时容器和 descriptor + +```text +META-INF/plexus/components.xml +org.unidal.lookup.* +org.codehaus.plexus.* +``` + +这部分仍承载旧容器的组件注册、`lookup(...)`、`lookupMap(...)`、生命周期初始化和 fallback 链路。当前不能一次性删除。 + +3. Web MVC 依赖 + +```text +org.unidal.web.mvc.* +org.unidal.web.MVC +BaseJspViewer +PageHandler +ActionContext +PayloadMeta / ModelMeta / FieldMeta +``` + +这部分影响 `/cat/r/*`、`/cat/s/*` 路由、页面 handler、payload、model、JSP viewer 和 servlet 初始化链路,属于高风险迁移项,应放在中后期。 + +4. 工具类 / 辅助类 / 测试基建 + +```text +org.unidal.helper.* +org.unidal.tuple.Pair +org.unidal.lookup.util.StringUtils +org.codehaus.plexus.util.StringUtils +org.unidal.lookup.ComponentTestCase +lookup(...) in tests +``` + +这部分风险相对低,适合作为下一阶段的入口,用小批量替换逐步缩小 Unidal 依赖面。 + +### 19.2 推荐拆除顺序 + +后续建议按以下顺序推进: + +1. 建立依赖清单和防回归检查。 +2. 替换低风险工具类和辅助类。 +3. 清理测试中的 `ComponentTestCase` / `lookup(...)`。 +4. 迁移剩余 `lookupMap(...)` 扩展点管理器。 +5. 替换或隔离 Unidal Web MVC。 +6. 替换或隔离 Unidal DAL / codegen。 +7. 移除 `plexus-maven-plugin` 和 `components.xml` 生成链路。 +8. 最后移除根 POM 中 Unidal / Plexus 相关依赖和仓库配置。 + +### 19.3 下一步具体执行项 + +下一步不建议直接删除 POM 依赖,而是先做“依赖清单 + 第一批低风险替换”。 + +执行项如下: + +1. 生成按模块统计的源码引用清单: + +```powershell +rg -n "org\.unidal\.lookup|org\.unidal\.web\.mvc|org\.unidal\.dal\.jdbc|org\.unidal\.helper|org\.unidal\.tuple|org\.codehaus\.plexus" --glob "**/src/**/*.{java,scala,xml}" . +``` + +输出需要按模块分组,区分: + +```text +cat-client +cat-core +cat-consumer +cat-hadoop +cat-alarm +cat-home +cat-boot +integration +``` + +2. 先替换低风险工具类: + +```text +org.codehaus.plexus.util.StringUtils +org.unidal.lookup.util.StringUtils +org.unidal.tuple.Pair +org.unidal.helper.Files +org.unidal.helper.Splitters +org.unidal.helper.Urls +``` + +替换原则: + +```text +StringUtils -> JDK / Spring / Apache Commons Lang 中已存在能力 +Pair -> Java record / Map.Entry / Spring Pair / 局部小对象 +Files -> java.nio.file.Files +Urls -> java.net.URI / URL / URLEncoder / UriComponentsBuilder +Splitters -> JDK String split / Pattern / Stream +``` + +每一批只替换一个工具类族,避免同时改动业务语义和依赖边界。 + +3. 优先选择不影响启动链路的目录: + +```text +cat-home/src/main/java/com/dianping/cat/report/page/*/transform +cat-home/src/main/java/com/dianping/cat/report/page/*/graph +cat-home/src/main/java/com/dianping/cat/report/page/*/display +cat-consumer/src/test/java +cat-core/src/test/java +``` + +暂缓目录: + +```text +cat-home/src/main/java/com/dianping/cat/*/Handler.java +cat-home/src/main/java/com/dianping/cat/*/Payload.java +cat-home/src/main/java/com/dianping/cat/*/Model.java +cat-home/src/main/java/com/dianping/cat/*/JspViewer.java +CatServlet / CatHomeModule / Web MVC 初始化链路 +DAL repository / DAO / codegen 生成类 +``` + +4. 替换后执行精确扫描: + +```powershell +rg -n "org\.unidal\.lookup\.util\.StringUtils|org\.codehaus\.plexus\.util\.StringUtils|org\.unidal\.tuple\.Pair|org\.unidal\.helper\.(Files|Splitters|Urls)" --glob "**/src/**/*.{java,scala}" . +``` + +5. 执行 Maven 验证: + +```powershell +mvn validate +mvn -pl cat-home -am -DskipTests compile +mvn -pl cat-boot -am package -DskipTests "-Dmaven.javadoc.skip=true" +``` + +如果只改测试代码,则至少执行: + +```powershell +mvn -pl cat-consumer,cat-home -am -DskipTests test-compile +``` + +### 19.4 暂时不要做的事 + +在完成工具类、测试基建、`lookupMap(...)` 和 Web MVC 替换前,暂时不要执行以下操作: + +1. 不要删除根 POM 中的 `org.unidal.framework` 依赖。 +2. 不要删除 `org.unidal.maven.plugins:codegen-maven-plugin`。 +3. 不要删除 `org.unidal.maven.plugins:plexus-maven-plugin`。 +4. 不要删除任何 `META-INF/plexus/components.xml`。 +5. 不要全量替换 `org.unidal.web.mvc.*`。 +6. 不要一次性重写 DAL / DAO / Repository 层。 +7. 不要因为看到第三方 `@Inject` 就全局禁用 `@Inject`;当前只应禁止 `org.unidal.lookup.annotation.Inject` 和 `org.unidal.lookup.annotation.Named`。 + +### 19.5 当前已加入的防回归检查 + +已在父 `pom.xml` 中加入 validate 阶段检查,禁止源码重新引入: + +```text +import org.unidal.lookup.annotation.Inject; +import org.unidal.lookup.annotation.Named; +``` + +该检查不会误伤以下第三方注入: + +```text +org.elasticsearch.common.inject.Inject +javax.inject.Inject +``` + +后续可以逐步扩展防回归规则,但每次只能禁止已经完成替换并验证通过的依赖族。 + ### 当前阶段判断 项目仍然不能直接移除 Plexus / Unidal 依赖。当前大致完成度约为: diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/business/BusinessAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/business/BusinessAnalyzerTest.java index 8d8c79c7f6..cf618d002a 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/business/BusinessAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/business/BusinessAnalyzerTest.java @@ -24,7 +24,6 @@ //import org.junit.Assert; //import org.junit.Before; //import org.junit.Test; -//import org.unidal.helper.Files; //import org.unidal.lookup.ComponentTestCase; // //import com.dianping.cat.Constants; @@ -67,7 +66,7 @@ // } // // BusinessReport report = m_analyzer.getReport(m_domain); -// String expected = Files.forIO().readFrom(getClass().getResourceAsStream("business_analyzer.xml"), "utf-8"); +// String expected = new String(getClass().getResourceAsStream("business_analyzer.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); // // Assert.assertEquals(expected.replaceAll("\r", ""), report.toString().replaceAll("\r", "")); // } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/business/BusinessReportMergerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/business/BusinessReportMergerTest.java index ee0bf567b9..07341422a9 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/business/BusinessReportMergerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/business/BusinessReportMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.business.model.entity.BusinessReport; import com.dianping.cat.consumer.business.model.transform.DefaultSaxParser; @@ -29,11 +28,11 @@ public class BusinessReportMergerTest { @Test public void testBusinessReportMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("business_base.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("business_merger.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("business_base.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("business_merger.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); BusinessReport reportOld = DefaultSaxParser.parse(oldXml); BusinessReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("business_merger_result.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("business_merger_result.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); BusinessReportMerger merger = new BusinessReportMerger(new BusinessReport(reportOld.getDomain())); reportOld.accept(merger); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossAnalyzerTest.java index f3ec92c154..9c2c2b7ca0 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossAnalyzerTest.java @@ -25,7 +25,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.helper.Files; import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; @@ -70,11 +69,11 @@ public void testProcess() throws Exception { } CrossReport report = m_analyzer.getReport(m_domain); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("cross_analyzer.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("cross_analyzer.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); Assert.assertEquals(expected.replaceAll("\r", ""), report.toString().replaceAll("\r", "")); CrossReport reportCaller = m_analyzer.getReport("server"); - String expectedCaller = Files.forIO().readFrom(getClass().getResourceAsStream("cross_analyzer_caller.xml"), "utf-8"); + String expectedCaller = new String(getClass().getResourceAsStream("cross_analyzer_caller.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); Assert.assertEquals(expectedCaller.replaceAll("\r", ""), reportCaller.toString().replaceAll("\r", "")); } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossReportMergerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossReportMergerTest.java index a00947ba01..f729c26406 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossReportMergerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossReportMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.cross.model.entity.CrossReport; import com.dianping.cat.consumer.cross.model.transform.DefaultSaxParser; @@ -28,11 +27,11 @@ public class CrossReportMergerTest { @Test public void testCrossReportMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("cross_analyzer_old.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("cross_analyzer_old.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("cross_analyzer_old.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("cross_analyzer_old.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); CrossReport reportOld = DefaultSaxParser.parse(oldXml); CrossReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("cross_analyzer_merger.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("cross_analyzer_merger.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); CrossReportMerger merger = new CrossReportMerger(new CrossReport(reportOld.getDomain())); reportOld.accept(merger); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/dump/StoragePerformanceTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/dump/StoragePerformanceTest.java index 06c9118eb6..eff7a62aac 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/dump/StoragePerformanceTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/dump/StoragePerformanceTest.java @@ -19,11 +19,14 @@ package com.dianping.cat.consumer.dump; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Comparator; import org.junit.Before; import org.junit.Test; import org.unidal.cat.message.storage.StorageConfiguration; -import org.unidal.helper.Files; import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Cat; @@ -38,14 +41,24 @@ public class StoragePerformanceTest extends ComponentTestCase { private MessageCodec m_codec = new PlainTextMessageCodec(); @Before - public void before() { + public void before() throws IOException { File baseDir = new File(Cat.getCatHome(),"bucket/dump/20160415"); - Files.forDir().delete(new File(baseDir, "dump"), true); + deleteDirectory(new File(baseDir, "dump").toPath()); lookup(StorageConfiguration.class).setBaseDataDir(baseDir); } + private void deleteDirectory(Path path) throws IOException { + if (!Files.exists(path)) { + return; + } + + try (java.util.stream.Stream stream = Files.walk(path)) { + stream.sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete); + } + } + @Test public void testManyDomainIpWrite() throws Exception { TreeHelper.init(m_codec); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventAnalyzerTest.java index c3e7d9a6aa..3a5a3e5f0a 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventAnalyzerTest.java @@ -24,7 +24,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.helper.Files; import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; @@ -69,7 +68,7 @@ public void testProcess() throws Exception { EventReport report = m_analyzer.getReport(m_domain); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("event_analyzer.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("event_analyzer.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); EventReport expected4report = com.dianping.cat.consumer.event.model.transform.DefaultSaxParser.parse(expected); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventReportMergerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventReportMergerTest.java index 5f2482071a..01377c63c3 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventReportMergerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventReportMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.TestHelper; import com.dianping.cat.consumer.event.model.entity.EventReport; @@ -29,11 +28,11 @@ public class EventReportMergerTest { @Test public void testEventReportMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("event_report_old.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("event_report_new.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("event_report_old.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("event_report_new.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); EventReport reportOld = DefaultSaxParser.parse(oldXml); EventReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("event_report_mergeResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("event_report_mergeResult.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); EventReportMerger merger = new EventReportMerger(new EventReport(reportOld.getDomain())); reportOld.accept(merger); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.java index 70d1706261..f362e8715c 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.java @@ -25,7 +25,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.helper.Files; import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; @@ -71,7 +70,7 @@ public void testProcess() throws Exception { HeartbeatReport report = m_analyzer.getReport(m_domain); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("heartbeat_analyzer.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("heartbeat_analyzer.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); Assert.assertEquals(expected.replaceAll("\r", ""), report.toString().replaceAll("\r", "")); } @@ -104,7 +103,7 @@ private Heartbeat newHeartbeat(String type, String name, long timestamp, String heartbeat.setTimestamp(timestamp); if (m_status == null) { - m_status = Files.forIO().readFrom(getClass().getResourceAsStream("status_info.xml"), "utf-8"); + m_status = new String(getClass().getResourceAsStream("status_info.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); } heartbeat.addData(m_status); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatReportMergerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatReportMergerTest.java index b09dc2afea..835c7a5d33 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatReportMergerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatReportMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; import com.dianping.cat.consumer.heartbeat.model.transform.DefaultSaxParser; @@ -28,11 +27,11 @@ public class HeartbeatReportMergerTest { @Test public void testHeartbeatReportMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("heartbeat_analyzer_old.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("heartbeat_analyzer_old.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("heartbeat_analyzer_old.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("heartbeat_analyzer_old.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); HeartbeatReport reportOld = DefaultSaxParser.parse(oldXml); HeartbeatReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("heartbeat_analyzer_merge.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("heartbeat_analyzer_merge.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); HeartbeatReportMerger merger = new HeartbeatReportMerger(new HeartbeatReport(reportOld.getDomain())); reportOld.accept(merger); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.java index 437a4aa354..be2a3232ce 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.java @@ -24,7 +24,6 @@ import org.junit.Before; import org.junit.Test; -import org.unidal.helper.Files; import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; @@ -71,7 +70,7 @@ public void testProcess() throws Exception { MatrixReport report = m_analyzer.getReport(m_domain); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("matrix_analyzer.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("matrix_analyzer.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); //Assert.assertEquals(expected.replaceAll("\r", ""), report.toString().replaceAll("\r", "")); MatrixReport expected4report = com.dianping.cat.consumer.matrix.model.transform.DefaultSaxParser.parse(expected); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixModelTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixModelTest.java index 9cff367e17..283a9f1e9c 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixModelTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixModelTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; import com.dianping.cat.consumer.matrix.model.transform.DefaultSaxParser; @@ -28,13 +27,13 @@ public class MatrixModelTest { @Test public void testModel() throws Exception { - String source = Files.forIO().readFrom(getClass().getResourceAsStream("matrix.xml"), "utf-8"); + String source = new String(getClass().getResourceAsStream("matrix.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); MatrixReport report = DefaultSaxParser.parse(source); MatrixReportFilter filter = new MatrixReportFilter(); filter.setMaxSize(10); report.accept(filter); - String expected1 = Files.forIO().readFrom(getClass().getResourceAsStream("matrix_result.xml"), "utf-8"); + String expected1 = new String(getClass().getResourceAsStream("matrix_result.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); Assert.assertEquals(expected1.replaceAll("\r", ""), report.toString().replaceAll("\r", "")); } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixReportMergerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixReportMergerTest.java index 1169bbb395..b72f354d27 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixReportMergerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixReportMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; import com.dianping.cat.consumer.matrix.model.transform.DefaultSaxParser; @@ -28,11 +27,11 @@ public class MatrixReportMergerTest { @Test public void testMatrixReportMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("matrix_analyzer.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("matrix_analyzer.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("matrix_analyzer.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("matrix_analyzer.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); MatrixReport reportOld = DefaultSaxParser.parse(oldXml); MatrixReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("matrix_analyzer_merger.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("matrix_analyzer_merger.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); MatrixReportMerger merger = new MatrixReportMerger(new MatrixReport(reportOld.getDomain())); reportOld.accept(merger); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.java index 7a28fc45d9..5fbab9c8cc 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.java @@ -23,7 +23,6 @@ import org.junit.Before; import org.junit.Test; -import org.unidal.helper.Files; import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; @@ -71,7 +70,7 @@ public void testProcess() throws Exception { ProblemReport report = m_analyzer.getReport(m_domain); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("problem_analyzer.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("problem_analyzer.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ProblemReport expected4report = com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser.parse(expected); Assert.assertTrue(TestHelper.isEquals(expected4report,report)); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemFilterTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemFilterTest.java index 4a5a3e4a01..39c3974575 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemFilterTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemFilterTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; import com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser; @@ -30,8 +29,8 @@ public class ProblemFilterTest { @Test public void test() throws Exception { ProblemReportFilter problemReportURLFilter = new ProblemReportFilter(5); - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("problemURLFilter.xml"), "utf-8"); - String resultXml = Files.forIO().readFrom(getClass().getResourceAsStream("problemURLFilterResult.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("problemURLFilter.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String resultXml = new String(getClass().getResourceAsStream("problemURLFilterResult.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ProblemReport report = DefaultSaxParser.parse(oldXml); problemReportURLFilter.visitProblemReport(report); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemReportConvertorTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemReportConvertorTest.java index 52a22f10a2..9fefd39637 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemReportConvertorTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemReportConvertorTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; import com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser; @@ -29,8 +28,8 @@ public class ProblemReportConvertorTest { @Test public void test() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("problemReportForConvert.xml"), "utf-8"); - String result = Files.forIO().readFrom(getClass().getResourceAsStream("problemReportConvertResult.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("problemReportForConvert.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String result = new String(getClass().getResourceAsStream("problemReportConvertResult.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ProblemReport report = DefaultSaxParser.parse(oldXml); ProblemReportConvertor convertor = new ProblemReportConvertor(); report.accept(convertor); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemReportMergerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemReportMergerTest.java index 1c55b52459..6b3b87fc80 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemReportMergerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemReportMergerTest.java @@ -23,7 +23,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; import com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser; @@ -31,11 +30,11 @@ public class ProblemReportMergerTest { @Test public void testProblemReportMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("ProblemReportOld.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("ProblemReportNew.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("ProblemReportOld.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("ProblemReportNew.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ProblemReport reportOld = DefaultSaxParser.parse(oldXml); ProblemReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("ProblemReportMergeResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("ProblemReportMergeResult.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ProblemReportMerger merger = new ProblemReportMerger(new ProblemReport(reportOld.getDomain())); reportOld.accept(merger); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemReportTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemReportTest.java index 5cf0d71c50..f64ed0c446 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemReportTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemReportTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; import com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser; @@ -29,7 +28,7 @@ public class ProblemReportTest { @Test public void testXml() throws Exception { - String source = Files.forIO().readFrom(getClass().getResourceAsStream("problem-report.xml"), "utf-8"); + String source = new String(getClass().getResourceAsStream("problem-report.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ProblemReport root = DefaultSaxParser.parse(source); String xml = new DefaultXmlBuilder().buildXml(root); String expected = source; diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/state/StateAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/state/StateAnalyzerTest.java index cf56488681..f861f43b8e 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/state/StateAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/state/StateAnalyzerTest.java @@ -25,7 +25,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.helper.Files; import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; @@ -55,7 +54,7 @@ public void setUp() throws Exception { public void testProcess() throws Exception { StateReport report = m_analyzer.getReport(m_domain); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("state_analyzer.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("state_analyzer.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); Assert.assertEquals(expected.replaceAll("\r", ""), report.toString().replaceAll("\r", "")); } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/state/StateReportMergerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/state/StateReportMergerTest.java index 4eb4a3e506..9b42b654a8 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/state/StateReportMergerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/state/StateReportMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.state.model.entity.StateReport; import com.dianping.cat.consumer.state.model.transform.DefaultSaxParser; @@ -28,11 +27,11 @@ public class StateReportMergerTest { @Test public void testStateReportMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("old.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("new.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("old.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("new.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); StateReport reportOld = DefaultSaxParser.parse(oldXml); StateReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("result.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("result.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); StateReportMerger merger = new StateReportMerger(new StateReport(reportOld.getDomain())); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/top/TopAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/top/TopAnalyzerTest.java index dd6eed359a..5b8636b891 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/top/TopAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/top/TopAnalyzerTest.java @@ -24,7 +24,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.helper.Files; import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; @@ -70,7 +69,7 @@ public void testProcess() throws Exception { TopReport report = m_analyzer.getReport(m_domain); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("top_analyzer.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("top_analyzer.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); Assert.assertEquals(expected.replaceAll("\r", ""), report.toString().replaceAll("\r", "")); } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/top/TopReportMergerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/top/TopReportMergerTest.java index 74e074038e..1034787c35 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/top/TopReportMergerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/top/TopReportMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.top.model.entity.TopReport; import com.dianping.cat.consumer.top.model.transform.DefaultSaxParser; @@ -28,11 +27,11 @@ public class TopReportMergerTest { @Test public void testTopReportMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("top_analyzer_old.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("top_analyzer_old.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("top_analyzer_old.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("top_analyzer_old.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TopReport reportOld = DefaultSaxParser.parse(oldXml); TopReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("top_analyzer_merger.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("top_analyzer_merger.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TopReportMerger merger = new TopReportMerger(new TopReport(reportOld.getDomain())); reportOld.accept(merger); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.java index eca8341ee0..8e01ab008a 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.java @@ -24,7 +24,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.helper.Files; import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; @@ -81,7 +80,7 @@ public void testProcess() throws Exception { report.accept(new TransactionStatisticsComputer()); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("transaction_analyzer.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("transaction_analyzer.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); Assert.assertTrue( TestHelper.isEquals(com.dianping.cat.consumer.transaction.model.transform.DefaultSaxParser.parse(expected), report)); } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionReportMergerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionReportMergerTest.java index 326bb253b2..e068d1f9a2 100755 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionReportMergerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionReportMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.TestHelper; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; @@ -29,12 +28,12 @@ public class TransactionReportMergerTest { @Test public void testTransactionReportMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("transaction_report_old.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("transaction_report_new.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("transaction_report_old.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("transaction_report_new.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TransactionReport reportOld = DefaultSaxParser.parse(oldXml); TransactionReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO() - .readFrom(getClass().getResourceAsStream("transaction_report_mergeResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("transaction_report_mergeResult.xml") + .readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TransactionReport reportExpected = DefaultSaxParser.parse(expected); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionReportTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionReportTest.java index c820b69f77..991c96d956 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionReportTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionReportTest.java @@ -19,7 +19,6 @@ package com.dianping.cat.consumer.transaction; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.TestHelper; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; @@ -28,7 +27,7 @@ public class TransactionReportTest { @Test public void testXml() throws Exception { - String source = Files.forIO().readFrom(getClass().getResourceAsStream("transaction_report.xml"), "utf-8"); + String source = new String(getClass().getResourceAsStream("transaction_report.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TransactionReport report = DefaultSaxParser.parse(source); String expected = source; diff --git a/cat-core/src/test/java/com/dianping/cat/message/DefaultMessagePathBuilderTest.java b/cat-core/src/test/java/com/dianping/cat/message/DefaultMessagePathBuilderTest.java index 3b9e86d404..9221f39bc2 100644 --- a/cat-core/src/test/java/com/dianping/cat/message/DefaultMessagePathBuilderTest.java +++ b/cat-core/src/test/java/com/dianping/cat/message/DefaultMessagePathBuilderTest.java @@ -21,17 +21,17 @@ import java.text.Format; import java.text.MessageFormat; import java.text.SimpleDateFormat; +import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.TimeZone; import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Splitters; public class DefaultMessagePathBuilderTest { private String convertToHex(String ip) { - List items = Splitters.by(".").noEmptyItem().split(ip); + List items = Arrays.asList(ip.split("\\.")); byte[] bytes = new byte[4]; for (int i = 0; i < 4; i++) { @@ -61,7 +61,7 @@ public void testParseMessageIdFromPath() throws Exception { String path = "20120807/14/Cat-Cat-192.168.64.153"; Object[] objects = format.parse(path); Date timestamp = (Date) objects[0]; - List parts = Splitters.by('-').split((String) objects[1]); + List parts = Arrays.asList(((String) objects[1]).split("-")); String domain = parts.get(1); String ip = parts.get(2); String id = domain + "-" + convertToHex(ip) + "-" + timestamp.getTime() / 3600000L + "-0"; diff --git a/cat-core/src/test/java/com/dianping/cat/server/ServerConfigVisitorTest.java b/cat-core/src/test/java/com/dianping/cat/server/ServerConfigVisitorTest.java index b206f6a0f2..887254b53d 100644 --- a/cat-core/src/test/java/com/dianping/cat/server/ServerConfigVisitorTest.java +++ b/cat-core/src/test/java/com/dianping/cat/server/ServerConfigVisitorTest.java @@ -22,7 +22,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import org.xml.sax.SAXException; import com.dianping.cat.config.server.ServerConfigVisitor; @@ -34,7 +33,7 @@ public class ServerConfigVisitorTest { @Test public void test() throws IOException, SAXException { - String server = Files.forIO().readFrom(getClass().getResourceAsStream("server.xml"), "utf-8"); + String server = readResource("server.xml"); ServerConfig serverConfig01 = DefaultSaxParser.parse(server); ServerConfig serverConfig02 = DefaultSaxParser.parse(server); @@ -49,11 +48,14 @@ public void test() throws IOException, SAXException { ServerConfigVisitor visitor02 = new ServerConfigVisitor(server02); visitor02.visitServer(default02); - String expected01 = Files.forIO().readFrom(getClass().getResourceAsStream("server01.xml"), "utf-8"); + String expected01 = readResource("server01.xml"); Assert.assertEquals(expected01.replace("\r", ""), default01.toString().replace("\r", "")); - String expected02 = Files.forIO().readFrom(getClass().getResourceAsStream("server02.xml"), "utf-8"); + String expected02 = readResource("server02.xml"); Assert.assertEquals(expected02.replace("\r", ""), default02.toString().replace("\r", "")); } + private String readResource(String name) throws IOException { + return new String(getClass().getResourceAsStream(name).readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + } } diff --git a/cat-hadoop/src/test/java/org/unidal/cat/message/storage/IndexTest.java b/cat-hadoop/src/test/java/org/unidal/cat/message/storage/IndexTest.java index 2425986b1a..a1d5a2617a 100644 --- a/cat-hadoop/src/test/java/org/unidal/cat/message/storage/IndexTest.java +++ b/cat-hadoop/src/test/java/org/unidal/cat/message/storage/IndexTest.java @@ -19,11 +19,14 @@ package org.unidal.cat.message.storage; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Comparator; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.helper.Files; import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.configuration.NetworkInterfaceManager; @@ -39,10 +42,20 @@ public void before() throws Exception { config.setBaseDataDir(new File("target")); File baseDir = new File("target"); - Files.forDir().delete(new File(baseDir, "dump"), true); + deleteDirectory(new File(baseDir, "dump").toPath()); m_ip = NetworkInterfaceManager.INSTANCE.getLocalHostAddress(); } + private void deleteDirectory(Path path) throws IOException { + if (!Files.exists(path)) { + return; + } + + try (java.util.stream.Stream stream = Files.walk(path)) { + stream.sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete); + } + } + @Test public void testMapAndLookups() throws Exception { int total = 15000; diff --git a/cat-hadoop/src/test/java/org/unidal/cat/message/storage/TokenMappingTest.java b/cat-hadoop/src/test/java/org/unidal/cat/message/storage/TokenMappingTest.java index f9f3e40c1e..01e0d7a028 100644 --- a/cat-hadoop/src/test/java/org/unidal/cat/message/storage/TokenMappingTest.java +++ b/cat-hadoop/src/test/java/org/unidal/cat/message/storage/TokenMappingTest.java @@ -20,12 +20,14 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Comparator; import java.util.concurrent.CountDownLatch; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.helper.Files; import org.unidal.helper.Threads; import org.unidal.helper.Threads.Task; import org.unidal.lookup.ComponentTestCase; @@ -33,16 +35,26 @@ public class TokenMappingTest extends ComponentTestCase { @Before - public void before() { + public void before() throws IOException { File baseDir = new File("target"); - Files.forDir().delete(new File(baseDir, "dump"), true); + deleteDirectory(new File(baseDir, "dump").toPath()); StorageConfiguration config = lookup(StorageConfiguration.class); config.setBaseDataDir(baseDir); } + private void deleteDirectory(Path path) throws IOException { + if (!Files.exists(path)) { + return; + } + + try (java.util.stream.Stream stream = Files.walk(path)) { + stream.sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete); + } + } + @Test public void test() throws IOException { TokenMapping mapping = lookup(TokenMapping.class, "local"); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventAlert.java index 9273fd65eb..40094170b0 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventAlert.java @@ -26,7 +26,7 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; -import org.codehaus.plexus.util.StringUtils; +import org.apache.commons.lang.StringUtils; import org.slf4j.LoggerFactory; import org.unidal.helper.Splitters; import org.unidal.helper.Threads.Task; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java index 2124e6dbd9..b469edfac9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java @@ -43,7 +43,7 @@ import com.dianping.cat.report.service.ModelService; import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; -import org.codehaus.plexus.util.StringUtils; +import org.apache.commons.lang.StringUtils; import org.slf4j.LoggerFactory; import org.unidal.helper.Splitters; import org.unidal.helper.Threads.Task; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java index 5aa07615d3..33ebcda0ca 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java @@ -32,7 +32,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang.StringUtils; import org.unidal.tuple.Pair; import com.dianping.cat.Cat; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/display/HostInfo.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/display/HostInfo.java index ebdd9156c5..74c3b56a8c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/display/HostInfo.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/display/HostInfo.java @@ -25,7 +25,7 @@ import java.util.List; import java.util.Map; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.consumer.cross.model.entity.CrossReport; import com.dianping.cat.consumer.cross.model.entity.Local; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphBuilder.java index 2ff78e5cbd..5ef85e50bd 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphBuilder.java @@ -25,7 +25,7 @@ import java.util.Map; import java.util.Set; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.consumer.dependency.model.entity.Dependency; import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportDailyGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportDailyGraphCreator.java index 865a4de390..f980a0d590 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportDailyGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportDailyGraphCreator.java @@ -20,7 +20,7 @@ import java.util.Date; -import org.codehaus.plexus.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.consumer.GraphTrendUtil; import com.dianping.cat.consumer.event.model.entity.EventName; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportHourlyGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportHourlyGraphCreator.java index 502bc996b9..51737286fe 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportHourlyGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportHourlyGraphCreator.java @@ -20,7 +20,7 @@ import java.util.Calendar; -import org.codehaus.plexus.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.consumer.GraphTrendUtil; import com.dianping.cat.consumer.event.model.entity.EventName; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/transform/DistributionDetailVisitor.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/transform/DistributionDetailVisitor.java index def1f96781..7c45f0cbe5 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/transform/DistributionDetailVisitor.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/transform/DistributionDetailVisitor.java @@ -23,7 +23,7 @@ import java.util.Comparator; import java.util.List; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.Constants; import com.dianping.cat.consumer.event.model.entity.EventName; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/transform/PieGraphChartVisitor.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/transform/PieGraphChartVisitor.java index d27f78dd66..ea9e2654f2 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/transform/PieGraphChartVisitor.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/transform/PieGraphChartVisitor.java @@ -24,7 +24,7 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.Constants; import com.dianping.cat.consumer.event.model.entity.EventName; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportDailyGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportDailyGraphCreator.java index d10cc785da..505f35ca57 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportDailyGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportDailyGraphCreator.java @@ -20,7 +20,7 @@ import java.util.Date; -import org.codehaus.plexus.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.consumer.GraphTrendUtil; import com.dianping.cat.consumer.problem.model.entity.Duration; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportHourlyGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportHourlyGraphCreator.java index a92279d072..212f4a53a0 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportHourlyGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportHourlyGraphCreator.java @@ -20,7 +20,7 @@ import java.util.Calendar; -import org.codehaus.plexus.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.consumer.GraphTrendUtil; import com.dianping.cat.consumer.problem.model.entity.Entity; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/transform/DetailStatistics.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/transform/DetailStatistics.java index 6fef460db8..c7b9a99849 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/transform/DetailStatistics.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/transform/DetailStatistics.java @@ -27,7 +27,7 @@ import java.util.Map; import java.util.TreeMap; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.consumer.problem.model.entity.Entity; import com.dianping.cat.consumer.problem.model.entity.JavaThread; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/transform/HourlyLineChartVisitor.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/transform/HourlyLineChartVisitor.java index 6ba46491bc..df214e408c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/transform/HourlyLineChartVisitor.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/transform/HourlyLineChartVisitor.java @@ -22,7 +22,7 @@ import java.util.LinkedHashMap; import java.util.Map; -import org.codehaus.plexus.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.Constants; import com.dianping.cat.consumer.problem.model.entity.Entity; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/transform/PieGraphChartVisitor.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/transform/PieGraphChartVisitor.java index bc6d1078f9..3e761e0a77 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/transform/PieGraphChartVisitor.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/transform/PieGraphChartVisitor.java @@ -23,7 +23,7 @@ import java.util.List; import java.util.Map; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.consumer.problem.model.entity.Duration; import com.dianping.cat.consumer.problem.model.entity.Entity; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/transform/HourlyLineChartVisitor.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/transform/HourlyLineChartVisitor.java index c35d614aec..a7129af2a2 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/transform/HourlyLineChartVisitor.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/transform/HourlyLineChartVisitor.java @@ -24,7 +24,7 @@ import java.util.Map.Entry; import java.util.Set; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.Constants; import com.dianping.cat.consumer.storage.model.entity.Domain; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportDailyGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportDailyGraphCreator.java index a57ab1eabe..3e38ed204d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportDailyGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportDailyGraphCreator.java @@ -20,7 +20,7 @@ import java.util.Date; -import org.codehaus.plexus.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.consumer.GraphTrendUtil; import com.dianping.cat.consumer.transaction.model.entity.GraphTrend; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportHourlyGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportHourlyGraphCreator.java index 92b31374be..1b1e099332 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportHourlyGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportHourlyGraphCreator.java @@ -20,7 +20,7 @@ import java.util.Calendar; -import org.codehaus.plexus.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.consumer.GraphTrendUtil; import com.dianping.cat.consumer.transaction.model.entity.GraphTrend; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/DistributionDetailVisitor.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/DistributionDetailVisitor.java index 357a259df1..9b9168f559 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/DistributionDetailVisitor.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/DistributionDetailVisitor.java @@ -23,7 +23,7 @@ import java.util.Comparator; import java.util.List; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.Constants; import com.dianping.cat.consumer.transaction.model.entity.Machine; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/PieGraphChartVisitor.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/PieGraphChartVisitor.java index 075c36275e..18e5427f8c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/PieGraphChartVisitor.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/PieGraphChartVisitor.java @@ -24,7 +24,7 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.Constants; import com.dianping.cat.consumer.transaction.model.entity.Machine; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/TransactionMergeHelper.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/TransactionMergeHelper.java index 832e8f5dcb..a5b5ea1451 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/TransactionMergeHelper.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/transform/TransactionMergeHelper.java @@ -18,7 +18,7 @@ */ package com.dianping.cat.report.page.transaction.transform; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.Constants; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/AlertConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/AlertConfigProcessor.java index 1f23896a85..cfce8763e5 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/AlertConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/AlertConfigProcessor.java @@ -18,7 +18,7 @@ */ package com.dianping.cat.system.page.config.processor; -import org.codehaus.plexus.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.config.AlertPolicyManager; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/HeartbeatConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/HeartbeatConfigProcessor.java index 932f8b0016..554b0cfa81 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/HeartbeatConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/HeartbeatConfigProcessor.java @@ -18,7 +18,7 @@ */ package com.dianping.cat.system.page.config.processor; -import org.codehaus.plexus.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.report.alert.heartbeat.HeartbeatRuleConfigManager; import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/Handler.java index 91424b6355..27cadf4835 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/Handler.java @@ -21,7 +21,7 @@ import javax.servlet.ServletException; import java.io.IOException; -import org.codehaus.plexus.util.StringUtils; +import org.apache.commons.lang.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/plugin/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/plugin/Handler.java index dde0beb2ae..22a9a5dc3d 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/plugin/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/plugin/Handler.java @@ -27,7 +27,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import org.codehaus.plexus.util.StringUtils; +import org.apache.commons.lang.StringUtils; import org.unidal.helper.Files; import org.unidal.helper.Files.AutoClose; import org.unidal.web.mvc.PageHandler; diff --git a/cat-home/src/test/java/com/dianping/cat/Api.java b/cat-home/src/test/java/com/dianping/cat/Api.java index f0a91d5bf5..11e693e7e8 100644 --- a/cat-home/src/test/java/com/dianping/cat/Api.java +++ b/cat-home/src/test/java/com/dianping/cat/Api.java @@ -81,7 +81,7 @@ private static void print(String bu, String detailContent) throws Exception { private static String fetchContent(String url) throws IOException { InputStream in = Urls.forIO().readTimeout(1000).connectTimeout(1000).openStream(url); - String content = Files.forIO().readFrom(in, "utf-8"); + String content = new String(in.readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); return content; } diff --git a/cat-home/src/test/java/com/dianping/cat/TestApi.java b/cat-home/src/test/java/com/dianping/cat/TestApi.java index ec9e118eba..4343b44ddf 100644 --- a/cat-home/src/test/java/com/dianping/cat/TestApi.java +++ b/cat-home/src/test/java/com/dianping/cat/TestApi.java @@ -43,7 +43,7 @@ private String build720Url(int id) { private String fetchContent(String url) throws Exception { InputStream in = Urls.forIO().readTimeout(3000).connectTimeout(3000).openStream(url); - return Files.forIO().readFrom(in, "utf-8"); + return new String(in.readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); } private Pair parse(String content) throws ParseException { diff --git a/cat-home/src/test/java/com/dianping/cat/demo/DatabaseDataFetcher.java b/cat-home/src/test/java/com/dianping/cat/demo/DatabaseDataFetcher.java index 16a6ccc152..a08258f426 100644 --- a/cat-home/src/test/java/com/dianping/cat/demo/DatabaseDataFetcher.java +++ b/cat-home/src/test/java/com/dianping/cat/demo/DatabaseDataFetcher.java @@ -28,7 +28,6 @@ import java.util.Map; import org.junit.Test; -import org.unidal.helper.Files; import org.unidal.helper.Urls; import org.unidal.webres.json.JsonArray; import org.unidal.webres.json.JsonObject; @@ -42,7 +41,7 @@ public void test() { for (int n = 2; n < 7; n++) { try { InputStream stream = Urls.forIO().connectTimeout(5000).readTimeout(10000).openStream(String.format(url, n)); - String result = Files.forIO().readFrom(stream, "utf-8"); + String result = new String(stream.readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); JsonObject jo = new JsonObject(result); JsonArray array = jo.getJSONArray("lineCharts"); Map datas = new LinkedHashMap(); diff --git a/cat-home/src/test/java/com/dianping/cat/demo/TestCode.java b/cat-home/src/test/java/com/dianping/cat/demo/TestCode.java index 8551881bee..eeae752b1f 100644 --- a/cat-home/src/test/java/com/dianping/cat/demo/TestCode.java +++ b/cat-home/src/test/java/com/dianping/cat/demo/TestCode.java @@ -54,7 +54,7 @@ public void testTime() throws Exception { for (int j = 0; j < 5; j++) { String url = String.format(format, time, "database" + j); InputStream in = Urls.forIO().readTimeout(1000).connectTimeout(1000).openStream(url); - Files.forIO().readFrom(in, "utf-8"); + new String(in.readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); } } } diff --git a/cat-home/src/test/java/com/dianping/cat/demo/TestHttp.java b/cat-home/src/test/java/com/dianping/cat/demo/TestHttp.java index 766f4a015b..34212c9a6a 100644 --- a/cat-home/src/test/java/com/dianping/cat/demo/TestHttp.java +++ b/cat-home/src/test/java/com/dianping/cat/demo/TestHttp.java @@ -24,7 +24,6 @@ import java.util.concurrent.CountDownLatch; import org.junit.Test; -import org.unidal.helper.Files; import org.unidal.helper.Threads; import org.unidal.helper.Threads.Task; import org.unidal.helper.Urls; @@ -68,7 +67,7 @@ public void run() { InputStream in = Urls.forIO().readTimeout(3000).connectTimeout(3000) .openStream("http://cat.qa.dianpingoa.com/cat/r/"); - String content = Files.forIO().readFrom(in, "utf-8"); + String content = new String(in.readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); System.out.println(" id:" + m_index + " seq" + i + " length:" + content.length()); } catch (Exception e) { e.printStackTrace(); diff --git a/cat-home/src/test/java/com/dianping/cat/report/alert/MetricIdAndRuleMappingTest.java b/cat-home/src/test/java/com/dianping/cat/report/alert/MetricIdAndRuleMappingTest.java index e5c3faef0d..cee31cc59d 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/alert/MetricIdAndRuleMappingTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/alert/MetricIdAndRuleMappingTest.java @@ -24,7 +24,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.report.alert.spi.config.BaseRuleConfigManager; @@ -45,7 +44,7 @@ protected String getConfigName() { private List buildPatternList(String path) { try { - String content = Files.forIO().readFrom(this.getClass().getResourceAsStream(path), "utf-8"); + String content = new String(this.getClass().getResourceAsStream(path).readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); return Arrays.asList(content.split("[\r\n]+")); } catch (IOException e) { return null; diff --git a/cat-home/src/test/java/com/dianping/cat/report/alert/RuleConfigTest.java b/cat-home/src/test/java/com/dianping/cat/report/alert/RuleConfigTest.java index 7ec2128790..0cfd724ec2 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/alert/RuleConfigTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/alert/RuleConfigTest.java @@ -25,7 +25,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.Cat; import com.dianping.cat.alarm.rule.entity.Condition; @@ -75,7 +74,7 @@ private Map> buildConfigMap(MonitorRules monitorRules) { private MonitorRules buildMonitorRuleFromFile(String path) { try { - String content = Files.forIO().readFrom(this.getClass().getResourceAsStream(path), "utf-8"); + String content = new String(this.getClass().getResourceAsStream(path).readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); return DefaultSaxParser.parse(content); } catch (Exception ex) { Cat.logError(ex); diff --git a/cat-home/src/test/java/com/dianping/cat/report/analyzer/TopologyGraphTest.java b/cat-home/src/test/java/com/dianping/cat/report/analyzer/TopologyGraphTest.java index bdbf5d310e..5fd6682fcd 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/analyzer/TopologyGraphTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/analyzer/TopologyGraphTest.java @@ -22,7 +22,6 @@ import java.text.SimpleDateFormat; import org.junit.Test; -import org.unidal.helper.Files; import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; @@ -56,7 +55,7 @@ public void build(String date) throws Exception { if (!file.exists()) { file.createNewFile(); } - Files.forIO().writeTo(file, graph.toString()); + java.nio.file.Files.writeString(file.toPath(), graph.toString(), java.nio.charset.StandardCharsets.UTF_8); } else { System.err.println(date + " is null1"); } diff --git a/cat-home/src/test/java/com/dianping/cat/report/page/cross/CrossReportMergerTest.java b/cat-home/src/test/java/com/dianping/cat/report/page/cross/CrossReportMergerTest.java index 6226486bad..c65f573abb 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/page/cross/CrossReportMergerTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/page/cross/CrossReportMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.cross.CrossReportMerger; import com.dianping.cat.consumer.cross.model.entity.CrossReport; @@ -29,11 +28,11 @@ public class CrossReportMergerTest { @Test public void testCrossReportMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("CrossReportOld.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("CrossReportNew.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("CrossReportOld.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("CrossReportNew.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); CrossReport reportOld = DefaultSaxParser.parse(oldXml); CrossReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("CrossReportMergeResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("CrossReportMergeResult.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); CrossReportMerger merger = new CrossReportMerger(new CrossReport(reportOld.getDomain())); reportOld.accept(merger); diff --git a/cat-home/src/test/java/com/dianping/cat/report/page/event/EventReportFilterTest.java b/cat-home/src/test/java/com/dianping/cat/report/page/event/EventReportFilterTest.java index 75cc3bc9c6..89c37afaf1 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/page/event/EventReportFilterTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/page/event/EventReportFilterTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.TestHelper; import com.dianping.cat.consumer.event.model.entity.EventReport; @@ -30,16 +29,16 @@ public class EventReportFilterTest { @Test public void test() throws Exception { - String source = Files.forIO().readFrom(getClass().getResourceAsStream("event_filter.xml"), "utf-8"); + String source = new String(getClass().getResourceAsStream("event_filter.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); EventReport report = DefaultSaxParser.parse(source); EventReportFilter f1 = new EventReportFilter(null, null, null); - String expected1 = Files.forIO().readFrom(getClass().getResourceAsStream("event_filter_type.xml"), "utf-8"); + String expected1 = new String(getClass().getResourceAsStream("event_filter_type.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); Assert.assertTrue(TestHelper.isEquals(DefaultSaxParser.parse(expected1), DefaultSaxParser.parse(f1.buildXml(report)))); EventReportFilter f2 = new EventReportFilter("URL", null, null); - String expected2 = Files.forIO().readFrom(getClass().getResourceAsStream("event_filter_name.xml"), "utf-8"); + String expected2 = new String(getClass().getResourceAsStream("event_filter_name.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); Assert.assertTrue(TestHelper.isEquals(DefaultSaxParser.parse(expected2), DefaultSaxParser.parse(f2.buildXml(report)))); } diff --git a/cat-home/src/test/java/com/dianping/cat/report/page/event/EventTrendGraphBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/page/event/EventTrendGraphBuilderTest.java index 0430a85d29..704f93fa4a 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/page/event/EventTrendGraphBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/page/event/EventTrendGraphBuilderTest.java @@ -22,7 +22,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.event.model.entity.EventReport; import com.dianping.cat.consumer.event.model.transform.DefaultSaxParser; @@ -33,7 +32,7 @@ public class EventTrendGraphBuilderTest { @Test public void testVisitName() throws Exception { - String xml = Files.forIO().readFrom(getClass().getResourceAsStream("EventReportDailyGraph.xml"), "utf-8"); + String xml = new String(getClass().getResourceAsStream("EventReportDailyGraph.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); EventReport report = DefaultSaxParser.parse(xml); EventReportVisitor visitor = new EventTrendGraphBuilder().new EventReportVisitor("10.1.77.193", "URL", "ClientInfo"); @@ -46,7 +45,7 @@ public void testVisitName() throws Exception { @Test public void testVisitType() throws Exception { - String xml = Files.forIO().readFrom(getClass().getResourceAsStream("EventReportDailyGraph.xml"), "utf-8"); + String xml = new String(getClass().getResourceAsStream("EventReportDailyGraph.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); EventReport report = DefaultSaxParser.parse(xml); EventReportVisitor visitor = new EventTrendGraphBuilder().new EventReportVisitor("10.1.77.193", "URL", ""); diff --git a/cat-home/src/test/java/com/dianping/cat/report/page/problem/ProblemReportMergerTest.java b/cat-home/src/test/java/com/dianping/cat/report/page/problem/ProblemReportMergerTest.java index 73a2ab408d..f0830bb957 100755 --- a/cat-home/src/test/java/com/dianping/cat/report/page/problem/ProblemReportMergerTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/page/problem/ProblemReportMergerTest.java @@ -22,7 +22,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.problem.ProblemReportMerger; import com.dianping.cat.consumer.problem.model.entity.Entry; @@ -35,11 +34,11 @@ public class ProblemReportMergerTest { @Test public void testProblemReportMergeAll() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("ProblemReportOld.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("ProblemReportNew.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("ProblemReportOld.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("ProblemReportNew.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ProblemReport reportOld = DefaultSaxParser.parse(oldXml); ProblemReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("ProblemReportMergeAllResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("ProblemReportMergeAllResult.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ProblemReportMerger merger = new HistoryProblemReportMerger(new ProblemReport(reportOld.getDomain())); reportOld.accept(merger); @@ -55,7 +54,7 @@ public void testProblemReportMergeAll() throws Exception { @Test public void testProblemReportMergerSize() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("ProblemMobile.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("ProblemMobile.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ProblemReport reportOld = DefaultSaxParser.parse(oldXml); ProblemReportMerger merger = new HistoryProblemReportMerger(new ProblemReport(reportOld.getDomain())); diff --git a/cat-home/src/test/java/com/dianping/cat/report/page/problem/ProblemTrendGraphBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/page/problem/ProblemTrendGraphBuilderTest.java index a6c68ab6a8..e5e9d1a678 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/page/problem/ProblemTrendGraphBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/page/problem/ProblemTrendGraphBuilderTest.java @@ -22,7 +22,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; import com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser; @@ -33,7 +32,7 @@ public class ProblemTrendGraphBuilderTest { @Test public void test() throws Exception { - String xml = Files.forIO().readFrom(getClass().getResourceAsStream("ProblemReportDailyGraph.xml"), "utf-8"); + String xml = new String(getClass().getResourceAsStream("ProblemReportDailyGraph.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ProblemReport report = DefaultSaxParser.parse(xml); ProblemReportVisitor visitor = new ProblemTrendGraphBuilder().new ProblemReportVisitor("10.1.1.166", "long-url", diff --git a/cat-home/src/test/java/com/dianping/cat/report/page/state/StateReportMergerTest.java b/cat-home/src/test/java/com/dianping/cat/report/page/state/StateReportMergerTest.java index 2536c32273..ec2a4166ee 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/page/state/StateReportMergerTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/page/state/StateReportMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.state.model.entity.StateReport; import com.dianping.cat.consumer.state.model.transform.DefaultSaxParser; @@ -30,11 +29,11 @@ public class StateReportMergerTest { @Test public void testHistoryStateReportMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("old.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("new.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("old.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("new.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); StateReport reportOld = DefaultSaxParser.parse(oldXml); StateReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("historyResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("historyResult.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); HistoryStateReportMerger merger = new HistoryStateReportMerger(new StateReport(reportOld.getDomain())); diff --git a/cat-home/src/test/java/com/dianping/cat/report/page/transaction/TransactionReportFilterTest.java b/cat-home/src/test/java/com/dianping/cat/report/page/transaction/TransactionReportFilterTest.java index 1c5d9c1912..5e5b15445b 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/page/transaction/TransactionReportFilterTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/page/transaction/TransactionReportFilterTest.java @@ -19,7 +19,6 @@ package com.dianping.cat.report.page.transaction; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.TestHelper; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; @@ -29,16 +28,16 @@ public class TransactionReportFilterTest { @Test public void test() throws Exception { - String source = Files.forIO().readFrom(getClass().getResourceAsStream("transaction_filter.xml"), "utf-8"); + String source = new String(getClass().getResourceAsStream("transaction_filter.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TransactionReport report = DefaultSaxParser.parse(source); TransactionReportFilter f1 = new TransactionReportFilter(null, null, "10.1.77.193", 0, 59); - String expected1 = Files.forIO().readFrom(getClass().getResourceAsStream("transaction_filter_type.xml"), "utf-8"); + String expected1 = new String(getClass().getResourceAsStream("transaction_filter_type.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TransactionReport report4expected1 = DefaultSaxParser.parse(expected1); String input = f1.buildXml(report); TestHelper.assertEquals(report4expected1, input); TransactionReportFilter f2 = new TransactionReportFilter("URL", null, null, 0, 59); - String expected2 = Files.forIO().readFrom(getClass().getResourceAsStream("transaction_filter_name.xml"), "utf-8"); + String expected2 = new String(getClass().getResourceAsStream("transaction_filter_name.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); String input2 = f2.buildXml(report); TestHelper.assertEquals(DefaultSaxParser.parse(expected2), input2); diff --git a/cat-home/src/test/java/com/dianping/cat/report/page/transaction/TransactionTrendGraphBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/page/transaction/TransactionTrendGraphBuilderTest.java index cdf9a510ed..9255e496e7 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/page/transaction/TransactionTrendGraphBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/page/transaction/TransactionTrendGraphBuilderTest.java @@ -22,7 +22,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; import com.dianping.cat.consumer.transaction.model.transform.DefaultSaxParser; @@ -32,7 +31,7 @@ public class TransactionTrendGraphBuilderTest { @Test public void testVisitName() throws Exception { - String xml = Files.forIO().readFrom(getClass().getResourceAsStream("TransactionReportDailyGraph.xml"), "utf-8"); + String xml = new String(getClass().getResourceAsStream("TransactionReportDailyGraph.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TransactionReport report = DefaultSaxParser.parse(xml); TransactionReportVisitor visitor = new TransactionTrendGraphBuilder().new TransactionReportVisitor("10.1.77.193", @@ -47,7 +46,7 @@ public void testVisitName() throws Exception { @Test public void testVisitType() throws Exception { - String xml = Files.forIO().readFrom(getClass().getResourceAsStream("TransactionReportDailyGraph.xml"), "utf-8"); + String xml = new String(getClass().getResourceAsStream("TransactionReportDailyGraph.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TransactionReport report = DefaultSaxParser.parse(xml); TransactionReportVisitor visitor = new TransactionTrendGraphBuilder().new TransactionReportVisitor("10.1.77.193", diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java index 6140a00bfb..0afc09f661 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java @@ -25,7 +25,6 @@ import org.junit.Assert; import org.junit.Test; import org.unidal.dal.jdbc.DalException; -import org.unidal.helper.Files; import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.core.config.Config; @@ -57,7 +56,7 @@ private boolean backupConfig(String name, String context) { File backupFile = new File(filePath); try { - Files.forIO().writeTo(backupFile, context); + java.nio.file.Files.writeString(backupFile.toPath(), context, java.nio.charset.StandardCharsets.UTF_8); } catch (IOException e) { return false; } diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/event/EventGraphCreatorTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/event/EventGraphCreatorTest.java index 7f3cdbbb0e..e643dd95a4 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/event/EventGraphCreatorTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/event/EventGraphCreatorTest.java @@ -22,7 +22,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.TestHelper; import com.dianping.cat.consumer.event.model.entity.EventReport; @@ -35,10 +34,10 @@ public class EventGraphCreatorTest { @Test public void testMergeHourlyGraph() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("BaseEventGraphReport.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("BaseEventGraphReport.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); EventReport report1 = DefaultSaxParser.parse(oldXml); EventReport report2 = DefaultSaxParser.parse(oldXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("EventReportHourlyGraphResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("EventReportHourlyGraphResult.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); EventReport result = new EventReport(report1.getDomain()); @@ -54,12 +53,12 @@ public void testMergeHourlyGraph() throws Exception { @Test public void testMergeDailyGraph() throws Exception { - String oldXml1 = Files.forIO().readFrom(getClass().getResourceAsStream("BaseDailyEventReport1.xml"), "utf-8"); - String oldXml2 = Files.forIO().readFrom(getClass().getResourceAsStream("BaseDailyEventReport2.xml"), "utf-8"); + String oldXml1 = new String(getClass().getResourceAsStream("BaseDailyEventReport1.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String oldXml2 = new String(getClass().getResourceAsStream("BaseDailyEventReport2.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); EventReport report1 = DefaultSaxParser.parse(oldXml1); EventReport report2 = DefaultSaxParser.parse(oldXml2); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("EventReportDailyGraphResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("EventReportDailyGraphResult.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); EventReport result = new EventReport(report1.getDomain()); diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/event/HistoryEventMergerTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/event/HistoryEventMergerTest.java index aed9e12f45..bfeca6fd92 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/event/HistoryEventMergerTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/event/HistoryEventMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.TestHelper; import com.dianping.cat.consumer.event.EventReportMerger; @@ -31,10 +30,10 @@ public class HistoryEventMergerTest { @Test public void testMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("HistoryBaseEvent.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("HistoryBaseEvent.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); EventReport report1 = DefaultSaxParser.parse(oldXml); EventReport report2 = DefaultSaxParser.parse(oldXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("HistoryEventMergerDaily.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("HistoryEventMergerDaily.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); EventReportMerger merger = new HistoryEventReportMerger(new EventReport(report1.getDomain())); EventReport report3 = DefaultSaxParser.parse(expected); diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/heartbeat/HeartbeatDailyMergerTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/heartbeat/HeartbeatDailyMergerTest.java index 6781aacc55..6cfd5dca68 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/heartbeat/HeartbeatDailyMergerTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/heartbeat/HeartbeatDailyMergerTest.java @@ -22,7 +22,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; import com.dianping.cat.consumer.heartbeat.model.transform.DefaultSaxParser; @@ -34,12 +33,12 @@ public class HeartbeatDailyMergerTest { @Test public void test() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("heartbeat.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("heartbeat.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); HeartbeatReport report1 = DefaultSaxParser.parse(oldXml); report1.setStartTime(m_sdf.parse("2015-02-26 00:00:00")); HeartbeatReport report2 = DefaultSaxParser.parse(oldXml); report2.setStartTime(m_sdf.parse("2015-02-26 05:00:00")); - String result = Files.forIO().readFrom(getClass().getResourceAsStream("dailyReport.xml"), "utf-8"); + String result = new String(getClass().getResourceAsStream("dailyReport.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); HeartbeatDailyMerger merger = new HeartbeatDailyMerger(new HeartbeatReport("cat"), m_sdf.parse("2015-02-26 00:00:00").getTime()); diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/heavy/HeavyReportBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/heavy/HeavyReportBuilderTest.java index 6364f08ec0..9570ec1bdc 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/heavy/HeavyReportBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/heavy/HeavyReportBuilderTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.home.heavy.entity.HeavyReport; @@ -31,11 +30,11 @@ public class HeavyReportBuilderTest extends ComponentTestCase { @Test public void testMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("old.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("new.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("old.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("new.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); HeavyReport reportOld = DefaultSaxParser.parse(oldXml); HeavyReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("result.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("result.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); HeavyReportMerger merger = new HeavyReportMerger(new HeavyReport(reportOld.getDomain())); reportOld.accept(merger); diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/metric/AlertConfigTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/metric/AlertConfigTest.java index 1c16002bfb..c9b719315c 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/metric/AlertConfigTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/metric/AlertConfigTest.java @@ -25,7 +25,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.Cat; import com.dianping.cat.alarm.rule.entity.Condition; @@ -67,7 +66,7 @@ private List buildConditions(List configs) { private MonitorRules buildMonitorRuleFromFile(String path) { try { - String content = Files.forIO().readFrom(this.getClass().getResourceAsStream(path), "utf-8"); + String content = new String(this.getClass().getResourceAsStream(path).readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); return DefaultSaxParser.parse(content); } catch (Exception ex) { Cat.logError(ex); diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/problem/ProblemReportDailyGraphCreatorTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/problem/ProblemReportDailyGraphCreatorTest.java index e2614b11f2..4484de5ed4 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/problem/ProblemReportDailyGraphCreatorTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/problem/ProblemReportDailyGraphCreatorTest.java @@ -22,7 +22,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; import com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser; @@ -33,13 +32,13 @@ public class ProblemReportDailyGraphCreatorTest { @Test public void test() throws Exception { - String oldXml1 = Files.forIO().readFrom(getClass().getResourceAsStream("BaseDailyProblemReport1.xml"), "utf-8"); - String oldXml2 = Files.forIO().readFrom(getClass().getResourceAsStream("BaseDailyProblemReport2.xml"), "utf-8"); + String oldXml1 = new String(getClass().getResourceAsStream("BaseDailyProblemReport1.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String oldXml2 = new String(getClass().getResourceAsStream("BaseDailyProblemReport2.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ProblemReport report1 = DefaultSaxParser.parse(oldXml1); ProblemReport report2 = DefaultSaxParser.parse(oldXml2); - String expected = Files.forIO() - .readFrom(getClass().getResourceAsStream("ProblemReportDailyGraphResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("ProblemReportDailyGraphResult.xml") + .readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ProblemReport result = new ProblemReport(report1.getDomain()); diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/problem/ProblemReportHourlyGraphCreatorTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/problem/ProblemReportHourlyGraphCreatorTest.java index 11a029f007..05761172f9 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/problem/ProblemReportHourlyGraphCreatorTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/problem/ProblemReportHourlyGraphCreatorTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; import com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser; @@ -31,11 +30,11 @@ public class ProblemReportHourlyGraphCreatorTest { @Test public void testGraph() throws Exception { - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("problemModel.xml"), "utf-8"); + String newXml = new String(getClass().getResourceAsStream("problemModel.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ProblemReport report1 = DefaultSaxParser.parse(newXml); ProblemReport report2 = DefaultSaxParser.parse(newXml); - String expected = Files.forIO() - .readFrom(getClass().getResourceAsStream("ProblemReportHourlyGraphResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("ProblemReportHourlyGraphResult.xml") + .readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ProblemReport result = new ProblemReport(report1.getDomain()); diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/service/ClientReportStatisticsTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/service/ClientReportStatisticsTest.java index f48de88b40..d434feab71 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/service/ClientReportStatisticsTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/service/ClientReportStatisticsTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; import com.dianping.cat.consumer.transaction.model.transform.DefaultSaxParser; @@ -31,11 +30,11 @@ public class ClientReportStatisticsTest { @Test public void test() throws Exception { ClientReportStatistics statistics = new ClientReportStatistics(); - String xml = Files.forIO().readFrom(getClass().getResourceAsStream("transactionReport.xml"), "utf-8"); + String xml = new String(getClass().getResourceAsStream("transactionReport.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TransactionReport report = DefaultSaxParser.parse(xml); - String xml2 = Files.forIO().readFrom(getClass().getResourceAsStream("transactionReport2.xml"), "utf-8"); + String xml2 = new String(getClass().getResourceAsStream("transactionReport2.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TransactionReport report2 = DefaultSaxParser.parse(xml2); - String result = Files.forIO().readFrom(getClass().getResourceAsStream("clientReport.xml"), "utf-8"); + String result = new String(getClass().getResourceAsStream("clientReport.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); report.accept(statistics); report2.accept(statistics); diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/service/ServiceReportMergerTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/service/ServiceReportMergerTest.java index 3476fbc644..2cdfa14d8a 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/service/ServiceReportMergerTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/service/ServiceReportMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.home.service.entity.ServiceReport; import com.dianping.cat.home.service.transform.DefaultSaxParser; @@ -29,11 +28,11 @@ public class ServiceReportMergerTest { @Test public void testServiceReportMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("ServiceReportOld.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("ServiceReportNew.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("ServiceReportOld.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("ServiceReportNew.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ServiceReport reportOld = DefaultSaxParser.parse(oldXml); ServiceReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("ServiceReportResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("ServiceReportResult.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); ServiceReportMerger merger = new ServiceReportMerger(new ServiceReport(reportOld.getDomain())); reportOld.accept(merger); diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/storage/HistoryStorageReportMergerTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/storage/HistoryStorageReportMergerTest.java index cc9a4c0b94..7c9a6c082a 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/storage/HistoryStorageReportMergerTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/storage/HistoryStorageReportMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.consumer.storage.StorageReportMerger; import com.dianping.cat.consumer.storage.model.entity.StorageReport; @@ -31,10 +30,10 @@ public class HistoryStorageReportMergerTest { @Test public void testMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("storage.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("storage.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); StorageReport report1 = DefaultSaxParser.parse(oldXml); StorageReport report2 = DefaultSaxParser.parse(oldXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("result.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("result.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); StorageReportMerger merger = new HistoryStorageReportMerger(new StorageReport(report1.getId())); report1.accept(merger); diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/transaction/HistoryTransactionMergerTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/transaction/HistoryTransactionMergerTest.java index ec8b73ca76..50b23efc53 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/transaction/HistoryTransactionMergerTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/transaction/HistoryTransactionMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.TestHelper; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; @@ -31,11 +30,11 @@ public class HistoryTransactionMergerTest { @Test public void testMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("HistoryTransaction.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("HistoryTransaction.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TransactionReport report1 = DefaultSaxParser.parse(oldXml); TransactionReport report2 = DefaultSaxParser.parse(oldXml); - String expected = Files.forIO() - .readFrom(getClass().getResourceAsStream("HistoryTransactionMergeResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("HistoryTransactionMergeResult.xml") + .readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); HistoryTransactionReportMerger merger = new HistoryTransactionReportMerger(new TransactionReport(report1.getDomain())) .setDuration(2); diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/transaction/TransactionReportGraphCreatorTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/transaction/TransactionReportGraphCreatorTest.java index f45269a4ad..f30e7fe9eb 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/transaction/TransactionReportGraphCreatorTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/transaction/TransactionReportGraphCreatorTest.java @@ -22,7 +22,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.TestHelper; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; @@ -34,11 +33,11 @@ public class TransactionReportGraphCreatorTest { @Test public void testMergeHourlyGraph() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("BaseTransactionReportForGraph.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("BaseTransactionReportForGraph.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TransactionReport report1 = DefaultSaxParser.parse(oldXml); TransactionReport report2 = DefaultSaxParser.parse(oldXml); - String expected = Files.forIO() - .readFrom(getClass().getResourceAsStream("TransactionReportHourlyGraphResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("TransactionReportHourlyGraphResult.xml") + .readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TransactionReport result = new TransactionReport(report1.getDomain()); @@ -53,13 +52,13 @@ public void testMergeHourlyGraph() throws Exception { @Test public void testMergeDailyGraph() throws Exception { - String oldXml1 = Files.forIO().readFrom(getClass().getResourceAsStream("BaseDailyTransactionReport1.xml"), "utf-8"); - String oldXml2 = Files.forIO().readFrom(getClass().getResourceAsStream("BaseDailyTransactionReport2.xml"), "utf-8"); + String oldXml1 = new String(getClass().getResourceAsStream("BaseDailyTransactionReport1.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String oldXml2 = new String(getClass().getResourceAsStream("BaseDailyTransactionReport2.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TransactionReport report1 = DefaultSaxParser.parse(oldXml1); TransactionReport report2 = DefaultSaxParser.parse(oldXml2); - String expected = Files.forIO() - .readFrom(getClass().getResourceAsStream("TransactionReportDailyGraphResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("TransactionReportDailyGraphResult.xml") + .readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); TransactionReport result = new TransactionReport(report1.getDomain()); diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/utilization/UtilizationReportMergerTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/utilization/UtilizationReportMergerTest.java index 3bbc9bbcd7..77bd3dafb7 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/utilization/UtilizationReportMergerTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/utilization/UtilizationReportMergerTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.helper.Files; import com.dianping.cat.home.utilization.entity.UtilizationReport; import com.dianping.cat.home.utilization.transform.DefaultSaxParser; @@ -29,11 +28,11 @@ public class UtilizationReportMergerTest { @Test public void testUtilizationReportMerge() throws Exception { - String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("UtilizationReportOld.xml"), "utf-8"); - String newXml = Files.forIO().readFrom(getClass().getResourceAsStream("UtilizationReportNew.xml"), "utf-8"); + String oldXml = new String(getClass().getResourceAsStream("UtilizationReportOld.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); + String newXml = new String(getClass().getResourceAsStream("UtilizationReportNew.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); UtilizationReport reportOld = DefaultSaxParser.parse(oldXml); UtilizationReport reportNew = DefaultSaxParser.parse(newXml); - String expected = Files.forIO().readFrom(getClass().getResourceAsStream("UtilizationReportResult.xml"), "utf-8"); + String expected = new String(getClass().getResourceAsStream("UtilizationReportResult.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); UtilizationReportMerger merger = new UtilizationReportMerger(new UtilizationReport(reportOld.getDomain())); reportOld.accept(merger); diff --git a/pom.xml b/pom.xml index d441472e1a..cb7d192697 100644 --- a/pom.xml +++ b/pom.xml @@ -456,9 +456,52 @@ org.eclipse.jdt.core.compiler.compliance=21 maven-enforcer-plugin ${maven-enforcer-plugin.version} + + org.apache.maven.plugins + maven-antrun-plugin + ${maven-antrun-plugin.version} + + + org.apache.maven.plugins + maven-antrun-plugin + false + + + ban-unidal-lookup-annotations + validate + + run + + + + + + + + + + + + + + + + + + + + + + + + + + + org.apache.maven.plugins maven-enforcer-plugin @@ -528,6 +571,7 @@ org.eclipse.jdt.core.compiler.compliance=21 3.3.1 3.12.0 3.6.2 + 3.1.0 2.0.17 1.5.34 2.0.62 From f88f30c8769532d2584961ada7457df62185c5a5 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 12:01:55 +0800 Subject: [PATCH 093/231] =?UTF-8?q?=E6=B8=85=E7=90=86=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=B8=AD=E7=9A=84=E4=BD=8E=E9=A3=8E=E9=99=A9?= =?UTF-8?q?=20Unidal=20=E5=B7=A5=E5=85=B7=E7=B1=BB=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/spi/config/AlertConfigManager.java | 2 +- .../alarm/spi/decorator/ProjectDecorator.java | 2 +- .../alarm/spi/receiver/DefaultContactor.java | 10 ++++++--- .../alarm/spi/receiver/ProjectContactor.java | 2 +- .../cat/alarm/spi/sender/AbstractSender.java | 17 ++++++-------- .../dianping/cat/consumer/DatabaseParser.java | 2 +- .../cat/consumer/cross/CrossAnalyzer.java | 2 +- .../problem/DefaultProblemHandler.java | 7 +++--- .../cat/consumer/storage/StorageAnalyzer.java | 2 +- .../cat/consumer/top/TopAnalyzer.java | 6 ++--- .../com/dianping/cat/app/AppDataField.java | 10 +++++---- .../message/codec/WaterfallMessageCodec.java | 18 +++++++-------- .../cat/mvc/AbstractReportPayload.java | 11 ++++++---- .../dianping/cat/server/QueryParameter.java | 22 ++++++++++++++----- .../dianping/cat/service/HostinfoService.java | 7 ++++-- 15 files changed, 70 insertions(+), 50 deletions(-) diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java index 1f2c8aa60c..36c47650a6 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java @@ -20,10 +20,10 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.util.StringUtils; import com.dianping.cat.Cat; import com.dianping.cat.alarm.receiver.entity.AlertConfig; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java index 4015b0806a..e6461f13f2 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/ProjectDecorator.java @@ -18,7 +18,7 @@ */ package com.dianping.cat.alarm.spi.decorator; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/DefaultContactor.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/DefaultContactor.java index 27804b7cde..9c18299edc 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/DefaultContactor.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/DefaultContactor.java @@ -21,8 +21,6 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.helper.Splitters; - import com.dianping.cat.alarm.receiver.entity.Receiver; public abstract class DefaultContactor { @@ -67,7 +65,13 @@ protected List split(String str) { List result = new ArrayList(); if (str != null) { - result.addAll(Splitters.by(",").noEmptyItem().trim().split(str)); + for (String item : str.split(",")) { + String value = item.trim(); + + if (value.length() > 0) { + result.add(value); + } + } } return result; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ProjectContactor.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ProjectContactor.java index d152e28b5e..adc5c2f373 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ProjectContactor.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/receiver/ProjectContactor.java @@ -21,7 +21,7 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.alarm.receiver.entity.Receiver; import com.dianping.cat.alarm.spi.config.AlertConfigManager; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java index fa80ab7535..0bf529ef90 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/sender/AbstractSender.java @@ -23,11 +23,11 @@ import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; +import java.nio.charset.StandardCharsets; import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; import org.slf4j.LoggerFactory; -import org.unidal.helper.Files; import com.dianping.cat.Cat; import com.dianping.cat.alarm.spi.config.SenderConfigManager; @@ -63,15 +63,14 @@ private boolean httpGetSend(String successCode, String urlPrefix, String urlPars conn.setReadTimeout(3000); in = conn.getInputStream(); - StringBuilder sb = new StringBuilder(); - sb.append(Files.forIO().readFrom(in, "utf-8")).append(""); + String response = new String(in.readAllBytes(), StandardCharsets.UTF_8); - if (sb.toString().contains(successCode)) { + if (response.contains(successCode)) { sendSuccess = true; return true; } else { LOGGER.warn("Alert HTTP GET returned unexpected response, urlPrefix={}, successCode={}, response={}.", - urlPrefix, successCode, sb); + urlPrefix, successCode, response); return false; } } catch (Exception e) { @@ -116,15 +115,13 @@ private boolean httpPostSend(String successCode, String urlPrefix, String conten writer.flush(); in = conn.getInputStream(); - StringBuilder sb = new StringBuilder(); - - sb.append(Files.forIO().readFrom(in, "utf-8")).append(""); - if (sb.toString().contains(successCode)) { + String response = new String(in.readAllBytes(), StandardCharsets.UTF_8); + if (response.contains(successCode)) { sendSuccess = true; return true; } else { LOGGER.warn("Alert HTTP POST returned unexpected response, urlPrefix={}, successCode={}, response={}.", - urlPrefix, successCode, sb); + urlPrefix, successCode, response); return false; } } catch (Exception e) { diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/DatabaseParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/DatabaseParser.java index f694bee99d..fae2332f90 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/DatabaseParser.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/DatabaseParser.java @@ -25,8 +25,8 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; +import org.apache.commons.lang.StringUtils; import org.slf4j.LoggerFactory; -import org.unidal.lookup.util.StringUtils; import com.dianping.cat.Cat; import com.dianping.cat.message.Event; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossAnalyzer.java index 74ea2c9447..42120aa577 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/CrossAnalyzer.java @@ -28,9 +28,9 @@ import com.dianping.cat.message.spi.MessageTree; import com.dianping.cat.report.DefaultReportManager.StoragePolicy; import com.dianping.cat.report.ReportManager; +import org.apache.commons.lang.StringUtils; import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; -import org.unidal.lookup.util.StringUtils; import java.util.List; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/DefaultProblemHandler.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/DefaultProblemHandler.java index 559070f603..53d6a7791b 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/DefaultProblemHandler.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/DefaultProblemHandler.java @@ -18,11 +18,10 @@ */ package com.dianping.cat.consumer.problem; -import java.util.HashSet; import java.util.List; import java.util.Set; - -import org.unidal.helper.Splitters; +import java.util.stream.Collectors; +import java.util.stream.Stream; import com.dianping.cat.consumer.problem.model.entity.Entity; import com.dianping.cat.consumer.problem.model.entity.Machine; @@ -96,7 +95,7 @@ private void processTransaction(Machine machine, Transaction transaction, Messag } public void setErrorType(String type) { - m_errorTypes = new HashSet(Splitters.by(',').noEmptyItem().split(type)); + m_errorTypes = Stream.of(type.split(",")).map(String::trim).filter(item -> !item.isEmpty()).collect(Collectors.toSet()); } } diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageAnalyzer.java index 6c50fdf238..de1f56c463 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/StorageAnalyzer.java @@ -26,7 +26,7 @@ import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang.StringUtils; import com.dianping.cat.analysis.AbstractMessageAnalyzer; import com.dianping.cat.analysis.MessageAnalyzer; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/TopAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/TopAnalyzer.java index e53e5c6b68..a8064a500e 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/TopAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/TopAnalyzer.java @@ -18,13 +18,13 @@ */ package com.dianping.cat.consumer.top; -import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; -import org.unidal.helper.Splitters; import com.dianping.cat.Constants; import com.dianping.cat.analysis.AbstractMessageAnalyzer; @@ -118,6 +118,6 @@ private void processEvent(TopReport report, MessageTree tree, Event event) { } public void setErrorType(String type) { - m_errorTypes = new HashSet(Splitters.by(',').noEmptyItem().split(type)); + m_errorTypes = Stream.of(type.split(",")).map(String::trim).filter(item -> !item.isEmpty()).collect(Collectors.toSet()); } } diff --git a/cat-core/src/main/java/com/dianping/cat/app/AppDataField.java b/cat-core/src/main/java/com/dianping/cat/app/AppDataField.java index 8741d26bdf..aa1478dc05 100644 --- a/cat-core/src/main/java/com/dianping/cat/app/AppDataField.java +++ b/cat-core/src/main/java/com/dianping/cat/app/AppDataField.java @@ -18,8 +18,6 @@ */ package com.dianping.cat.app; -import org.unidal.lookup.util.StringUtils; - public enum AppDataField { OPERATOR("operator", "运营商"), @@ -47,7 +45,7 @@ public enum AppDataField { } public static AppDataField getByName(String name, AppDataField defaultField) { - if (StringUtils.isNotEmpty(name)) { + if (isNotEmpty(name)) { for (AppDataField field : AppDataField.values()) { if (field.getName().equals(name)) { return field; @@ -58,7 +56,7 @@ public static AppDataField getByName(String name, AppDataField defaultField) { } public static AppDataField getByTitle(String title) { - if (StringUtils.isNotEmpty(title)) { + if (isNotEmpty(title)) { for (AppDataField field : AppDataField.values()) { if (field.getTitle().equals(title)) { return field; @@ -68,6 +66,10 @@ public static AppDataField getByTitle(String title) { return null; } + private static boolean isNotEmpty(String value) { + return value != null && value.length() > 0; + } + public String getName() { return m_name; } diff --git a/cat-core/src/main/java/com/dianping/cat/message/codec/WaterfallMessageCodec.java b/cat-core/src/main/java/com/dianping/cat/message/codec/WaterfallMessageCodec.java index 9b1805c0bc..01fb4f5db0 100644 --- a/cat-core/src/main/java/com/dianping/cat/message/codec/WaterfallMessageCodec.java +++ b/cat-core/src/main/java/com/dianping/cat/message/codec/WaterfallMessageCodec.java @@ -18,13 +18,13 @@ */ package com.dianping.cat.message.codec; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -import io.netty.buffer.ByteBuf; -import org.unidal.helper.Splitters; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Stack; + +import io.netty.buffer.ByteBuf; import com.dianping.cat.message.Event; import com.dianping.cat.message.Message; @@ -286,7 +286,7 @@ private int[] getTransactionDurationSegments(Transaction t) { str = data.substring(3, pos); } - List parts = Splitters.by(',').split(str); + List parts = Arrays.asList(str.split(",")); int len = parts.size(); int[] segments = new int[len]; @@ -311,7 +311,7 @@ private int[] getTransactionDurationSegments(Transaction t) { str = data.substring(3, pos); } - List parts = Splitters.by(',').split(str); + List parts = Arrays.asList(str.split(",")); int len = parts.size(); int[] segments = new int[len]; diff --git a/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportPayload.java b/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportPayload.java index 8e711e139b..d4e5a396df 100755 --- a/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportPayload.java +++ b/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportPayload.java @@ -23,7 +23,6 @@ import java.util.Calendar; import java.util.Date; -import org.unidal.lookup.util.StringUtils; import org.unidal.web.mvc.Action; import org.unidal.web.mvc.ActionPayload; import org.unidal.web.mvc.Page; @@ -186,7 +185,7 @@ public String getDomain() { } public void setDomain(String domain) { - if (StringUtils.isNotEmpty(domain)) { + if (isNotEmpty(domain)) { m_domain = domain; } } @@ -242,7 +241,7 @@ public String getIpAddress() { } public void setIpAddress(String ipAddress) { - if (StringUtils.isNotEmpty(ipAddress)) { + if (isNotEmpty(ipAddress)) { m_ipAddress = ipAddress; } } @@ -269,7 +268,7 @@ public String getReportType() { } public void setReportType(String reportType) { - if (StringUtils.isNotEmpty(reportType)) { + if (isNotEmpty(reportType)) { m_reportType = reportType; } } @@ -290,4 +289,8 @@ public void setCustomStart(String customStart) { m_customStart = customStart; } + private boolean isNotEmpty(String value) { + return value != null && value.length() > 0; + } + } diff --git a/cat-core/src/main/java/com/dianping/cat/server/QueryParameter.java b/cat-core/src/main/java/com/dianping/cat/server/QueryParameter.java index 65dbf4bf8d..86a3339cdf 100644 --- a/cat-core/src/main/java/com/dianping/cat/server/QueryParameter.java +++ b/cat-core/src/main/java/com/dianping/cat/server/QueryParameter.java @@ -19,11 +19,9 @@ package com.dianping.cat.server; import java.util.Date; +import java.util.LinkedList; import java.util.List; -import org.unidal.helper.Splitters; -import org.unidal.lookup.util.StringUtils; - public class QueryParameter { private String m_category; @@ -99,15 +97,29 @@ public QueryParameter setMeasurement(String measurement) { public String getSqlTags() { String tag = ""; - List tags = Splitters.by(";").noEmptyItem().split(m_tags); + List tags = splitTags(); if (!tags.isEmpty()) { - tag = StringUtils.join(tags, " AND ") + " AND "; + tag = String.join(" AND ", tags) + " AND "; } return tag; } + private List splitTags() { + List tags = new LinkedList(); + + if (m_tags != null) { + for (String item : m_tags.split(";")) { + if (item.length() > 0) { + tags.add(item); + } + } + } + + return tags; + } + public Date getStart() { return m_start; } diff --git a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java index d764574010..43094d09b9 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java @@ -34,7 +34,6 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.helper.Threads; import org.unidal.helper.Threads.Task; -import org.unidal.lookup.util.StringUtils; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -160,7 +159,7 @@ public String queryHostnameByIp(String ip) { if (info != null) { hostname = info.getHostname(); - if (StringUtils.isNotEmpty(hostname)) { + if (isNotEmpty(hostname)) { return hostname; } } @@ -262,6 +261,10 @@ private boolean validateIp(String str) { return pattern.matcher(str).matches(); } + private boolean isNotEmpty(String value) { + return value != null && value.length() > 0; + } + public class RefreshHost implements Task { @Override public String getName() { From c42f92e48bd4157bc5f6fc5469dd372710182786 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 12:28:57 +0800 Subject: [PATCH 094/231] =?UTF-8?q?=E5=AE=8C=E6=88=90=20cat-core=20?= =?UTF-8?q?=E5=89=A9=E4=BD=99=E4=BD=8E=E9=A3=8E=E9=99=A9=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/LocalResourceContentFetcher.java | 8 +++++--- .../cat/report/LocalReportBucket.java | 11 ++++------ .../service/BaseCompositeModelService.java | 19 ++++++++++++++++-- .../service/BaseRemoteModelService.java | 20 +++++++++++++++---- .../com/dianping/cat/service/IpService2.java | 6 ++---- 5 files changed, 44 insertions(+), 20 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/config/content/LocalResourceContentFetcher.java b/cat-core/src/main/java/com/dianping/cat/config/content/LocalResourceContentFetcher.java index e0147e05cb..e5fcf6f331 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/content/LocalResourceContentFetcher.java +++ b/cat-core/src/main/java/com/dianping/cat/config/content/LocalResourceContentFetcher.java @@ -18,9 +18,11 @@ */ package com.dianping.cat.config.content; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; -import org.unidal.helper.Files; import com.dianping.cat.Cat; @@ -34,8 +36,8 @@ public String getConfigContent(String configName) { String path = PATH + configName + ".xml"; String content = ""; - try { - content = Files.forIO().readFrom(this.getClass().getResourceAsStream(path), "utf-8"); + try (InputStream in = getClass().getResourceAsStream(path)) { + content = new String(in.readAllBytes(), StandardCharsets.UTF_8); } catch (Exception e) { m_logger.warn("can't find local default config " + configName); Cat.logError(configName + " can't find", e); diff --git a/cat-core/src/main/java/com/dianping/cat/report/LocalReportBucket.java b/cat-core/src/main/java/com/dianping/cat/report/LocalReportBucket.java index 3d860a907e..80d8053a56 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/LocalReportBucket.java +++ b/cat-core/src/main/java/com/dianping/cat/report/LocalReportBucket.java @@ -36,8 +36,6 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; import org.slf4j.LoggerFactory; -import org.unidal.helper.Splitters; -import org.unidal.helper.Splitters.StringSplitter; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -190,7 +188,6 @@ protected void loadIndexes(File indexFile) throws IOException { m_writeLock.lock(); try { reader = new BufferedReader(new FileReader(indexFile)); - StringSplitter splitter = Splitters.by('\t'); while (true) { String line = reader.readLine(); @@ -199,11 +196,11 @@ protected void loadIndexes(File indexFile) throws IOException { break; } - List parts = splitter.split(line); + String[] parts = line.split("\t"); - if (parts.size() >= 2) { - String id = parts.remove(0); - String offset = parts.remove(0); + if (parts.length >= 2) { + String id = parts[0]; + String offset = parts[1]; try { m_idToOffsets.put(id, Long.parseLong(offset)); diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java b/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java index c98d020e86..3461ded56e 100755 --- a/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/BaseCompositeModelService.java @@ -26,7 +26,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; -import org.unidal.helper.Splitters; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -79,7 +78,7 @@ public void initialize() throws InitializationException { } String remoteServers = m_configManager.getConsoleRemoteServers(); - List endpoints = Splitters.by(',').noEmptyItem().trim().split(remoteServers); + List endpoints = splitEndpoints(remoteServers); for (String endpoint : endpoints) { int pos = endpoint.indexOf(':'); @@ -104,6 +103,22 @@ private String buildHost(String endpoint, int pos) { return host; } + private List splitEndpoints(String remoteServers) { + List endpoints = new ArrayList(); + + if (remoteServers != null) { + for (String endpoint : remoteServers.split(",")) { + String value = endpoint.trim(); + + if (value.length() > 0) { + endpoints.add(value); + } + } + } + + return endpoints; + } + @Override public ModelResponse invoke(final ModelRequest request) { int requireSize = 0; diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/BaseRemoteModelService.java b/cat-core/src/main/java/com/dianping/cat/report/service/BaseRemoteModelService.java index e948afbc7d..5cd1e2ba84 100755 --- a/cat-core/src/main/java/com/dianping/cat/report/service/BaseRemoteModelService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/BaseRemoteModelService.java @@ -23,15 +23,15 @@ import com.dianping.cat.message.Message; import com.dianping.cat.message.Transaction; import com.dianping.cat.report.server.RemoteServersManager; -import org.unidal.helper.Files; -import org.unidal.helper.Urls; import org.xml.sax.SAXException; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; +import java.net.URLConnection; import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.Map.Entry; import java.util.Set; import java.util.zip.GZIPInputStream; @@ -89,8 +89,7 @@ public ModelResponse invoke(ModelRequest request) { t.addData(url.toString()); - InputStream in = Urls.forIO().connectTimeout(1000).readTimeout(10000).withGzip().openStream(url.toExternalForm()); - String xml = Files.forIO().readFrom(in, "utf-8"); + String xml = readUrl(url); int len = xml == null ? 0 : xml.length(); @@ -136,6 +135,19 @@ public boolean isEligable(ModelRequest request) { public abstract boolean isServersFixed(); + private String readUrl(URL url) throws IOException { + URLConnection connection = url.openConnection(); + + connection.setConnectTimeout(1000); + connection.setReadTimeout(10000); + connection.setRequestProperty("Accept-Encoding", "gzip"); + + try (InputStream raw = connection.getInputStream(); + InputStream in = "gzip".equalsIgnoreCase(connection.getContentEncoding()) ? new GZIPInputStream(raw) : raw) { + return new String(in.readAllBytes(), StandardCharsets.UTF_8); + } + } + public void setHost(String host) { m_host = host; } diff --git a/cat-core/src/main/java/com/dianping/cat/service/IpService2.java b/cat-core/src/main/java/com/dianping/cat/service/IpService2.java index a37d8c7eaa..47235ab88d 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/IpService2.java +++ b/cat-core/src/main/java/com/dianping/cat/service/IpService2.java @@ -27,7 +27,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; -import org.unidal.helper.Files; import com.dianping.cat.Cat; import com.dianping.cat.service.IpService.IpInfo; @@ -123,9 +122,8 @@ private long ip2long(String ip) { private void load(String filename) { m_lock.lock(); - try { - InputStream is = IpService.class.getClassLoader().getResourceAsStream(filename); - m_dataBuffer = ByteBuffer.wrap(Files.forIO().readFrom(is)); + try (InputStream is = IpService.class.getClassLoader().getResourceAsStream(filename)) { + m_dataBuffer = ByteBuffer.wrap(is.readAllBytes()); m_dataBuffer.position(0); m_offset = m_dataBuffer.getInt(); // indexLength byte[] indexBytes = new byte[m_offset]; From 5c2f63e34d8be442327a5b6d007b940b395c8f07 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 12:51:11 +0800 Subject: [PATCH 095/231] =?UTF-8?q?=E4=BD=BF=E7=94=A8=20Apache=20Commons?= =?UTF-8?q?=20=E5=92=8C=20Guava=20=E6=9B=BF=E6=8D=A2=20cat-core=20Unidal?= =?UTF-8?q?=20=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cat-core/pom.xml | 20 ++++++++++++--- .../config/server/ServerConfigManager.java | 17 +++++++------ pom.xml | 25 +++++++++++++++---- 3 files changed, 46 insertions(+), 16 deletions(-) diff --git a/cat-core/pom.xml b/cat-core/pom.xml index 67b6858af4..266bc107da 100644 --- a/cat-core/pom.xml +++ b/cat-core/pom.xml @@ -23,10 +23,22 @@ org.unidal.framework web-framework - - org.xerial.snappy - snappy-java - + + org.xerial.snappy + snappy-java + + + org.apache.commons + commons-lang3 + + + commons-io + commons-io + + + com.google.guava + guava + org.unidal.framework dal-jdbc diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java index 0727c58086..81a4b77186 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java @@ -20,6 +20,7 @@ import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -34,14 +35,15 @@ import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.tuple.Pair; import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.helper.Files; -import org.unidal.helper.Splitters; import org.unidal.helper.Threads; -import org.unidal.tuple.Pair; import org.xml.sax.SAXException; +import com.google.common.base.Splitter; + import com.dianping.cat.Cat; import com.dianping.cat.Constants; import com.dianping.cat.config.content.ContentFetcher; @@ -127,7 +129,7 @@ public String getConsoleDefaultDomain() { public List> getConsoleEndpoints() { String remoteServers = getProperty(REMOTE_SERVERS, ""); - List endpoints = Splitters.by(',').noEmptyItem().trim().split(remoteServers); + List endpoints = Splitter.on(',').trimResults().omitEmptyStrings().splitToList(remoteServers); List> pairs = new ArrayList>(endpoints.size()); for (String endpoint : endpoints) { @@ -135,7 +137,7 @@ public List> getConsoleEndpoints() { String host = (pos > 0 ? endpoint.substring(0, pos) : endpoint); int port = (pos > 0 ? Integer.parseInt(endpoint.substring(pos + 1)) : 2281); - pairs.add(new Pair(host, port)); + pairs.add(Pair.of(host, port)); } return pairs; @@ -475,7 +477,7 @@ public void initialize(File configFile) throws Exception { if (configFile != null && configFile.canRead()) { m_logger.info(String.format("Loading configuration file(%s) ...", configFile.getCanonicalPath())); - String xml = Files.forIO().readFrom(configFile, "utf-8"); + String xml = FileUtils.readFileToString(configFile, StandardCharsets.UTF_8); m_config = DefaultSaxParser.parse(xml); SLF4J_LOGGER.info("Loaded server config from local file, path={}.", configFile.getCanonicalPath()); } else { @@ -600,7 +602,8 @@ private void refreshServer() throws SAXException, IOException { m_server = defaultServer; String forcedStatisticTypePrefixStr = getProperty("forced-statistic-type-prefixes", "Cellar.,Squirrel."); - List forcedStatisticTypePrefixes = Splitters.by(",").noEmptyItem().split(forcedStatisticTypePrefixStr); + List forcedStatisticTypePrefixes = Splitter.on(',').omitEmptyStrings() + .splitToList(forcedStatisticTypePrefixStr); m_forcedStatisticTypePrefixes = new HashSet<>(forcedStatisticTypePrefixes); SLF4J_LOGGER.info("Refreshed server runtime config, localIp={}, forcedStatisticTypePrefixes={}.", ip, m_forcedStatisticTypePrefixes); diff --git a/pom.xml b/pom.xml index cb7d192697..71746ea9b0 100644 --- a/pom.xml +++ b/pom.xml @@ -213,11 +213,26 @@ commons-codec 1.19.0 - - commons-lang - commons-lang - 2.6 - + + commons-lang + commons-lang + 2.6 + + + org.apache.commons + commons-lang3 + 3.20.0 + + + commons-io + commons-io + 2.22.0 + + + com.google.guava + guava + 33.6.0-jre + org.xerial.snappy snappy-java From 222520128c9a03f257730ae87565364f6664ee7c Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 13:02:50 +0800 Subject: [PATCH 096/231] =?UTF-8?q?=E5=AE=8C=E6=88=90=20cat-home=20?= =?UTF-8?q?=E5=91=8A=E8=AD=A6=E5=B1=82=E4=B8=80=E6=89=B9=20Unidal=20?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cat-home/pom.xml | 8 ++++++++ .../cat/report/alert/business/BusinessAlert.java | 2 +- .../dianping/cat/report/alert/config/BaseRuleHelper.java | 4 ++-- .../com/dianping/cat/report/alert/event/EventAlert.java | 9 +++++---- .../cat/report/alert/heartbeat/HeartbeatAlert.java | 6 +++--- .../com/dianping/cat/report/alert/spi/AlarmRule.java | 4 ++-- .../report/alert/spi/config/BaseRuleConfigManager.java | 4 ++-- .../cat/report/alert/summary/AlertSummaryExecutor.java | 5 +++-- .../cat/report/alert/transaction/TransactionAlert.java | 9 +++++---- 9 files changed, 31 insertions(+), 20 deletions(-) diff --git a/cat-home/pom.xml b/cat-home/pom.xml index ec00f493c0..f7e0ecbee5 100755 --- a/cat-home/pom.xml +++ b/cat-home/pom.xml @@ -74,6 +74,14 @@ org.springframework spring-tx + + org.apache.commons + commons-lang3 + + + com.google.guava + guava + org.projectlombok lombok diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java index 0114bf5e61..90d5d9a64b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessAlert.java @@ -29,7 +29,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.helper.Threads.Task; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.tuple.Pair; import com.dianping.cat.Cat; import com.dianping.cat.alarm.rule.entity.Condition; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/config/BaseRuleHelper.java b/cat-home/src/main/java/com/dianping/cat/report/alert/config/BaseRuleHelper.java index 0910610f6b..416f1b2003 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/config/BaseRuleHelper.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/config/BaseRuleHelper.java @@ -25,7 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.tuple.Pair; import com.dianping.cat.Cat; import com.dianping.cat.alarm.rule.entity.Condition; @@ -57,7 +57,7 @@ public Pair> convertConditions(List configs) { } if (maxMinute > 0) { - return new Pair>(maxMinute, conditions); + return Pair.of(maxMinute, conditions); } else { return null; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventAlert.java index 40094170b0..62f54c4e73 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/event/EventAlert.java @@ -26,11 +26,12 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.slf4j.LoggerFactory; -import org.unidal.helper.Splitters; import org.unidal.helper.Threads.Task; -import org.unidal.tuple.Pair; + +import com.google.common.base.Splitter; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -233,7 +234,7 @@ protected double[] mergerArray(double[] from, double[] to) { } private void processRule(Rule rule) { - List fields = Splitters.by(";").split(rule.getId()); + List fields = Splitter.on(';').splitToList(rule.getId()); String domain = fields.get(0); String type = fields.get(1); String name = fields.get(2); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java index ea0a0a539d..2aff23d03e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/heartbeat/HeartbeatAlert.java @@ -28,8 +28,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.helper.Threads.Task; -import org.unidal.lookup.util.StringUtils; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -197,7 +197,7 @@ private List> extractExtentionMetrics(Period period) { Map details = extension.getDetails(); for (Entry detail : details.entrySet()) { - metrics.add(new Pair(extension.getId(), detail.getKey())); + metrics.add(Pair.of(extension.getId(), detail.getKey())); } } return metrics; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/AlarmRule.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/AlarmRule.java index 9db4628c9c..138665236e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/AlarmRule.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/AlarmRule.java @@ -25,7 +25,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.dianping.cat.alarm.rule.entity.Condition; import com.dianping.cat.alarm.rule.entity.Config; @@ -98,4 +98,4 @@ public int validateRegex(String regexText, String text) { } } -} \ No newline at end of file +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java index 29821e96d3..b352a84f22 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java @@ -33,8 +33,8 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.util.StringUtils; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.xml.sax.SAXException; import com.dianping.cat.Cat; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java index 04fe90f883..14546249ae 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryExecutor.java @@ -26,7 +26,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.helper.Splitters; + +import com.google.common.base.Splitter; import com.dianping.cat.Cat; import com.dianping.cat.alarm.spi.AlertChannel; @@ -74,7 +75,7 @@ private List builderReceivers(String str) { List result = new ArrayList(); if (str != null) { - result.addAll(Splitters.by(",").noEmptyItem().split(str)); + result.addAll(Splitter.on(',').omitEmptyStrings().splitToList(str)); } return result; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java b/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java index b469edfac9..79134f648d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/transaction/TransactionAlert.java @@ -43,11 +43,12 @@ import com.dianping.cat.report.service.ModelService; import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.slf4j.LoggerFactory; -import org.unidal.helper.Splitters; import org.unidal.helper.Threads.Task; -import org.unidal.tuple.Pair; + +import com.google.common.base.Splitter; import java.util.ArrayList; import java.util.HashMap; @@ -238,7 +239,7 @@ private double[] mergerArray(double[] from, double[] to) { } private void processRule(Rule rule) { - List fields = Splitters.by(";").split(rule.getId()); + List fields = Splitter.on(';').splitToList(rule.getId()); String domain = fields.get(0); String type = fields.get(1); String name = fields.get(2); From 8ae95d865b7d59728b21d764ff3665accebef371 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 13:13:13 +0800 Subject: [PATCH 097/231] =?UTF-8?q?cat-home=20=E9=A1=B5=E9=9D=A2/=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=E5=B1=82=E4=B8=AD=E7=9A=84=20Unidal=20=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=B1=BB=E6=9B=BF=E6=8D=A2=E4=B8=BA=20Commons=20Lang3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alert/exception/AlertExceptionBuilder.java | 15 ++++++++------- .../dianping/cat/report/page/alert/Handler.java | 7 ++++--- .../dianping/cat/report/page/alert/Payload.java | 7 ++++--- .../cat/report/page/alteration/Handler.java | 2 +- .../cat/report/page/alteration/Payload.java | 2 +- .../cat/report/page/cache/CacheReport.java | 2 +- .../dianping/cat/report/page/cache/Handler.java | 2 +- .../cat/report/page/cross/CrossMethodVisitor.java | 2 +- .../dianping/cat/report/page/cross/Handler.java | 2 +- .../cat/report/page/dependency/Handler.java | 2 +- .../cat/report/page/event/DisplayTypes.java | 2 +- .../dianping/cat/report/page/event/Handler.java | 2 +- .../cat/report/page/heartbeat/Handler.java | 2 +- .../heartbeat/service/LocalHeartbeatService.java | 2 +- .../dianping/cat/report/page/problem/Handler.java | 2 +- .../cat/report/page/statistics/Handler.java | 6 +++--- .../com/dianping/cat/report/page/top/Handler.java | 2 +- .../cat/report/page/transaction/Handler.java | 2 +- 18 files changed, 33 insertions(+), 30 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/AlertExceptionBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/AlertExceptionBuilder.java index 7da19fe928..ec92e780e8 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/AlertExceptionBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/AlertExceptionBuilder.java @@ -24,7 +24,8 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.tuple.MutablePair; +import org.apache.commons.lang3.tuple.Pair; import com.dianping.cat.alarm.spi.AlertLevel; import com.dianping.cat.home.exception.entity.ExceptionLimit; @@ -86,7 +87,7 @@ private List buildDomainAlertExceptions(Item item) { private Pair queryDomainExceptionLimit(String domain, String exceptionName) { ExceptionLimit exceptionLimit = m_exceptionConfigManager.queryExceptionLimit(domain, exceptionName); - Pair limits = new Pair(); + MutablePair limits = new MutablePair(); double warnLimit = -1; double errorLimit = -1; @@ -98,15 +99,15 @@ private Pair queryDomainExceptionLimit(String domain, String exc warnLimit = exceptionLimit.getWarning(); errorLimit = exceptionLimit.getError(); } - limits.setKey(warnLimit); - limits.setValue(errorLimit); + limits.setLeft(warnLimit); + limits.setRight(errorLimit); return limits; } private Pair queryDomainTotalLimit(String domain) { ExceptionLimit totalExceptionLimit = m_exceptionConfigManager.queryTotalLimitByDomain(domain); - Pair limits = new Pair(); + MutablePair limits = new MutablePair(); double totalWarnLimit = -1; double totalErrorLimit = -1; @@ -118,8 +119,8 @@ private Pair queryDomainTotalLimit(String domain) { totalWarnLimit = totalExceptionLimit.getWarning(); totalErrorLimit = totalExceptionLimit.getError(); } - limits.setKey(totalWarnLimit); - limits.setValue(totalErrorLimit); + limits.setLeft(totalWarnLimit); + limits.setRight(totalErrorLimit); return limits; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java index 12f989bdeb..7495387618 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java @@ -32,8 +32,7 @@ import java.util.Map; import org.unidal.dal.jdbc.DalException; -import org.unidal.helper.Splitters; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.web.mvc.PageHandler; @@ -41,6 +40,8 @@ import org.unidal.web.mvc.annotation.OutboundActionMeta; import org.unidal.web.mvc.annotation.PayloadMeta; +import com.google.common.base.Splitter; + import com.dianping.cat.Cat; import com.dianping.cat.alarm.Alert; import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; @@ -108,7 +109,7 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { switch (action) { case ALERT: - List receivers = Splitters.by(",").noEmptyItem().split(payload.getReceivers()); + List receivers = Splitter.on(',').omitEmptyStrings().splitToList(payload.getReceivers()); if (receivers == null || receivers.size() == 0) { LOGGER.warn("Manual alert send request lacks receivers, channel={}, type={}, group={}.", payload.getChannel(), payload.getType(), payload.getGroup()); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Payload.java b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Payload.java index e25cf83741..fa4881d9d1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Payload.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Payload.java @@ -25,12 +25,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.helper.Splitters; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.web.mvc.ActionContext; import org.unidal.web.mvc.ActionPayload; import org.unidal.web.mvc.payload.annotation.FieldMeta; +import com.google.common.base.Splitter; + import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.ReportPage; @@ -132,7 +133,7 @@ public void setAlertType(String alertType) { } public String[] getAlertTypeArray() { - List typeList = Splitters.by(",").noEmptyItem().split(m_alertType); + List typeList = Splitter.on(',').omitEmptyStrings().splitToList(m_alertType); String[] typeArray = new String[typeList.size()]; return typeList.toArray(typeArray); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java index 41aab01f31..315a244097 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java @@ -34,7 +34,7 @@ import java.util.Map; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.web.mvc.PageHandler; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Payload.java b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Payload.java index 1f555b6d57..07ecc7d2ec 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Payload.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Payload.java @@ -24,7 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.web.mvc.ActionContext; import org.unidal.web.mvc.payload.annotation.FieldMeta; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cache/CacheReport.java b/cat-home/src/main/java/com/dianping/cat/report/page/cache/CacheReport.java index cef39a49ee..c82658006f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cache/CacheReport.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cache/CacheReport.java @@ -27,7 +27,7 @@ import java.util.Map; import java.util.Set; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.dianping.cat.consumer.event.model.entity.EventName; import com.dianping.cat.consumer.event.model.entity.EventType; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cache/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/cache/Handler.java index cbae49275e..dc3f7c4e96 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cache/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cache/Handler.java @@ -24,7 +24,7 @@ import java.util.Date; import java.util.List; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/CrossMethodVisitor.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/CrossMethodVisitor.java index 9d08bda8db..607490b57d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/CrossMethodVisitor.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/CrossMethodVisitor.java @@ -18,7 +18,7 @@ */ package com.dianping.cat.report.page.cross; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.dianping.cat.consumer.cross.model.entity.Name; import com.dianping.cat.consumer.cross.model.entity.Remote; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/Handler.java index c380a8c755..6130d43b84 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/Handler.java @@ -22,7 +22,7 @@ import java.io.IOException; import java.util.Date; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/Handler.java index 916b695545..014a9c4d8f 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/Handler.java @@ -39,7 +39,7 @@ import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; import com.dianping.cat.spring.CatSpringContext; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/DisplayTypes.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/DisplayTypes.java index 2b127c275a..6b6ac515aa 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/DisplayTypes.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/DisplayTypes.java @@ -26,7 +26,7 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.dianping.cat.consumer.event.model.entity.EventReport; import com.dianping.cat.consumer.event.model.entity.EventType; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/Handler.java index ebd806a7c2..bce669d94d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/Handler.java @@ -24,7 +24,7 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/Handler.java index 42195e677e..2e34c0ffe3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/Handler.java @@ -27,7 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/LocalHeartbeatService.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/LocalHeartbeatService.java index a01a8729be..faed62dc00 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/LocalHeartbeatService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/LocalHeartbeatService.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.Set; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.dianping.cat.Constants; import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java index c7e8d7a278..122511925a 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/Handler.java @@ -28,7 +28,7 @@ import java.util.List; import java.util.Map; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/Handler.java index 2975f71b7a..ce3f0292f0 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/Handler.java @@ -28,8 +28,8 @@ import java.util.LinkedList; import java.util.List; -import org.unidal.lookup.util.StringUtils; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -258,7 +258,7 @@ private Pair queryStartEndTime(Payload payload) { start = payload.getHistoryStartDate(); end = payload.getHistoryEndDate(); } - return new Pair(start, end); + return Pair.of(start, end); } private UtilizationReport queryUtilizationReport(Payload payload) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/top/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/top/Handler.java index 603027ff6d..306d6b117d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/top/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/top/Handler.java @@ -32,7 +32,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java index 51d000bc9b..c29f2c0d8c 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java @@ -25,7 +25,7 @@ import java.util.Date; import java.util.List; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; From 918018c7ce8655376339f00ad3b13495509a6fc9 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 13:19:00 +0800 Subject: [PATCH 098/231] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dianping/cat/report/page/state/Handler.java | 2 +- .../cat/report/page/state/StateDistirbutionVisitor.java | 2 +- .../cat/report/page/state/StateHourlyGraphVisitor.java | 2 +- .../java/com/dianping/cat/report/page/storage/Handler.java | 2 +- .../report/page/storage/config/StorageGroupConfigManager.java | 2 +- .../report/page/storage/display/StorageAlertInfoBuilder.java | 4 ++-- .../cat/report/page/storage/service/LocalStorageService.java | 2 +- .../java/com/dianping/cat/system/page/business/Handler.java | 2 +- .../cat/system/page/config/processor/BaseProcesser.java | 2 +- .../page/config/processor/DependencyConfigProcessor.java | 2 +- .../page/config/processor/ExceptionConfigProcessor.java | 2 +- .../system/page/config/processor/GlobalConfigProcessor.java | 2 +- 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java index 7b8e05f603..af51d1e6eb 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java @@ -24,7 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.tuple.Pair; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/StateDistirbutionVisitor.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/StateDistirbutionVisitor.java index 5f011a0ab2..32e4b58e8c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/StateDistirbutionVisitor.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/StateDistirbutionVisitor.java @@ -21,7 +21,7 @@ import java.util.HashMap; import java.util.Map; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.dianping.cat.consumer.state.model.entity.Machine; import com.dianping.cat.consumer.state.model.entity.ProcessDomain; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/StateHourlyGraphVisitor.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/StateHourlyGraphVisitor.java index 893af70c02..25af184d9f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/StateHourlyGraphVisitor.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/StateHourlyGraphVisitor.java @@ -20,7 +20,7 @@ import java.util.Set; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.dianping.cat.Constants; import com.dianping.cat.consumer.state.model.entity.Detail; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java index 370828d816..fddd5d3369 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java @@ -33,7 +33,7 @@ import java.util.Set; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.tuple.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java index f5326e1cb9..c276d28614 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java @@ -25,7 +25,7 @@ import java.util.Map; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/display/StorageAlertInfoBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/display/StorageAlertInfoBuilder.java index 1d779d5481..2f8045aee5 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/display/StorageAlertInfoBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/display/StorageAlertInfoBuilder.java @@ -24,7 +24,7 @@ import java.util.List; import java.util.Map; -import org.unidal.helper.Splitters; +import com.google.common.base.Splitter; import com.dianping.cat.Cat; import com.dianping.cat.alarm.Alert; @@ -81,7 +81,7 @@ public StorageAlertInfo makeAlertInfo(String id, Date start) { public void parseAlertEntity(Alert alert, StorageAlertInfo alertInfo) { String name = alert.getDomain(); - List fields = Splitters.by(";").split(alert.getMetric()); + List fields = Splitter.on(';').splitToList(alert.getMetric()); String ip = fields.get(0); String operation = fields.get(1); String target = queryTargetTitle(fields.get(2)); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/LocalStorageService.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/LocalStorageService.java index 2164234286..9e7eac46d1 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/LocalStorageService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/service/LocalStorageService.java @@ -23,7 +23,7 @@ import java.util.List; import java.util.Set; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.dianping.cat.Constants; import com.dianping.cat.consumer.storage.StorageAnalyzer; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java index b275c9a32a..23bd40cd55 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/business/Handler.java @@ -27,7 +27,7 @@ import java.util.Map; import java.util.Set; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/BaseProcesser.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/BaseProcesser.java index e1d4bd5c76..49f14eff74 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/BaseProcesser.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/BaseProcesser.java @@ -22,7 +22,7 @@ import java.util.Collection; import java.util.List; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.dianping.cat.Cat; import com.dianping.cat.alarm.rule.entity.MetricItem; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/DependencyConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/DependencyConfigProcessor.java index 6b911a9a5b..c8a180f153 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/DependencyConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/DependencyConfigProcessor.java @@ -18,7 +18,7 @@ */ package com.dianping.cat.system.page.config.processor; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.dianping.cat.Constants; import com.dianping.cat.home.dependency.config.entity.DomainConfig; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/ExceptionConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/ExceptionConfigProcessor.java index 03a17cc142..1eab81b7a9 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/ExceptionConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/ExceptionConfigProcessor.java @@ -21,7 +21,7 @@ import java.util.ArrayList; import java.util.List; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.dianping.cat.home.exception.entity.ExceptionExclude; import com.dianping.cat.home.exception.entity.ExceptionLimit; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java index 15a6b53a3a..7e3e346331 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java @@ -23,7 +23,7 @@ import java.util.Comparator; import java.util.List; -import org.unidal.lookup.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.dianping.cat.Cat; import com.dianping.cat.Constants; From aec243a132be62985391c7e88bd57a639e5ddc96 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 13:23:27 +0800 Subject: [PATCH 099/231] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../page/business/graph/BusinessGraphCreator.java | 4 ++-- .../dependency/graph/DependencyItemBuilder.java | 2 +- .../graph/TopologyGraphConfigManager.java | 14 +++----------- .../dianping/cat/report/page/state/Handler.java | 2 +- .../cat/report/page/state/StateGraphBuilder.java | 6 +++--- .../dianping/cat/report/page/storage/Handler.java | 4 ++-- 6 files changed, 12 insertions(+), 20 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java index 33ebcda0ca..b6df05886e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/graph/BusinessGraphCreator.java @@ -33,7 +33,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.commons.lang.StringUtils; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.tuple.Pair; import com.dianping.cat.Cat; import com.dianping.cat.alarm.spi.AlertEntity; @@ -93,7 +93,7 @@ private Pair buildTitleAndPrivilege(BusinessReportConfig busine } } - return new Pair(title, isPrivilege); + return Pair.of(title, isPrivilege); } private Map buildCharts(final Map datas, Map baseLines, diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/DependencyItemBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/DependencyItemBuilder.java index 118cc4d03c..3e3b2fbedf 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/DependencyItemBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/DependencyItemBuilder.java @@ -18,7 +18,7 @@ */ package com.dianping.cat.report.page.dependency.graph; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.tuple.Pair; import com.dianping.cat.consumer.dependency.model.entity.Dependency; import com.dianping.cat.consumer.dependency.model.entity.Index; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java index 997f1b3f1b..da937da19e 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java @@ -27,7 +27,7 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.helper.Files; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.tuple.Pair; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -125,11 +125,7 @@ public Pair buildEdgeState(String domain, Dependency dependency sb.append(buildDes(type, ERROR_STR, String.valueOf(error))).append(GraphConstrant.ENTER); } } - Pair result = new Pair(); - - result.setKey(errorCode); - result.setValue(sb.toString()); - return result; + return Pair.of(errorCode, sb.toString()); } private String buildErrorDes(String... args) { @@ -182,11 +178,7 @@ public Pair buildNodeState(String domain, Index index) { } sb.append(GraphConstrant.ENTER); } - Pair result = new Pair(); - - result.setKey(errorCode); - result.setValue(sb.toString()); - return result; + return Pair.of(errorCode, sb.toString()); } private String buildWarningDes(String... args) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java index af51d1e6eb..807d31419b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/Handler.java @@ -25,7 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.commons.lang3.StringUtils; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.tuple.Pair; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java index 257a8d108e..10766960dc 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/StateGraphBuilder.java @@ -24,7 +24,7 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.tuple.Pair; import com.dianping.cat.config.server.ServerFilterConfigManager; import com.dianping.cat.consumer.state.model.entity.StateReport; @@ -87,7 +87,7 @@ private Pair buildHistoryGraph(String domain, Date start, D PieChart piechart = buildPiechart(visitor.getDistribute()); - return new Pair(linechart, piechart); + return Pair.of(linechart, piechart); } private Pair buildHourlyGraph(StateReport report, String domain, String key, String ip) { @@ -106,7 +106,7 @@ private Pair buildHourlyGraph(StateReport report, String do Map distributes = visitor.getDistribute(); PieChart piechart = buildPiechart(distributes); - return new Pair(linechart, piechart); + return Pair.of(linechart, piechart); } private PieChart buildPiechart(Map distributes) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java index fddd5d3369..584e4dbff3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java @@ -34,7 +34,7 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.apache.commons.lang3.StringUtils; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.tuple.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.web.mvc.PageHandler; @@ -187,7 +187,7 @@ private Pair> buildOperations(Payload payload, Model model, } else { ops.addAll(defaultValue); } - return new Pair>(filter, ops); + return Pair.of(filter, ops); } private String buildOperationStr(List ops) { From e905c4bbc20138429b720c13168bd6672b392053 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 13:34:19 +0800 Subject: [PATCH 100/231] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../graph/TopologyGraphConfigManager.java | 7 ++--- .../logview/service/RemoteLogViewService.java | 27 ++++++++++++++++--- .../cat/system/page/plugin/Handler.java | 22 +++++++++------ .../router/config/RouterConfigAdjustor.java | 4 +-- .../router/config/RouterConfigManager.java | 4 +-- .../router/service/RouterConfigService.java | 4 +-- 6 files changed, 47 insertions(+), 21 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java index da937da19e..e22524c202 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java @@ -20,13 +20,14 @@ import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.text.DecimalFormat; import java.util.Arrays; import java.util.HashSet; import java.util.Set; +import org.apache.commons.io.FileUtils; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.helper.Files; import org.apache.commons.lang3.tuple.Pair; import com.dianping.cat.Cat; @@ -247,7 +248,7 @@ public void initialize() { if (m_fileName != null) { try { - String content = Files.forIO().readFrom(new File(m_fileName), "utf-8"); + String content = FileUtils.readFileToString(new File(m_fileName), StandardCharsets.UTF_8); m_config = DefaultSaxParser.parse(content); } catch (Exception e) { Cat.logError(e); @@ -372,7 +373,7 @@ private boolean storeConfig() { if (m_fileName != null) { try { - Files.forIO().writeTo(new File(m_fileName), m_config.toString()); + FileUtils.writeStringToFile(new File(m_fileName), m_config.toString(), StandardCharsets.UTF_8); } catch (IOException e) { Cat.logError(e); return false; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/RemoteLogViewService.java b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/RemoteLogViewService.java index 4878912726..43b221dd15 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/RemoteLogViewService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/RemoteLogViewService.java @@ -21,10 +21,11 @@ import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; import java.util.zip.GZIPInputStream; -import org.unidal.helper.Files; -import org.unidal.helper.Urls; +import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; @@ -63,8 +64,7 @@ public ModelResponse invoke(ModelRequest request) { t.addData(url.toString()); - InputStream in = Urls.forIO().connectTimeout(1000).readTimeout(5000).withGzip().openStream(url.toExternalForm()); - String xml = Files.forIO().readFrom(in, "utf-8"); + String xml = readFrom(url); int len = xml == null ? 0 : xml.length(); @@ -86,6 +86,25 @@ public ModelResponse invoke(ModelRequest request) { return response; } + private String readFrom(URL url) throws IOException { + URLConnection connection = url.openConnection(); + + connection.setConnectTimeout(1000); + connection.setReadTimeout(5000); + connection.setRequestProperty("Accept-Encoding", "gzip"); + + try (InputStream raw = connection.getInputStream(); + InputStream in = isGzip(connection) ? new GZIPInputStream(raw) : raw) { + return IOUtils.toString(in, StandardCharsets.UTF_8); + } + } + + private boolean isGzip(URLConnection connection) { + String encoding = connection.getContentEncoding(); + + return encoding != null && "gzip".equalsIgnoreCase(encoding); + } + @Override public boolean isEligable(ModelRequest request) { refreshSpringBeans(); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/plugin/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/plugin/Handler.java index 22a9a5dc3d..9e4c42c251 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/plugin/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/plugin/Handler.java @@ -22,14 +22,14 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.LinkedHashMap; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import org.apache.commons.lang.StringUtils; -import org.unidal.helper.Files; -import org.unidal.helper.Files.AutoClose; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.web.mvc.PageHandler; import org.unidal.web.mvc.annotation.InboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta; @@ -61,10 +61,12 @@ private void addResourceFiles(ZipOutputStream zos, String baseDir, String... pat for (String path : paths) { ZipEntry entry = new ZipEntry(path); String resource = baseDir + "/" + path; - byte[] data = Files.forIO().readFrom(getClass().getResourceAsStream(resource)); zos.putNextEntry(entry); - zos.write(data); + try (InputStream in = getClass().getResourceAsStream(resource)) { + IOUtils.copy(in, zos); + } + zos.closeEntry(); } } @@ -90,7 +92,7 @@ private void downloadChromeExtension(Context ctx) throws IOException { sb.append('}'); - byte[] content = sb.toString().getBytes("utf-8"); + byte[] content = sb.toString().getBytes(StandardCharsets.UTF_8); res.setContentType("application/json; charset=utf-8"); res.setContentLength(content.length); @@ -108,7 +110,9 @@ private void downloadChromeExtension(Context ctx) throws IOException { res.setContentType("application/octet-stream"); res.addHeader("Content-Disposition", "attachment;filename=cat.crx"); - Files.forIO().copy(is, res.getOutputStream(), AutoClose.INPUT); + try (InputStream in = is) { + IOUtils.copy(in, res.getOutputStream()); + } } ctx.stopProcess(); @@ -158,7 +162,9 @@ private void downloadFile(Context ctx) throws IOException { res.setContentType("application/octet-stream"); res.addHeader("Content-Disposition", "attachment;filename=" + file); - Files.forIO().copy(is, res.getOutputStream(), AutoClose.INPUT); + try (InputStream in = is) { + IOUtils.copy(in, res.getOutputStream()); + } } ctx.stopProcess(); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java index 67fb1bec34..42982b2c10 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java @@ -27,7 +27,7 @@ import java.util.Map.Entry; import org.unidal.dal.jdbc.DalException; -import org.unidal.helper.Splitters; +import com.google.common.base.Splitter; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -72,7 +72,7 @@ public void Adjust(Date period) { StateReport report = m_stateReportService.queryHourlyReport(Constants.CAT, period, end); String remoteServers = m_serverConfigManager.getConsoleRemoteServers(); - List servers = Splitters.by(",").noEmptyItem().split(remoteServers); + List servers = Splitter.on(',').omitEmptyStrings().splitToList(remoteServers); AdjustStateReportVisitor visitor = new AdjustStateReportVisitor(m_configManager, servers); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java index 3e549e6a93..cdc1e65628 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java @@ -37,6 +37,7 @@ import com.dianping.cat.task.TimerSyncTask.SyncHandler; import org.apache.commons.net.util.SubnetUtils; import org.apache.commons.net.util.SubnetUtils.SubnetInfo; +import org.apache.commons.lang3.tuple.Pair; import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; @@ -44,7 +45,6 @@ import org.slf4j.LoggerFactory; import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.tuple.Pair; import org.xml.sax.SAXException; import java.io.IOException; @@ -385,7 +385,7 @@ private void refreshReportInfo() throws Exception { DailyReportContentEntity.READSET_FULL); RouterConfig routerConfig = DefaultNativeParser.parse(reportContent.getContent()); - m_routerConfigs.put(time, new Pair(routerConfig, modifyTime)); + m_routerConfigs.put(time, Pair.of(routerConfig, modifyTime)); Cat.logEvent("ReloadConfig", "router"); } catch (DalNotFoundException ignored) { SLF4J_LOGGER.warn("Router report content not found while refreshing report cache, reportId={}.", diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java index 51622a4902..4dfa927f4e 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java @@ -24,7 +24,7 @@ import org.unidal.dal.jdbc.DalException; import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.tuple.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -62,7 +62,7 @@ public RouterConfig queryDailyReport(String domain, Date start, Date end) { DailyReport report = m_dailyReportDao.findByDomainNamePeriod(domain, name, start, DailyReportEntity.READSET_FULL); RouterConfig config = queryFromDailyBinary(report.getId()); - routerConfigs.put(time, new Pair(config, report.getCreationDate().getTime())); + routerConfigs.put(time, Pair.of(config, report.getCreationDate().getTime())); return config; } catch (DalNotFoundException e) { // ignore From a2bd057a71ab6fd633c4ad35f27a1a386b0abe58 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 13:38:36 +0800 Subject: [PATCH 101/231] =?UTF-8?q?=E6=9B=BF=E6=8D=A2unidal=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/task/cmdb/ProjectUpdateTask.java | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java index 5e6aa04ca0..af9f8d4db3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java @@ -19,6 +19,9 @@ package com.dianping.cat.report.task.cmdb; import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -29,11 +32,10 @@ import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.unidal.dal.jdbc.DalException; -import org.unidal.helper.Files; import org.unidal.helper.Threads.Task; -import org.unidal.helper.Urls; -import org.unidal.lookup.util.StringUtils; import org.unidal.webres.json.JsonArray; import org.unidal.webres.json.JsonObject; @@ -238,8 +240,7 @@ private String queryDomainFromCMDB(String ip) { try { String cmdb = String.format(CMDB_DOMAIN_URL, ip); - InputStream in = Urls.forIO().readTimeout(1000).connectTimeout(1000).openStream(cmdb); - String content = Files.forIO().readFrom(in, "utf-8"); + String content = readFrom(cmdb); t.setStatus(Transaction.SUCCESS); t.addData(content); @@ -256,8 +257,7 @@ private String queryHostnameFromCMDB(String ip) { Transaction t = Cat.newTransaction("CMDB", "queryHostname"); try { String cmdb = String.format(CMDB_HOSTNAME_URL, ip); - InputStream in = Urls.forIO().readTimeout(1000).connectTimeout(1000).openStream(cmdb); - String content = Files.forIO().readFrom(in, "utf-8"); + String content = readFrom(cmdb); t.setStatus(Transaction.SUCCESS); t.addData(content); @@ -285,8 +285,7 @@ private Map queryProjectInfoFromCMDB(String cmdbDomain) { Transaction t = Cat.newTransaction("CMDB", "queryProjectInfo"); try { String cmdb = String.format(CMDB_INFO_URL, cmdbDomain); - InputStream in = Urls.forIO().readTimeout(1000).connectTimeout(1000).openStream(cmdb); - String content = Files.forIO().readFrom(in, "utf-8"); + String content = readFrom(cmdb); t.setStatus(Transaction.SUCCESS); t.addData(content); @@ -302,8 +301,7 @@ private Map queryProjectInfoFromCMDB(String cmdbDomain) { private String queryProjectInfoFromCMDB(String url, String jsonName, String attrName) { Transaction t = Cat.newTransaction("CMDB", "queryProjectInfo"); try { - InputStream in = Urls.forIO().readTimeout(1000).connectTimeout(1000).openStream(url); - String content = Files.forIO().readFrom(in, "utf-8"); + String content = readFrom(url); t.setStatus(Transaction.SUCCESS); t.addData(content); @@ -316,6 +314,17 @@ private String queryProjectInfoFromCMDB(String url, String jsonName, String attr return null; } + private String readFrom(String url) throws Exception { + URLConnection connection = new URL(url).openConnection(); + + connection.setConnectTimeout(1000); + connection.setReadTimeout(1000); + + try (InputStream in = connection.getInputStream()) { + return IOUtils.toString(in, StandardCharsets.UTF_8); + } + } + @Override public void run() { refreshSpringBeans(); From d86b63f99cdb23fac84d56ebf0609fc25792a95e Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 15:55:38 +0800 Subject: [PATCH 102/231] =?UTF-8?q?=E5=AE=8C=E6=88=90=20cat-alarm=20?= =?UTF-8?q?=E4=BD=8E=E9=A3=8E=E9=99=A9=20Pair=20=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cat-alarm/pom.xml | 4 ++ .../dianping/cat/alarm/spi/AlertManager.java | 2 +- .../alarm/spi/decorator/DecoratorManager.java | 4 +- .../alarm/spi/rule/DefaultDataChecker.java | 8 +-- .../dianping/cat/alarm/spi/rule/RuleType.java | 50 +++++++++---------- .../cat/report/DefaultReportManager.java | 3 ++ .../cat/service/DefaultReportManagerTest.java | 8 +++ .../cat/report/alert/UserDefineRuleTest.java | 4 +- 8 files changed, 49 insertions(+), 34 deletions(-) diff --git a/cat-alarm/pom.xml b/cat-alarm/pom.xml index 46e6d15a42..e27b99bdbf 100644 --- a/cat-alarm/pom.xml +++ b/cat-alarm/pom.xml @@ -63,6 +63,10 @@ commons-lang commons-lang + + org.apache.commons + commons-lang3 + com.google.code.gson gson diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/AlertManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/AlertManager.java index 50f1bf262c..2f0d9c2a7b 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/AlertManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/AlertManager.java @@ -29,13 +29,13 @@ import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.message.Event; +import org.apache.commons.lang3.tuple.Pair; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.helper.Threads; import org.unidal.helper.Threads.Task; -import org.unidal.tuple.Pair; import java.text.DateFormat; import java.text.SimpleDateFormat; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java index 48160c1c72..388b0cd50b 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/decorator/DecoratorManager.java @@ -24,10 +24,10 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.apache.commons.lang3.tuple.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.lookup.ContainerHolder; -import org.unidal.tuple.Pair; import com.dianping.cat.alarm.spi.AlertEntity; import com.dianping.cat.alarm.spi.AlertType; @@ -46,7 +46,7 @@ public Pair generateTitleAndContent(AlertEntity alert) { String title = decorator.generateTitle(alert); String content = decorator.generateContent(alert); - return new Pair(title, content); + return Pair.of(title, content); } else { LOGGER.error("Alert decorator is not configured, alertType={}, availableDecorators={}.", alertType.getName(), m_decorators.keySet()); diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/DefaultDataChecker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/DefaultDataChecker.java index 2cafa87ab3..5619f25c4d 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/DefaultDataChecker.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/DefaultDataChecker.java @@ -21,9 +21,9 @@ import com.dianping.cat.Cat; import com.dianping.cat.alarm.rule.entity.Condition; import com.dianping.cat.alarm.rule.entity.SubCondition; +import org.apache.commons.lang3.tuple.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.tuple.Pair; import java.util.ArrayList; import java.util.List; @@ -93,18 +93,18 @@ private Pair checkDataByCondition(double[] value, double[] base Pair subResult = rule.executeRule(value, baseline, subCondition.getText()); if (!subResult.getKey()) { - return new Pair(false, ""); + return Pair.of(false, ""); } builder.append(subResult.getValue()).append("
"); } catch (Exception ex) { LOGGER.error("Unable to check alert rule condition, condition={}, subCondition={}.", condition, subCondition, ex); Cat.logError(condition.toString(), ex); - return new Pair(false, ""); + return Pair.of(false, ""); } } - return new Pair(true, builder.toString()); + return Pair.of(true, builder.toString()); } public List checkDataForApp(double[] value, List conditions) { diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/RuleType.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/RuleType.java index 649bbe1114..5636616d05 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/RuleType.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/rule/RuleType.java @@ -21,7 +21,7 @@ import com.dianping.cat.Cat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.tuple.Pair; import javax.tools.JavaCompiler; import javax.tools.ToolProvider; @@ -74,11 +74,11 @@ public Pair executeRule(double[] values, double[] baselines, St for (int i = 0; i < length; i++) { if (baselines[i] <= 0 || values[i] / baselines[i] > (1 - ruleValue / 100)) { - return new Pair(false, ""); + return Pair.of(false, ""); } } - return new Pair(true, buildRuleMessage(values, baselines, ruleValue)); + return Pair.of(true, buildRuleMessage(values, baselines, ruleValue)); } @Override @@ -122,11 +122,11 @@ public Pair executeRule(double[] values, double[] baselines, St for (int i = 0; i < length; i++) { if (baselines[i] - values[i] < ruleValue) { - return new Pair(false, ""); + return Pair.of(false, ""); } } - return new Pair(true, buildRuleMessage(values, baselines, ruleValue)); + return Pair.of(true, buildRuleMessage(values, baselines, ruleValue)); } @Override @@ -169,11 +169,11 @@ public Pair executeRule(double[] values, double[] baselines, St for (int i = 0; i < length; i++) { if (baselines[i] <= 0 || values[i] / baselines[i] < (1 + ruleValue / 100)) { - return new Pair(false, ""); + return Pair.of(false, ""); } } - return new Pair(true, buildRuleMessage(values, baselines, ruleValue)); + return Pair.of(true, buildRuleMessage(values, baselines, ruleValue)); } @Override @@ -216,11 +216,11 @@ public Pair executeRule(double[] values, double[] baselines, St for (int i = 0; i < length; i++) { if (values[i] - baselines[i] < ruleValue) { - return new Pair(false, ""); + return Pair.of(false, ""); } } - return new Pair(true, buildRuleMessage(values, baselines, ruleValue)); + return Pair.of(true, buildRuleMessage(values, baselines, ruleValue)); } @Override @@ -249,11 +249,11 @@ public Pair executeRule(double[] values, double[] baselines, St for (int i = 0; i < length; i++) { if (values[i] < ruleValue) { - return new Pair(false, ""); + return Pair.of(false, ""); } } - return new Pair(true, buildRuleMessage(values, baselines, ruleValue)); + return Pair.of(true, buildRuleMessage(values, baselines, ruleValue)); } @Override @@ -282,11 +282,11 @@ public Pair executeRule(double[] values, double[] baselines, St for (int i = 0; i < length; i++) { if (values[i] > ruleValue) { - return new Pair(false, ""); + return Pair.of(false, ""); } } - return new Pair(true, buildRuleMessage(values, baselines, ruleValue)); + return Pair.of(true, buildRuleMessage(values, baselines, ruleValue)); } @Override @@ -328,18 +328,18 @@ public Pair executeRule(double[] values, double[] baselines, St int length = values.length; if (length <= 1) { - return new Pair(false, ""); + return Pair.of(false, ""); } double baseVal = values[length - 1]; for (int i = 0; i <= length - 2; i++) { if (baseVal / values[i] - 1 < ruleValue / 100) { - return new Pair(false, ""); + return Pair.of(false, ""); } } - return new Pair(true, buildRuleMessage(values, baselines, ruleValue)); + return Pair.of(true, buildRuleMessage(values, baselines, ruleValue)); } @Override @@ -381,18 +381,18 @@ public Pair executeRule(double[] values, double[] baselines, St int length = values.length; if (length <= 1) { - return new Pair(false, ""); + return Pair.of(false, ""); } double baseVal = values[length - 1]; for (int i = 0; i <= length - 2; i++) { if (1 - baseVal / values[i] < ruleValue / 100) { - return new Pair(false, ""); + return Pair.of(false, ""); } } - return new Pair(true, buildRuleMessage(values, baselines, ruleValue)); + return Pair.of(true, buildRuleMessage(values, baselines, ruleValue)); } @Override @@ -421,10 +421,10 @@ public Pair executeRule(double[] values, double[] baselines, St double totalVal = calSum(values); if (totalVal < ruleValue) { - return new Pair(false, ""); + return Pair.of(false, ""); } - return new Pair(true, buildRuleMessage(values, baselines, ruleValue)); + return Pair.of(true, buildRuleMessage(values, baselines, ruleValue)); } @Override @@ -453,10 +453,10 @@ public Pair executeRule(double[] values, double[] baselines, St double totalVal = calSum(values); if (totalVal > ruleValue) { - return new Pair(false, ""); + return Pair.of(false, ""); } - return new Pair(true, buildRuleMessage(values, baselines, ruleValue)); + return Pair.of(true, buildRuleMessage(values, baselines, ruleValue)); } @Override @@ -496,7 +496,7 @@ public Pair executeRule(double[] values, double[] baselines, St LOGGER.error("Unable to generate user defined alert rule, rawValueLength={}.", rawValue == null ? 0 : rawValue.length(), e); Cat.logError("generate user defined rule error: " + rawValue, e); - return new Pair(false, ""); + return Pair.of(false, ""); } } return instance.checkData(values, baselines); @@ -519,7 +519,7 @@ private Pair generateClassFile(String rawValue) throws IOException { } finally { output.close(); } - return new Pair(userDefinedFolder, userDefinedClassFile); + return Pair.of(userDefinedFolder, userDefinedClassFile); } @Override diff --git a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java index fd9cf956cc..2523572331 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java +++ b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java @@ -250,6 +250,7 @@ public void setValidator(DomainValidator validator) { private void storeDatabase(long startTime, Map reports) { Date period = new Date(startTime); + Date creationDate = new Date(); String ip = NetworkInterfaceManager.INSTANCE.getLocalHostAddress(); for (T report : reports.values()) { @@ -262,6 +263,7 @@ private void storeDatabase(long startTime, Map reports) { r.setPeriod(period); r.setIp(ip); r.setType(1); + r.setCreationDate(creationDate); m_reportDao.insert(r); @@ -272,6 +274,7 @@ private void storeDatabase(long startTime, Map reports) { content.setReportId(id); content.setContent(binaryContent); content.setPeriod(period); + content.setCreationDate(creationDate); m_reportContentDao.insert(content); m_reportDelegate.createHourlyTask(report); } catch (Throwable e) { diff --git a/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java b/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java index de32bbd366..48aa19d69c 100644 --- a/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java +++ b/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java @@ -136,6 +136,8 @@ public void testStoreReport() { Assert.assertEquals(3, m_reportContentDao.count); Assert.assertEquals(3, m_hourlyReportDao.count); Assert.assertEquals(3, m_bucketInsertCount); + Assert.assertNotNull(m_hourlyReportDao.creationDate); + Assert.assertNotNull(m_reportContentDao.creationDate); } public class MockBucketManager implements ReportBucketManager { @@ -159,8 +161,11 @@ public class MockHourlyReportDao extends HourlyReportRepository { public int count; + public Date creationDate; + @Override public int insert(HourlyReport proto) throws DalException { + creationDate = proto.getCreationDate(); return count++; } @@ -170,8 +175,11 @@ public class MockReportContentDao extends HourlyReportContentRepository { public int count; + public Date creationDate; + @Override public int insert(HourlyReportContent proto) throws DalException { + creationDate = proto.getCreationDate(); return count++; } diff --git a/cat-home/src/test/java/com/dianping/cat/report/alert/UserDefineRuleTest.java b/cat-home/src/test/java/com/dianping/cat/report/alert/UserDefineRuleTest.java index 5206d24a51..e084273fca 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/alert/UserDefineRuleTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/alert/UserDefineRuleTest.java @@ -20,14 +20,14 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.tuple.Pair; +import org.apache.commons.lang3.tuple.Pair; import com.dianping.cat.alarm.spi.rule.RuleType; public class UserDefineRuleTest { @Test public void testUserDefineRule() throws Exception { - String userDefineStr = "import org.unidal.tuple.Pair; import com.dianping.cat.report.alert.RuleType.MonitorRule; public class UserDefinedRule implements MonitorRule{ /* * 请编写checkData()方法, 除了import标准库,其余部分不能改变 * 该方法接受两个参数: values:当前值数组 baselineValue:基线值数组 * 该方法返回一个Pair对象,key是boolean类型,表明是否触发告警; value是String类型,表明告警内容 * 如:没有触发,返回:return new Pair(false, \"\"); * 触发报警,返回:return new Pair(true, \"alert info\"); */ @Override public Pair checkData(double[] values, double[] baselineValues) { if(values.length <= 0){ return new Pair(false, \"\"); } else{ return new Pair(true, Double.toString(values[0])); } } }"; + String userDefineStr = "import org.apache.commons.lang3.tuple.Pair; import com.dianping.cat.report.alert.RuleType.MonitorRule; public class UserDefinedRule implements MonitorRule{ /* * 请编写checkData()方法, 除了import标准库,其余部分不能改变 * 该方法接受两个参数: values:当前值数组 baselineValue:基线值数组 * 该方法返回一个Pair对象,key是boolean类型,表明是否触发告警; value是String类型,表明告警内容 * 如:没有触发,返回:return Pair.of(false, \"\"); * 触发报警,返回:return Pair.of(true, \"alert info\"); */ @Override public Pair checkData(double[] values, double[] baselineValues) { if(values.length <= 0){ return Pair.of(false, \"\"); } else{ return Pair.of(true, Double.toString(values[0])); } } }"; RuleType userDefineRuleType = RuleType.getByTypeId(RuleType.UserDefine.getId()); Pair result = userDefineRuleType.executeRule(new double[0], new double[0], userDefineStr); Assert.assertFalse(result.getKey()); From f70f9ba5e1d9949c0d04f44eb0c48189475cb865 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 14 Jun 2026 16:14:19 +0800 Subject: [PATCH 103/231] =?UTF-8?q?=E6=B8=85=E7=90=86=20cat-hadoop=20?= =?UTF-8?q?=E4=B8=BB=E4=BB=A3=E7=A0=81=E9=87=8C=E7=9A=84=E4=BD=8E=E9=A3=8E?= =?UTF-8?q?=E9=99=A9=20Unidal=20=E5=B7=A5=E5=85=B7=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cat-hadoop/pom.xml | 20 +++++++++----- .../cat/hadoop/hdfs/HarConnectionPool.java | 5 ++-- .../hadoop/hdfs/HdfsMessageBucketManager.java | 6 ++--- .../message/storage/clean/HdfsUploader.java | 26 ++++++------------- .../storage/hdfs/HdfsTokenMappingManager.java | 4 +-- .../local/LocalTokenMappingManager.java | 4 +-- 6 files changed, 32 insertions(+), 33 deletions(-) diff --git a/cat-hadoop/pom.xml b/cat-hadoop/pom.xml index 5162d7bf94..c42a3e73af 100644 --- a/cat-hadoop/pom.xml +++ b/cat-hadoop/pom.xml @@ -38,12 +38,20 @@ com.dianping.cat cat-core
- - org.xerial.snappy - snappy-java - - - + + org.xerial.snappy + snappy-java + + + org.apache.commons + commons-lang3 + + + commons-io + commons-io + + + - - + + + org.apache.maven.surefire surefire-junit47 @@ -344,34 +344,34 @@
- - maven-eclipse-plugin - 2.9 - - true - none - - - .settings/org.eclipse.jdt.core.prefs - + maven-eclipse-plugin + 2.9 + + true + none + + + .settings/org.eclipse.jdt.core.prefs + - - - .settings/org.eclipse.core.resources.prefs - - =UTF-8 - ]]> - - - - - + ]]> + + + .settings/org.eclipse.core.resources.prefs + + =UTF-8 + ]]> + + + + + org.unidal.maven.plugins codegen-maven-plugin @@ -380,14 +380,14 @@ org.eclipse.jdt.core.compiler.compliance=21 org.sonatype.plugins nexus-staging-maven-plugin - 1.6.8 - true - - ossrh - https://s01.oss.sonatype.org/ - ${deploy.autoRelease} - - + 1.6.8 + true + + ossrh + https://s01.oss.sonatype.org/ + ${deploy.autoRelease} + + org.apache.maven.plugins maven-javadoc-plugin @@ -403,21 +403,21 @@ org.eclipse.jdt.core.compiler.compliance=21 - - - org.apache.maven.plugins - maven-gpg-plugin - 1.6 - - - sign-artifacts - verify - - sign - - - - + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + sign-artifacts + verify + + sign + + + + org.apache.maven.plugins maven-source-plugin @@ -425,12 +425,12 @@ org.eclipse.jdt.core.compiler.compliance=21 attach-sources - - jar-no-fork - - - - + + jar-no-fork + + + + org.apache.maven.plugins maven-compiler-plugin @@ -537,38 +537,38 @@ org.eclipse.jdt.core.compiler.compliance=21 org.apache.maven.plugins maven-source-plugin - - - org.apache.maven.plugins - maven-javadoc-plugin - - - org.apache.maven.plugins - maven-compiler-plugin - -
- - - - central - Maven2 Central Repository - default - https://repo1.maven.org/maven2 - - - unidal.releases - http://unidal.org/nexus/content/repositories/releases/ - - - - - central - https://repo1.maven.org/maven2 - - - unidal.releases - http://unidal.org/nexus/content/repositories/releases/ - + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + + + + + central + Maven2 Central Repository + default + https://repo1.maven.org/maven2 + + + unidal.releases + http://unidal.org/nexus/content/repositories/releases/ + + + + + central + https://repo1.maven.org/maven2 + + + unidal.releases + http://unidal.org/nexus/content/repositories/releases/ + utf-8 @@ -588,21 +588,21 @@ org.eclipse.jdt.core.compiler.compliance=21 3.5.19 4.0.0 1.18.46 - 4.0.2 + 4.1.0 7.0.3 9.0.112 false - - - ossrh - OSS Snapshots Repository - https://s01.oss.sonatype.org/content/repositories/snapshots/ - - - ossrh - OSS Staging Repository - https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ - - - + + + ossrh + OSS Snapshots Repository + https://s01.oss.sonatype.org/content/repositories/snapshots/ + + + ossrh + OSS Staging Repository + https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ + + + From 0121c993f16bfac8bc584266f3bd8243c37ece86 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 09:31:20 +0800 Subject: [PATCH 134/231] =?UTF-8?q?=E7=A7=BB=E9=99=A4=20CatSpringContext?= =?UTF-8?q?=20=E5=B9=B6=E6=B8=85=E7=90=86=E4=BD=8E=E9=A3=8E=E9=99=A9=20Ple?= =?UTF-8?q?xus=20=E6=B5=8B=E8=AF=95=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dianping/cat/consumer/MockLog.java | 128 ------------------ .../performance/CrossPerformanceTest.java | 3 +- .../dianping/cat/mvc/AbstractReportModel.java | 21 +-- .../cat/mvc/ReportModelDependencies.java | 39 ++++++ .../mvc/ReportModelDependencyProvider.java | 8 ++ .../dianping/cat/spring/CatSpringContext.java | 69 ---------- .../analysis/AbstractMessageAnalyzerTest.java | 3 +- .../dianping/cat/analysis/PeriodTaskTest.java | 3 +- .../org/unidal/cat/message/MessageIdTest.java | 3 +- .../java/com/dianping/cat/CatHomeModule.java | 80 +---------- .../spring/CatHomeSpringConfiguration.java | 7 + .../spring/CatHomeSpringContextListener.java | 5 - .../dianping/cat/mvc/SpringMvcRuntime.java | 10 ++ .../dianping/cat/report/ReportContext.java | 16 ++- .../task/heavy/HeavyReportBuilderTest.java | 3 +- 15 files changed, 100 insertions(+), 298 deletions(-) delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/MockLog.java create mode 100644 cat-core/src/main/java/com/dianping/cat/mvc/ReportModelDependencies.java create mode 100644 cat-core/src/main/java/com/dianping/cat/mvc/ReportModelDependencyProvider.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/MockLog.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/MockLog.java deleted file mode 100644 index 5050a3b80a..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/MockLog.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer; - -import org.codehaus.plexus.logging.Logger; - -public class MockLog implements Logger { - - @Override - public void debug(String message) { - - } - - @Override - public void debug(String message, Throwable throwable) { - - } - - @Override - public boolean isDebugEnabled() { - - return false; - } - - @Override - public void info(String message) { - - } - - @Override - public void info(String message, Throwable throwable) { - - } - - @Override - public boolean isInfoEnabled() { - - return false; - } - - @Override - public void warn(String message) { - - } - - @Override - public void warn(String message, Throwable throwable) { - - } - - @Override - public boolean isWarnEnabled() { - - return false; - } - - @Override - public void error(String message) { - - } - - @Override - public void error(String message, Throwable throwable) { - - } - - @Override - public boolean isErrorEnabled() { - - return false; - } - - @Override - public void fatalError(String message) { - - } - - @Override - public void fatalError(String message, Throwable throwable) { - - } - - @Override - public boolean isFatalErrorEnabled() { - - return false; - } - - @Override - public Logger getChildLogger(String name) { - - return null; - } - - @Override - public int getThreshold() { - - return 0; - } - - @Override - public void setThreshold(int threshold) { - - } - - @Override - public String getName() { - - return null; - } - -} \ No newline at end of file diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/CrossPerformanceTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/CrossPerformanceTest.java index 5f6f7045eb..329ade98c6 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/CrossPerformanceTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/CrossPerformanceTest.java @@ -23,7 +23,6 @@ import java.util.concurrent.ConcurrentHashMap; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; import com.dianping.cat.config.server.ServerConfigManager; @@ -36,7 +35,7 @@ import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; -public class CrossPerformanceTest extends ComponentTestCase { +public class CrossPerformanceTest { @Test public void test() throws Exception { diff --git a/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportModel.java b/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportModel.java index 2a1f35a639..2a73f647d2 100755 --- a/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportModel.java +++ b/cat-core/src/main/java/com/dianping/cat/mvc/AbstractReportModel.java @@ -38,7 +38,6 @@ import com.dianping.cat.service.HostinfoService; import com.dianping.cat.service.ProjectService; import com.dianping.cat.service.ProjectService.Department; -import com.dianping.cat.spring.CatSpringContext; public abstract class AbstractReportModel> extends ViewModel { @@ -68,18 +67,22 @@ public abstract class AbstractReportModel T resolveService(Class type) { - T service = CatSpringContext.getBeanIfAvailable(type); + private ReportModelDependencies resolveDependencies(M ctx) { + if (ctx instanceof ReportModelDependencyProvider) { + ReportModelDependencies dependencies = ((ReportModelDependencyProvider) ctx).getReportModelDependencies(); - if (service != null) { - return service; + if (dependencies != null) { + return dependencies; + } } - throw new IllegalStateException(type.getName() + " must be configured by Spring."); + throw new IllegalStateException("ReportModelDependencies must be configured for " + ctx.getClass().getName() + "."); } public double getSample() { diff --git a/cat-core/src/main/java/com/dianping/cat/mvc/ReportModelDependencies.java b/cat-core/src/main/java/com/dianping/cat/mvc/ReportModelDependencies.java new file mode 100644 index 0000000000..247d8c781c --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/mvc/ReportModelDependencies.java @@ -0,0 +1,39 @@ +package com.dianping.cat.mvc; + +import com.dianping.cat.config.sample.SampleConfigManager; +import com.dianping.cat.service.HostinfoService; +import com.dianping.cat.service.ProjectService; + +public class ReportModelDependencies { + private final HostinfoService m_hostinfoService; + + private final ProjectService m_projectService; + + private final SampleConfigManager m_sampleConfigManager; + + public ReportModelDependencies(ProjectService projectService, HostinfoService hostinfoService, + SampleConfigManager sampleConfigManager) { + m_projectService = requireNonNull(projectService, ProjectService.class); + m_hostinfoService = requireNonNull(hostinfoService, HostinfoService.class); + m_sampleConfigManager = requireNonNull(sampleConfigManager, SampleConfigManager.class); + } + + public HostinfoService getHostinfoService() { + return m_hostinfoService; + } + + public ProjectService getProjectService() { + return m_projectService; + } + + public SampleConfigManager getSampleConfigManager() { + return m_sampleConfigManager; + } + + private T requireNonNull(T value, Class type) { + if (value == null) { + throw new IllegalArgumentException(type.getName() + " is required for report model dependencies."); + } + return value; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/mvc/ReportModelDependencyProvider.java b/cat-core/src/main/java/com/dianping/cat/mvc/ReportModelDependencyProvider.java new file mode 100644 index 0000000000..24d8c64bff --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/mvc/ReportModelDependencyProvider.java @@ -0,0 +1,8 @@ +package com.dianping.cat.mvc; + +public interface ReportModelDependencyProvider { + + ReportModelDependencies getReportModelDependencies(); + + void setReportModelDependencies(ReportModelDependencies dependencies); +} diff --git a/cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java b/cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java deleted file mode 100644 index c938185ebe..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/spring/CatSpringContext.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.dianping.cat.spring; - -import java.util.Collections; -import java.util.Map; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; - -public final class CatSpringContext { - private static volatile ApplicationContext s_context; - - private CatSpringContext() { - } - - public static T getBean(Class type) { - ApplicationContext context = s_context; - - return context == null ? null : context.getBean(type); - } - - public static T getBeanIfAvailable(Class type) { - ApplicationContext context = s_context; - - if (context == null) { - return null; - } - try { - return context.getBean(type); - } catch (BeansException e) { - return null; - } - } - - public static T getBeanIfAvailable(String name, Class type) { - ApplicationContext context = s_context; - - if (context == null) { - return null; - } - try { - return context.getBean(name, type); - } catch (BeansException e) { - return null; - } - } - - public static Map getBeansIfAvailable(Class type) { - ApplicationContext context = s_context; - - if (context == null) { - return Collections.emptyMap(); - } - try { - return context.getBeansOfType(type); - } catch (BeansException e) { - return Collections.emptyMap(); - } - } - - public static void setContext(ApplicationContext context) { - s_context = context; - } - - public static void clear(ApplicationContext context) { - if (s_context == context) { - s_context = null; - } - } -} diff --git a/cat-core/src/test/java/com/dianping/cat/analysis/AbstractMessageAnalyzerTest.java b/cat-core/src/test/java/com/dianping/cat/analysis/AbstractMessageAnalyzerTest.java index 9be6216780..97d70a2b8f 100644 --- a/cat-core/src/test/java/com/dianping/cat/analysis/AbstractMessageAnalyzerTest.java +++ b/cat-core/src/test/java/com/dianping/cat/analysis/AbstractMessageAnalyzerTest.java @@ -21,13 +21,12 @@ import org.junit.Assert; import org.junit.Test; import com.dianping.cat.support.Threads; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; import com.dianping.cat.report.ReportManager; -public class AbstractMessageAnalyzerTest extends ComponentTestCase { +public class AbstractMessageAnalyzerTest { @Test public void testTimeOut() throws InterruptedException { diff --git a/cat-core/src/test/java/com/dianping/cat/analysis/PeriodTaskTest.java b/cat-core/src/test/java/com/dianping/cat/analysis/PeriodTaskTest.java index a924826546..0c51f7c0e8 100644 --- a/cat-core/src/test/java/com/dianping/cat/analysis/PeriodTaskTest.java +++ b/cat-core/src/test/java/com/dianping/cat/analysis/PeriodTaskTest.java @@ -20,13 +20,12 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; import com.dianping.cat.report.ReportManager; -public class PeriodTaskTest extends ComponentTestCase { +public class PeriodTaskTest { @Test public void test() throws Exception { diff --git a/cat-hadoop/src/test/java/org/unidal/cat/message/MessageIdTest.java b/cat-hadoop/src/test/java/org/unidal/cat/message/MessageIdTest.java index 3c73aca3b8..60975dee2e 100644 --- a/cat-hadoop/src/test/java/org/unidal/cat/message/MessageIdTest.java +++ b/cat-hadoop/src/test/java/org/unidal/cat/message/MessageIdTest.java @@ -22,11 +22,10 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.message.tree.MessageId; -public class MessageIdTest extends ComponentTestCase { +public class MessageIdTest { @Test public void test() throws IOException { MessageId id = MessageId.parse("child-0a260015-403899-12345"); diff --git a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java index 6831a37719..41351241cd 100644 --- a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java +++ b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java @@ -18,22 +18,14 @@ */ package com.dianping.cat; -import com.dianping.cat.support.Threads; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.unidal.initialization.AbstractModule; import org.unidal.initialization.Module; import org.unidal.initialization.ModuleContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.dianping.cat.analysis.MessageConsumer; -import com.dianping.cat.analysis.TcpSocketReceiver; -import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.consumer.CatConsumerModule; import com.dianping.cat.hadoop.CatHadoopModule; -import com.dianping.cat.report.alert.AlarmManager; -import com.dianping.cat.report.task.DefaultTaskConsumer; -import com.dianping.cat.report.task.reload.ReportReloadTask; -import com.dianping.cat.spring.CatSpringContext; public class CatHomeModule extends AbstractModule { private static final Logger LOGGER = LoggerFactory.getLogger(CatHomeModule.class); @@ -42,56 +34,7 @@ public class CatHomeModule extends AbstractModule { @Override protected void execute(ModuleContext ctx) throws Exception { - ServerConfigManager serverConfigManager = CatSpringContext.getBeanIfAvailable(ServerConfigManager.class); - - if (serverConfigManager == null) { - throw new IllegalStateException("ServerConfigManager must be configured by Spring for CatHomeModule."); - } - LOGGER.info("Resolved ServerConfigManager from Spring for CatHomeModule."); - ReportReloadTask reportReloadTask = CatSpringContext.getBeanIfAvailable(ReportReloadTask.class); - - if (reportReloadTask == null) { - throw new IllegalStateException("ReportReloadTask must be configured by Spring for CatHomeModule."); - } - LOGGER.info("Resolved ReportReloadTask from Spring for CatHomeModule."); - - Threads.forGroup("Cat").start(reportReloadTask); - - MessageConsumer messageConsumer = CatSpringContext.getBeanIfAvailable(MessageConsumer.class); - - if (messageConsumer == null) { - throw new IllegalStateException("MessageConsumer must be configured by Spring for CatHomeModule."); - } - LOGGER.info("Resolved MessageConsumer from Spring for CatHomeModule."); - - if (serverConfigManager.isJobMachine()) { - DefaultTaskConsumer taskConsumer = CatSpringContext.getBeanIfAvailable(DefaultTaskConsumer.class); - - if (taskConsumer == null) { - throw new IllegalStateException("DefaultTaskConsumer must be configured by Spring for CatHomeModule."); - } - LOGGER.info("Resolved DefaultTaskConsumer from Spring for CatHomeModule."); - Threads.forGroup("Cat").start(taskConsumer); - } - - AlarmManager alarmManager = CatSpringContext.getBeanIfAvailable(AlarmManager.class); - - if (alarmManager == null) { - throw new IllegalStateException("AlarmManager must be configured by Spring for CatHomeModule."); - } - LOGGER.info("Resolved AlarmManager from Spring for CatHomeModule."); - - if (serverConfigManager.isAlertMachine()) { - alarmManager.startAlarm(); - } - - Runtime.getRuntime().addShutdownHook(new Thread() { - - @Override - public void run() { - messageConsumer.doCheckpoint(); - } - }); + LOGGER.info("Cat home module initialized."); } @Override @@ -101,21 +44,6 @@ public Module[] getDependencies(ModuleContext ctx) { @Override protected void setup(ModuleContext ctx) throws Exception { - final TcpSocketReceiver messageReceiver = CatSpringContext.getBeanIfAvailable(TcpSocketReceiver.class); - - if (messageReceiver == null) { - throw new IllegalStateException("TcpSocketReceiver must be configured by Spring for CatHomeModule."); - } - LOGGER.info("Resolved TcpSocketReceiver from Spring for CatHomeModule."); - - messageReceiver.init(); - - Runtime.getRuntime().addShutdownHook(new Thread() { - - @Override - public void run() { - messageReceiver.destory(); - } - }); + LOGGER.info("Cat home module setup completed."); } } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index b9038d06e4..d19b42d1b4 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -195,6 +195,7 @@ import com.dianping.cat.message.storage.MessageBucketFactory; import com.dianping.cat.message.storage.MessageBucketManager; import com.dianping.cat.mvc.PayloadNormalizer; +import com.dianping.cat.mvc.ReportModelDependencies; import com.dianping.cat.report.DefaultReportBucketManager; import com.dianping.cat.report.DefaultReportManager; import com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager; @@ -1343,6 +1344,12 @@ public PayloadNormalizer payloadNormalizer(ServerConfigManager serverConfigManag return normalizer; } + @Bean + public ReportModelDependencies reportModelDependencies(ProjectService projectService, HostinfoService hostinfoService, + SampleConfigManager sampleConfigManager) { + return new ReportModelDependencies(projectService, hostinfoService, sampleConfigManager); + } + @Bean public JsonBuilder jsonBuilder() { return new JsonBuilder(); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java index cf5794db49..829d5ce728 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringContextListener.java @@ -7,8 +7,6 @@ import org.slf4j.LoggerFactory; import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import com.dianping.cat.spring.CatSpringContext; - public class CatHomeSpringContextListener implements ServletContextListener { public static final String ATTRIBUTE_NAME = CatHomeSpringContextListener.class.getName() + ".context"; @@ -22,14 +20,12 @@ public void contextInitialized(ServletContextEvent event) { try { context.register(CatHomeSpringConfiguration.class); - CatSpringContext.setContext(context); context.refresh(); event.getServletContext().setAttribute(ATTRIBUTE_NAME, context); m_context = context; LOGGER.info("CAT home Spring context initialized, beanCount={}.", context.getBeanDefinitionCount()); } catch (RuntimeException | Error e) { LOGGER.error("Failed to initialize CAT home Spring context.", e); - CatSpringContext.clear(context); context.close(); throw e; } @@ -40,7 +36,6 @@ public void contextDestroyed(ServletContextEvent event) { event.getServletContext().removeAttribute(ATTRIBUTE_NAME); if (m_context != null) { - CatSpringContext.clear(m_context); m_context.close(); LOGGER.info("CAT home Spring context closed."); } diff --git a/cat-home/src/main/java/com/dianping/cat/mvc/SpringMvcRuntime.java b/cat-home/src/main/java/com/dianping/cat/mvc/SpringMvcRuntime.java index fe7474dba3..b5fb456f15 100644 --- a/cat-home/src/main/java/com/dianping/cat/mvc/SpringMvcRuntime.java +++ b/cat-home/src/main/java/com/dianping/cat/mvc/SpringMvcRuntime.java @@ -73,11 +73,14 @@ final class SpringMvcRuntime { private final Map> m_modules = new HashMap>(); + private final ReportModelDependencies m_reportModelDependencies; + private final ServletContext m_servletContext; SpringMvcRuntime(ApplicationContext applicationContext, ServletContext servletContext) { m_applicationContext = applicationContext; m_servletContext = servletContext; + m_reportModelDependencies = applicationContext.getBean(ReportModelDependencies.class); m_defaultModule = register(new ReportModule(), true); register(new SystemModule(), false); LOGGER.info("Spring MVC runtime initialized, modules={}.", m_modules.keySet()); @@ -287,9 +290,16 @@ private ActionContext createActionContext(HttpServletRequest request, HttpSer context.setInboundPage(inboundAction.getActionName()); context.setOutboundPage(inboundAction.getActionName()); context.setServletContext(m_servletContext); + injectReportModelDependencies(context); return context; } + private void injectReportModelDependencies(ActionContext context) { + if (context instanceof ReportModelDependencyProvider) { + ((ReportModelDependencyProvider) context).setReportModelDependencies(m_reportModelDependencies); + } + } + private RequestContext createPreActionRequestContext(RequestContext parentContext, InboundActionModel preAction) { DefaultUrlMapping urlMapping = new DefaultUrlMapping(parentContext.getUrlMapping()); RequestContext context = new RequestContext(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/ReportContext.java b/cat-home/src/main/java/com/dianping/cat/report/ReportContext.java index 06cf5fe793..317dc195c1 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/ReportContext.java +++ b/cat-home/src/main/java/com/dianping/cat/report/ReportContext.java @@ -35,7 +35,17 @@ import org.unidal.webres.tag.resource.ResourceTagConfigurator; import org.unidal.webres.taglib.basic.ResourceTagLibConfigurator; -public class ReportContext> extends ActionContext { +import com.dianping.cat.mvc.ReportModelDependencies; +import com.dianping.cat.mvc.ReportModelDependencyProvider; + +public class ReportContext> extends ActionContext + implements ReportModelDependencyProvider { + private ReportModelDependencies m_reportModelDependencies; + + @Override + public ReportModelDependencies getReportModelDependencies() { + return m_reportModelDependencies; + } @Override public void initialize(HttpServletRequest request, HttpServletResponse response) { @@ -67,4 +77,8 @@ public void initialize(HttpServletRequest request, HttpServletResponse response) } } + @Override + public void setReportModelDependencies(ReportModelDependencies dependencies) { + m_reportModelDependencies = dependencies; + } } diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/heavy/HeavyReportBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/heavy/HeavyReportBuilderTest.java index 9570ec1bdc..359a36d727 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/heavy/HeavyReportBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/heavy/HeavyReportBuilderTest.java @@ -20,13 +20,12 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.home.heavy.entity.HeavyReport; import com.dianping.cat.home.heavy.transform.DefaultSaxParser; import com.dianping.cat.report.page.statistics.task.heavy.HeavyReportMerger; -public class HeavyReportBuilderTest extends ComponentTestCase { +public class HeavyReportBuilderTest { @Test public void testMerge() throws Exception { From 09407882467e67349645bf8a57a6e9b8b58aec5f Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 10:13:28 +0800 Subject: [PATCH 135/231] =?UTF-8?q?=E6=B8=85=E7=90=86=20cat-consumer=20?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E4=BE=A7=20Plexus=20lookup=20=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../consumer/RealtimeConfigConfiguration.java | 3 +- .../cat/consumer/cross/Configurator.java | 90 ------------------- .../cat/consumer/cross/CrossAnalyzerTest.java | 63 +++++++++++-- .../cat/consumer/cross/CrossInfoTest.java | 44 +++++---- .../consumer/dump/StoragePerformanceTest.java | 61 +++++++++++-- .../cat/consumer/event/Configurator.java | 77 ---------------- .../cat/consumer/event/EventAnalyzerTest.java | 44 +++++++-- .../cat/consumer/heartbeat/Configurator.java | 77 ---------------- .../heartbeat/HeartbeatAnalyzerTest.java | 47 ++++++++-- .../cat/consumer/matrix/Configurator.java | 76 ---------------- .../consumer/matrix/MatrixAnalyzerTest.java | 37 ++++++-- .../performance/CrossConfigurator.java | 82 ----------------- .../performance/DumpPerformanceTest.java | 74 +++++++++++++-- .../performance/EventConfigurator.java | 82 ----------------- .../performance/EventPerformanceTest.java | 46 +++++++++- .../performance/MatrixConfigurator.java | 82 ----------------- .../performance/MatrixPerformanceTest.java | 39 +++++++- .../performance/ProblemConfigurator.java | 82 ----------------- .../performance/ProblemPerformanceTest.java | 39 ++++++-- .../performance/TransactionConfigurator.java | 82 ----------------- .../TransactionPerformanceTest.java | 70 +++++++++++++-- .../cat/consumer/problem/Configurator.java | 80 ----------------- .../consumer/problem/ProblemAnalyzerTest.java | 36 ++++++-- .../cat/consumer/state/Configurator.java | 82 ----------------- .../cat/consumer/state/StateAnalyzerTest.java | 65 ++++++++++++-- .../consumer/storage/DatabaseParserTest.java | 7 +- .../cat/consumer/top/Configurator.java | 76 ---------------- .../cat/consumer/top/TopAnalyzerTest.java | 36 ++++++-- .../consumer/transaction/Configurator.java | 80 ----------------- .../transaction/TransactionAnalyzerTest.java | 86 ++++++++++++++++-- .../cat/consumer/cross/CrossAnalyzerTest.xml | 20 ----- .../cat/consumer/event/EventAnalyzerTest.xml | 20 ----- .../heartbeat/HeartbeatAnalyzerTest.xml | 20 ----- .../consumer/matrix/MatrixAnalyzerTest.xml | 20 ----- .../performance/CrossPerformanceTest.xml | 20 ----- .../performance/EventPerformanceTest.xml | 20 ----- .../performance/MatrixPerformanceTest.xml | 20 ----- .../performance/ProblemPerformanceTest.xml | 20 ----- .../TransactionPerformanceTest.xml | 20 ----- .../consumer/problem/ProblemAnalyzerTest.xml | 20 ----- .../cat/consumer/state/StateAnalyzerTest.xml | 40 --------- .../cat/consumer/top/TopAnalyzerTest.xml | 21 ----- .../transaction/TransactionAnalyzerTest.xml | 20 ----- 43 files changed, 692 insertions(+), 1434 deletions(-) delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/cross/Configurator.java delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/event/Configurator.java delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/Configurator.java delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/Configurator.java delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/performance/CrossConfigurator.java delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/performance/EventConfigurator.java delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/performance/MatrixConfigurator.java delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/performance/ProblemConfigurator.java delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/performance/TransactionConfigurator.java delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/problem/Configurator.java delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/state/Configurator.java delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/top/Configurator.java delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/Configurator.java delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/cross/CrossAnalyzerTest.xml delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/event/EventAnalyzerTest.xml delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.xml delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.xml delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/CrossPerformanceTest.xml delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/EventPerformanceTest.xml delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/MatrixPerformanceTest.xml delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/ProblemPerformanceTest.xml delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/TransactionPerformanceTest.xml delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.xml delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/state/StateAnalyzerTest.xml delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/top/TopAnalyzerTest.xml delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.xml diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/RealtimeConfigConfiguration.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/RealtimeConfigConfiguration.java index 47b23a0933..ff90826aea 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/RealtimeConfigConfiguration.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/RealtimeConfigConfiguration.java @@ -28,14 +28,13 @@ import com.dianping.cat.analysis.MessageAnalyzerManager; import com.dianping.cat.consumer.event.EventAnalyzer; import com.dianping.cat.consumer.top.TopAnalyzer; -import com.dianping.cat.consumer.transaction.Configurator; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.consumer.transaction.TransactionAnalyzerTest; public class RealtimeConfigConfiguration extends AbstractResourceConfigurator { public static void main(String[] args) { - generatePlexusComponentsXmlFile(new Configurator()); + generatePlexusComponentsXmlFile(new RealtimeConfigConfiguration()); } protected Class getTestClass() { diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/Configurator.java deleted file mode 100644 index 789a0722dd..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/Configurator.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer.cross; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.unidal.lookup.configuration.AbstractResourceConfigurator; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.consumer.MockReportManager; -import com.dianping.cat.consumer.cross.model.entity.CrossReport; -import com.dianping.cat.report.ReportDelegate; -import com.dianping.cat.report.ReportManager; - -import static com.dianping.cat.Constants.HOUR; - -public class Configurator extends AbstractResourceConfigurator { - - public static void main(String[] args) { - generatePlexusComponentsXmlFile(new Configurator()); - } - - protected Class getTestClass() { - return CrossAnalyzerTest.class; - } - - @Override - public List defineComponents() { - List all = new ArrayList(); - final String ID = CrossAnalyzer.ID; - - all.add(C(ReportManager.class, ID, MockCrossReportManager.class)// - .req(ReportDelegate.class, ID)); - all.add(C(ReportDelegate.class, ID, ExtendedCrossDelegate.class)); - - return all; - } - - public static class ExtendedCrossDelegate extends CrossDelegate { - } - - public static class MockCrossReportManager extends MockReportManager { - private Map> m_reports = new ConcurrentHashMap>(); - - ; - - private ReportDelegate m_delegate; - - @Override - public CrossReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { - Map reports = m_reports.get(startTime); - - if (reports == null && createIfNotExist) { - reports = new ConcurrentHashMap(); - m_reports.put(startTime, reports); - } - - CrossReport report = reports.get(domain); - - if (report == null && createIfNotExist) { - report = m_delegate.makeReport(domain, startTime, HOUR); - reports.put(domain, report); - } - return report; - } - - @Override - public void destory() { - } - } -} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossAnalyzerTest.java index 9c2c2b7ca0..cf4ab4ae90 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossAnalyzerTest.java @@ -20,23 +20,26 @@ import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Map; import java.util.TimeZone; +import java.util.concurrent.ConcurrentHashMap; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; -import com.dianping.cat.analysis.MessageAnalyzer; +import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.consumer.MockReportManager; import com.dianping.cat.consumer.cross.model.entity.CrossReport; import com.dianping.cat.message.Message; import com.dianping.cat.message.internal.DefaultEvent; import com.dianping.cat.message.internal.DefaultTransaction; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; +import com.dianping.cat.report.ReportDelegate; -public class CrossAnalyzerTest extends ComponentTestCase { +public class CrossAnalyzerTest { private long m_timestamp; @@ -46,14 +49,12 @@ public class CrossAnalyzerTest extends ComponentTestCase { @Before public void setUp() throws Exception { - super.setUp(); TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); long currentTimeMillis = System.currentTimeMillis(); m_timestamp = currentTimeMillis - currentTimeMillis % (3600 * 1000); - m_analyzer = (CrossAnalyzer) lookup(MessageAnalyzer.class, CrossAnalyzer.ID); - + m_analyzer = createAnalyzer(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm"); Date date = sdf.parse("20120101 00:00"); @@ -135,4 +136,54 @@ public void testFormatIp() { Assert.assertEquals("10.1.6.128", analyzer.convertHostNameToIP("10.1.6.128")); } + private CrossAnalyzer createAnalyzer() { + CrossAnalyzer analyzer = new CrossAnalyzer(); + + analyzer.setIpConvertManager(new IpConvertManager()); + analyzer.setReportManager(new MockCrossReportManager()); + analyzer.setServerConfigManager(new MockServerConfigManager()); + return analyzer; + } + + private static class MockCrossReportManager extends MockReportManager { + private final ReportDelegate m_delegate = new CrossDelegate(); + + private Map> m_reports = new ConcurrentHashMap>(); + + @Override + public CrossReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { + Map reports = m_reports.get(startTime); + + if (reports == null && createIfNotExist) { + reports = new ConcurrentHashMap(); + m_reports.put(startTime, reports); + } + + CrossReport report = reports.get(domain); + + if (report == null && createIfNotExist) { + report = m_delegate.makeReport(domain, startTime, Constants.HOUR); + reports.put(domain, report); + } + return report; + } + + @Override + public void destory() { + } + } + + private static class MockServerConfigManager extends ServerConfigManager { + + @Override + public boolean isRpcClient(String type) { + return "PigeonCall".equals(type) || "Call".equals(type); + } + + @Override + public boolean isRpcServer(String type) { + return "PigeonService".equals(type) || "Service".equals(type); + } + } + } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossInfoTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossInfoTest.java index b4bd25cf62..a5b7e98093 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossInfoTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/cross/CrossInfoTest.java @@ -20,7 +20,6 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.consumer.cross.CrossAnalyzer.CrossInfo; @@ -30,7 +29,7 @@ import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; -public class CrossInfoTest extends ComponentTestCase { +public class CrossInfoTest { public MessageTree buildMockMessageTree() { MessageTree tree = new DefaultMessageTree(); tree.setMessageId("Cat-c0a80746-373452-6");// 192.168.7.70 machine logview @@ -40,10 +39,7 @@ public MessageTree buildMockMessageTree() { @Test public void testParseOtherTransaction() throws Exception { - CrossAnalyzer analyzer = new CrossAnalyzer(); - - analyzer.setServerConfigManager(lookup(ServerConfigManager.class)); - analyzer.setIpConvertManager(new IpConvertManager()); + CrossAnalyzer analyzer = createAnalyzer(); DefaultTransaction t = new DefaultTransaction("Other", "method1"); MessageTree tree = buildMockMessageTree(); @@ -54,10 +50,7 @@ public void testParseOtherTransaction() throws Exception { @Test public void testParsePigeonClientTransaction() throws Exception { - CrossAnalyzer analyzer = new CrossAnalyzer(); - - analyzer.setServerConfigManager(lookup(ServerConfigManager.class)); - analyzer.setIpConvertManager(new IpConvertManager()); + CrossAnalyzer analyzer = createAnalyzer(); DefaultTransaction t = new DefaultTransaction("PigeonCall", "method1"); MessageTree tree = buildMockMessageTree(); @@ -82,10 +75,7 @@ public void testParsePigeonClientTransaction() throws Exception { @Test public void testParsePigeonServerTransaction() throws Exception { - CrossAnalyzer analyzer = new CrossAnalyzer(); - - analyzer.setServerConfigManager(lookup(ServerConfigManager.class)); - analyzer.setIpConvertManager(new IpConvertManager()); + CrossAnalyzer analyzer = createAnalyzer(); DefaultTransaction t = new DefaultTransaction("PigeonService", "method1"); MessageTree tree = buildMockMessageTree(); @@ -109,10 +99,7 @@ public void testParsePigeonServerTransaction() throws Exception { @Test public void testParsePigeonServerTransactionWithPort() throws Exception { - CrossAnalyzer analyzer = new CrossAnalyzer(); - - analyzer.setServerConfigManager(lookup(ServerConfigManager.class)); - analyzer.setIpConvertManager(new IpConvertManager()); + CrossAnalyzer analyzer = createAnalyzer(); DefaultTransaction t = new DefaultTransaction("PigeonService", "method1"); MessageTree tree = buildMockMessageTree(); @@ -131,4 +118,25 @@ public void testParsePigeonServerTransactionWithPort() throws Exception { Assert.assertEquals(info.getRemoteRole(), "Pigeon.Client"); Assert.assertEquals(info.getApp(), "myDomain"); } + + private CrossAnalyzer createAnalyzer() { + CrossAnalyzer analyzer = new CrossAnalyzer(); + + analyzer.setServerConfigManager(new MockServerConfigManager()); + analyzer.setIpConvertManager(new IpConvertManager()); + return analyzer; + } + + private static class MockServerConfigManager extends ServerConfigManager { + + @Override + public boolean isRpcClient(String type) { + return "PigeonCall".equals(type) || "Call".equals(type); + } + + @Override + public boolean isRpcServer(String type) { + return "PigeonService".equals(type) || "Service".equals(type); + } + } } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/dump/StoragePerformanceTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/dump/StoragePerformanceTest.java index eff7a62aac..7bef6efcff 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/dump/StoragePerformanceTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/dump/StoragePerformanceTest.java @@ -26,27 +26,30 @@ import org.junit.Before; import org.junit.Test; -import org.unidal.cat.message.storage.StorageConfiguration; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Cat; +import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.message.DefaultPathBuilder; import com.dianping.cat.message.codec.PlainTextMessageCodec; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageCodec; import com.dianping.cat.message.spi.MessageTree; +import com.dianping.cat.message.storage.LocalMessageBucket; +import com.dianping.cat.message.storage.MessageBucketFactory; import com.dianping.cat.message.storage.MessageBucketManager; import com.dianping.cat.message.tree.MessageId; +import com.dianping.cat.statistic.ServerStatisticManager; -public class StoragePerformanceTest extends ComponentTestCase { +public class StoragePerformanceTest { private MessageCodec m_codec = new PlainTextMessageCodec(); + private File m_baseDir; + @Before public void before() throws IOException { - File baseDir = new File(Cat.getCatHome(),"bucket/dump/20160415"); - - deleteDirectory(new File(baseDir, "dump").toPath()); + m_baseDir = new File(Cat.getCatHome(),"bucket/dump/20160415"); - lookup(StorageConfiguration.class).setBaseDataDir(baseDir); + deleteDirectory(new File(m_baseDir, "dump").toPath()); } private void deleteDirectory(Path path) throws IOException { @@ -63,7 +66,7 @@ private void deleteDirectory(Path path) throws IOException { public void testManyDomainIpWrite() throws Exception { TreeHelper.init(m_codec); long start = System.currentTimeMillis(); - MessageBucketManager manager = lookup(MessageBucketManager.class, "local"); + MessageBucketManager manager = createLocalMessageBucketManager(); int hour = 405746; for (int i = 0; i < 10000; i++) { @@ -94,4 +97,46 @@ public void testManyDomainIpWrite() throws Exception { long duration = System.currentTimeMillis() - start; System.out.println("write cost" + duration); } + + private MessageBucketManager createLocalMessageBucketManager() { + LocalMessageBucketManager manager = new LocalMessageBucketManager(); + + manager.setBucketFactory(new MockMessageBucketFactory()); + manager.setConfigManager(new MockServerConfigManager()); + manager.setLocalIp("127.0.0.1"); + manager.setPathBuilder(new DefaultPathBuilder()); + manager.setServerStateManager(new ServerStatisticManager()); + manager.initialize(); + return manager; + } + + private class MockMessageBucketFactory implements MessageBucketFactory { + + @Override + public LocalMessageBucket createBucket(File baseDir, String dataFile) throws IOException { + LocalMessageBucket bucket = new LocalMessageBucket(); + + bucket.setBaseDir(baseDir); + bucket.initialize(dataFile); + return bucket; + } + } + + private class MockServerConfigManager extends ServerConfigManager { + + @Override + public String getHdfsLocalBaseDir(String id) { + return new File(m_baseDir, id).getPath(); + } + + @Override + public boolean isLocalMode() { + return true; + } + + @Override + public boolean isUseNewStorage() { + return false; + } + } } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/event/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/event/Configurator.java deleted file mode 100644 index 88108fb7ef..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/event/Configurator.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer.event; - -import java.util.ArrayList; -import java.util.List; - -import org.unidal.lookup.configuration.AbstractResourceConfigurator; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.Constants; -import com.dianping.cat.consumer.MockReportManager; -import com.dianping.cat.consumer.event.model.entity.EventReport; -import com.dianping.cat.report.ReportDelegate; -import com.dianping.cat.report.ReportManager; - -public class Configurator extends AbstractResourceConfigurator { - - public static void main(String[] args) { - generatePlexusComponentsXmlFile(new Configurator()); - } - - protected Class getTestClass() { - return EventAnalyzerTest.class; - } - - @Override - public List defineComponents() { - List all = new ArrayList(); - final String ID = EventAnalyzer.ID; - - all.add(C(ReportManager.class, ID, MockEventReportManager.class)// - .req(ReportDelegate.class, ID)); - all.add(C(ReportDelegate.class, ID, ExtendedEventDelegate.class)); - - return all; - } - - public static class ExtendedEventDelegate extends EventDelegate { - } - - public static class MockEventReportManager extends MockReportManager { - private EventReport m_report; - - private ReportDelegate m_delegate; - - @Override - public EventReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { - if (m_report == null) { - m_report = (EventReport) m_delegate.makeReport(domain, startTime, Constants.HOUR); - } - - return m_report; - } - - @Override - public void destory() { - } - } - -} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventAnalyzerTest.java index 3a5a3e5f0a..3ceb0131bf 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/event/EventAnalyzerTest.java @@ -24,10 +24,10 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; -import com.dianping.cat.analysis.MessageAnalyzer; +import com.dianping.cat.config.AtomicMessageConfigManager; +import com.dianping.cat.consumer.MockReportManager; import com.dianping.cat.consumer.TestHelper; import com.dianping.cat.consumer.event.model.entity.EventReport; import com.dianping.cat.message.Message; @@ -35,8 +35,9 @@ import com.dianping.cat.message.internal.DefaultTransaction; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; +import com.dianping.cat.report.ReportDelegate; -public class EventAnalyzerTest extends ComponentTestCase { +public class EventAnalyzerTest { private long m_timestamp; @@ -46,12 +47,11 @@ public class EventAnalyzerTest extends ComponentTestCase { @Before public void setUp() throws Exception { - super.setUp(); long currentTimeMillis = System.currentTimeMillis(); m_timestamp = currentTimeMillis - currentTimeMillis % (3600 * 1000); - m_analyzer = (EventAnalyzer) lookup(MessageAnalyzer.class, EventAnalyzer.ID); + m_analyzer = createAnalyzer(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm"); Date date = sdf.parse("20120101 00:00"); @@ -121,4 +121,38 @@ protected MessageTree generateMessageTree(int i) { return tree; } + private EventAnalyzer createAnalyzer() { + EventAnalyzer analyzer = new EventAnalyzer(); + + analyzer.setAtomicMessageConfigManager(new MockAtomicMessageConfigManager()); + analyzer.setReportManager(new MockEventReportManager()); + return analyzer; + } + + private static class MockAtomicMessageConfigManager extends AtomicMessageConfigManager { + @Override + public int getMaxNameThreshold(String domain) { + return 200; + } + } + + private static class MockEventReportManager extends MockReportManager { + private final ReportDelegate m_delegate = new EventDelegate(); + + private EventReport m_report; + + @Override + public EventReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { + if (m_report == null) { + m_report = m_delegate.makeReport(domain, startTime, Constants.HOUR); + } + + return m_report; + } + + @Override + public void destory() { + } + } + } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/Configurator.java deleted file mode 100644 index 8a899ebae0..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/Configurator.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer.heartbeat; - -import java.util.ArrayList; -import java.util.List; - -import org.unidal.lookup.configuration.AbstractResourceConfigurator; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.Constants; -import com.dianping.cat.consumer.MockReportManager; -import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; -import com.dianping.cat.report.ReportDelegate; -import com.dianping.cat.report.ReportManager; - -public class Configurator extends AbstractResourceConfigurator { - - public static void main(String[] args) { - generatePlexusComponentsXmlFile(new Configurator()); - } - - protected Class getTestClass() { - return HeartbeatAnalyzerTest.class; - } - - @Override - public List defineComponents() { - List all = new ArrayList(); - final String ID = HeartbeatAnalyzer.ID; - - all.add(C(ReportManager.class, ID, MockHeartbeatReportManager.class)// - .req(ReportDelegate.class, ID)); - all.add(C(ReportDelegate.class, ID, ExtendedHeartbeatDelegate.class)); - - return all; - } - - public static class ExtendedHeartbeatDelegate extends HeartbeatDelegate { - } - - public static class MockHeartbeatReportManager extends MockReportManager { - private HeartbeatReport m_report; - - private ReportDelegate m_delegate; - - @Override - public HeartbeatReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { - if (m_report == null) { - m_report = (HeartbeatReport) m_delegate.makeReport(domain, startTime, Constants.HOUR); - } - - return m_report; - } - - @Override - public void destory() { - } - } - -} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.java index f362e8715c..13f4ad6afb 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.java @@ -25,18 +25,19 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; -import com.dianping.cat.analysis.MessageAnalyzer; +import com.dianping.cat.config.server.ServerFilterConfigManager; +import com.dianping.cat.consumer.MockReportManager; import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; import com.dianping.cat.message.Heartbeat; import com.dianping.cat.message.internal.DefaultHeartbeat; import com.dianping.cat.message.internal.DefaultTransaction; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; +import com.dianping.cat.report.ReportDelegate; -public class HeartbeatAnalyzerTest extends ComponentTestCase { +public class HeartbeatAnalyzerTest { private long m_timestamp; @@ -48,15 +49,12 @@ public class HeartbeatAnalyzerTest extends ComponentTestCase { @Before public void setUp() throws Exception { - super.setUp(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm"); Date date = sdf.parse("20120101 00:00"); m_timestamp = date.getTime(); - m_analyzer = (HeartbeatAnalyzer) lookup(MessageAnalyzer.class, HeartbeatAnalyzer.ID); - + m_analyzer = createAnalyzer(); m_analyzer.initialize(date.getTime(), Constants.HOUR, Constants.MINUTE * 5); } @@ -110,4 +108,39 @@ private Heartbeat newHeartbeat(String type, String name, long timestamp, String return heartbeat; } + + private HeartbeatAnalyzer createAnalyzer() { + HeartbeatAnalyzer analyzer = new HeartbeatAnalyzer(); + + analyzer.setReportManager(new MockHeartbeatReportManager()); + analyzer.setServerFilterConfigManager(new MockServerFilterConfigManager()); + return analyzer; + } + + private static class MockHeartbeatReportManager extends MockReportManager { + private final ReportDelegate m_delegate = new HeartbeatDelegate(); + + private HeartbeatReport m_report; + + @Override + public HeartbeatReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { + if (m_report == null) { + m_report = m_delegate.makeReport(domain, startTime, Constants.HOUR); + } + + return m_report; + } + + @Override + public void destory() { + } + } + + private static class MockServerFilterConfigManager extends ServerFilterConfigManager { + + @Override + public boolean validateDomain(String domain) { + return true; + } + } } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/Configurator.java deleted file mode 100644 index b941413f81..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/Configurator.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer.matrix; - -import java.util.ArrayList; -import java.util.List; - -import org.unidal.lookup.configuration.AbstractResourceConfigurator; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.Constants; -import com.dianping.cat.consumer.MockReportManager; -import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; -import com.dianping.cat.report.ReportDelegate; -import com.dianping.cat.report.ReportManager; - -public class Configurator extends AbstractResourceConfigurator { - - public static void main(String[] args) { - generatePlexusComponentsXmlFile(new Configurator()); - } - - protected Class getTestClass() { - return MatrixAnalyzerTest.class; - } - - @Override - public List defineComponents() { - List all = new ArrayList(); - final String ID = MatrixAnalyzer.ID; - - all.add(C(ReportManager.class, ID, MockMatrixReportManager.class)// - .req(ReportDelegate.class, ID)); - all.add(C(ReportDelegate.class, ID, ExtendedMatrixDelegate.class)); - - return all; - } - - public static class ExtendedMatrixDelegate extends MatrixDelegate { - } - - public static class MockMatrixReportManager extends MockReportManager { - private MatrixReport m_report; - - private ReportDelegate m_delegate; - - @Override - public MatrixReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { - if (m_report == null) { - m_report = (MatrixReport) m_delegate.makeReport(domain, startTime, Constants.HOUR); - } - - return m_report; - } - - @Override - public void destory() { - } - } -} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.java index be2a3232ce..356ac1886d 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.java @@ -24,20 +24,21 @@ import org.junit.Before; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; -import com.dianping.cat.analysis.MessageAnalyzer; +import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.consumer.MockReportManager; import com.dianping.cat.consumer.TestHelper; import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; import com.dianping.cat.message.Message; import com.dianping.cat.message.internal.DefaultTransaction; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; +import com.dianping.cat.report.ReportDelegate; import org.junit.Assert; -public class MatrixAnalyzerTest extends ComponentTestCase { +public class MatrixAnalyzerTest { private long m_timestamp; @@ -47,13 +48,12 @@ public class MatrixAnalyzerTest extends ComponentTestCase { @Before public void setUp() throws Exception { - super.setUp(); TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); long currentTimeMillis = System.currentTimeMillis(); m_timestamp = currentTimeMillis - currentTimeMillis % (3600 * 1000); - m_analyzer = (MatrixAnalyzer) lookup(MessageAnalyzer.class, MatrixAnalyzer.ID); + m_analyzer = createAnalyzer(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm"); Date date = sdf.parse("20120101 00:00"); @@ -113,4 +113,31 @@ protected MessageTree generateMessageTree(int i) { return tree; } + private MatrixAnalyzer createAnalyzer() { + MatrixAnalyzer analyzer = new MatrixAnalyzer(); + + analyzer.setReportManager(new MockMatrixReportManager()); + analyzer.setServerConfigManager(new ServerConfigManager()); + return analyzer; + } + + private static class MockMatrixReportManager extends MockReportManager { + private final ReportDelegate m_delegate = new MatrixDelegate(); + + private MatrixReport m_report; + + @Override + public MatrixReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { + if (m_report == null) { + m_report = m_delegate.makeReport(domain, startTime, Constants.HOUR); + } + + return m_report; + } + + @Override + public void destory() { + } + } + } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/CrossConfigurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/CrossConfigurator.java deleted file mode 100644 index 014a2b79fc..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/CrossConfigurator.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer.performance; - -import java.util.ArrayList; -import java.util.List; - -import org.unidal.lookup.configuration.AbstractResourceConfigurator; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.Constants; -import com.dianping.cat.consumer.MockReportManager; -import com.dianping.cat.consumer.cross.CrossAnalyzer; -import com.dianping.cat.consumer.cross.CrossDelegate; -import com.dianping.cat.consumer.cross.model.entity.CrossReport; -import com.dianping.cat.report.ReportDelegate; -import com.dianping.cat.report.ReportManager; - -public class CrossConfigurator extends AbstractResourceConfigurator { - - public static void main(String[] args) { - generatePlexusComponentsXmlFile(new CrossConfigurator()); - } - - protected Class getTestClass() { - return CrossPerformanceTest.class; - } - - @Override - public List defineComponents() { - List all = new ArrayList(); - final String ID = CrossAnalyzer.ID; - - all.add(C(ReportManager.class, ID, MockCrossReportManager.class)// - .req(ReportDelegate.class, ID)); - all.add(C(ReportDelegate.class, ID, ExtendedCrossDelegate.class)); - - return all; - } - - public static class ExtendedCrossDelegate extends CrossDelegate { - } - - public static class MockCrossReportManager extends MockReportManager { - private CrossReport m_report; - - private ReportDelegate m_delegate; - - @Override - public CrossReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { - if (m_report == null) { - m_report = (CrossReport) m_delegate.makeReport(domain, startTime, Constants.HOUR); - } - - return m_report; - } - - public void setReport(CrossReport report) { - m_report = report; - } - - @Override - public void destory() { - } - } -} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/DumpPerformanceTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/DumpPerformanceTest.java index b1c4bcfdca..2bf308def8 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/DumpPerformanceTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/DumpPerformanceTest.java @@ -19,28 +19,33 @@ package com.dianping.cat.consumer.performance; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; +import org.unidal.cat.message.storage.MessageDumper; +import org.unidal.cat.message.storage.MessageDumperManager; +import org.unidal.cat.message.storage.MessageFinder; +import org.unidal.cat.message.storage.MessageFinderManager; -import com.dianping.cat.analysis.MessageAnalyzer; import com.dianping.cat.consumer.dump.DumpAnalyzer; import com.dianping.cat.message.Message; import com.dianping.cat.message.context.MessageIdFactory; import com.dianping.cat.message.internal.MockMessageBuilder; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; +import com.dianping.cat.message.tree.MessageId; +import com.dianping.cat.statistic.ServerStatisticManager; -public class DumpPerformanceTest extends ComponentTestCase { +import io.netty.buffer.ByteBuf; + +public class DumpPerformanceTest { private MessageIdFactory m_factory = new MessageIdFactory(); public void setUp() throws Exception { - super.setUp(); m_factory.initialize("test"); } @Test public void test() throws Exception { - DumpAnalyzer analyzer = (DumpAnalyzer) lookup(MessageAnalyzer.class, DumpAnalyzer.ID); + DumpAnalyzer analyzer = createAnalyzer(); MessageTree tree = buildMessage(); @@ -113,4 +118,63 @@ public MessageHolder define() { return tree; } + private DumpAnalyzer createAnalyzer() { + DumpAnalyzer analyzer = new DumpAnalyzer(); + + analyzer.setDumperManager(new MockMessageDumperManager()); + analyzer.setFinderManager(new MockMessageFinderManager()); + analyzer.setServerStateManager(new ServerStatisticManager()); + analyzer.initialize(System.currentTimeMillis(), 60 * 60 * 1000L, 5 * 60 * 1000L); + return analyzer; + } + + private static class MockMessageDumper implements MessageDumper { + + @Override + public void awaitTermination(int hour) throws InterruptedException { + } + + @Override + public void initialize(int hour) { + } + + @Override + public void process(MessageTree tree) { + } + } + + private static class MockMessageDumperManager implements MessageDumperManager { + private final MessageDumper m_dumper = new MockMessageDumper(); + + @Override + public void close(int hour) { + } + + @Override + public MessageDumper find(int hour) { + return m_dumper; + } + + @Override + public MessageDumper findOrCreate(int hour) { + return m_dumper; + } + } + + private static class MockMessageFinderManager implements MessageFinderManager { + + @Override + public void close(int hour) { + } + + @Override + public ByteBuf find(MessageId id) { + return null; + } + + @Override + public void register(int hour, MessageFinder finder) { + } + } + } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/EventConfigurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/EventConfigurator.java deleted file mode 100644 index ae12aa53fb..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/EventConfigurator.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer.performance; - -import java.util.ArrayList; -import java.util.List; - -import org.unidal.lookup.configuration.AbstractResourceConfigurator; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.Constants; -import com.dianping.cat.consumer.MockReportManager; -import com.dianping.cat.consumer.event.EventAnalyzer; -import com.dianping.cat.consumer.event.EventDelegate; -import com.dianping.cat.consumer.event.model.entity.EventReport; -import com.dianping.cat.report.ReportDelegate; -import com.dianping.cat.report.ReportManager; - -public class EventConfigurator extends AbstractResourceConfigurator { - - public static void main(String[] args) { - generatePlexusComponentsXmlFile(new EventConfigurator()); - } - - protected Class getTestClass() { - return EventPerformanceTest.class; - } - - @Override - public List defineComponents() { - List all = new ArrayList(); - final String ID = EventAnalyzer.ID; - - all.add(C(ReportManager.class, ID, MockEventReportManager.class)// - .req(ReportDelegate.class, ID)); - all.add(C(ReportDelegate.class, ID, ExtendedEventDelegate.class)); - - return all; - } - - public static class ExtendedEventDelegate extends EventDelegate { - } - - public static class MockEventReportManager extends MockReportManager { - private EventReport m_report; - - private ReportDelegate m_delegate; - - @Override - public EventReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { - if (m_report == null) { - m_report = (EventReport) m_delegate.makeReport(domain, startTime, Constants.HOUR); - } - - return m_report; - } - - public void setReport(EventReport report) { - m_report = report; - } - - @Override - public void destory() { - } - } -} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/EventPerformanceTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/EventPerformanceTest.java index fadfa8934e..75d79134dc 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/EventPerformanceTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/EventPerformanceTest.java @@ -19,20 +19,24 @@ package com.dianping.cat.consumer.performance; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; -import com.dianping.cat.analysis.MessageAnalyzer; +import com.dianping.cat.Constants; +import com.dianping.cat.config.AtomicMessageConfigManager; +import com.dianping.cat.consumer.MockReportManager; import com.dianping.cat.consumer.event.EventAnalyzer; +import com.dianping.cat.consumer.event.EventDelegate; +import com.dianping.cat.consumer.event.model.entity.EventReport; import com.dianping.cat.message.Message; import com.dianping.cat.message.internal.MockMessageBuilder; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; +import com.dianping.cat.report.ReportDelegate; -public class EventPerformanceTest extends ComponentTestCase { +public class EventPerformanceTest { @Test public void test() throws Exception { - EventAnalyzer analyzer = (EventAnalyzer) lookup(MessageAnalyzer.class, EventAnalyzer.ID); + EventAnalyzer analyzer = createAnalyzer(); MessageTree tree = buildMessage(); @@ -98,4 +102,38 @@ public MessageHolder define() { return tree; } + private EventAnalyzer createAnalyzer() { + EventAnalyzer analyzer = new EventAnalyzer(); + + analyzer.setAtomicMessageConfigManager(new MockAtomicMessageConfigManager()); + analyzer.setReportManager(new MockEventReportManager()); + return analyzer; + } + + private static class MockAtomicMessageConfigManager extends AtomicMessageConfigManager { + @Override + public int getMaxNameThreshold(String domain) { + return 200; + } + } + + private static class MockEventReportManager extends MockReportManager { + private final ReportDelegate m_delegate = new EventDelegate(); + + private EventReport m_report; + + @Override + public EventReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { + if (m_report == null) { + m_report = m_delegate.makeReport(domain, startTime, Constants.HOUR); + } + + return m_report; + } + + @Override + public void destory() { + } + } + } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/MatrixConfigurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/MatrixConfigurator.java deleted file mode 100644 index 621d3eed8b..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/MatrixConfigurator.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer.performance; - -import java.util.ArrayList; -import java.util.List; - -import org.unidal.lookup.configuration.AbstractResourceConfigurator; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.Constants; -import com.dianping.cat.consumer.MockReportManager; -import com.dianping.cat.consumer.matrix.MatrixAnalyzer; -import com.dianping.cat.consumer.matrix.MatrixDelegate; -import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; -import com.dianping.cat.report.ReportDelegate; -import com.dianping.cat.report.ReportManager; - -public class MatrixConfigurator extends AbstractResourceConfigurator { - - public static void main(String[] args) { - generatePlexusComponentsXmlFile(new MatrixConfigurator()); - } - - protected Class getTestClass() { - return MatrixPerformanceTest.class; - } - - @Override - public List defineComponents() { - List all = new ArrayList(); - final String ID = MatrixAnalyzer.ID; - - all.add(C(ReportManager.class, ID, MockMatrixReportManager.class)// - .req(ReportDelegate.class, ID)); - all.add(C(ReportDelegate.class, ID, ExtendedMatrixDelegate.class)); - - return all; - } - - public static class ExtendedMatrixDelegate extends MatrixDelegate { - } - - public static class MockMatrixReportManager extends MockReportManager { - private MatrixReport m_report; - - private ReportDelegate m_delegate; - - @Override - public MatrixReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { - if (m_report == null) { - m_report = (MatrixReport) m_delegate.makeReport(domain, startTime, Constants.HOUR); - } - - return m_report; - } - - public void setReport(MatrixReport report) { - m_report = report; - } - - @Override - public void destory() { - } - } -} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/MatrixPerformanceTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/MatrixPerformanceTest.java index 05192a9e47..bd146c8614 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/MatrixPerformanceTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/MatrixPerformanceTest.java @@ -19,20 +19,24 @@ package com.dianping.cat.consumer.performance; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; -import com.dianping.cat.analysis.MessageAnalyzer; +import com.dianping.cat.Constants; +import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.consumer.MockReportManager; import com.dianping.cat.consumer.matrix.MatrixAnalyzer; +import com.dianping.cat.consumer.matrix.MatrixDelegate; +import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; import com.dianping.cat.message.Message; import com.dianping.cat.message.internal.MockMessageBuilder; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; +import com.dianping.cat.report.ReportDelegate; -public class MatrixPerformanceTest extends ComponentTestCase { +public class MatrixPerformanceTest { @Test public void test() throws Exception { - MatrixAnalyzer analyzer = (MatrixAnalyzer) lookup(MessageAnalyzer.class, MatrixAnalyzer.ID); + MatrixAnalyzer analyzer = createAnalyzer(); MessageTree tree = buildMessage(); long current = System.currentTimeMillis(); @@ -97,4 +101,31 @@ public MessageHolder define() { return tree; } + private MatrixAnalyzer createAnalyzer() { + MatrixAnalyzer analyzer = new MatrixAnalyzer(); + + analyzer.setReportManager(new MockMatrixReportManager()); + analyzer.setServerConfigManager(new ServerConfigManager()); + return analyzer; + } + + private static class MockMatrixReportManager extends MockReportManager { + private final ReportDelegate m_delegate = new MatrixDelegate(); + + private MatrixReport m_report; + + @Override + public MatrixReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { + if (m_report == null) { + m_report = m_delegate.makeReport(domain, startTime, Constants.HOUR); + } + + return m_report; + } + + @Override + public void destory() { + } + } + } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/ProblemConfigurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/ProblemConfigurator.java deleted file mode 100644 index 8d7ad504e0..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/ProblemConfigurator.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer.performance; - -import java.util.ArrayList; -import java.util.List; - -import org.unidal.lookup.configuration.AbstractResourceConfigurator; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.Constants; -import com.dianping.cat.consumer.MockReportManager; -import com.dianping.cat.consumer.problem.ProblemAnalyzer; -import com.dianping.cat.consumer.problem.ProblemDelegate; -import com.dianping.cat.consumer.problem.model.entity.ProblemReport; -import com.dianping.cat.report.ReportDelegate; -import com.dianping.cat.report.ReportManager; - -public class ProblemConfigurator extends AbstractResourceConfigurator { - - public static void main(String[] args) { - generatePlexusComponentsXmlFile(new ProblemConfigurator()); - } - - protected Class getTestClass() { - return ProblemPerformanceTest.class; - } - - @Override - public List defineComponents() { - List all = new ArrayList(); - final String ID = ProblemAnalyzer.ID; - - all.add(C(ReportManager.class, ID, MockProblemReportManager.class)// - .req(ReportDelegate.class, ID)); - all.add(C(ReportDelegate.class, ID, ExtendedProblemDelegate.class)); - - return all; - } - - public static class ExtendedProblemDelegate extends ProblemDelegate { - } - - public static class MockProblemReportManager extends MockReportManager { - private ProblemReport m_report; - - private ReportDelegate m_delegate; - - @Override - public ProblemReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { - if (m_report == null) { - m_report = (ProblemReport) m_delegate.makeReport(domain, startTime, Constants.HOUR); - } - - return m_report; - } - - public void setReport(ProblemReport report) { - m_report = report; - } - - @Override - public void destory() { - } - } -} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/ProblemPerformanceTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/ProblemPerformanceTest.java index 70d756e261..a71f09928c 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/ProblemPerformanceTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/ProblemPerformanceTest.java @@ -19,22 +19,25 @@ package com.dianping.cat.consumer.performance; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; -import com.dianping.cat.analysis.MessageAnalyzer; +import com.dianping.cat.Constants; +import com.dianping.cat.consumer.MockReportManager; import com.dianping.cat.consumer.problem.ProblemAnalyzer; +import com.dianping.cat.consumer.problem.ProblemDelegate; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; import com.dianping.cat.message.Event; import com.dianping.cat.message.Message; import com.dianping.cat.message.internal.DefaultEvent; import com.dianping.cat.message.internal.MockMessageBuilder; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; +import com.dianping.cat.report.ReportDelegate; -public class ProblemPerformanceTest extends ComponentTestCase { +public class ProblemPerformanceTest { @Test public void test() throws Exception { - ProblemAnalyzer analyzer = (ProblemAnalyzer) lookup(MessageAnalyzer.class, ProblemAnalyzer.ID); + ProblemAnalyzer analyzer = createAnalyzer(); MessageTree tree = buildMessage(); long current = System.currentTimeMillis(); @@ -50,7 +53,7 @@ public void test() throws Exception { @Test public void test2() throws Exception { - ProblemAnalyzer analyzer = (ProblemAnalyzer) lookup(MessageAnalyzer.class, ProblemAnalyzer.ID); + ProblemAnalyzer analyzer = createAnalyzer(); MessageTree tree = buildMessage(); long current = System.currentTimeMillis(); @@ -110,4 +113,30 @@ public MessageHolder define() { return tree; } + private ProblemAnalyzer createAnalyzer() { + ProblemAnalyzer analyzer = new ProblemAnalyzer(); + + analyzer.setReportManager(new MockProblemReportManager()); + return analyzer; + } + + private static class MockProblemReportManager extends MockReportManager { + private final ReportDelegate m_delegate = new ProblemDelegate(); + + private ProblemReport m_report; + + @Override + public ProblemReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { + if (m_report == null) { + m_report = m_delegate.makeReport(domain, startTime, Constants.HOUR); + } + + return m_report; + } + + @Override + public void destory() { + } + } + } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/TransactionConfigurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/TransactionConfigurator.java deleted file mode 100644 index 5a9fb7e711..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/TransactionConfigurator.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer.performance; - -import java.util.ArrayList; -import java.util.List; - -import org.unidal.lookup.configuration.AbstractResourceConfigurator; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.Constants; -import com.dianping.cat.consumer.MockReportManager; -import com.dianping.cat.consumer.transaction.TransactionAnalyzer; -import com.dianping.cat.consumer.transaction.TransactionDelegate; -import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; -import com.dianping.cat.report.ReportDelegate; -import com.dianping.cat.report.ReportManager; - -public class TransactionConfigurator extends AbstractResourceConfigurator { - - public static void main(String[] args) { - generatePlexusComponentsXmlFile(new TransactionConfigurator()); - } - - protected Class getTestClass() { - return TransactionPerformanceTest.class; - } - - @Override - public List defineComponents() { - List all = new ArrayList(); - final String ID = TransactionAnalyzer.ID; - - all.add(C(ReportManager.class, ID, MockTransactionReportManager.class)// - .req(ReportDelegate.class, ID)); - all.add(C(ReportDelegate.class, ID, ExtendedTransactionDelegate.class)); - - return all; - } - - public static class ExtendedTransactionDelegate extends TransactionDelegate { - } - - public static class MockTransactionReportManager extends MockReportManager { - private TransactionReport m_report; - - private ReportDelegate m_delegate; - - @Override - public TransactionReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { - if (m_report == null) { - m_report = (TransactionReport) m_delegate.makeReport(domain, startTime, Constants.HOUR); - } - - return m_report; - } - - public void setReport(TransactionReport report) { - m_report = report; - } - - @Override - public void destory() { - } - } -} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/TransactionPerformanceTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/TransactionPerformanceTest.java index 27ac3dbe11..5896a92fb2 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/TransactionPerformanceTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/performance/TransactionPerformanceTest.java @@ -19,24 +19,27 @@ package com.dianping.cat.consumer.performance; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; -import com.dianping.cat.analysis.MessageAnalyzer; +import com.dianping.cat.Constants; +import com.dianping.cat.config.AtomicMessageConfigManager; +import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.config.server.ServerFilterConfigManager; +import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; +import com.dianping.cat.consumer.MockReportManager; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; +import com.dianping.cat.consumer.transaction.TransactionDelegate; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; import com.dianping.cat.message.Message; import com.dianping.cat.message.internal.MockMessageBuilder; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; +import com.dianping.cat.report.ReportDelegate; -public class TransactionPerformanceTest extends ComponentTestCase { - - public void setUp() throws Exception { - super.setUp(); - } +public class TransactionPerformanceTest { @Test public void test() throws Exception { - TransactionAnalyzer analyzer = (TransactionAnalyzer) lookup(MessageAnalyzer.class, TransactionAnalyzer.ID); + TransactionAnalyzer analyzer = createAnalyzer(); MessageTree tree = buildMessage(); @@ -108,4 +111,55 @@ public MessageHolder define() { return tree; } + private TransactionAnalyzer createAnalyzer() { + TransactionAnalyzer analyzer = new TransactionAnalyzer(); + + analyzer.setAtomicMessageConfigManager(new MockAtomicMessageConfigManager()); + analyzer.setFilterConfigManager(new MockServerFilterConfigManager()); + analyzer.setReportManager(new MockTransactionReportManager()); + analyzer.setServerConfigManager(new ServerConfigManager()); + analyzer.setStatisticManager(new MockTpValueStatisticConfigManager()); + return analyzer; + } + + private static class MockAtomicMessageConfigManager extends AtomicMessageConfigManager { + @Override + public int getMaxNameThreshold(String domain) { + return 200; + } + } + + private static class MockServerFilterConfigManager extends ServerFilterConfigManager { + @Override + public boolean discardTransaction(String type, String name) { + return false; + } + } + + private static class MockTpValueStatisticConfigManager extends TpValueStatisticConfigManager { + @Override + public boolean shouldStatistic(String type, String domain) { + return false; + } + } + + private static class MockTransactionReportManager extends MockReportManager { + private final ReportDelegate m_delegate = new TransactionDelegate(); + + private TransactionReport m_report; + + @Override + public TransactionReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { + if (m_report == null) { + m_report = m_delegate.makeReport(domain, startTime, Constants.HOUR); + } + + return m_report; + } + + @Override + public void destory() { + } + } + } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/Configurator.java deleted file mode 100644 index 01c5274bbb..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/Configurator.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer.problem; - -import java.util.ArrayList; -import java.util.List; - -import org.unidal.lookup.configuration.AbstractResourceConfigurator; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.Constants; -import com.dianping.cat.consumer.MockReportManager; -import com.dianping.cat.consumer.problem.model.entity.ProblemReport; -import com.dianping.cat.report.ReportDelegate; -import com.dianping.cat.report.ReportManager; - -public class Configurator extends AbstractResourceConfigurator { - - public static void main(String[] args) { - generatePlexusComponentsXmlFile(new Configurator()); - } - - protected Class getTestClass() { - return ProblemAnalyzerTest.class; - } - - @Override - public List defineComponents() { - List all = new ArrayList(); - final String ID = ProblemAnalyzer.ID; - - all.add(C(ReportManager.class, ID, MockProblemReportManager.class)// - .req(ReportDelegate.class, ID)); - all.add(C(ReportDelegate.class, ID, ExtendedProblemDelegate.class)); - - return all; - } - - public static class ExtendedProblemDelegate extends ProblemDelegate { - } - - public static class MockProblemReportManager extends MockReportManager { - private ProblemReport m_report; - - private ReportDelegate m_delegate; - - @Override - public ProblemReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { - if (m_report == null) { - m_report = (ProblemReport) m_delegate.makeReport(domain, startTime, Constants.HOUR); - } - - return m_report; - } - - public void setReport(ProblemReport report) { - m_report = report; - } - - @Override - public void destory() { - } - } -} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.java index 5fbab9c8cc..b33f31259f 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.java @@ -23,10 +23,9 @@ import org.junit.Before; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; -import com.dianping.cat.analysis.MessageAnalyzer; +import com.dianping.cat.consumer.MockReportManager; import com.dianping.cat.consumer.TestHelper; import com.dianping.cat.consumer.problem.model.entity.ProblemReport; import com.dianping.cat.message.Event; @@ -37,10 +36,11 @@ import com.dianping.cat.message.internal.DefaultTransaction; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; +import com.dianping.cat.report.ReportDelegate; import org.junit.Assert; -public class ProblemAnalyzerTest extends ComponentTestCase { +public class ProblemAnalyzerTest { private long m_timestamp; @@ -50,10 +50,8 @@ public class ProblemAnalyzerTest extends ComponentTestCase { @Before public void setUp() throws Exception { - super.setUp(); - m_timestamp = 1385470800000L; - m_analyzer = (ProblemAnalyzer) lookup(MessageAnalyzer.class, ProblemAnalyzer.ID); + m_analyzer = createAnalyzer(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm"); Date date = sdf.parse("20120101 00:00"); @@ -144,4 +142,30 @@ protected MessageTree generateMessageTree(int i) { return tree; } + private ProblemAnalyzer createAnalyzer() { + ProblemAnalyzer analyzer = new ProblemAnalyzer(); + + analyzer.setReportManager(new MockProblemReportManager()); + return analyzer; + } + + private static class MockProblemReportManager extends MockReportManager { + private final ReportDelegate m_delegate = new ProblemDelegate(); + + private ProblemReport m_report; + + @Override + public ProblemReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { + if (m_report == null) { + m_report = m_delegate.makeReport(domain, startTime, Constants.HOUR); + } + + return m_report; + } + + @Override + public void destory() { + } + } + } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/state/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/state/Configurator.java deleted file mode 100644 index d32d3d4838..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/state/Configurator.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer.state; - -import java.util.ArrayList; -import java.util.List; - -import org.unidal.lookup.configuration.AbstractResourceConfigurator; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.Constants; -import com.dianping.cat.analysis.MessageAnalyzer; -import com.dianping.cat.config.server.ServerConfigManager; -import com.dianping.cat.consumer.MockReportManager; -import com.dianping.cat.consumer.state.model.entity.StateReport; -import com.dianping.cat.report.ReportDelegate; -import com.dianping.cat.report.ReportManager; -import com.dianping.cat.statistic.ServerStatisticManager; - -public class Configurator extends AbstractResourceConfigurator { - - public static void main(String[] args) { - generatePlexusComponentsXmlFile(new Configurator()); - } - - protected Class getTestClass() { - return StateAnalyzerTest.class; - } - - @Override - public List defineComponents() { - List all = new ArrayList(); - final String ID = StateAnalyzer.ID; - - all.add(C(ReportManager.class, ID, MockStateReportManager.class)// - .req(ReportDelegate.class, ID)); - all.add(C(ReportDelegate.class, ID, ExtendedStateDelegate.class)); - all.add(C(MessageAnalyzer.class, ID, StateAnalyzer.class).req(ReportManager.class, ID) - .req(ServerConfigManager.class, ServerStatisticManager.class).config(E("m_ip").value("192.168.1.1"))); - - return all; - } - - public static class ExtendedStateDelegate extends StateDelegate { - } - - public static class MockStateReportManager extends MockReportManager { - private StateReport m_report; - - private ReportDelegate m_delegate; - - @Override - public StateReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { - if (m_report == null) { - m_report = (StateReport) m_delegate.makeReport(domain, startTime, Constants.HOUR); - } - - return m_report; - } - - @Override - public void destory() { - } - } - -} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/state/StateAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/state/StateAnalyzerTest.java index f861f43b8e..5ae5e61c2f 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/state/StateAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/state/StateAnalyzerTest.java @@ -25,13 +25,17 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; -import com.dianping.cat.analysis.MessageAnalyzer; +import com.dianping.cat.config.server.ServerFilterConfigManager; +import com.dianping.cat.consumer.MockReportManager; import com.dianping.cat.consumer.state.model.entity.StateReport; +import com.dianping.cat.core.dal.Project; +import com.dianping.cat.report.ReportDelegate; +import com.dianping.cat.service.ProjectService; +import com.dianping.cat.statistic.ServerStatisticManager; -public class StateAnalyzerTest extends ComponentTestCase { +public class StateAnalyzerTest { private StateAnalyzer m_analyzer; @@ -39,14 +43,12 @@ public class StateAnalyzerTest extends ComponentTestCase { @Before public void setUp() throws Exception { - super.setUp(); TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss:SS"); Date date = sdf.parse("20120101 00:00:00:00"); - m_analyzer = (StateAnalyzer) lookup(MessageAnalyzer.class, StateAnalyzer.ID); - + m_analyzer = createAnalyzer(); m_analyzer.initialize(date.getTime(), Constants.HOUR, Constants.MINUTE * 5); } @@ -58,4 +60,55 @@ public void testProcess() throws Exception { Assert.assertEquals(expected.replaceAll("\r", ""), report.toString().replaceAll("\r", "")); } + + private StateAnalyzer createAnalyzer() { + StateAnalyzer analyzer = new StateAnalyzer(); + + analyzer.setMIp("192.168.1.1"); + analyzer.setProjectService(new MockProjectService()); + analyzer.setReportManager(new MockStateReportManager()); + analyzer.setServerFilterConfigManager(new MockServerFilterConfigManager()); + analyzer.setServerStateManager(new ServerStatisticManager()); + return analyzer; + } + + private static class MockProjectService extends ProjectService { + + @Override + public Project findProject(String domain) { + return null; + } + + @Override + public boolean insert(String domain) { + return true; + } + } + + private static class MockServerFilterConfigManager extends ServerFilterConfigManager { + + @Override + public boolean validateDomain(String domain) { + return true; + } + } + + private static class MockStateReportManager extends MockReportManager { + private final ReportDelegate m_delegate = new StateDelegate(); + + private StateReport m_report; + + @Override + public StateReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { + if (m_report == null) { + m_report = m_delegate.makeReport(domain, startTime, Constants.HOUR); + } + + return m_report; + } + + @Override + public void destory() { + } + } } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/storage/DatabaseParserTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/storage/DatabaseParserTest.java index 2e3b3bda39..1a49e1ce7b 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/storage/DatabaseParserTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/storage/DatabaseParserTest.java @@ -20,16 +20,15 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.consumer.DatabaseParser; import com.dianping.cat.consumer.DatabaseParser.Database; -public class DatabaseParserTest extends ComponentTestCase { +public class DatabaseParserTest { @Test public void testOracle() { - DatabaseParser parser = lookup(DatabaseParser.class); + DatabaseParser parser = new DatabaseParser(); Database database = parser.parseDatabase("jdbc:oracle:thin:@ 172.20.70.36:1521:gbst"); Assert.assertEquals("172.20.70.36", database.getIp()); @@ -38,7 +37,7 @@ public void testOracle() { @Test public void testMysql() { - DatabaseParser parser = lookup(DatabaseParser.class); + DatabaseParser parser = new DatabaseParser(); Database database = parser.parseDatabase("jdbc:mysql://localhost:3306/mydb"); Assert.assertEquals("localhost", database.getIp()); diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/top/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/top/Configurator.java deleted file mode 100644 index 30205aef92..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/top/Configurator.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer.top; - -import java.util.ArrayList; -import java.util.List; - -import org.unidal.lookup.configuration.AbstractResourceConfigurator; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.Constants; -import com.dianping.cat.consumer.MockReportManager; -import com.dianping.cat.consumer.top.model.entity.TopReport; -import com.dianping.cat.report.ReportDelegate; -import com.dianping.cat.report.ReportManager; - -public class Configurator extends AbstractResourceConfigurator { - - public static void main(String[] args) { - generatePlexusComponentsXmlFile(new Configurator()); - } - - protected Class getTestClass() { - return TopAnalyzerTest.class; - } - - @Override - public List defineComponents() { - List all = new ArrayList(); - final String ID = TopAnalyzer.ID; - - all.add(C(ReportManager.class, ID, MockTopReportManager.class)// - .req(ReportDelegate.class, ID).is(PER_LOOKUP)); - all.add(C(ReportDelegate.class, ID, ExtendedTopDelegate.class)); - - return all; - } - - public static class ExtendedTopDelegate extends TopDelegate { - } - - public static class MockTopReportManager extends MockReportManager { - private TopReport m_report; - - private ReportDelegate m_delegate; - - @Override - public TopReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { - if (m_report == null) { - m_report = (TopReport) m_delegate.makeReport(domain, startTime, Constants.HOUR); - } - - return m_report; - } - - @Override - public void destory() { - } - } -} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/top/TopAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/top/TopAnalyzerTest.java index 5b8636b891..568733452a 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/top/TopAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/top/TopAnalyzerTest.java @@ -24,10 +24,9 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; -import com.dianping.cat.analysis.MessageAnalyzer; +import com.dianping.cat.consumer.MockReportManager; import com.dianping.cat.consumer.top.model.entity.TopReport; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.message.Event; @@ -38,8 +37,9 @@ import com.dianping.cat.message.internal.DefaultTransaction; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; +import com.dianping.cat.report.ReportDelegate; -public class TopAnalyzerTest extends ComponentTestCase { +public class TopAnalyzerTest { private long m_timestamp; @@ -49,10 +49,8 @@ public class TopAnalyzerTest extends ComponentTestCase { @Before public void setUp() throws Exception { - super.setUp(); - m_timestamp = 1385470800000L; - m_analyzer = (TopAnalyzer) lookup(MessageAnalyzer.class, TopAnalyzer.ID); + m_analyzer = createAnalyzer(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm"); Date date = sdf.parse("20120101 00:00"); @@ -114,4 +112,30 @@ protected MessageTree generateMessageTree(int i) { return tree; } + private TopAnalyzer createAnalyzer() { + TopAnalyzer analyzer = new TopAnalyzer(); + + analyzer.setReportManager(new MockTopReportManager()); + return analyzer; + } + + private static class MockTopReportManager extends MockReportManager { + private final ReportDelegate m_delegate = new TopDelegate(); + + private TopReport m_report; + + @Override + public TopReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { + if (m_report == null) { + m_report = m_delegate.makeReport(domain, startTime, Constants.HOUR); + } + + return m_report; + } + + @Override + public void destory() { + } + } + } diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/Configurator.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/Configurator.java deleted file mode 100644 index 8c8b45f9c9..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/Configurator.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer.transaction; - -import java.util.ArrayList; -import java.util.List; - -import org.unidal.lookup.configuration.AbstractResourceConfigurator; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.Constants; -import com.dianping.cat.consumer.MockReportManager; -import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; -import com.dianping.cat.report.ReportDelegate; -import com.dianping.cat.report.ReportManager; - -public class Configurator extends AbstractResourceConfigurator { - - public static void main(String[] args) { - generatePlexusComponentsXmlFile(new Configurator()); - } - - protected Class getTestClass() { - return TransactionAnalyzerTest.class; - } - - @Override - public List defineComponents() { - List all = new ArrayList(); - final String ID = TransactionAnalyzer.ID; - - all.add(C(ReportManager.class, ID, MockTransactionReportManager.class)// - .req(ReportDelegate.class, ID)); - all.add(C(ReportDelegate.class, ID, ExtendedTransactionDelegate.class)); - - return all; - } - - public static class ExtendedTransactionDelegate extends TransactionDelegate { - } - - public static class MockTransactionReportManager extends MockReportManager { - private TransactionReport m_report; - - private ReportDelegate m_delegate; - - @Override - public TransactionReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { - if (m_report == null) { - m_report = (TransactionReport) m_delegate.makeReport(domain, startTime, Constants.HOUR); - } - - return m_report; - } - - public void setReport(TransactionReport report) { - m_report = report; - } - - @Override - public void destory() { - } - } -} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.java index 8e01ab008a..3b472126b3 100644 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.java +++ b/cat-consumer/src/test/java/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.java @@ -24,18 +24,22 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; -import com.dianping.cat.analysis.MessageAnalyzer; +import com.dianping.cat.config.AtomicMessageConfigManager; +import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.config.server.ServerFilterConfigManager; +import com.dianping.cat.config.transaction.TpValueStatisticConfigManager; +import com.dianping.cat.consumer.MockReportManager; import com.dianping.cat.consumer.TestHelper; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; import com.dianping.cat.message.Message; import com.dianping.cat.message.internal.DefaultTransaction; import com.dianping.cat.message.spi.DefaultMessageTree; import com.dianping.cat.message.spi.MessageTree; +import com.dianping.cat.report.ReportDelegate; -public class TransactionAnalyzerTest extends ComponentTestCase { +public class TransactionAnalyzerTest { private long m_timestamp; private TransactionAnalyzer m_analyzer; @@ -58,10 +62,8 @@ public static void main(String[] args) { @Before public void setUp() throws Exception { - super.setUp(); - m_timestamp = System.currentTimeMillis() - System.currentTimeMillis() % (3600 * 1000); - m_analyzer = (TransactionAnalyzer) lookup(MessageAnalyzer.class, TransactionAnalyzer.ID); + m_analyzer = createAnalyzer(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm"); Date date = sdf.parse("20120101 00:00"); @@ -120,4 +122,76 @@ protected MessageTree generateMessageTree(int i) { return tree; } + + private TransactionAnalyzer createAnalyzer() { + TransactionAnalyzer analyzer = new TransactionAnalyzer(); + + analyzer.setAtomicMessageConfigManager(new MockAtomicMessageConfigManager()); + analyzer.setFilterConfigManager(new MockServerFilterConfigManager()); + analyzer.setReportManager(new MockTransactionReportManager()); + analyzer.setServerConfigManager(new MockServerConfigManager()); + analyzer.setStatisticManager(new MockTpValueStatisticConfigManager()); + return analyzer; + } + + private static class MockAtomicMessageConfigManager extends AtomicMessageConfigManager { + + @Override + public int getMaxNameThreshold(String domain) { + return 200; + } + } + + private static class MockServerConfigManager extends ServerConfigManager { + + @Override + public int getMaxTypeThreshold() { + return 100; + } + + @Override + public int getTpValueExpireMinute() { + return 1; + } + + @Override + public int getTypeNameLengthLimit() { + return 256; + } + } + + private static class MockServerFilterConfigManager extends ServerFilterConfigManager { + + @Override + public boolean discardTransaction(String type, String name) { + return false; + } + } + + private static class MockTpValueStatisticConfigManager extends TpValueStatisticConfigManager { + + @Override + public boolean shouldStatistic(String type, String domain) { + return false; + } + } + + private static class MockTransactionReportManager extends MockReportManager { + private final ReportDelegate m_delegate = new TransactionDelegate(); + + private TransactionReport m_report; + + @Override + public TransactionReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) { + if (m_report == null) { + m_report = m_delegate.makeReport(domain, startTime, Constants.HOUR); + } + + return m_report; + } + + @Override + public void destory() { + } + } } diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/cross/CrossAnalyzerTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/cross/CrossAnalyzerTest.xml deleted file mode 100644 index f1d9d7214b..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/cross/CrossAnalyzerTest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - cross - com.dianping.cat.consumer.cross.Configurator$MockCrossReportManager - - - com.dianping.cat.report.ReportDelegate - cross - - - - - com.dianping.cat.report.ReportDelegate - cross - com.dianping.cat.consumer.cross.Configurator$ExtendedCrossDelegate - - - diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/event/EventAnalyzerTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/event/EventAnalyzerTest.xml deleted file mode 100644 index 5f10bc3355..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/event/EventAnalyzerTest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - event - com.dianping.cat.consumer.event.Configurator$MockEventReportManager - - - com.dianping.cat.report.ReportDelegate - event - - - - - com.dianping.cat.report.ReportDelegate - event - com.dianping.cat.consumer.event.Configurator$ExtendedEventDelegate - - - diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.xml deleted file mode 100644 index a99685df17..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzerTest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - heartbeat - com.dianping.cat.consumer.heartbeat.Configurator$MockHeartbeatReportManager - - - com.dianping.cat.report.ReportDelegate - heartbeat - - - - - com.dianping.cat.report.ReportDelegate - heartbeat - com.dianping.cat.consumer.heartbeat.Configurator$ExtendedHeartbeatDelegate - - - diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.xml deleted file mode 100644 index 3a51c41900..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/matrix/MatrixAnalyzerTest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - matrix - com.dianping.cat.consumer.matrix.Configurator$MockMatrixReportManager - - - com.dianping.cat.report.ReportDelegate - matrix - - - - - com.dianping.cat.report.ReportDelegate - matrix - com.dianping.cat.consumer.matrix.Configurator$ExtendedMatrixDelegate - - - diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/CrossPerformanceTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/CrossPerformanceTest.xml deleted file mode 100644 index b77761c565..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/CrossPerformanceTest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - cross - com.dianping.cat.consumer.performance.CrossConfigurator$MockCrossReportManager - - - com.dianping.cat.report.ReportDelegate - cross - - - - - com.dianping.cat.report.ReportDelegate - cross - com.dianping.cat.consumer.performance.CrossConfigurator$ExtendedCrossDelegate - - - diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/EventPerformanceTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/EventPerformanceTest.xml deleted file mode 100644 index 67f4973459..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/EventPerformanceTest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - event - com.dianping.cat.consumer.performance.EventConfigurator$MockEventReportManager - - - com.dianping.cat.report.ReportDelegate - event - - - - - com.dianping.cat.report.ReportDelegate - event - com.dianping.cat.consumer.performance.EventConfigurator$ExtendedEventDelegate - - - diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/MatrixPerformanceTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/MatrixPerformanceTest.xml deleted file mode 100644 index a8786e2a5f..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/MatrixPerformanceTest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - matrix - com.dianping.cat.consumer.performance.MatrixConfigurator$MockMatrixReportManager - - - com.dianping.cat.report.ReportDelegate - matrix - - - - - com.dianping.cat.report.ReportDelegate - matrix - com.dianping.cat.consumer.performance.MatrixConfigurator$ExtendedMatrixDelegate - - - diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/ProblemPerformanceTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/ProblemPerformanceTest.xml deleted file mode 100644 index c2c61b85ab..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/ProblemPerformanceTest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - problem - com.dianping.cat.consumer.performance.ProblemConfigurator$MockProblemReportManager - - - com.dianping.cat.report.ReportDelegate - problem - - - - - com.dianping.cat.report.ReportDelegate - problem - com.dianping.cat.consumer.performance.ProblemConfigurator$ExtendedProblemDelegate - - - diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/TransactionPerformanceTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/TransactionPerformanceTest.xml deleted file mode 100644 index 72419f9356..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/TransactionPerformanceTest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - transaction - com.dianping.cat.consumer.performance.TransactionConfigurator$MockTransactionReportManager - - - com.dianping.cat.report.ReportDelegate - transaction - - - - - com.dianping.cat.report.ReportDelegate - transaction - com.dianping.cat.consumer.performance.TransactionConfigurator$ExtendedTransactionDelegate - - - diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.xml deleted file mode 100644 index 360d0f09eb..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/problem/ProblemAnalyzerTest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - problem - com.dianping.cat.consumer.problem.Configurator$MockProblemReportManager - - - com.dianping.cat.report.ReportDelegate - problem - - - - - com.dianping.cat.report.ReportDelegate - problem - com.dianping.cat.consumer.problem.Configurator$ExtendedProblemDelegate - - - diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/state/StateAnalyzerTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/state/StateAnalyzerTest.xml deleted file mode 100644 index 092eb17448..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/state/StateAnalyzerTest.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - state - com.dianping.cat.consumer.state.Configurator$MockStateReportManager - - - com.dianping.cat.report.ReportDelegate - state - - - - - com.dianping.cat.report.ReportDelegate - state - com.dianping.cat.consumer.state.Configurator$ExtendedStateDelegate - - - com.dianping.cat.analysis.MessageAnalyzer - state - com.dianping.cat.consumer.state.StateAnalyzer - - 192.168.1.1 - - - - com.dianping.cat.report.ReportManager - state - - - com.dianping.cat.config.server.ServerConfigManager - - - com.dianping.cat.statistic.ServerStatisticManager - - - - - diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/top/TopAnalyzerTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/top/TopAnalyzerTest.xml deleted file mode 100644 index 3ea279d962..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/top/TopAnalyzerTest.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - top - com.dianping.cat.consumer.top.Configurator$MockTopReportManager - per-lookup - - - com.dianping.cat.report.ReportDelegate - top - - - - - com.dianping.cat.report.ReportDelegate - top - com.dianping.cat.consumer.top.Configurator$ExtendedTopDelegate - - - diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.xml deleted file mode 100644 index 1886061696..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/transaction/TransactionAnalyzerTest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - transaction - com.dianping.cat.consumer.transaction.Configurator$MockTransactionReportManager - - - com.dianping.cat.report.ReportDelegate - transaction - - - - - com.dianping.cat.report.ReportDelegate - transaction - com.dianping.cat.consumer.transaction.Configurator$ExtendedTransactionDelegate - - - From fb559416c1efe53388b1308b86268940b3851633 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 12:47:16 +0800 Subject: [PATCH 136/231] =?UTF-8?q?=E6=B8=85=E7=90=86=20hadoop=20=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E4=BE=A7=20Plexus=20=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../consumer/RealtimeConfigConfiguration.java | 68 --------- .../business/BusinessAnalyzerTest.java | 136 ------------------ .../consumer/business/business_analyzer.xml | 91 ------------ .../dependency/DependencyAnalyzerTest.xml | 24 ---- .../performance/DependencyPerformanceTest.xml | 20 --- .../dianping/cat/service/IpServiceTest.java | 7 +- .../cat/storage/BucketConcurrentTest.java | 66 ++++++--- .../cat/storage/StringBucketTestCase.java | 11 +- .../storage/report/LocalReportBucketTest.java | 7 +- .../DefaultMessageAnalyzerManagerTest.xml | 22 --- .../message/codec/HtmlMessageCodecTest.xml | 14 -- .../cat/message/storage/IndexManagerTest.java | 5 +- .../unidal/cat/message/storage/IndexTest.java | 14 +- .../storage/LocalStorageTestSupport.java | 86 +++++++++++ .../cat/message/storage/TokenMappingTest.java | 22 +-- .../hdfs/MessageConsumerIpFindTest.java | 16 ++- .../cat/hadoop/sql/SqlJobDataProduceTest.xml | 8 -- 17 files changed, 168 insertions(+), 449 deletions(-) delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/RealtimeConfigConfiguration.java delete mode 100644 cat-consumer/src/test/java/com/dianping/cat/consumer/business/BusinessAnalyzerTest.java delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/business/business_analyzer.xml delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/dependency/DependencyAnalyzerTest.xml delete mode 100644 cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/DependencyPerformanceTest.xml delete mode 100644 cat-core/src/test/resources/com/dianping/cat/analysis/DefaultMessageAnalyzerManagerTest.xml delete mode 100644 cat-core/src/test/resources/com/dianping/cat/message/codec/HtmlMessageCodecTest.xml create mode 100644 cat-hadoop/src/test/java/org/unidal/cat/message/storage/LocalStorageTestSupport.java delete mode 100644 cat-hadoop/src/test/resources/com/dianping/cat/hadoop/sql/SqlJobDataProduceTest.xml diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/RealtimeConfigConfiguration.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/RealtimeConfigConfiguration.java deleted file mode 100644 index ff90826aea..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/RealtimeConfigConfiguration.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer; - -import java.util.ArrayList; -import java.util.List; - -import org.unidal.lookup.configuration.AbstractResourceConfigurator; -import org.unidal.lookup.configuration.Component; - -import com.dianping.cat.analysis.MessageAnalyzer; -import com.dianping.cat.analysis.MessageAnalyzerManager; -import com.dianping.cat.consumer.event.EventAnalyzer; -import com.dianping.cat.consumer.top.TopAnalyzer; -import com.dianping.cat.consumer.transaction.TransactionAnalyzer; -import com.dianping.cat.consumer.transaction.TransactionAnalyzerTest; - -public class RealtimeConfigConfiguration extends AbstractResourceConfigurator { - - public static void main(String[] args) { - generatePlexusComponentsXmlFile(new RealtimeConfigConfiguration()); - } - - protected Class getTestClass() { - return TransactionAnalyzerTest.class; - } - - @Override - public List defineComponents() { - List all = new ArrayList(); - - return all; - } - - public static class MockMessageAnalyzerManager implements MessageAnalyzerManager { - - @Override - public List getAnalyzerNames() { - List list = new ArrayList(); - - list.add(TransactionAnalyzer.ID); - list.add(EventAnalyzer.ID); - list.add(TopAnalyzer.ID); - return list; - } - - @Override - public List getAnalyzer(String name, long startTime) { - return null; - } - } -} diff --git a/cat-consumer/src/test/java/com/dianping/cat/consumer/business/BusinessAnalyzerTest.java b/cat-consumer/src/test/java/com/dianping/cat/consumer/business/BusinessAnalyzerTest.java deleted file mode 100644 index cf618d002a..0000000000 --- a/cat-consumer/src/test/java/com/dianping/cat/consumer/business/BusinessAnalyzerTest.java +++ /dev/null @@ -1,136 +0,0 @@ -///* -// * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. -// * -// * Licensed to the Apache Software Foundation (ASF) under one or more -// * contributor license agreements. See the NOTICE file distributed with -// * this work for additional information regarding copyright ownership. -// * The ASF licenses this file to You under the Apache License, Version 2.0 -// * (the "License"); you may not use this file except in compliance with -// * the License. You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package com.dianping.cat.consumer.business; -// -//import java.text.SimpleDateFormat; -//import java.util.Date; -// -//import org.junit.Assert; -//import org.junit.Before; -//import org.junit.Test; -//import org.unidal.lookup.ComponentTestCase; -// -//import com.dianping.cat.Constants; -//import com.dianping.cat.analysis.MessageAnalyzer; -//import com.dianping.cat.consumer.business.model.entity.BusinessReport; -//import com.dianping.cat.message.internal.DefaultEvent; -//import com.dianping.cat.message.internal.DefaultMetric; -//import com.dianping.cat.message.internal.DefaultTransaction; -//import com.dianping.cat.message.spi.MessageTree; -//import com.dianping.cat.message.spi.internal.DefaultMessageTree; -// -//public class BusinessAnalyzerTest extends ComponentTestCase { -// -// private final int MINITE = 60 * 1000; -// -// private long m_timestamp; -// -// private String m_domain = "group"; -// -// private BusinessAnalyzer m_analyzer; -// -// @Before -// public void setUp() throws Exception { -// super.setUp(); -// -// m_timestamp = System.currentTimeMillis() - System.currentTimeMillis() % (3600 * 1000); -// m_analyzer = (BusinessAnalyzer) lookup(MessageAnalyzer.class, BusinessAnalyzer.ID); -// SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm"); -// Date date = sdf.parse("20160308 00:00"); -// -// m_analyzer.initialize(date.getTime(), Constants.HOUR, Constants.MINUTE * 5); -// } -// -// @Test -// public void testProcess() throws Exception { -// for (int i = 1; i <= 60; i++) { -// MessageTree tree = ((DefaultMessageTree) generateMessageTree(i)).copyForTest(); -// -// m_analyzer.process(tree); -// } -// -// BusinessReport report = m_analyzer.getReport(m_domain); -// String expected = new String(getClass().getResourceAsStream("business_analyzer.xml").readAllBytes(), java.nio.charset.StandardCharsets.UTF_8); -// -// Assert.assertEquals(expected.replaceAll("\r", ""), report.toString().replaceAll("\r", "")); -// } -// -// protected MessageTree generateMessageTree(int i) { -// MessageTree tree = new DefaultMessageTree(); -// -// tree.setMessageId("" + i); -// tree.setDomain(m_domain); -// tree.setHostName("group001"); -// tree.setIpAddress("192.168.1.1"); -// -// DefaultTransaction t; -// -// if (i % 3 == 0) { -// t = new DefaultTransaction("URL", "TuanGouWeb", null); -// t.setTimestamp(m_timestamp + i * MINITE); -// DefaultEvent event = new DefaultEvent("URL", "ABTest"); -// -// DefaultMetric metric = new DefaultMetric("City", "/beijing"); -// -// metric.setTimestamp(m_timestamp + i * MINITE); -// metric.setStatus("S"); -// metric.addData("10"); -// -// t.addChild(metric); -// t.addChild(event); -// } else if (i % 3 == 1) { -// t = new DefaultTransaction("Service", "TuanGouWeb", null); -// t.setTimestamp(m_timestamp + i * MINITE); -// DefaultEvent event = new DefaultEvent("URL", "ABTest"); -// -// DefaultMetric metric = new DefaultMetric("", "/nanjing"); -// -// metric.setTimestamp(m_timestamp + i * MINITE); -// metric.setStatus("S,C"); -// metric.addData("10,10"); -// -// t.addChild(metric); -// t.addChild(event); -// } else { -// t = new DefaultTransaction("Metric", "TuanGouWeb", null); -// t.setTimestamp(m_timestamp + 1000); -// DefaultMetric metric = new DefaultMetric("", "/shanghai"); -// -// metric.setTimestamp(m_timestamp + i * MINITE); -// metric.setStatus("C"); -// metric.addData("10"); -// -// t.addChild(metric); -// -// DefaultMetric durationMetric = new DefaultMetric("", "/shenzhen"); -// -// durationMetric.setTimestamp(m_timestamp + i * MINITE); -// durationMetric.setStatus("T"); -// durationMetric.addData("10"); -// -// t.addChild(durationMetric); -// } -// -// t.complete(); -// t.setDurationInMillis(i * 2); -// tree.setMessage(t); -// -// return tree; -// } -//} diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/business/business_analyzer.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/business/business_analyzer.xml deleted file mode 100644 index 4e29fa356a..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/business/business_analyzer.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/dependency/DependencyAnalyzerTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/dependency/DependencyAnalyzerTest.xml deleted file mode 100644 index cddbd45c0d..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/dependency/DependencyAnalyzerTest.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - dependency - com.dianping.cat.consumer.dependency.Configurator$MockDependencyReportManager - - - com.dianping.cat.report.ReportDelegate - dependency - - - - - com.dianping.cat.report.ReportDelegate - dependency - com.dianping.cat.consumer.dependency.Configurator$ExtendedDependencyDelegate - - - com.dianping.cat.dal.HostinfoService - com.dianping.cat.consumer.dependency.Configurator$ExtendedHostinfoService - - - diff --git a/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/DependencyPerformanceTest.xml b/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/DependencyPerformanceTest.xml deleted file mode 100644 index 4d26979c93..0000000000 --- a/cat-consumer/src/test/resources/com/dianping/cat/consumer/performance/DependencyPerformanceTest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - com.dianping.cat.report.ReportManager - dependency - com.dianping.cat.consumer.performance.DependencyConfigurator$MockDependencyReportManager - - - com.dianping.cat.report.ReportDelegate - dependency - - - - - com.dianping.cat.report.ReportDelegate - dependency - com.dianping.cat.consumer.performance.DependencyConfigurator$ExtendedDependencyDelegate - - - diff --git a/cat-core/src/test/java/com/dianping/cat/service/IpServiceTest.java b/cat-core/src/test/java/com/dianping/cat/service/IpServiceTest.java index 46b25693ac..1c6c5530ed 100644 --- a/cat-core/src/test/java/com/dianping/cat/service/IpServiceTest.java +++ b/cat-core/src/test/java/com/dianping/cat/service/IpServiceTest.java @@ -23,11 +23,10 @@ import org.junit.Test; import com.dianping.cat.support.Threads; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.service.IpService.IpInfo; -public class IpServiceTest extends ComponentTestCase { +public class IpServiceTest { IpService2 service; List result = new ArrayList(); @@ -39,7 +38,7 @@ public void getSystemTime() throws Exception { @Test public void test() throws Exception { - IpService service = (IpService) lookup(IpService.class); + IpService service = new IpService(); for (int i = 0; i < 10000; i++) { String ip = i % 255 + "." + i % 255 + "." + i % 255 + "." + i % 255; @@ -55,7 +54,7 @@ public void test() throws Exception { @Test public void test2() throws InterruptedException { - service = (IpService2) lookup(IpService2.class); + service = new IpService2(); int count = 1000; for (int j = 0; j < count; j++) { diff --git a/cat-core/src/test/java/com/dianping/cat/storage/BucketConcurrentTest.java b/cat-core/src/test/java/com/dianping/cat/storage/BucketConcurrentTest.java index 934018b177..a8a3f4e8db 100644 --- a/cat-core/src/test/java/com/dianping/cat/storage/BucketConcurrentTest.java +++ b/cat-core/src/test/java/com/dianping/cat/storage/BucketConcurrentTest.java @@ -26,18 +26,22 @@ import org.junit.Assert; import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; -import org.unidal.lookup.ComponentTestCase; - -import com.dianping.cat.report.ReportBucket; -import com.dianping.cat.report.ReportBucketManager; - -@RunWith(JUnit4.class) -@Ignore -public class BucketConcurrentTest extends ComponentTestCase { +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.message.DefaultPathBuilder; +import com.dianping.cat.report.DefaultReportBucketManager; +import com.dianping.cat.report.LocalReportBucket; +import com.dianping.cat.report.ReportBucket; +import com.dianping.cat.report.ReportBucketFactory; +import com.dianping.cat.report.ReportBucketManager; + +@RunWith(JUnit4.class) +@Ignore +public class BucketConcurrentTest { @BeforeClass public static void beforeClass() { new File("target/bucket/concurrent/bytes").delete(); @@ -45,11 +49,11 @@ public static void beforeClass() { new File("target/bucket/concurrent/data").delete(); } - @Test - public void testStringBucket() throws Exception { - long timestamp = System.currentTimeMillis(); - ReportBucketManager manager = lookup(ReportBucketManager.class); - final ReportBucket bucket = manager.getReportBucket(timestamp, "concurrent/data", 0); + @Test + public void testStringBucket() throws Exception { + long timestamp = System.currentTimeMillis(); + ReportBucketManager manager = createReportBucketManager(); + final ReportBucket bucket = manager.getReportBucket(timestamp, "concurrent/data", 0); ExecutorService pool = Executors.newFixedThreadPool(10); for (int p = 0; p < 10; p++) { @@ -111,6 +115,28 @@ public void run() { String t2 = bucket.findById(id); Assert.assertEquals("Unable to find data after stored it.", t1, t2); - } - } -} + } + } + + private ReportBucketManager createReportBucketManager() { + DefaultReportBucketManager manager = new DefaultReportBucketManager(); + + manager.setBucketFactory(new MockReportBucketFactory()); + manager.setConfigManager(new ServerConfigManager()); + manager.initialize(); + return manager; + } + + private static class MockReportBucketFactory implements ReportBucketFactory { + + @Override + public ReportBucket createReportBucket(String name, java.util.Date timestamp, int index) throws IOException { + LocalReportBucket bucket = new LocalReportBucket(); + + bucket.setConfigManager(new ServerConfigManager()); + bucket.setPathBuilder(new DefaultPathBuilder()); + bucket.initialize(name, timestamp, index); + return bucket; + } + } +} diff --git a/cat-core/src/test/java/com/dianping/cat/storage/StringBucketTestCase.java b/cat-core/src/test/java/com/dianping/cat/storage/StringBucketTestCase.java index edd690e60f..d96a9cd8a7 100644 --- a/cat-core/src/test/java/com/dianping/cat/storage/StringBucketTestCase.java +++ b/cat-core/src/test/java/com/dianping/cat/storage/StringBucketTestCase.java @@ -28,11 +28,10 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.report.ReportBucket; -public abstract class StringBucketTestCase extends ComponentTestCase { +public abstract class StringBucketTestCase { protected final static int threadNum = 200;// notice: max 9, for creating asc order id bellow @@ -76,13 +75,7 @@ protected CountDownLatch createLatch() { } @Before - @Override public void setUp() throws IOException { - try { - super.setUp(); - } catch (Exception e1) { - e1.printStackTrace(); - } try { pool = Executors.newFixedThreadPool(threadNum); bucket = createBucket(); @@ -94,9 +87,7 @@ public void setUp() throws IOException { protected abstract ReportBucket createBucket() throws Exception; @After - @Override public void tearDown() throws Exception { - super.tearDown(); bucket.close(); } diff --git a/cat-core/src/test/java/com/dianping/cat/storage/report/LocalReportBucketTest.java b/cat-core/src/test/java/com/dianping/cat/storage/report/LocalReportBucketTest.java index adc8a9c9b5..cefbdb2ed3 100644 --- a/cat-core/src/test/java/com/dianping/cat/storage/report/LocalReportBucketTest.java +++ b/cat-core/src/test/java/com/dianping/cat/storage/report/LocalReportBucketTest.java @@ -24,6 +24,8 @@ import org.junit.After; +import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.message.DefaultPathBuilder; import com.dianping.cat.report.LocalReportBucket; import com.dianping.cat.report.ReportBucket; import com.dianping.cat.storage.StringBucketTestCase; @@ -32,7 +34,10 @@ public class LocalReportBucketTest extends StringBucketTestCase { @Override protected ReportBucket createBucket() throws Exception, IOException { - ReportBucket bucket = lookup(ReportBucket.class, String.class.getName() + "-report"); + LocalReportBucket bucket = new LocalReportBucket(); + + bucket.setConfigManager(new ServerConfigManager()); + bucket.setPathBuilder(new DefaultPathBuilder()); bucket.initialize("cat", new Date(), 0); return bucket; } diff --git a/cat-core/src/test/resources/com/dianping/cat/analysis/DefaultMessageAnalyzerManagerTest.xml b/cat-core/src/test/resources/com/dianping/cat/analysis/DefaultMessageAnalyzerManagerTest.xml deleted file mode 100644 index 541a789112..0000000000 --- a/cat-core/src/test/resources/com/dianping/cat/analysis/DefaultMessageAnalyzerManagerTest.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - com.dianping.cat.analysis.MessageAnalyzer - mock1 - com.dianping.cat.analysis.Configurator$MockAnalyzer1 - per-lookup - - - com.dianping.cat.analysis.MessageAnalyzer - mock2 - com.dianping.cat.analysis.Configurator$MockAnalyzer2 - per-lookup - - - com.dianping.cat.analysis.MessageAnalyzer - state - com.dianping.cat.analysis.Configurator$MockAnalyzer3 - per-lookup - - - diff --git a/cat-core/src/test/resources/com/dianping/cat/message/codec/HtmlMessageCodecTest.xml b/cat-core/src/test/resources/com/dianping/cat/message/codec/HtmlMessageCodecTest.xml deleted file mode 100644 index ff489d85f2..0000000000 --- a/cat-core/src/test/resources/com/dianping/cat/message/codec/HtmlMessageCodecTest.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - com.dianping.cat.message.MessageProducer - com.dianping.cat.message.internal.DefaultMessageProducer - - - com.dianping.cat.message.io.MessageSender - in-memory - - - - - diff --git a/cat-hadoop/src/test/java/org/unidal/cat/message/storage/IndexManagerTest.java b/cat-hadoop/src/test/java/org/unidal/cat/message/storage/IndexManagerTest.java index 7518709838..bf4338ef80 100644 --- a/cat-hadoop/src/test/java/org/unidal/cat/message/storage/IndexManagerTest.java +++ b/cat-hadoop/src/test/java/org/unidal/cat/message/storage/IndexManagerTest.java @@ -22,15 +22,14 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.message.tree.MessageId; -public class IndexManagerTest extends ComponentTestCase { +public class IndexManagerTest { @Test public void test() throws IOException { - IndexManager manager = lookup(IndexManager.class, "local"); + IndexManager manager = new LocalStorageTestSupport(new java.io.File("target")).getIndexManager(); MessageId id = MessageId.parse("mock-0a260014-403890-12345"); String ip = NetworkInterfaceManager.INSTANCE.getLocalHostAddress(); diff --git a/cat-hadoop/src/test/java/org/unidal/cat/message/storage/IndexTest.java b/cat-hadoop/src/test/java/org/unidal/cat/message/storage/IndexTest.java index a1d5a2617a..877afb9834 100644 --- a/cat-hadoop/src/test/java/org/unidal/cat/message/storage/IndexTest.java +++ b/cat-hadoop/src/test/java/org/unidal/cat/message/storage/IndexTest.java @@ -27,22 +27,22 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.message.tree.MessageId; -public class IndexTest extends ComponentTestCase { +public class IndexTest { private String m_ip; + private LocalStorageTestSupport m_storage; + @Before public void before() throws Exception { - StorageConfiguration config = lookup(StorageConfiguration.class); - - config.setBaseDataDir(new File("target")); File baseDir = new File("target"); + deleteDirectory(new File(baseDir, "dump").toPath()); + m_storage = new LocalStorageTestSupport(baseDir); m_ip = NetworkInterfaceManager.INSTANCE.getLocalHostAddress(); } @@ -59,7 +59,7 @@ private void deleteDirectory(Path path) throws IOException { @Test public void testMapAndLookups() throws Exception { int total = 15000; - IndexManager manager = lookup(IndexManager.class, "local"); + IndexManager manager = m_storage.getIndexManager(); Index index = manager.getIndex("from", m_ip, 403899, true); for (int i = 1; i < total; i++) { @@ -81,7 +81,7 @@ public void testMapAndLookups() throws Exception { @Test public void testMapAndLookupManyIps() throws Exception { - IndexManager manager = lookup(IndexManager.class, "local"); + IndexManager manager = m_storage.getIndexManager(); Index index = manager.getIndex("from", m_ip, 403899, true); for (int i = 1; i < 150000; i++) { diff --git a/cat-hadoop/src/test/java/org/unidal/cat/message/storage/LocalStorageTestSupport.java b/cat-hadoop/src/test/java/org/unidal/cat/message/storage/LocalStorageTestSupport.java new file mode 100644 index 0000000000..2de62c3fd5 --- /dev/null +++ b/cat-hadoop/src/test/java/org/unidal/cat/message/storage/LocalStorageTestSupport.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.unidal.cat.message.storage; + +import java.io.File; +import java.io.IOException; + +import org.unidal.cat.message.storage.internals.DefaultByteBufCache; +import org.unidal.cat.message.storage.internals.DefaultStorageConfiguration; +import org.unidal.cat.message.storage.local.LocalFileBuilder; +import org.unidal.cat.message.storage.local.LocalIndex; +import org.unidal.cat.message.storage.local.LocalIndexManager; +import org.unidal.cat.message.storage.local.LocalTokenMapping; +import org.unidal.cat.message.storage.local.LocalTokenMappingManager; + +public class LocalStorageTestSupport { + private final DefaultByteBufCache m_byteBufCache; + + private final DefaultStorageConfiguration m_config; + + private final LocalIndexManager m_indexManager; + + private final LocalFileBuilder m_pathBuilder; + + private final LocalTokenMappingManager m_tokenMappingManager; + + public LocalStorageTestSupport(File baseDir) { + m_config = new DefaultStorageConfiguration(); + m_config.setBaseDataDir(baseDir); + + m_pathBuilder = new LocalFileBuilder(); + m_pathBuilder.setConfig(m_config); + + m_byteBufCache = new DefaultByteBufCache(); + m_byteBufCache.initialize(); + + m_tokenMappingManager = new LocalTokenMappingManager(); + m_tokenMappingManager.setTokenMappingFactory(this::createTokenMapping); + + m_indexManager = new LocalIndexManager(); + m_indexManager.setPathBuilder(m_pathBuilder); + m_indexManager.setIndexFactory(this::createIndex); + } + + private Index createIndex(String domain, String ip, int hour) throws IOException { + LocalIndex index = new LocalIndex(); + + index.setPathBuilder(m_pathBuilder); + index.setBufCache(m_byteBufCache); + index.setTokenMappingManager(m_tokenMappingManager); + index.initialize(domain, ip, hour); + return index; + } + + public TokenMapping createTokenMapping(int hour, String ip) throws IOException { + LocalTokenMapping mapping = new LocalTokenMapping(); + + mapping.setPathBuilder(m_pathBuilder); + mapping.open(hour, ip); + return mapping; + } + + public IndexManager getIndexManager() { + return m_indexManager; + } + + public TokenMappingManager getTokenMappingManager() { + return m_tokenMappingManager; + } +} diff --git a/cat-hadoop/src/test/java/org/unidal/cat/message/storage/TokenMappingTest.java b/cat-hadoop/src/test/java/org/unidal/cat/message/storage/TokenMappingTest.java index e9b2f29e45..8196718e80 100644 --- a/cat-hadoop/src/test/java/org/unidal/cat/message/storage/TokenMappingTest.java +++ b/cat-hadoop/src/test/java/org/unidal/cat/message/storage/TokenMappingTest.java @@ -28,21 +28,19 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; + import com.dianping.cat.support.Threads; import com.dianping.cat.support.Threads.Task; -import org.unidal.lookup.ComponentTestCase; -public class TokenMappingTest extends ComponentTestCase { +public class TokenMappingTest { + private LocalStorageTestSupport m_storage; @Before public void before() throws IOException { File baseDir = new File("target"); deleteDirectory(new File(baseDir, "dump").toPath()); - - StorageConfiguration config = lookup(StorageConfiguration.class); - - config.setBaseDataDir(baseDir); + m_storage = new LocalStorageTestSupport(baseDir); } private void deleteDirectory(Path path) throws IOException { @@ -57,11 +55,10 @@ private void deleteDirectory(Path path) throws IOException { @Test public void test() throws IOException { - TokenMapping mapping = lookup(TokenMapping.class, "local"); int hour = 405845; for (int times = 0; times < 3; times++) { - mapping.open(hour, "127.0.0.1"); + TokenMapping mapping = m_storage.createTokenMapping(hour, "127.0.0.1"); for (int i = 0; i < 64 * 1024; i++) { String expected = "token-mapping-" + i; @@ -78,15 +75,10 @@ public void test() throws IOException { @Test public void testMany() throws IOException { - StorageConfiguration config = lookup(StorageConfiguration.class); - - config.setBaseDataDir(new File("target")); - - TokenMapping mapping = lookup(TokenMapping.class, "local"); int hour = 405845; for (int times = 0; times < 3; times++) { - mapping.open(hour, "127.0.0.1"); + TokenMapping mapping = m_storage.createTokenMapping(hour, "127.0.0.1"); for (int i = 0; i < 64 * 1024 * 10; i++) { String expected = "token-mapping-" + i; @@ -133,7 +125,7 @@ public void run() { } try { - TokenMappingManager mappingManager = lookup(TokenMappingManager.class, "local"); + TokenMappingManager mappingManager = m_storage.getTokenMappingManager(); int hour = 405845; TokenMapping mapping = mappingManager.getTokenMapping(hour, "127.0.0.1"); diff --git a/cat-hadoop/src/test/java/org/unidal/cat/message/storage/hdfs/MessageConsumerIpFindTest.java b/cat-hadoop/src/test/java/org/unidal/cat/message/storage/hdfs/MessageConsumerIpFindTest.java index 334c02e2cd..da688bd7b7 100644 --- a/cat-hadoop/src/test/java/org/unidal/cat/message/storage/hdfs/MessageConsumerIpFindTest.java +++ b/cat-hadoop/src/test/java/org/unidal/cat/message/storage/hdfs/MessageConsumerIpFindTest.java @@ -23,27 +23,31 @@ import org.junit.Before; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.message.tree.MessageId; -public class MessageConsumerIpFindTest extends ComponentTestCase { +public class MessageConsumerIpFindTest { + private MessageConsumerFinder m_finder; @Before public void before() throws Exception { - ServerConfigManager config = lookup(ServerConfigManager.class); + ServerConfigManager config = new ServerConfigManager(); + HdfsSystemManager fileSystemManager = new HdfsSystemManager(); + HdfsMessageConsumerFinder finder = new HdfsMessageConsumerFinder(); config.initialize(new File(MessageConsumerIpFindTest.class.getClassLoader().getResource("server.xml").getFile())); + fileSystemManager.setConfigManager(config); + fileSystemManager.initialize(); + finder.setFileSystemManager(fileSystemManager); + m_finder = finder; } @Test public void test() { - MessageConsumerFinder find = lookup(MessageConsumerFinder.class, "hdfs"); MessageId id = MessageId.parse("shop-web-0a420d56-405915-16"); - Set ips = find.findConsumerIps(id.getDomain(), id.getHour()); + Set ips = m_finder.findConsumerIps(id.getDomain(), id.getHour()); System.err.println(ips); - } } diff --git a/cat-hadoop/src/test/resources/com/dianping/cat/hadoop/sql/SqlJobDataProduceTest.xml b/cat-hadoop/src/test/resources/com/dianping/cat/hadoop/sql/SqlJobDataProduceTest.xml deleted file mode 100644 index 8ccfc2a214..0000000000 --- a/cat-hadoop/src/test/resources/com/dianping/cat/hadoop/sql/SqlJobDataProduceTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - com.dianping.cat.message.io.TransportManager - com.dianping.cat.hadoop.sql.MockTransportManager - - - From 78f98aec840d99a27bc6ba9a3d0fab45e2b4895f Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 14:02:42 +0800 Subject: [PATCH 137/231] =?UTF-8?q?=E6=B8=85=E7=90=86=20cat-client=20?= =?UTF-8?q?=E4=B8=8E=20cat-home=20=E6=B5=8B=E8=AF=95=E5=9F=BA=E7=B1=BB?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dianping/cat/CatBootstrapTest.java | 8 ++-- ...estCase.java => CatClientTestSupport.java} | 8 +--- .../configuration/ConfigureManagerTest.java | 5 +-- .../com/dianping/cat/message/MessageTest.java | 8 ++-- .../com/dianping/cat/message/MetricTest.java | 6 +-- .../message/context/MessageContextTest.java | 15 ++++++- .../message/context/MessageIdFactoryTest.java | 3 +- .../internal/MockMessageBuilderTest.java | 3 +- .../message/pipeline/MessagePipelineTest.java | 8 ++-- .../pipeline/MetricAggregatorTest.java | 8 ++-- .../network/ClientTransportManagerTest.java | 8 ++-- .../cat/support/servlet/CatFilterTest.java | 6 +-- .../cat/SpringCatHomeTestSupport.java | 42 +++++++++++++++++++ .../dianping/cat/report/alert/AlertTest.java | 4 +- .../cat/report/alert/SenderManagerTest.java | 4 +- .../cat/report/alert/SuspendTest.java | 4 +- .../alert/sender/SenderManagerTest.java | 4 +- .../cat/report/alert/sender/SenderTest.java | 4 +- .../cat/report/analyzer/CapacityAnalyzer.java | 4 +- .../cat/report/analyzer/GraphBuilderTest.java | 4 +- .../analyzer/MonthlyMaxTpsAnalyzer.java | 4 +- .../report/analyzer/RouterBuilderTest.java | 4 +- .../report/analyzer/TopologyGraphTest.java | 4 +- .../cat/report/graph/ValueTranslaterTest.java | 7 ++-- .../cat/report/service/ReportDaoTest.java | 4 +- .../cat/report/task/ConfigsBackupTest.java | 3 +- .../cat/report/task/DatabaseCapacityTest.java | 3 +- .../report/task/SpringTaskTestSupport.java | 24 +++++++++++ .../business/BusinessBaseLineCreatorTest.java | 4 +- .../task/cached/CachedReportBuilerTest.java | 6 +-- .../task/event/EventReportBuilderTest.java | 4 +- .../heartbeat/HeartBeatReportBuilderTest.java | 5 +-- .../report/task/jar/JarReportBuilderTest.java | 4 +- .../problem/ProblemReportBuilderTest.java | 4 +- .../task/project/ProjectBuilderTest.java | 4 +- .../task/router/RouterReportAdjustTest.java | 4 +- .../task/router/RouterReportBuilderTest.java | 4 +- .../task/service/ClientReportBuilderTest.java | 4 +- .../task/service/ServiceBuilderTest.java | 22 +++++----- .../storage/StorageReportBuilderTest.java | 5 +-- .../TransactionReportBuilderTest.java | 4 +- .../utilization/UtilizationBuilderTest.java | 20 ++++----- 42 files changed, 184 insertions(+), 119 deletions(-) rename cat-client/src/test/java/com/dianping/cat/{ComponentTestCase.java => CatClientTestSupport.java} (77%) create mode 100644 cat-home/src/test/java/com/dianping/cat/SpringCatHomeTestSupport.java create mode 100644 cat-home/src/test/java/com/dianping/cat/report/task/SpringTaskTestSupport.java diff --git a/cat-client/src/test/java/com/dianping/cat/CatBootstrapTest.java b/cat-client/src/test/java/com/dianping/cat/CatBootstrapTest.java index 9fb3e2279a..eaddc3f688 100644 --- a/cat-client/src/test/java/com/dianping/cat/CatBootstrapTest.java +++ b/cat-client/src/test/java/com/dianping/cat/CatBootstrapTest.java @@ -7,7 +7,7 @@ import com.dianping.cat.configuration.ConfigureManager; -public class CatBootstrapTest extends ComponentTestCase { +public class CatBootstrapTest extends CatClientTestSupport { @After public void after() { } @@ -20,7 +20,7 @@ public void before() { public void testInitializeByDomain() { Cat.getBootstrap().initializeByDomain("MyDomain"); - ConfigureManager manager = context().lookup(ConfigureManager.class); + ConfigureManager manager = componentContext().lookup(ConfigureManager.class); Assert.assertEquals("MyDomain", manager.getDomain()); } @@ -29,7 +29,7 @@ public void testInitializeByDomain() { public void testInitializeByDomainAndServers() { Cat.getBootstrap().initializeByDomain("MyDomain", "server1", "server2"); - ConfigureManager manager = context().lookup(ConfigureManager.class); + ConfigureManager manager = componentContext().lookup(ConfigureManager.class); Assert.assertEquals("MyDomain", manager.getDomain()); Assert.assertEquals(2, manager.getServers().size()); @@ -41,7 +41,7 @@ public void testInitializeByDomainAndServers() { public void testInitializeByServers() { Cat.getBootstrap().initialize("server1", "server2"); - ConfigureManager manager = context().lookup(ConfigureManager.class); + ConfigureManager manager = componentContext().lookup(ConfigureManager.class); Assert.assertEquals(2, manager.getServers().size()); Assert.assertEquals("server1", manager.getServers().get(0).getIp()); diff --git a/cat-client/src/test/java/com/dianping/cat/ComponentTestCase.java b/cat-client/src/test/java/com/dianping/cat/CatClientTestSupport.java similarity index 77% rename from cat-client/src/test/java/com/dianping/cat/ComponentTestCase.java rename to cat-client/src/test/java/com/dianping/cat/CatClientTestSupport.java index 9cdce81afe..5d4b76f73c 100644 --- a/cat-client/src/test/java/com/dianping/cat/ComponentTestCase.java +++ b/cat-client/src/test/java/com/dianping/cat/CatClientTestSupport.java @@ -7,15 +7,11 @@ import com.dianping.cat.message.context.MetricContextHelper; import com.dianping.cat.message.context.TraceContextHelper; -public abstract class ComponentTestCase { - protected ComponentContext context() { +public abstract class CatClientTestSupport { + protected ComponentContext componentContext() { return Cat.getBootstrap().getComponentContext(); } - protected T lookup(Class componentType) { - return context().lookup(componentType); - } - @Before public void setUp() throws Exception { Cat.destroy(); diff --git a/cat-client/src/test/java/com/dianping/cat/configuration/ConfigureManagerTest.java b/cat-client/src/test/java/com/dianping/cat/configuration/ConfigureManagerTest.java index a41820c4f9..8a34d66000 100644 --- a/cat-client/src/test/java/com/dianping/cat/configuration/ConfigureManagerTest.java +++ b/cat-client/src/test/java/com/dianping/cat/configuration/ConfigureManagerTest.java @@ -3,19 +3,18 @@ import org.junit.Assert; import org.junit.Test; -import com.dianping.cat.ComponentTestCase; import com.dianping.cat.component.ComponentContext; import com.dianping.cat.component.DefaultComponentContext; import com.dianping.cat.component.factory.CatComponentFactory; -public class ConfigureManagerTest extends ComponentTestCase { +public class ConfigureManagerTest { @Test public void testConfigureManager() { ComponentContext ctx = new DefaultComponentContext(); ctx.registerFactory(new CatComponentFactory()); - ConfigureManager manager = lookup(ConfigureManager.class); + ConfigureManager manager = ctx.lookup(ConfigureManager.class); Assert.assertNotNull(manager); } diff --git a/cat-client/src/test/java/com/dianping/cat/message/MessageTest.java b/cat-client/src/test/java/com/dianping/cat/message/MessageTest.java index 058ba334bc..66969dfb6e 100644 --- a/cat-client/src/test/java/com/dianping/cat/message/MessageTest.java +++ b/cat-client/src/test/java/com/dianping/cat/message/MessageTest.java @@ -18,14 +18,14 @@ import org.junit.Test; import com.dianping.cat.Cat; -import com.dianping.cat.ComponentTestCase; +import com.dianping.cat.CatClientTestSupport; import com.dianping.cat.message.MessageAssert.TransactionAssert; import com.dianping.cat.message.context.MessageIdFactory; import com.dianping.cat.message.context.TraceContextHelper; import com.dianping.cat.message.internal.DefaultForkedTransaction; import com.dianping.cat.message.internal.DefaultTransaction; -public class MessageTest extends ComponentTestCase { +public class MessageTest extends CatClientTestSupport { private static AtomicInteger s_index = new AtomicInteger(); private static AtomicInteger s_count = new AtomicInteger(); @@ -41,9 +41,9 @@ public void after() { public void before() throws Exception { Cat.getBootstrap().testMode(); - MessageAssert.intercept(context()); + MessageAssert.intercept(componentContext()); - context().registerComponent(MessageIdFactory.class, new MockMessageIdFactory()); + componentContext().registerComponent(MessageIdFactory.class, new MockMessageIdFactory()); } private void checkMessageIdUsed(int expected) throws InterruptedException { diff --git a/cat-client/src/test/java/com/dianping/cat/message/MetricTest.java b/cat-client/src/test/java/com/dianping/cat/message/MetricTest.java index 2efa00be32..4ce348b824 100644 --- a/cat-client/src/test/java/com/dianping/cat/message/MetricTest.java +++ b/cat-client/src/test/java/com/dianping/cat/message/MetricTest.java @@ -5,10 +5,10 @@ import org.junit.Test; import com.dianping.cat.Cat; -import com.dianping.cat.ComponentTestCase; +import com.dianping.cat.CatClientTestSupport; import com.dianping.cat.message.Metric.Kind; -public class MetricTest extends ComponentTestCase { +public class MetricTest extends CatClientTestSupport { @After public void after() { MetricAssert.reset(); @@ -18,7 +18,7 @@ public void after() { public void before() throws Exception { Cat.getBootstrap().testMode(); - MetricAssert.intercept(context()); + MetricAssert.intercept(componentContext()); } @Test diff --git a/cat-client/src/test/java/com/dianping/cat/message/context/MessageContextTest.java b/cat-client/src/test/java/com/dianping/cat/message/context/MessageContextTest.java index ad8423c405..73028a7ae7 100644 --- a/cat-client/src/test/java/com/dianping/cat/message/context/MessageContextTest.java +++ b/cat-client/src/test/java/com/dianping/cat/message/context/MessageContextTest.java @@ -2,14 +2,25 @@ import javax.servlet.http.HttpServletRequest; +import org.junit.After; import org.junit.Assert; +import org.junit.Before; import org.junit.Ignore; import org.junit.Test; -import com.dianping.cat.ComponentTestCase; import com.dianping.cat.message.Transaction; -public class MessageContextTest extends ComponentTestCase { +public class MessageContextTest { + @Before + public void setUp() { + TraceContextHelper.reset(); + } + + @After + public void tearDown() { + TraceContextHelper.reset(); + } + @Test public void testInstrument() { int index = 1; diff --git a/cat-client/src/test/java/com/dianping/cat/message/context/MessageIdFactoryTest.java b/cat-client/src/test/java/com/dianping/cat/message/context/MessageIdFactoryTest.java index 8f4c6d5023..d6e85e3989 100644 --- a/cat-client/src/test/java/com/dianping/cat/message/context/MessageIdFactoryTest.java +++ b/cat-client/src/test/java/com/dianping/cat/message/context/MessageIdFactoryTest.java @@ -19,11 +19,10 @@ import org.junit.Assert; import org.junit.Test; -import com.dianping.cat.ComponentTestCase; import com.dianping.cat.support.Files; import com.dianping.cat.support.Threads; -public class MessageIdFactoryTest extends ComponentTestCase { +public class MessageIdFactoryTest { /** * Run it multiple times in console to simulate multiple processes scenario, * diff --git a/cat-client/src/test/java/com/dianping/cat/message/internal/MockMessageBuilderTest.java b/cat-client/src/test/java/com/dianping/cat/message/internal/MockMessageBuilderTest.java index 62b763be0d..d0a2dde846 100644 --- a/cat-client/src/test/java/com/dianping/cat/message/internal/MockMessageBuilderTest.java +++ b/cat-client/src/test/java/com/dianping/cat/message/internal/MockMessageBuilderTest.java @@ -21,10 +21,9 @@ import org.junit.Assert; import org.junit.Test; -import com.dianping.cat.ComponentTestCase; import com.dianping.cat.message.Message; -public class MockMessageBuilderTest extends ComponentTestCase { +public class MockMessageBuilderTest { @Test public void test() { Message message = new MockMessageBuilder() { diff --git a/cat-client/src/test/java/com/dianping/cat/message/pipeline/MessagePipelineTest.java b/cat-client/src/test/java/com/dianping/cat/message/pipeline/MessagePipelineTest.java index ab9f3d487f..76fb155a7b 100644 --- a/cat-client/src/test/java/com/dianping/cat/message/pipeline/MessagePipelineTest.java +++ b/cat-client/src/test/java/com/dianping/cat/message/pipeline/MessagePipelineTest.java @@ -3,17 +3,17 @@ import org.junit.Assert; import org.junit.Test; -import com.dianping.cat.ComponentTestCase; +import com.dianping.cat.CatClientTestSupport; import com.dianping.cat.message.internal.DefaultMessageTree; -public class MessagePipelineTest extends ComponentTestCase { +public class MessagePipelineTest extends CatClientTestSupport { private int m_count; @Test public void test() { - context().registerComponent(MessageHandler.class, new CounterHandler()); + componentContext().registerComponent(MessageHandler.class, new CounterHandler()); - MessagePipeline pipeline = lookup(MessagePipeline.class); + MessagePipeline pipeline = componentContext().lookup(MessagePipeline.class); DefaultMessageTree tree = new DefaultMessageTree(null); MessageHandlerContext ctx = pipeline.headContext(tree); diff --git a/cat-client/src/test/java/com/dianping/cat/message/pipeline/MetricAggregatorTest.java b/cat-client/src/test/java/com/dianping/cat/message/pipeline/MetricAggregatorTest.java index 19c887e056..30659f9e7c 100644 --- a/cat-client/src/test/java/com/dianping/cat/message/pipeline/MetricAggregatorTest.java +++ b/cat-client/src/test/java/com/dianping/cat/message/pipeline/MetricAggregatorTest.java @@ -7,18 +7,18 @@ import org.junit.Test; import com.dianping.cat.Cat; -import com.dianping.cat.ComponentTestCase; +import com.dianping.cat.CatClientTestSupport; import com.dianping.cat.message.MetricBag; import com.dianping.cat.message.context.MetricContext; -public class MetricAggregatorTest extends ComponentTestCase { +public class MetricAggregatorTest extends CatClientTestSupport { private AtomicInteger m_count = new AtomicInteger(); private StringBuilder m_sb = new StringBuilder(); @Before public void before() throws Exception { - context().registerComponent(MessageHandler.class, new CounterHandler()); + componentContext().registerComponent(MessageHandler.class, new CounterHandler()); } @Test @@ -31,7 +31,7 @@ public void test() throws InterruptedException { Cat.logMetricForDuration("duration", 200); // trigger metric aggregation - lookup(MessagePipeline.class).headContext(MetricContext.TICK).fireMessage(MetricContext.TICK); + componentContext().lookup(MessagePipeline.class).headContext(MetricContext.TICK).fireMessage(MetricContext.TICK); Assert.assertEquals(1, m_count.get()); diff --git a/cat-client/src/test/java/com/dianping/cat/network/ClientTransportManagerTest.java b/cat-client/src/test/java/com/dianping/cat/network/ClientTransportManagerTest.java index a7d56b2e6b..fdf85180ec 100644 --- a/cat-client/src/test/java/com/dianping/cat/network/ClientTransportManagerTest.java +++ b/cat-client/src/test/java/com/dianping/cat/network/ClientTransportManagerTest.java @@ -10,7 +10,7 @@ import org.junit.Before; import org.junit.Test; -import com.dianping.cat.ComponentTestCase; +import com.dianping.cat.CatClientTestSupport; import com.dianping.cat.configuration.ConfigureManager; import com.dianping.cat.configuration.ConfigureProperty; import com.dianping.cat.configuration.DefaultConfigureManager; @@ -23,17 +23,17 @@ import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; -public class ClientTransportManagerTest extends ComponentTestCase { +public class ClientTransportManagerTest extends CatClientTestSupport { private List m_ports = new ArrayList<>(); @Before public void before() { - context().registerComponent(ConfigureManager.class, new MockConfigureManager()); + componentContext().registerComponent(ConfigureManager.class, new MockConfigureManager()); } @Test public void testReconfigure() throws Exception { - ClientTransportManager manager = lookup(ClientTransportManager.class); + ClientTransportManager manager = componentContext().lookup(ClientTransportManager.class); Server s2290 = new Server(manager, 2290); Server s2291 = new Server(manager, 2291); Server s2292 = new Server(manager, 2292); diff --git a/cat-client/src/test/java/com/dianping/cat/support/servlet/CatFilterTest.java b/cat-client/src/test/java/com/dianping/cat/support/servlet/CatFilterTest.java index b1236309b1..0598f96c2c 100644 --- a/cat-client/src/test/java/com/dianping/cat/support/servlet/CatFilterTest.java +++ b/cat-client/src/test/java/com/dianping/cat/support/servlet/CatFilterTest.java @@ -45,7 +45,7 @@ import com.dianping.cat.Cat.PropertyConsumer; import com.dianping.cat.Cat.PropertyContext; import com.dianping.cat.CatClientConstants; -import com.dianping.cat.ComponentTestCase; +import com.dianping.cat.CatClientTestSupport; import com.dianping.cat.message.MessageAssert; import com.dianping.cat.message.MessageAssert.HeaderAssert; import com.dianping.cat.message.MessageAssert.TransactionAssert; @@ -57,7 +57,7 @@ import com.github.netty.protocol.HttpServletProtocol; import com.github.netty.protocol.servlet.ServletContext; -public class CatFilterTest extends ComponentTestCase { +public class CatFilterTest extends CatClientTestSupport { private HttpServer m_server; @After @@ -68,7 +68,7 @@ public void after() { @Before public void before() { - MessageAssert.intercept(Cat.getBootstrap().getComponentContext()); + MessageAssert.intercept(componentContext()); Cat.getBootstrap().initializeByDomain("mockApp"); diff --git a/cat-home/src/test/java/com/dianping/cat/SpringCatHomeTestSupport.java b/cat-home/src/test/java/com/dianping/cat/SpringCatHomeTestSupport.java new file mode 100644 index 0000000000..9f54c3c943 --- /dev/null +++ b/cat-home/src/test/java/com/dianping/cat/SpringCatHomeTestSupport.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.dianping.cat; + +import java.util.Map; + +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import com.dianping.cat.home.spring.CatHomeSpringConfiguration; + +public abstract class SpringCatHomeTestSupport { + private static final AnnotationConfigApplicationContext CONTEXT = new AnnotationConfigApplicationContext( + CatHomeSpringConfiguration.class); + + protected T lookup(Class componentType) { + return CONTEXT.getBean(componentType); + } + + protected T lookup(Class componentType, String componentHint) { + return CONTEXT.getBean(componentHint, componentType); + } + + protected Map lookupMap(Class componentType) { + return CONTEXT.getBeansOfType(componentType); + } +} diff --git a/cat-home/src/test/java/com/dianping/cat/report/alert/AlertTest.java b/cat-home/src/test/java/com/dianping/cat/report/alert/AlertTest.java index df5eaa9d10..f00d570cbf 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/alert/AlertTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/alert/AlertTest.java @@ -22,14 +22,14 @@ import org.junit.Before; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Cat; +import com.dianping.cat.SpringCatHomeTestSupport; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.report.alert.heartbeat.HeartbeatAlert; import com.dianping.cat.report.alert.transaction.TransactionAlert; -public class AlertTest extends ComponentTestCase { +public class AlertTest extends SpringCatHomeTestSupport { @Before public void before() throws Exception { diff --git a/cat-home/src/test/java/com/dianping/cat/report/alert/SenderManagerTest.java b/cat-home/src/test/java/com/dianping/cat/report/alert/SenderManagerTest.java index 4415d23aad..6c772a8c6d 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/alert/SenderManagerTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/alert/SenderManagerTest.java @@ -22,13 +22,13 @@ import java.util.List; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; +import com.dianping.cat.SpringCatHomeTestSupport; import com.dianping.cat.alarm.spi.AlertChannel; import com.dianping.cat.alarm.spi.sender.SendMessageEntity; import com.dianping.cat.alarm.spi.sender.SenderManager; -public class SenderManagerTest extends ComponentTestCase { +public class SenderManagerTest extends SpringCatHomeTestSupport { @Test public void test() { diff --git a/cat-home/src/test/java/com/dianping/cat/report/alert/SuspendTest.java b/cat-home/src/test/java/com/dianping/cat/report/alert/SuspendTest.java index 7e886cc620..9199ada076 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/alert/SuspendTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/alert/SuspendTest.java @@ -23,13 +23,13 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; +import com.dianping.cat.SpringCatHomeTestSupport; import com.dianping.cat.alarm.spi.AlertEntity; import com.dianping.cat.alarm.spi.AlertManager; import com.dianping.cat.alarm.spi.AlertType; -public class SuspendTest extends ComponentTestCase { +public class SuspendTest extends SpringCatHomeTestSupport { @Test public void test() { diff --git a/cat-home/src/test/java/com/dianping/cat/report/alert/sender/SenderManagerTest.java b/cat-home/src/test/java/com/dianping/cat/report/alert/sender/SenderManagerTest.java index 0b6013bd77..04e01870da 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/alert/sender/SenderManagerTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/alert/sender/SenderManagerTest.java @@ -23,13 +23,13 @@ import org.junit.Before; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; +import com.dianping.cat.SpringCatHomeTestSupport; import com.dianping.cat.alarm.spi.AlertChannel; import com.dianping.cat.alarm.spi.sender.SendMessageEntity; import com.dianping.cat.alarm.spi.sender.SenderManager; -public class SenderManagerTest extends ComponentTestCase { +public class SenderManagerTest extends SpringCatHomeTestSupport { @Before public void before() throws Exception { diff --git a/cat-home/src/test/java/com/dianping/cat/report/alert/sender/SenderTest.java b/cat-home/src/test/java/com/dianping/cat/report/alert/sender/SenderTest.java index 2f4ce1c1db..15dcf4af16 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/alert/sender/SenderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/alert/sender/SenderTest.java @@ -23,8 +23,8 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; +import com.dianping.cat.SpringCatHomeTestSupport; import com.dianping.cat.alarm.spi.AlertType; import com.dianping.cat.alarm.spi.sender.MailSender; import com.dianping.cat.alarm.spi.sender.SendMessageEntity; @@ -32,7 +32,7 @@ import com.dianping.cat.alarm.spi.sender.SmsSender; import com.dianping.cat.alarm.spi.sender.WeixinSender; -public class SenderTest extends ComponentTestCase { +public class SenderTest extends SpringCatHomeTestSupport { @Test public void test() { diff --git a/cat-home/src/test/java/com/dianping/cat/report/analyzer/CapacityAnalyzer.java b/cat-home/src/test/java/com/dianping/cat/report/analyzer/CapacityAnalyzer.java index a20d63e9c3..2ccf083a74 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/analyzer/CapacityAnalyzer.java +++ b/cat-home/src/test/java/com/dianping/cat/report/analyzer/CapacityAnalyzer.java @@ -19,12 +19,12 @@ package com.dianping.cat.report.analyzer; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; +import com.dianping.cat.SpringCatHomeTestSupport; import com.dianping.cat.report.page.overload.task.CapacityUpdateTask; import com.dianping.cat.report.task.TaskBuilder; -public class CapacityAnalyzer extends ComponentTestCase { +public class CapacityAnalyzer extends SpringCatHomeTestSupport { @Test public void test() throws Exception { diff --git a/cat-home/src/test/java/com/dianping/cat/report/analyzer/GraphBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/analyzer/GraphBuilderTest.java index 88824c1849..2ef3565945 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/analyzer/GraphBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/analyzer/GraphBuilderTest.java @@ -22,8 +22,8 @@ import java.util.Date; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; +import com.dianping.cat.SpringCatHomeTestSupport; import com.dianping.cat.Constants; import com.dianping.cat.consumer.event.EventAnalyzer; import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; @@ -40,7 +40,7 @@ import com.dianping.cat.report.page.statistics.task.utilization.UtilizationReportBuilder; import com.dianping.cat.report.page.transaction.task.TransactionReportBuilder; -public class GraphBuilderTest extends ComponentTestCase { +public class GraphBuilderTest extends SpringCatHomeTestSupport { @Test public void test() throws Exception { diff --git a/cat-home/src/test/java/com/dianping/cat/report/analyzer/MonthlyMaxTpsAnalyzer.java b/cat-home/src/test/java/com/dianping/cat/report/analyzer/MonthlyMaxTpsAnalyzer.java index f2726bd978..24a4b86acb 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/analyzer/MonthlyMaxTpsAnalyzer.java +++ b/cat-home/src/test/java/com/dianping/cat/report/analyzer/MonthlyMaxTpsAnalyzer.java @@ -26,8 +26,8 @@ import java.util.Set; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; +import com.dianping.cat.SpringCatHomeTestSupport; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.consumer.transaction.model.entity.Machine; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; @@ -36,7 +36,7 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.page.transaction.service.TransactionReportService; -public class MonthlyMaxTpsAnalyzer extends ComponentTestCase { +public class MonthlyMaxTpsAnalyzer extends SpringCatHomeTestSupport { private String m_start = "2013-08-23 16:00"; diff --git a/cat-home/src/test/java/com/dianping/cat/report/analyzer/RouterBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/analyzer/RouterBuilderTest.java index 29de74d02c..4d4ef9f4db 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/analyzer/RouterBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/analyzer/RouterBuilderTest.java @@ -23,15 +23,15 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; +import com.dianping.cat.SpringCatHomeTestSupport; import com.dianping.cat.Constants; import com.dianping.cat.core.dal.Task; import com.dianping.cat.home.router.entity.RouterConfig; import com.dianping.cat.report.task.ReportFacade; import com.dianping.cat.system.page.router.service.RouterConfigService; -public class RouterBuilderTest extends ComponentTestCase { +public class RouterBuilderTest extends SpringCatHomeTestSupport { public String day1 = "2014-11-10"; diff --git a/cat-home/src/test/java/com/dianping/cat/report/analyzer/TopologyGraphTest.java b/cat-home/src/test/java/com/dianping/cat/report/analyzer/TopologyGraphTest.java index 5fd6682fcd..9fabc2c74c 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/analyzer/TopologyGraphTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/analyzer/TopologyGraphTest.java @@ -22,12 +22,12 @@ import java.text.SimpleDateFormat; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; +import com.dianping.cat.SpringCatHomeTestSupport; import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; import com.dianping.cat.report.page.dependency.graph.TopologyGraphManager; -public class TopologyGraphTest extends ComponentTestCase { +public class TopologyGraphTest extends SpringCatHomeTestSupport { @Test public void test() throws Exception { diff --git a/cat-home/src/test/java/com/dianping/cat/report/graph/ValueTranslaterTest.java b/cat-home/src/test/java/com/dianping/cat/report/graph/ValueTranslaterTest.java index 94777b5ffa..0026928b1c 100755 --- a/cat-home/src/test/java/com/dianping/cat/report/graph/ValueTranslaterTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/graph/ValueTranslaterTest.java @@ -22,12 +22,11 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; -import org.unidal.lookup.ComponentTestCase; -import com.dianping.cat.report.graph.svg.ValueTranslater; +import com.dianping.cat.report.graph.svg.DefaultValueTranslater; @RunWith(JUnit4.class) -public class ValueTranslaterTest extends ComponentTestCase { +public class ValueTranslaterTest { @Test public void test() throws Exception { check(1000, 123, 456, 247, 473, 976, 236); @@ -38,7 +37,7 @@ public void test() throws Exception { } void check(double expected, double... values) throws Exception { - ValueTranslater translater = lookup(ValueTranslater.class); + DefaultValueTranslater translater = new DefaultValueTranslater(); Assert.assertEquals(expected, translater.getMaxValue(values), 1e-6); } diff --git a/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java b/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java index 3ae985b013..c38179b193 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java @@ -22,8 +22,8 @@ import org.junit.Test; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.ComponentTestCase; +import com.dianping.cat.SpringCatHomeTestSupport; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportDao; @@ -33,7 +33,7 @@ import com.dianping.cat.core.dal.WeeklyReportDao; import com.dianping.cat.core.report.daily.repository.DailyReportRepository; -public class ReportDaoTest extends ComponentTestCase { +public class ReportDaoTest extends SpringCatHomeTestSupport { @Test public void test() throws DalException { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java index 0afc09f661..4cde478dec 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java @@ -25,13 +25,12 @@ import org.junit.Assert; import org.junit.Test; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; -public class ConfigsBackupTest extends ComponentTestCase { +public class ConfigsBackupTest extends SpringTaskTestSupport { @Test public void backupConfigsTest() { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/DatabaseCapacityTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/DatabaseCapacityTest.java index d720f0ea89..e0dfe9440b 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/DatabaseCapacityTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/DatabaseCapacityTest.java @@ -19,12 +19,11 @@ package com.dianping.cat.report.task; import org.unidal.dal.jdbc.DalException; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.report.page.overload.task.CapacityUpdater; import com.dianping.cat.report.page.overload.task.HourlyCapacityUpdater; -public class DatabaseCapacityTest extends ComponentTestCase { +public class DatabaseCapacityTest extends SpringTaskTestSupport { // @Test public void testTaskDuration() throws DalException { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/SpringTaskTestSupport.java b/cat-home/src/test/java/com/dianping/cat/report/task/SpringTaskTestSupport.java new file mode 100644 index 0000000000..39265baa3e --- /dev/null +++ b/cat-home/src/test/java/com/dianping/cat/report/task/SpringTaskTestSupport.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.dianping.cat.report.task; + +import com.dianping.cat.SpringCatHomeTestSupport; + +public abstract class SpringTaskTestSupport extends SpringCatHomeTestSupport { +} diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/business/BusinessBaseLineCreatorTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/business/BusinessBaseLineCreatorTest.java index 9596020beb..d90aee7764 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/business/BusinessBaseLineCreatorTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/business/BusinessBaseLineCreatorTest.java @@ -22,12 +22,12 @@ import java.text.SimpleDateFormat; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.report.page.business.task.BusinessBaselineReportBuilder; +import com.dianping.cat.report.task.SpringTaskTestSupport; import com.dianping.cat.report.task.TaskBuilder; -public class BusinessBaseLineCreatorTest extends ComponentTestCase { +public class BusinessBaseLineCreatorTest extends SpringTaskTestSupport { @Test public void testCreateData() throws ParseException { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/cached/CachedReportBuilerTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/cached/CachedReportBuilerTest.java index 560e4089e8..871d233dd3 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/cached/CachedReportBuilerTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/cached/CachedReportBuilerTest.java @@ -23,17 +23,17 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.helper.TimeHelper; +import com.dianping.cat.report.task.SpringTaskTestSupport; import com.dianping.cat.report.task.TaskBuilder; import com.dianping.cat.report.task.current.CurrentReportBuilder; import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask; import com.dianping.cat.report.task.current.CurrentWeeklyMonthlyReportTask.CurrentWeeklyMonthlyTask; -public class CachedReportBuilerTest extends ComponentTestCase { +public class CachedReportBuilerTest extends SpringTaskTestSupport { private int m_index = 0; @@ -69,4 +69,4 @@ public void buildCurrentMonthlyTask(String name, String domain, Date start) { Assert.assertEquals(true, m_index > 0); } -} \ No newline at end of file +} diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/event/EventReportBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/event/EventReportBuilderTest.java index 2e3a447ada..43fb6bde4e 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/event/EventReportBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/event/EventReportBuilderTest.java @@ -22,13 +22,13 @@ import java.text.SimpleDateFormat; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; import com.dianping.cat.report.page.event.task.EventReportBuilder; +import com.dianping.cat.report.task.SpringTaskTestSupport; import com.dianping.cat.report.task.TaskBuilder; -public class EventReportBuilderTest extends ComponentTestCase { +public class EventReportBuilderTest extends SpringTaskTestSupport { @Test public void testDailyTask() { TaskBuilder builder = lookup(TaskBuilder.class, EventReportBuilder.ID); diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/heartbeat/HeartBeatReportBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/heartbeat/HeartBeatReportBuilderTest.java index 9b0dc41edb..8a7a0cfea3 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/heartbeat/HeartBeatReportBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/heartbeat/HeartBeatReportBuilderTest.java @@ -18,13 +18,12 @@ */ package com.dianping.cat.report.task.heartbeat; -import org.unidal.lookup.ComponentTestCase; - import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; import com.dianping.cat.helper.TimeHelper; +import com.dianping.cat.report.task.SpringTaskTestSupport; import com.dianping.cat.report.task.TaskBuilder; -public class HeartBeatReportBuilderTest extends ComponentTestCase { +public class HeartBeatReportBuilderTest extends SpringTaskTestSupport { //@Test public void testDailyTask() { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/jar/JarReportBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/jar/JarReportBuilderTest.java index 645fe73786..c888f3cf49 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/jar/JarReportBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/jar/JarReportBuilderTest.java @@ -23,13 +23,13 @@ import java.util.Date; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; import com.dianping.cat.report.page.statistics.task.jar.JarReportBuilder; +import com.dianping.cat.report.task.SpringTaskTestSupport; import com.dianping.cat.report.task.TaskBuilder; -public class JarReportBuilderTest extends ComponentTestCase { +public class JarReportBuilderTest extends SpringTaskTestSupport { @Test public void test() throws ParseException { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/problem/ProblemReportBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/problem/ProblemReportBuilderTest.java index 8d7877a3e5..c8bca87144 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/problem/ProblemReportBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/problem/ProblemReportBuilderTest.java @@ -22,13 +22,13 @@ import java.text.SimpleDateFormat; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; import com.dianping.cat.report.page.problem.task.ProblemReportBuilder; +import com.dianping.cat.report.task.SpringTaskTestSupport; import com.dianping.cat.report.task.TaskBuilder; -public class ProblemReportBuilderTest extends ComponentTestCase { +public class ProblemReportBuilderTest extends SpringTaskTestSupport { @Test public void testDailyTask() { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/project/ProjectBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/project/ProjectBuilderTest.java index ca2a0fd283..5400959632 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/project/ProjectBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/project/ProjectBuilderTest.java @@ -23,14 +23,14 @@ import org.junit.Before; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.report.task.SpringTaskTestSupport; import com.dianping.cat.report.task.cmdb.ProjectUpdateTask; import com.dianping.cat.service.ProjectService; -public class ProjectBuilderTest extends ComponentTestCase { +public class ProjectBuilderTest extends SpringTaskTestSupport { @Before public void before() throws Exception { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/router/RouterReportAdjustTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/router/RouterReportAdjustTest.java index 5e61fecfe8..3b1f8b6c66 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/router/RouterReportAdjustTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/router/RouterReportAdjustTest.java @@ -23,11 +23,11 @@ import java.util.Date; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; +import com.dianping.cat.report.task.SpringTaskTestSupport; import com.dianping.cat.system.page.router.config.RouterConfigAdjustor; -public class RouterReportAdjustTest extends ComponentTestCase { +public class RouterReportAdjustTest extends SpringTaskTestSupport { @Test public void test() throws ParseException { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/router/RouterReportBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/router/RouterReportBuilderTest.java index 7cf07f6c68..6fdc78bd9c 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/router/RouterReportBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/router/RouterReportBuilderTest.java @@ -23,15 +23,15 @@ import java.util.Date; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.report.task.SpringTaskTestSupport; import com.dianping.cat.report.task.TaskBuilder; import com.dianping.cat.system.page.router.config.RouterConfigHandler; import com.dianping.cat.system.page.router.task.RouterConfigBuilder; -public class RouterReportBuilderTest extends ComponentTestCase { +public class RouterReportBuilderTest extends SpringTaskTestSupport { @Test public void test() throws ParseException { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/service/ClientReportBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/service/ClientReportBuilderTest.java index 94b07cb1ff..6a8ff613d1 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/service/ClientReportBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/service/ClientReportBuilderTest.java @@ -19,14 +19,14 @@ package com.dianping.cat.report.task.service; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.page.statistics.task.service.ClientReportBuilder; +import com.dianping.cat.report.task.SpringTaskTestSupport; import com.dianping.cat.report.task.TaskBuilder; -public class ClientReportBuilderTest extends ComponentTestCase { +public class ClientReportBuilderTest extends SpringTaskTestSupport { @Test public void test() { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/service/ServiceBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/service/ServiceBuilderTest.java index a40d8503a8..33fc00a9f5 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/service/ServiceBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/service/ServiceBuilderTest.java @@ -18,17 +18,17 @@ */ package com.dianping.cat.report.task.service; -import java.text.SimpleDateFormat; - -import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; - -import com.dianping.cat.Cat; -import com.dianping.cat.Constants; -import com.dianping.cat.report.page.statistics.task.service.ServiceReportBuilder; -import com.dianping.cat.service.HostinfoService; - -public class ServiceBuilderTest extends ComponentTestCase { +import java.text.SimpleDateFormat; + +import org.junit.Test; + +import com.dianping.cat.Cat; +import com.dianping.cat.Constants; +import com.dianping.cat.report.page.statistics.task.service.ServiceReportBuilder; +import com.dianping.cat.report.task.SpringTaskTestSupport; +import com.dianping.cat.service.HostinfoService; + +public class ServiceBuilderTest extends SpringTaskTestSupport { @Test public void testHourlyReport() throws Exception { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/storage/StorageReportBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/storage/StorageReportBuilderTest.java index 5f02622f33..e9e01151a0 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/storage/StorageReportBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/storage/StorageReportBuilderTest.java @@ -18,13 +18,12 @@ */ package com.dianping.cat.report.task.storage; -import org.unidal.lookup.ComponentTestCase; - import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.page.storage.task.StorageReportBuilder; +import com.dianping.cat.report.task.SpringTaskTestSupport; import com.dianping.cat.report.task.TaskBuilder; -public class StorageReportBuilderTest extends ComponentTestCase { +public class StorageReportBuilderTest extends SpringTaskTestSupport { // @Test public void testDailyTask() { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/transaction/TransactionReportBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/transaction/TransactionReportBuilderTest.java index 8497818c20..c9a678c16b 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/transaction/TransactionReportBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/transaction/TransactionReportBuilderTest.java @@ -22,13 +22,13 @@ import java.text.SimpleDateFormat; import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; import com.dianping.cat.Constants; import com.dianping.cat.report.page.transaction.task.TransactionReportBuilder; +import com.dianping.cat.report.task.SpringTaskTestSupport; import com.dianping.cat.report.task.TaskBuilder; -public class TransactionReportBuilderTest extends ComponentTestCase { +public class TransactionReportBuilderTest extends SpringTaskTestSupport { @Test public void testDailyTask() { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/utilization/UtilizationBuilderTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/utilization/UtilizationBuilderTest.java index 14907964b2..0bbbdcb697 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/utilization/UtilizationBuilderTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/utilization/UtilizationBuilderTest.java @@ -18,16 +18,16 @@ */ package com.dianping.cat.report.task.utilization; -import java.text.SimpleDateFormat; - -import org.junit.Test; -import org.unidal.lookup.ComponentTestCase; - -import com.dianping.cat.Constants; -import com.dianping.cat.report.page.statistics.task.utilization.UtilizationReportBuilder; -import com.dianping.cat.service.HostinfoService; - -public class UtilizationBuilderTest extends ComponentTestCase { +import java.text.SimpleDateFormat; + +import org.junit.Test; + +import com.dianping.cat.Constants; +import com.dianping.cat.report.page.statistics.task.utilization.UtilizationReportBuilder; +import com.dianping.cat.report.task.SpringTaskTestSupport; +import com.dianping.cat.service.HostinfoService; + +public class UtilizationBuilderTest extends SpringTaskTestSupport { @Test public void testHourlyReport() throws Exception { From d07c657e63c7fb933581ca4e9939add50a6d570e Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 14:44:56 +0800 Subject: [PATCH 138/231] =?UTF-8?q?=E7=A7=BB=E9=99=A4=20MyBatis=20?= =?UTF-8?q?=E4=BB=93=E5=82=A8=E7=9A=84=20Unidal=20DataSourceManager=20?= =?UTF-8?q?=E5=85=9C=E5=BA=95=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/alert/AlertRepository.java | 67 +---- .../alarm/rule/ServerAlarmRuleRepository.java | 43 +--- .../define/rule/UserDefineRuleRepository.java | 44 +--- .../config/repository/ConfigRepository.java | 211 +-------------- .../SpringBackedRepositorySupport.java | 58 +---- .../SupportingMyBatisRepository.java | 98 ------- .../config/BusinessConfigRepository.java | 155 ++--------- .../content/DailyReportContentRepository.java | 84 +----- .../hostinfo/HostinfoRepository.java | 218 ++-------------- .../HourlyReportContentRepository.java | 85 +----- .../hourlyreport/HourlyReportRepository.java | 212 +-------------- .../MonthlyReportContentRepository.java | 85 +----- .../monthreport/MonthlyReportRepository.java | 220 ++-------------- .../repository/project/ProjectRepository.java | 234 ++--------------- .../repository/task/TaskRepository.java | 183 ++----------- .../WeeklyReportContentRepository.java | 85 +----- .../weeklyreport/WeeklyReportRepository.java | 220 ++-------------- .../repository/DailyReportRepository.java | 241 ++---------------- .../alert/summary/AlertSummaryRepository.java | 35 +-- .../alteration/AlterationRepository.java | 67 +---- .../baseline/BaselineRepository.java | 44 +--- .../ConfigModificationRepository.java | 35 +-- .../metric/graph/MetricGraphRepository.java | 60 +---- .../metric/screen/MetricScreenRepository.java | 84 +----- .../overload/OverloadRepository.java | 60 +---- .../TopologyGraphRepository.java | 44 +--- .../spring/CatHomeSpringConfiguration.java | 46 ++-- .../home/spring/SpringDataSourceManager.java | 63 ----- 28 files changed, 282 insertions(+), 2799 deletions(-) delete mode 100644 cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SupportingMyBatisRepository.java delete mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/SpringDataSourceManager.java diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java index e5aebecb49..d97f13aaf0 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java @@ -6,7 +6,6 @@ import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import java.util.List; import java.util.stream.Collectors; -import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; @@ -31,14 +30,8 @@ public Alert createLocal() { public int deleteByPK(Alert proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(AlertMapper.class).deleteByPrimaryKey(proto.getKeyId()); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for Alert.", e); } @@ -51,14 +44,8 @@ public List queryAlertsByTimeDomain(java.util.Date startTime, java.util.D record.setStartTime(startTime); record.setEndTime(endTime); record.setDomain(domain); - if (mapper != null) { + try { return mapper.queryAlertsByTimeDomain(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(AlertMapper.class).queryAlertsByTimeDomain(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing queryAlertsByTimeDomain for Alert.", e); } @@ -72,15 +59,9 @@ public List queryAlertsByTimeDomainCategories(java.util.Date startTime, j record.setEndTime(endTime); record.setDomain(domain); record.setCategories(categories); - if (mapper != null) { + try { return mapper.queryAlertsByTimeDomainCategories(record).stream().map(this::toModel) .collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(AlertMapper.class).queryAlertsByTimeDomainCategories(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing queryAlertsByTimeDomainCategories for Alert.", e); } @@ -94,15 +75,9 @@ public List queryAlertsByTimeCategoryDomain(java.util.Date startTime, jav record.setEndTime(endTime); record.setCategory(category); record.setDomain(domain); - if (mapper != null) { + try { return mapper.queryAlertsByTimeCategoryDomain(record).stream().map(this::toModel) .collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(AlertMapper.class).queryAlertsByTimeCategoryDomain(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing queryAlertsByTimeCategoryDomain for Alert.", e); } @@ -115,14 +90,8 @@ public List queryAlertsByTimeCategory(java.util.Date startTime, java.util record.setStartTime(startTime); record.setEndTime(endTime); record.setCategory(category); - if (mapper != null) { + try { return mapper.queryAlertsByTimeCategory(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(AlertMapper.class).queryAlertsByTimeCategory(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing queryAlertsByTimeCategory for Alert.", e); } @@ -131,13 +100,8 @@ public List queryAlertsByTimeCategory(java.util.Date startTime, java.util public Alert findByPK(int keyId, Readset readset) throws DalException { AlertMapper mapper = springMapper(LOGGER); - if (mapper != null) { + try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - AlertDO record = session.getMapper(AlertMapper.class).findByPrimaryKey(keyId); - return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -148,19 +112,10 @@ public Alert findByPK(int keyId, Readset readset) throws DalException { public int insert(Alert proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { AlertDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - AlertDO record = toRecord(proto); - int count = session.getMapper(AlertMapper.class).insert(record); - session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); return count; @@ -172,14 +127,8 @@ public int insert(Alert proto) throws DalException { public int updateByPK(Alert proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(AlertMapper.class).updateByPrimaryKey(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for Alert.", e); } diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java index a1d0a10822..8f498ea47f 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java @@ -6,7 +6,6 @@ import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import java.util.List; import java.util.stream.Collectors; -import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; @@ -32,14 +31,8 @@ public ServerAlarmRule createLocal() { public int deleteByPK(ServerAlarmRule proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(ServerAlarmRuleMapper.class).deleteByPrimaryKey(proto.getKeyId()); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for ServerAlarmRule.", e); } @@ -49,14 +42,8 @@ public List findAll(Readset readset) throws Da ServerAlarmRuleMapper mapper = springMapper(LOGGER); ServerAlarmRuleDO record = new ServerAlarmRuleDO(); - if (mapper != null) { + try { return mapper.findAll(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(ServerAlarmRuleMapper.class).findAll(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findAll for ServerAlarmRule.", e); } @@ -65,13 +52,8 @@ public List findAll(Readset readset) throws Da public ServerAlarmRule findByPK(int keyId, Readset readset) throws DalException { ServerAlarmRuleMapper mapper = springMapper(LOGGER); - if (mapper != null) { + try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - ServerAlarmRuleDO record = session.getMapper(ServerAlarmRuleMapper.class).findByPrimaryKey(keyId); - return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -82,19 +64,10 @@ public ServerAlarmRule findByPK(int keyId, Readset readset) thr public int insert(ServerAlarmRule proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { ServerAlarmRuleDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - ServerAlarmRuleDO record = toRecord(proto); - int count = session.getMapper(ServerAlarmRuleMapper.class).insert(record); - session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); return count; @@ -106,14 +79,8 @@ public int insert(ServerAlarmRule proto) throws DalException { public int updateByPK(ServerAlarmRule proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(ServerAlarmRuleMapper.class).updateByPrimaryKey(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for ServerAlarmRule.", e); } diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java index 2e3fed4dea..fc0db2611b 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java @@ -4,7 +4,6 @@ import com.dianping.cat.core.mybatis.generated.user.define.rule.dao.UserDefineRuleMapper; import com.dianping.cat.core.mybatis.generated.user.define.rule.dao.data.UserDefineRuleDO; import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; -import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; @@ -30,14 +29,8 @@ public UserDefineRule createLocal() { public int deleteByPK(UserDefineRule proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(UserDefineRuleMapper.class).deleteByPrimaryKey(proto.getKeyId()); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for UserDefineRule.", e); } @@ -46,13 +39,8 @@ public int deleteByPK(UserDefineRule proto) throws DalException { public UserDefineRule findByPK(int keyId, Readset readset) throws DalException { UserDefineRuleMapper mapper = springMapper(LOGGER); - if (mapper != null) { + try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - UserDefineRuleDO record = session.getMapper(UserDefineRuleMapper.class).findByPrimaryKey(keyId); - return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -64,17 +52,10 @@ public UserDefineRule findMaxId(Readset readset) throws DalExcep UserDefineRuleMapper mapper = springMapper(LOGGER); UserDefineRuleDO record = new UserDefineRuleDO(); - if (mapper != null) { + try { UserDefineRuleDO result = mapper.findMaxId(record).stream().findFirst().orElse(null); return requireFound(result, "findMaxId", record.toString()); - } - - try (SqlSession session = openSession()) { - UserDefineRuleDO result = session.getMapper(UserDefineRuleMapper.class).findMaxId(record).stream() - .findFirst() - .orElse(null); - return requireFound(result, "findMaxId", record.toString()); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -85,19 +66,10 @@ public UserDefineRule findMaxId(Readset readset) throws DalExcep public int insert(UserDefineRule proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { UserDefineRuleDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - UserDefineRuleDO record = toRecord(proto); - int count = session.getMapper(UserDefineRuleMapper.class).insert(record); - session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); return count; @@ -109,14 +81,8 @@ public int insert(UserDefineRule proto) throws DalException { public int updateByPK(UserDefineRule proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(UserDefineRuleMapper.class).updateByPrimaryKey(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for UserDefineRule.", e); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java index 86d0b9784b..0856dff8bd 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java @@ -1,22 +1,9 @@ package com.dianping.cat.core.config.repository; -import java.io.IOException; -import java.io.Reader; -import java.sql.Connection; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; -import javax.sql.DataSource; - -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.builder.xml.XMLMapperBuilder; -import org.apache.ibatis.io.Resources; -import org.apache.ibatis.mapping.Environment; -import org.apache.ibatis.session.Configuration; -import org.apache.ibatis.session.SqlSessionFactory; -import org.apache.ibatis.session.SqlSessionFactoryBuilder; -import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +12,6 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -import org.unidal.dal.jdbc.datasource.DataSourceManager; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.dao.ConfigMapper; @@ -34,20 +20,12 @@ public class ConfigRepository { private static final Logger LOGGER = LoggerFactory.getLogger(ConfigRepository.class); - private static final String DATA_SOURCE_NAME = "cat"; - - private static final String MAPPER_RESOURCE = "mybatis/mapper/ConfigMapper.xml"; - private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - private DataSourceManager m_dataSourceManager; - private SqlSessionTemplate m_sqlSessionTemplate; private TransactionTemplate m_transactionTemplate; - private volatile SqlSessionFactory m_sqlSessionFactory; - public Config createLocal() { return new Config(); } @@ -55,140 +33,49 @@ public Config createLocal() { public int deleteByPK(Config proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().deleteById(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(ConfigMapper.class).deleteById(proto.getKeyId()); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when deleting config by primary key: " + proto, e); - } + return transactionTemplate.execute(status -> springMapper().deleteById(proto.getKeyId())); } public List findAllConfig(Readset readset) throws DalException { ConfigMapper mapper = springMapper(); - if (mapper != null) { - return mapper.queryAll().stream().map(this::toConfig).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(ConfigMapper.class).queryAll().stream() - .map(this::toConfig) - .collect(Collectors.toList()); - } catch (Exception e) { - throw new DalException("Error when finding all config records.", e); - } + return mapper.queryAll().stream().map(this::toConfig).collect(Collectors.toList()); } public Config findByName(String name, Readset readset) throws DalException { ConfigMapper mapper = springMapper(); - if (mapper != null) { - return requireFound(mapper.findByName(name), "name", name); - } - - try (SqlSession session = openSession()) { - ConfigDO config = session.getMapper(ConfigMapper.class).findByName(name); - - return requireFound(config, "name", name); - } catch (DalException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when finding config by name: " + name, e); - } + return requireFound(mapper.findByName(name), "name", name); } public Config findByPK(int keyId, Readset readset) throws DalException { ConfigMapper mapper = springMapper(); - if (mapper != null) { - return requireFound(mapper.findById(keyId), "id", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - ConfigDO config = session.getMapper(ConfigMapper.class).findById(keyId); - - return requireFound(config, "id", String.valueOf(keyId)); - } catch (DalException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when finding config by primary key: " + keyId, e); - } + return requireFound(mapper.findById(keyId), "id", String.valueOf(keyId)); } public int insert(Config proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - ConfigDO config = toConfigDO(proto); - int count = transactionTemplate.execute(status -> springMapper().insert(config)); - - proto.setId(config.getId()); - proto.setKeyId(config.getId()); - return count; - } - - try (SqlSession session = openSession()) { - ConfigDO config = toConfigDO(proto); - int count = session.getMapper(ConfigMapper.class).insert(config); + ConfigDO config = toConfigDO(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(config)); - session.commit(); - proto.setId(config.getId()); - proto.setKeyId(config.getId()); - return count; - } catch (Exception e) { - throw new DalException("Error when inserting config: " + proto, e); - } + proto.setId(config.getId()); + proto.setKeyId(config.getId()); + return count; } public int updateByPK(Config proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateById(toConfigDO(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(ConfigMapper.class).updateById(toConfigDO(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when updating config by primary key: " + proto, e); - } - } - - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - sqlSessionFactory = newSqlSessionFactory(); - m_sqlSessionFactory = sqlSessionFactory; - } - } - } - - return sqlSessionFactory; - } - - private SqlSession openSession() { - return getSqlSessionFactory().openSession(false); + return transactionTemplate.execute(status -> springMapper().updateById(toConfigDO(proto))); } private ConfigMapper springMapper() { SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; if (sqlSessionTemplate == null) { - return null; + throw new IllegalStateException("Spring SqlSessionTemplate is not configured for ConfigMapper."); } if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { @@ -199,6 +86,9 @@ private ConfigMapper springMapper() { } private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate == null) { + throw new IllegalStateException("Spring TransactionTemplate is not configured for ConfigMapper."); + } return m_transactionTemplate; } @@ -218,26 +108,6 @@ private Config requireFound(ConfigDO config, String field, String value) throws return toConfig(config); } - private SqlSessionFactory newSqlSessionFactory() { - Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), - new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); - - configuration.addMapper(ConfigMapper.class); - loadMapperXml(configuration); - return new SqlSessionFactoryBuilder().build(configuration); - } - - private void loadMapperXml(Configuration configuration) { - try (Reader reader = Resources.getResourceAsReader(MAPPER_RESOURCE)) { - XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, MAPPER_RESOURCE, - configuration.getSqlFragments()); - - mapperParser.parse(); - } catch (IOException e) { - throw new IllegalStateException("Error when loading MyBatis mapper: " + MAPPER_RESOURCE, e); - } - } - private Config toConfig(ConfigDO configDO) { Config config = new Config(); @@ -261,57 +131,4 @@ private ConfigDO toConfigDO(Config config) { return configDO; } - private static final class UnidalDataSource implements DataSource { - private final DataSourceManager m_dataSourceManager; - - private final String m_dataSourceName; - - private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { - m_dataSourceManager = dataSourceManager; - m_dataSourceName = dataSourceName; - } - - @Override - public Connection getConnection() throws java.sql.SQLException { - return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); - } - - @Override - public Connection getConnection(String username, String password) throws java.sql.SQLException { - return getConnection(); - } - - @Override - public int getLoginTimeout() { - return 0; - } - - @Override - public java.io.PrintWriter getLogWriter() { - return null; - } - - @Override - public java.util.logging.Logger getParentLogger() { - return java.util.logging.Logger.getGlobal(); - } - - @Override - public boolean isWrapperFor(Class iface) { - return false; - } - - @Override - public void setLoginTimeout(int seconds) { - } - - @Override - public void setLogWriter(java.io.PrintWriter out) { - } - - @Override - public T unwrap(Class iface) throws java.sql.SQLException { - throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); - } - } } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java index 305a2055e8..77f1ddb6c8 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java @@ -2,29 +2,17 @@ import java.util.concurrent.atomic.AtomicBoolean; -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.datasource.DataSourceManager; public abstract class SpringBackedRepositorySupport { - private static final Logger LOGGER = LoggerFactory.getLogger(SpringBackedRepositorySupport.class); - - private DataSourceManager m_dataSourceManager; - private final Class m_mapperClass; - private final String m_mapperResource; - private final String m_springMapperMessage; private final AtomicBoolean m_springMapperLogged = new AtomicBoolean(); - private volatile SqlSessionFactory m_sqlSessionFactory; - private SqlSessionTemplate m_sqlSessionTemplate; private TransactionTemplate m_transactionTemplate; @@ -32,27 +20,27 @@ public abstract class SpringBackedRepositorySupport { protected SpringBackedRepositorySupport(Class mapperClass, String mapperResource, String springMapperMessage) { m_mapperClass = mapperClass; - m_mapperResource = mapperResource; m_springMapperMessage = springMapperMessage; } - protected SqlSession openSession() { - return getSqlSessionFactory().openSession(false); - } - protected T springMapper(Logger logger) { SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; - if (sqlSessionTemplate != null) { - if (m_springMapperLogged.compareAndSet(false, true)) { - logger.info(m_springMapperMessage); - } - return sqlSessionTemplate.getMapper(m_mapperClass); + if (sqlSessionTemplate == null) { + throw new IllegalStateException("Spring SqlSessionTemplate is not configured for " + + m_mapperClass.getName() + "."); } - return null; + if (m_springMapperLogged.compareAndSet(false, true)) { + logger.info(m_springMapperMessage); + } + return sqlSessionTemplate.getMapper(m_mapperClass); } protected TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate == null) { + throw new IllegalStateException("Spring TransactionTemplate is not configured for " + + m_mapperClass.getName() + "."); + } return m_transactionTemplate; } @@ -63,28 +51,4 @@ public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - if (m_dataSourceManager == null) { - LOGGER.error("Cannot create fallback MyBatis SqlSessionFactory for mapper {} because " - + "DataSourceManager is not injected. Spring mapper is unavailable and legacy " - + "Unidal datasource fallback cannot be used.", m_mapperClass.getName()); - } - - sqlSessionFactory = SupportingMyBatisRepository.newSqlSessionFactory(m_dataSourceManager, - m_mapperClass, m_mapperResource); - m_sqlSessionFactory = sqlSessionFactory; - } - } - } - - return sqlSessionFactory; - } } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SupportingMyBatisRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SupportingMyBatisRepository.java deleted file mode 100644 index be9f846884..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SupportingMyBatisRepository.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.dianping.cat.core.mybatis.repository; - -import java.io.IOException; -import java.io.Reader; -import java.sql.Connection; - -import javax.sql.DataSource; - -import org.apache.ibatis.builder.xml.XMLMapperBuilder; -import org.apache.ibatis.io.Resources; -import org.apache.ibatis.mapping.Environment; -import org.apache.ibatis.session.Configuration; -import org.apache.ibatis.session.SqlSessionFactory; -import org.apache.ibatis.session.SqlSessionFactoryBuilder; -import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; -import org.unidal.dal.jdbc.datasource.DataSourceManager; - -public final class SupportingMyBatisRepository { - private static final String DATA_SOURCE_NAME = "cat"; - - private SupportingMyBatisRepository() { - } - - public static SqlSessionFactory newSqlSessionFactory(DataSourceManager dataSourceManager, Class mapperClass, - String mapperResource) { - Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), - new UnidalDataSource(dataSourceManager, DATA_SOURCE_NAME))); - - configuration.addMapper(mapperClass); - loadMapperXml(configuration, mapperResource); - return new SqlSessionFactoryBuilder().build(configuration); - } - - private static void loadMapperXml(Configuration configuration, String mapperResource) { - try (Reader reader = Resources.getResourceAsReader(mapperResource)) { - XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, mapperResource, - configuration.getSqlFragments()); - - mapperParser.parse(); - } catch (IOException e) { - throw new IllegalStateException("Error when loading MyBatis mapper: " + mapperResource, e); - } - } - - private static final class UnidalDataSource implements DataSource { - private final DataSourceManager m_dataSourceManager; - - private final String m_dataSourceName; - - private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { - m_dataSourceManager = dataSourceManager; - m_dataSourceName = dataSourceName; - } - - @Override - public Connection getConnection() throws java.sql.SQLException { - return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); - } - - @Override - public Connection getConnection(String username, String password) throws java.sql.SQLException { - return getConnection(); - } - - @Override - public int getLoginTimeout() { - return 0; - } - - @Override - public java.io.PrintWriter getLogWriter() { - return null; - } - - @Override - public java.util.logging.Logger getParentLogger() { - return java.util.logging.Logger.getGlobal(); - } - - @Override - public boolean isWrapperFor(Class iface) { - return false; - } - - @Override - public void setLoginTimeout(int seconds) { - } - - @Override - public void setLogWriter(java.io.PrintWriter out) { - } - - @Override - public T unwrap(Class iface) throws java.sql.SQLException { - throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); - } - } -} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java index 0a194e6b0e..5da14fedb0 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java @@ -4,8 +4,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,28 +12,20 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -import org.unidal.dal.jdbc.datasource.DataSourceManager; import com.dianping.cat.core.config.BusinessConfig; import com.dianping.cat.core.mybatis.generated.business.config.dao.BusinessConfigMapper; import com.dianping.cat.core.mybatis.generated.business.config.dao.data.BusinessConfigDO; -import com.dianping.cat.core.mybatis.repository.SupportingMyBatisRepository; public class BusinessConfigRepository { private static final Logger LOGGER = LoggerFactory.getLogger(BusinessConfigRepository.class); - private static final String MAPPER_RESOURCE = "mybatis/mapper/BusinessConfigMapper.xml"; - private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - private DataSourceManager m_dataSourceManager; - private SqlSessionTemplate m_sqlSessionTemplate; private TransactionTemplate m_transactionTemplate; - private volatile SqlSessionFactory m_sqlSessionFactory; - public BusinessConfig createLocal() { return new BusinessConfig(); } @@ -43,18 +33,7 @@ public BusinessConfig createLocal() { public int deleteByPK(BusinessConfig proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(BusinessConfigMapper.class).deleteByPrimaryKey(proto.getKeyId()); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for BusinessConfig.", e); - } + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } public List findByName(String name, Readset readset) throws DalException { @@ -62,35 +41,13 @@ public List findByName(String name, Readset read BusinessConfigDO record = new BusinessConfigDO(); record.setName(name); - if (mapper != null) { - return mapper.findByName(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(BusinessConfigMapper.class).findByName(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); - } catch (Exception e) { - throw new DalException("Error when executing findByName for BusinessConfig.", e); - } + return mapper.findByName(record).stream().map(this::toModel).collect(Collectors.toList()); } public BusinessConfig findByPK(int keyId, Readset readset) throws DalException { BusinessConfigMapper mapper = springMapper(); - if (mapper != null) { - return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - BusinessConfigDO record = session.getMapper(BusinessConfigMapper.class).findByPrimaryKey(keyId); - - return requireFound(record, "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when executing findByPK for BusinessConfig.", e); - } + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } public BusinessConfig findByNameDomain(String name, String domain, Readset readset) @@ -100,119 +57,49 @@ public BusinessConfig findByNameDomain(String name, String domain, Readset springMapper().insert(record)); - - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - BusinessConfigDO record = toRecord(proto); - int count = session.getMapper(BusinessConfigMapper.class).insert(record); + BusinessConfigDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(record)); - session.commit(); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } catch (Exception e) { - throw new DalException("Error when executing insert for BusinessConfig.", e); - } + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; } public int updateByPK(BusinessConfig proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(BusinessConfigMapper.class).updateByPrimaryKey(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing updateByPK for BusinessConfig.", e); - } + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } public int updateBaseConfigByDomain(BusinessConfig proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateBaseConfigByDomain(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(BusinessConfigMapper.class).updateBaseConfigByDomain(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing updateBaseConfigByDomain for BusinessConfig.", e); - } - } - - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - sqlSessionFactory = SupportingMyBatisRepository.newSqlSessionFactory(m_dataSourceManager, - BusinessConfigMapper.class, MAPPER_RESOURCE); - m_sqlSessionFactory = sqlSessionFactory; - } - } - } - - return sqlSessionFactory; - } - - private SqlSession openSession() { - return getSqlSessionFactory().openSession(false); + return transactionTemplate.execute(status -> springMapper().updateBaseConfigByDomain(toRecord(proto))); } private BusinessConfigMapper springMapper() { - if (m_sqlSessionTemplate != null) { - if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { - LOGGER.info("BusinessConfigRepository is using Spring managed BusinessConfigMapper."); - } - - return m_sqlSessionTemplate.getMapper(BusinessConfigMapper.class); + if (m_sqlSessionTemplate == null) { + throw new IllegalStateException("Spring SqlSessionTemplate is not configured for BusinessConfigMapper."); + } + if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { + LOGGER.info("BusinessConfigRepository is using Spring managed BusinessConfigMapper."); } - return null; + return m_sqlSessionTemplate.getMapper(BusinessConfigMapper.class); } private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate == null) { + throw new IllegalStateException("Spring TransactionTemplate is not configured for BusinessConfigMapper."); + } return m_transactionTemplate; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java index 555b4e8d71..e6ed90bf88 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java @@ -4,8 +4,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,31 +12,20 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -import org.unidal.dal.jdbc.datasource.DataSourceManager; import com.dianping.cat.core.dal.DailyReportContent; import com.dianping.cat.core.mybatis.generated.daily.report.content.dao.DailyReportContentMapper; import com.dianping.cat.core.mybatis.generated.daily.report.content.dao.data.DailyReportContentDO; -import com.dianping.cat.core.mybatis.repository.SupportingMyBatisRepository; public class DailyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(DailyReportContentRepository.class); - private static final String MAPPER_RESOURCE = "mybatis/mapper/DailyReportContentMapper.xml"; - private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - private DataSourceManager m_dataSourceManager; private SqlSessionTemplate m_sqlSessionTemplate; private TransactionTemplate m_transactionTemplate; - private volatile SqlSessionFactory m_sqlSessionFactory; - - public void setDataSourceManager(DataSourceManager dataSourceManager) { - m_dataSourceManager = dataSourceManager; - } - public DailyReportContent createLocal() { return new DailyReportContent(); } @@ -46,15 +33,8 @@ public DailyReportContent createLocal() { public int deleteByPK(DailyReportContent proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyReportId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(DailyReportContentMapper.class).deleteByPrimaryKey(proto.getKeyReportId()); - - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for DailyReportContent.", e); } @@ -66,14 +46,8 @@ public List findOverloadReport(int startId, Readset findOverloadReport(int startId, Readset readset) throws DalException { DailyReportContentMapper mapper = springMapper(); - if (mapper != null) { + try { return requireFound(mapper.findByPrimaryKey(keyReportId), "primary key", String.valueOf(keyReportId)); - } - - try (SqlSession session = openSession()) { - DailyReportContentDO record = session.getMapper(DailyReportContentMapper.class).findByPrimaryKey(keyReportId); - - return requireFound(record, "primary key", String.valueOf(keyReportId)); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -100,16 +68,8 @@ public DailyReportContent findByPK(int keyReportId, Readset public int insert(DailyReportContent proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper().insert(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - DailyReportContentDO record = toRecord(proto); - int count = session.getMapper(DailyReportContentMapper.class).insert(record); - - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing insert for DailyReportContent.", e); } @@ -118,45 +78,16 @@ public int insert(DailyReportContent proto) throws DalException { public int updateByPK(DailyReportContent proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(DailyReportContentMapper.class).updateByPrimaryKey(toRecord(proto)); - - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for DailyReportContent.", e); } } - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - sqlSessionFactory = SupportingMyBatisRepository.newSqlSessionFactory(m_dataSourceManager, - DailyReportContentMapper.class, MAPPER_RESOURCE); - m_sqlSessionFactory = sqlSessionFactory; - } - } - } - - return sqlSessionFactory; - } - - private SqlSession openSession() { - return getSqlSessionFactory().openSession(false); - } - private DailyReportContentMapper springMapper() { if (m_sqlSessionTemplate == null) { - return null; + throw new IllegalStateException("Spring SqlSessionTemplate is not configured for DailyReportContentMapper."); } if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { LOGGER.info("DailyReportContentRepository is using Spring managed DailyReportContentMapper."); @@ -165,6 +96,9 @@ private DailyReportContentMapper springMapper() { } private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate == null) { + throw new IllegalStateException("Spring TransactionTemplate is not configured for DailyReportContentMapper."); + } return m_transactionTemplate; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java index cab95f9d2a..7e140a8120 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java @@ -1,22 +1,9 @@ package com.dianping.cat.core.mybatis.repository.hostinfo; -import java.io.IOException; -import java.io.Reader; -import java.sql.Connection; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; -import javax.sql.DataSource; - -import org.apache.ibatis.builder.xml.XMLMapperBuilder; -import org.apache.ibatis.io.Resources; -import org.apache.ibatis.mapping.Environment; -import org.apache.ibatis.session.Configuration; -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; -import org.apache.ibatis.session.SqlSessionFactoryBuilder; -import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +12,6 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -import org.unidal.dal.jdbc.datasource.DataSourceManager; import com.dianping.cat.core.dal.Hostinfo; import com.dianping.cat.core.mybatis.generated.hostinfo.dao.HostinfoMapper; @@ -34,20 +20,12 @@ public class HostinfoRepository { private static final Logger LOGGER = LoggerFactory.getLogger(HostinfoRepository.class); - private static final String DATA_SOURCE_NAME = "cat"; - - private static final String MAPPER_RESOURCE = "mybatis/mapper/HostinfoMapper.xml"; - private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - private DataSourceManager m_dataSourceManager; - private SqlSessionTemplate m_sqlSessionTemplate; private TransactionTemplate m_transactionTemplate; - private volatile SqlSessionFactory m_sqlSessionFactory; - public Hostinfo createLocal() { return new Hostinfo(); } @@ -55,56 +33,21 @@ public Hostinfo createLocal() { public int deleteByPK(Hostinfo proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(HostinfoMapper.class).deleteByPrimaryKey(proto.getKeyId()); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for Hostinfo.", e); - } + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } public List findAllIp(Readset readset) throws DalException { HostinfoMapper mapper = springMapper(); - if (mapper != null) { - HostinfoDO record = new HostinfoDO(); - - return mapper.findAllIp(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - HostinfoDO record = new HostinfoDO(); + HostinfoDO record = new HostinfoDO(); - return session.getMapper(HostinfoMapper.class).findAllIp(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); - } catch (Exception e) { - throw new DalException("Error when executing findAllIp for Hostinfo.", e); - } + return mapper.findAllIp(record).stream().map(this::toModel).collect(Collectors.toList()); } public Hostinfo findByPK(int keyId, Readset readset) throws DalException { HostinfoMapper mapper = springMapper(); - if (mapper != null) { - return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - HostinfoDO record = session.getMapper(HostinfoMapper.class).findByPrimaryKey(keyId); - - return requireFound(record, "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when executing findByPK for Hostinfo.", e); - } + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } public Hostinfo findByIp(String ip, Readset readset) throws DalException { @@ -112,112 +55,33 @@ public Hostinfo findByIp(String ip, Readset readset) throws DalExcepti HostinfoDO record = new HostinfoDO(); record.setIp(ip); - if (mapper != null) { - HostinfoDO result = mapper.findByIp(record).stream().findFirst().orElse(null); - - return requireFound(result, "findByIp", record.toString()); - } + HostinfoDO result = mapper.findByIp(record).stream().findFirst().orElse(null); - try (SqlSession session = openSession()) { - HostinfoDO result = session.getMapper(HostinfoMapper.class).findByIp(record).stream().findFirst() - .orElse(null); - - return requireFound(result, "findByIp", record.toString()); - } catch (DalNotFoundException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when executing findByIp for Hostinfo.", e); - } + return requireFound(result, "findByIp", record.toString()); } public int insert(Hostinfo proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - HostinfoDO record = toRecord(proto); - int count = transactionTemplate.execute(status -> springMapper().insert(record)); + HostinfoDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(record)); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - HostinfoDO record = toRecord(proto); - int count = session.getMapper(HostinfoMapper.class).insert(record); - - session.commit(); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } catch (Exception e) { - throw new DalException("Error when executing insert for Hostinfo.", e); - } + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; } public int updateByPK(Hostinfo proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(HostinfoMapper.class).updateByPrimaryKey(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing updateByPK for Hostinfo.", e); - } - } - - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - sqlSessionFactory = newSqlSessionFactory(); - m_sqlSessionFactory = sqlSessionFactory; - } - } - } - - return sqlSessionFactory; - } - - private void loadMapperXml(Configuration configuration) { - try (Reader reader = Resources.getResourceAsReader(MAPPER_RESOURCE)) { - XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, MAPPER_RESOURCE, - configuration.getSqlFragments()); - - mapperParser.parse(); - } catch (IOException e) { - throw new IllegalStateException("Error when loading MyBatis mapper: " + MAPPER_RESOURCE, e); - } - } - - private SqlSessionFactory newSqlSessionFactory() { - Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), - new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); - - configuration.addMapper(HostinfoMapper.class); - loadMapperXml(configuration); - return new SqlSessionFactoryBuilder().build(configuration); - } - - private SqlSession openSession() { - return getSqlSessionFactory().openSession(false); + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } private HostinfoMapper springMapper() { SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; if (sqlSessionTemplate == null) { - return null; + throw new IllegalStateException("Spring SqlSessionTemplate is not configured for HostinfoMapper."); } if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { @@ -228,6 +92,9 @@ private HostinfoMapper springMapper() { } private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate == null) { + throw new IllegalStateException("Spring TransactionTemplate is not configured for HostinfoMapper."); + } return m_transactionTemplate; } @@ -285,57 +152,4 @@ private HostinfoDO toRecord(Hostinfo model) { return record; } - private static final class UnidalDataSource implements DataSource { - private final DataSourceManager m_dataSourceManager; - - private final String m_dataSourceName; - - private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { - m_dataSourceManager = dataSourceManager; - m_dataSourceName = dataSourceName; - } - - @Override - public Connection getConnection() throws java.sql.SQLException { - return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); - } - - @Override - public Connection getConnection(String username, String password) throws java.sql.SQLException { - return getConnection(); - } - - @Override - public int getLoginTimeout() { - return 0; - } - - @Override - public java.io.PrintWriter getLogWriter() { - return null; - } - - @Override - public java.util.logging.Logger getParentLogger() { - return java.util.logging.Logger.getGlobal(); - } - - @Override - public boolean isWrapperFor(Class iface) { - return false; - } - - @Override - public void setLoginTimeout(int seconds) { - } - - @Override - public void setLogWriter(java.io.PrintWriter out) { - } - - @Override - public T unwrap(Class iface) throws java.sql.SQLException { - throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); - } - } } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java index 0f83292052..a05d998834 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java @@ -4,8 +4,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,31 +12,20 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -import org.unidal.dal.jdbc.datasource.DataSourceManager; import com.dianping.cat.core.dal.HourlyReportContent; import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.HourlyReportContentMapper; import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.data.HourlyReportContentDO; -import com.dianping.cat.core.mybatis.repository.SupportingMyBatisRepository; public class HourlyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(HourlyReportContentRepository.class); - private static final String MAPPER_RESOURCE = "mybatis/mapper/HourlyReportContentMapper.xml"; - private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - private DataSourceManager m_dataSourceManager; private SqlSessionTemplate m_sqlSessionTemplate; private TransactionTemplate m_transactionTemplate; - private volatile SqlSessionFactory m_sqlSessionFactory; - - public void setDataSourceManager(DataSourceManager dataSourceManager) { - m_dataSourceManager = dataSourceManager; - } - public HourlyReportContent createLocal() { return new HourlyReportContent(); } @@ -46,15 +33,8 @@ public HourlyReportContent createLocal() { public int deleteByPK(HourlyReportContent proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyReportId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(HourlyReportContentMapper.class).deleteByPrimaryKey(proto.getKeyReportId()); - - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for HourlyReportContent.", e); } @@ -66,14 +46,8 @@ public List findOverloadReport(int startId, Readset springMapper().insert(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - HourlyReportContentDO record = toRecord(proto); - int count = session.getMapper(HourlyReportContentMapper.class).insert(record); - - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing insert for HourlyReportContent.", e); } @@ -120,45 +79,16 @@ public int insert(HourlyReportContent proto) throws DalException { public int updateByPK(HourlyReportContent proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(HourlyReportContentMapper.class).updateByPrimaryKey(toRecord(proto)); - - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for HourlyReportContent.", e); } } - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - sqlSessionFactory = SupportingMyBatisRepository.newSqlSessionFactory(m_dataSourceManager, - HourlyReportContentMapper.class, MAPPER_RESOURCE); - m_sqlSessionFactory = sqlSessionFactory; - } - } - } - - return sqlSessionFactory; - } - - private SqlSession openSession() { - return getSqlSessionFactory().openSession(false); - } - private HourlyReportContentMapper springMapper() { if (m_sqlSessionTemplate == null) { - return null; + throw new IllegalStateException("Spring SqlSessionTemplate is not configured for HourlyReportContentMapper."); } if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { LOGGER.info("HourlyReportContentRepository is using Spring managed HourlyReportContentMapper."); @@ -167,6 +97,9 @@ private HourlyReportContentMapper springMapper() { } private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate == null) { + throw new IllegalStateException("Spring TransactionTemplate is not configured for HourlyReportContentMapper."); + } return m_transactionTemplate; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java index 64b5eedfa8..5a2949d21b 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java @@ -1,22 +1,9 @@ package com.dianping.cat.core.mybatis.repository.hourlyreport; -import java.io.IOException; -import java.io.Reader; -import java.sql.Connection; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; -import javax.sql.DataSource; - -import org.apache.ibatis.builder.xml.XMLMapperBuilder; -import org.apache.ibatis.io.Resources; -import org.apache.ibatis.mapping.Environment; -import org.apache.ibatis.session.Configuration; -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; -import org.apache.ibatis.session.SqlSessionFactoryBuilder; -import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +12,6 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -import org.unidal.dal.jdbc.datasource.DataSourceManager; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.HourlyreportMapper; @@ -34,23 +20,12 @@ public class HourlyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(HourlyReportRepository.class); - private static final String DATA_SOURCE_NAME = "cat"; - - private static final String MAPPER_RESOURCE = "mybatis/mapper/HourlyreportMapper.xml"; - private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - private DataSourceManager m_dataSourceManager; private SqlSessionTemplate m_sqlSessionTemplate; private TransactionTemplate m_transactionTemplate; - private volatile SqlSessionFactory m_sqlSessionFactory; - - public void setDataSourceManager(DataSourceManager dataSourceManager) { - m_dataSourceManager = dataSourceManager; - } - public HourlyReport createLocal() { return new HourlyReport(); } @@ -58,18 +33,7 @@ public HourlyReport createLocal() { public int deleteByPK(HourlyReport proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(HourlyreportMapper.class).deleteByPrimaryKey(proto.getKeyId()); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for HourlyReport.", e); - } + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } public List findAllByDomainNamePeriod(java.util.Date period, String domain, String name, @@ -80,17 +44,7 @@ public List findAllByDomainNamePeriod(java.util.Date period, Strin record.setPeriod(period); record.setDomain(domain); record.setName(name); - if (mapper != null) { - return mapper.findAllByDomainNamePeriod(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(HourlyreportMapper.class).findAllByDomainNamePeriod(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); - } catch (Exception e) { - throw new DalException("Error when executing findAllByDomainNamePeriod for HourlyReport.", e); - } + return mapper.findAllByDomainNamePeriod(record).stream().map(this::toModel).collect(Collectors.toList()); } public List findAllByPeriodName(java.util.Date period, String name, Readset readset) @@ -100,125 +54,37 @@ public List findAllByPeriodName(java.util.Date period, String name record.setPeriod(period); record.setName(name); - if (mapper != null) { - return mapper.findAllByPeriodName(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(HourlyreportMapper.class).findAllByPeriodName(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); - } catch (Exception e) { - throw new DalException("Error when executing findAllByPeriodName for HourlyReport.", e); - } + return mapper.findAllByPeriodName(record).stream().map(this::toModel).collect(Collectors.toList()); } public HourlyReport findByPK(int keyId, Readset readset) throws DalException { HourlyreportMapper mapper = springMapper(); - if (mapper != null) { - return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - HourlyreportDO record = session.getMapper(HourlyreportMapper.class).findByPrimaryKey(keyId); - - return requireFound(record, "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when executing findByPK for HourlyReport.", e); - } + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } public int insert(HourlyReport proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - HourlyreportDO record = toRecord(proto); - int count = transactionTemplate.execute(status -> springMapper().insert(record)); - - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - HourlyreportDO record = toRecord(proto); - int count = session.getMapper(HourlyreportMapper.class).insert(record); + HourlyreportDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(record)); - session.commit(); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } catch (Exception e) { - throw new DalException("Error when executing insert for HourlyReport.", e); - } + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; } public int updateByPK(HourlyReport proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(HourlyreportMapper.class).updateByPrimaryKey(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing updateByPK for HourlyReport.", e); - } - } - - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - sqlSessionFactory = newSqlSessionFactory(); - m_sqlSessionFactory = sqlSessionFactory; - } - } - } - - return sqlSessionFactory; - } - - private void loadMapperXml(Configuration configuration) { - try (Reader reader = Resources.getResourceAsReader(MAPPER_RESOURCE)) { - XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, MAPPER_RESOURCE, - configuration.getSqlFragments()); - - mapperParser.parse(); - } catch (IOException e) { - throw new IllegalStateException("Error when loading MyBatis mapper: " + MAPPER_RESOURCE, e); - } - } - - private SqlSessionFactory newSqlSessionFactory() { - Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), - new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); - - configuration.addMapper(HourlyreportMapper.class); - loadMapperXml(configuration); - return new SqlSessionFactoryBuilder().build(configuration); - } - - private SqlSession openSession() { - return getSqlSessionFactory().openSession(false); + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } private HourlyreportMapper springMapper() { SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; if (sqlSessionTemplate == null) { - return null; + throw new IllegalStateException("Spring SqlSessionTemplate is not configured for HourlyreportMapper."); } if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { @@ -229,6 +95,9 @@ private HourlyreportMapper springMapper() { } private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate == null) { + throw new IllegalStateException("Spring TransactionTemplate is not configured for HourlyreportMapper."); + } return m_transactionTemplate; } @@ -290,57 +159,4 @@ private HourlyreportDO toRecord(HourlyReport model) { return record; } - private static final class UnidalDataSource implements DataSource { - private final DataSourceManager m_dataSourceManager; - - private final String m_dataSourceName; - - private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { - m_dataSourceManager = dataSourceManager; - m_dataSourceName = dataSourceName; - } - - @Override - public Connection getConnection() throws java.sql.SQLException { - return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); - } - - @Override - public Connection getConnection(String username, String password) throws java.sql.SQLException { - return getConnection(); - } - - @Override - public int getLoginTimeout() { - return 0; - } - - @Override - public java.io.PrintWriter getLogWriter() { - return null; - } - - @Override - public java.util.logging.Logger getParentLogger() { - return java.util.logging.Logger.getGlobal(); - } - - @Override - public boolean isWrapperFor(Class iface) { - return false; - } - - @Override - public void setLoginTimeout(int seconds) { - } - - @Override - public void setLogWriter(java.io.PrintWriter out) { - } - - @Override - public T unwrap(Class iface) throws java.sql.SQLException { - throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); - } - } } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java index e484544733..f590c23582 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java @@ -4,8 +4,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,31 +12,20 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -import org.unidal.dal.jdbc.datasource.DataSourceManager; import com.dianping.cat.core.dal.MonthlyReportContent; import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.MonthlyReportContentMapper; import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.data.MonthlyReportContentDO; -import com.dianping.cat.core.mybatis.repository.SupportingMyBatisRepository; public class MonthlyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(MonthlyReportContentRepository.class); - private static final String MAPPER_RESOURCE = "mybatis/mapper/MonthlyReportContentMapper.xml"; - private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - private DataSourceManager m_dataSourceManager; private SqlSessionTemplate m_sqlSessionTemplate; private TransactionTemplate m_transactionTemplate; - private volatile SqlSessionFactory m_sqlSessionFactory; - - public void setDataSourceManager(DataSourceManager dataSourceManager) { - m_dataSourceManager = dataSourceManager; - } - public MonthlyReportContent createLocal() { return new MonthlyReportContent(); } @@ -46,15 +33,8 @@ public MonthlyReportContent createLocal() { public int deleteByPK(MonthlyReportContent proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyReportId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(MonthlyReportContentMapper.class).deleteByPrimaryKey(proto.getKeyReportId()); - - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for MonthlyReportContent.", e); } @@ -66,14 +46,8 @@ public List findOverloadReport(int startId, Readset findOverloadReport(int startId, Readset readset) throws DalException { MonthlyReportContentMapper mapper = springMapper(); - if (mapper != null) { + try { return requireFound(mapper.findByPrimaryKey(keyReportId), "primary key", String.valueOf(keyReportId)); - } - - try (SqlSession session = openSession()) { - MonthlyReportContentDO record = session.getMapper(MonthlyReportContentMapper.class) - .findByPrimaryKey(keyReportId); - - return requireFound(record, "primary key", String.valueOf(keyReportId)); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -101,16 +68,8 @@ public MonthlyReportContent findByPK(int keyReportId, Readset springMapper().insert(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - MonthlyReportContentDO record = toRecord(proto); - int count = session.getMapper(MonthlyReportContentMapper.class).insert(record); - - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing insert for MonthlyReportContent.", e); } @@ -119,45 +78,16 @@ public int insert(MonthlyReportContent proto) throws DalException { public int updateByPK(MonthlyReportContent proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(MonthlyReportContentMapper.class).updateByPrimaryKey(toRecord(proto)); - - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for MonthlyReportContent.", e); } } - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - sqlSessionFactory = SupportingMyBatisRepository.newSqlSessionFactory(m_dataSourceManager, - MonthlyReportContentMapper.class, MAPPER_RESOURCE); - m_sqlSessionFactory = sqlSessionFactory; - } - } - } - - return sqlSessionFactory; - } - - private SqlSession openSession() { - return getSqlSessionFactory().openSession(false); - } - private MonthlyReportContentMapper springMapper() { if (m_sqlSessionTemplate == null) { - return null; + throw new IllegalStateException("Spring SqlSessionTemplate is not configured for MonthlyReportContentMapper."); } if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { LOGGER.info("MonthlyReportContentRepository is using Spring managed MonthlyReportContentMapper."); @@ -166,6 +96,9 @@ private MonthlyReportContentMapper springMapper() { } private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate == null) { + throw new IllegalStateException("Spring TransactionTemplate is not configured for MonthlyReportContentMapper."); + } return m_transactionTemplate; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java index f07a02957b..a0ff272867 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java @@ -1,20 +1,7 @@ package com.dianping.cat.core.mybatis.repository.monthreport; -import java.io.IOException; -import java.io.Reader; -import java.sql.Connection; import java.util.concurrent.atomic.AtomicBoolean; -import javax.sql.DataSource; - -import org.apache.ibatis.builder.xml.XMLMapperBuilder; -import org.apache.ibatis.io.Resources; -import org.apache.ibatis.mapping.Environment; -import org.apache.ibatis.session.Configuration; -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; -import org.apache.ibatis.session.SqlSessionFactoryBuilder; -import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,7 +10,6 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -import org.unidal.dal.jdbc.datasource.DataSourceManager; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.mybatis.generated.monthreport.dao.MonthreportMapper; @@ -32,23 +18,12 @@ public class MonthlyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(MonthlyReportRepository.class); - private static final String DATA_SOURCE_NAME = "cat"; - - private static final String MAPPER_RESOURCE = "mybatis/mapper/MonthreportMapper.xml"; - private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - private DataSourceManager m_dataSourceManager; private SqlSessionTemplate m_sqlSessionTemplate; private TransactionTemplate m_transactionTemplate; - private volatile SqlSessionFactory m_sqlSessionFactory; - - public void setDataSourceManager(DataSourceManager dataSourceManager) { - m_dataSourceManager = dataSourceManager; - } - public MonthlyReport createLocal() { return new MonthlyReport(); } @@ -56,53 +31,19 @@ public MonthlyReport createLocal() { public int deleteByPK(MonthlyReport proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(MonthreportMapper.class).deleteByPrimaryKey(proto.getKeyId()); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for MonthlyReport.", e); - } + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } public int deleteReportByDomainNamePeriod(MonthlyReport proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().deleteReportByDomainNamePeriod(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(MonthreportMapper.class).deleteReportByDomainNamePeriod(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing deleteReportByDomainNamePeriod for MonthlyReport.", e); - } + return transactionTemplate.execute(status -> springMapper().deleteReportByDomainNamePeriod(toRecord(proto))); } public MonthlyReport findByPK(int keyId, Readset readset) throws DalException { MonthreportMapper mapper = springMapper(); - if (mapper != null) { - return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - MonthreportDO record = session.getMapper(MonthreportMapper.class).findByPrimaryKey(keyId); - - return requireFound(record, "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when executing findByPK for MonthlyReport.", e); - } + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } public MonthlyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name, @@ -113,114 +54,33 @@ public MonthlyReport findReportByDomainNamePeriod(java.util.Date period, String record.setPeriod(period); record.setDomain(domain); record.setName(name); - if (mapper != null) { - MonthreportDO result = mapper.findReportByDomainNamePeriod(record).stream().findFirst().orElse(null); - - return requireFound(result, "findReportByDomainNamePeriod", record.toString()); - } + MonthreportDO result = mapper.findReportByDomainNamePeriod(record).stream().findFirst().orElse(null); - try (SqlSession session = openSession()) { - MonthreportDO result = session.getMapper(MonthreportMapper.class).findReportByDomainNamePeriod(record) - .stream() - .findFirst() - .orElse(null); - - return requireFound(result, "findReportByDomainNamePeriod", record.toString()); - } catch (DalNotFoundException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when executing findReportByDomainNamePeriod for MonthlyReport.", e); - } + return requireFound(result, "findReportByDomainNamePeriod", record.toString()); } public int insert(MonthlyReport proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - MonthreportDO record = toRecord(proto); - int count = transactionTemplate.execute(status -> springMapper().insert(record)); + MonthreportDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(record)); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - MonthreportDO record = toRecord(proto); - int count = session.getMapper(MonthreportMapper.class).insert(record); - - session.commit(); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } catch (Exception e) { - throw new DalException("Error when executing insert for MonthlyReport.", e); - } + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; } public int updateByPK(MonthlyReport proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(MonthreportMapper.class).updateByPrimaryKey(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing updateByPK for MonthlyReport.", e); - } - } - - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - sqlSessionFactory = newSqlSessionFactory(); - m_sqlSessionFactory = sqlSessionFactory; - } - } - } - - return sqlSessionFactory; - } - - private void loadMapperXml(Configuration configuration) { - try (Reader reader = Resources.getResourceAsReader(MAPPER_RESOURCE)) { - XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, MAPPER_RESOURCE, - configuration.getSqlFragments()); - - mapperParser.parse(); - } catch (IOException e) { - throw new IllegalStateException("Error when loading MyBatis mapper: " + MAPPER_RESOURCE, e); - } - } - - private SqlSessionFactory newSqlSessionFactory() { - Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), - new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); - - configuration.addMapper(MonthreportMapper.class); - loadMapperXml(configuration); - return new SqlSessionFactoryBuilder().build(configuration); - } - - private SqlSession openSession() { - return getSqlSessionFactory().openSession(false); + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } private MonthreportMapper springMapper() { SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; if (sqlSessionTemplate == null) { - return null; + throw new IllegalStateException("Spring SqlSessionTemplate is not configured for MonthreportMapper."); } if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { @@ -231,6 +91,9 @@ private MonthreportMapper springMapper() { } private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate == null) { + throw new IllegalStateException("Spring TransactionTemplate is not configured for MonthreportMapper."); + } return m_transactionTemplate; } @@ -292,57 +155,4 @@ private MonthreportDO toRecord(MonthlyReport model) { return record; } - private static final class UnidalDataSource implements DataSource { - private final DataSourceManager m_dataSourceManager; - - private final String m_dataSourceName; - - private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { - m_dataSourceManager = dataSourceManager; - m_dataSourceName = dataSourceName; - } - - @Override - public Connection getConnection() throws java.sql.SQLException { - return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); - } - - @Override - public Connection getConnection(String username, String password) throws java.sql.SQLException { - return getConnection(); - } - - @Override - public int getLoginTimeout() { - return 0; - } - - @Override - public java.io.PrintWriter getLogWriter() { - return null; - } - - @Override - public java.util.logging.Logger getParentLogger() { - return java.util.logging.Logger.getGlobal(); - } - - @Override - public boolean isWrapperFor(Class iface) { - return false; - } - - @Override - public void setLoginTimeout(int seconds) { - } - - @Override - public void setLogWriter(java.io.PrintWriter out) { - } - - @Override - public T unwrap(Class iface) throws java.sql.SQLException { - throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); - } - } } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java index 71025934af..aafb6517ad 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java @@ -1,22 +1,9 @@ package com.dianping.cat.core.mybatis.repository.project; -import java.io.IOException; -import java.io.Reader; -import java.sql.Connection; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; -import javax.sql.DataSource; - -import org.apache.ibatis.builder.xml.XMLMapperBuilder; -import org.apache.ibatis.io.Resources; -import org.apache.ibatis.mapping.Environment; -import org.apache.ibatis.session.Configuration; -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; -import org.apache.ibatis.session.SqlSessionFactoryBuilder; -import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +12,6 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -import org.unidal.dal.jdbc.datasource.DataSourceManager; import com.dianping.cat.core.dal.Project; import com.dianping.cat.core.mybatis.generated.project.dao.ProjectMapper; @@ -34,19 +20,12 @@ public class ProjectRepository { private static final Logger LOGGER = LoggerFactory.getLogger(ProjectRepository.class); - private static final String DATA_SOURCE_NAME = "cat"; - - private static final String MAPPER_RESOURCE = "mybatis/mapper/ProjectMapper.xml"; - private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - private DataSourceManager m_dataSourceManager; private SqlSessionTemplate m_sqlSessionTemplate; private TransactionTemplate m_transactionTemplate; - private volatile SqlSessionFactory m_sqlSessionFactory; - public Project createLocal() { return new Project(); } @@ -54,56 +33,21 @@ public Project createLocal() { public int deleteByPK(Project proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(ProjectMapper.class).deleteByPrimaryKey(proto.getKeyId()); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for Project.", e); - } + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } public List findAll(Readset readset) throws DalException { ProjectMapper mapper = springMapper(); - if (mapper != null) { - ProjectDO record = new ProjectDO(); - - return mapper.findAll(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - ProjectDO record = new ProjectDO(); + ProjectDO record = new ProjectDO(); - return session.getMapper(ProjectMapper.class).findAll(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); - } catch (Exception e) { - throw new DalException("Error when executing findAll for Project.", e); - } + return mapper.findAll(record).stream().map(this::toModel).collect(Collectors.toList()); } public Project findByPK(int keyId, Readset readset) throws DalException { ProjectMapper mapper = springMapper(); - if (mapper != null) { - return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - ProjectDO record = session.getMapper(ProjectMapper.class).findByPrimaryKey(keyId); - - return requireFound(record, "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when executing findByPK for Project.", e); - } + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } public Project findByDomain(String domain, Readset readset) throws DalException { @@ -111,22 +55,9 @@ public Project findByDomain(String domain, Readset readset) throws DalE ProjectMapper mapper = springMapper(); record.setDomain(domain); - if (mapper != null) { - ProjectDO result = mapper.findByDomain(record).stream().findFirst().orElse(null); - - return requireFound(result, "findByDomain", record.toString()); - } - - try (SqlSession session = openSession()) { - ProjectDO result = session.getMapper(ProjectMapper.class).findByDomain(record).stream().findFirst() - .orElse(null); + ProjectDO result = mapper.findByDomain(record).stream().findFirst().orElse(null); - return requireFound(result, "findByDomain", record.toString()); - } catch (DalNotFoundException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when executing findByDomain for Project.", e); - } + return requireFound(result, "findByDomain", record.toString()); } public Project findByCmdbDomain(String domain, Readset readset) throws DalException { @@ -134,112 +65,33 @@ public Project findByCmdbDomain(String domain, Readset readset) throws ProjectMapper mapper = springMapper(); record.setDomain(domain); - if (mapper != null) { - ProjectDO result = mapper.findByCmdbDomain(record).stream().findFirst().orElse(null); - - return requireFound(result, "findByCmdbDomain", record.toString()); - } + ProjectDO result = mapper.findByCmdbDomain(record).stream().findFirst().orElse(null); - try (SqlSession session = openSession()) { - ProjectDO result = session.getMapper(ProjectMapper.class).findByCmdbDomain(record).stream().findFirst() - .orElse(null); - - return requireFound(result, "findByCmdbDomain", record.toString()); - } catch (DalNotFoundException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when executing findByCmdbDomain for Project.", e); - } + return requireFound(result, "findByCmdbDomain", record.toString()); } public int insert(Project proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - ProjectDO record = toRecord(proto); - int count = transactionTemplate.execute(status -> springMapper().insert(record)); - - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - ProjectDO record = toRecord(proto); - int count = session.getMapper(ProjectMapper.class).insert(record); + ProjectDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(record)); - session.commit(); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } catch (Exception e) { - throw new DalException("Error when executing insert for Project.", e); - } + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; } public int updateByPK(Project proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(ProjectMapper.class).updateByPrimaryKey(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing updateByPK for Project.", e); - } - } - - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - sqlSessionFactory = newSqlSessionFactory(); - m_sqlSessionFactory = sqlSessionFactory; - } - } - } - - return sqlSessionFactory; - } - - private void loadMapperXml(Configuration configuration) { - try (Reader reader = Resources.getResourceAsReader(MAPPER_RESOURCE)) { - XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, MAPPER_RESOURCE, - configuration.getSqlFragments()); - - mapperParser.parse(); - } catch (IOException e) { - throw new IllegalStateException("Error when loading MyBatis mapper: " + MAPPER_RESOURCE, e); - } - } - - private SqlSessionFactory newSqlSessionFactory() { - Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), - new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); - - configuration.addMapper(ProjectMapper.class); - loadMapperXml(configuration); - return new SqlSessionFactoryBuilder().build(configuration); - } - - private SqlSession openSession() { - return getSqlSessionFactory().openSession(false); + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } private ProjectMapper springMapper() { SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; if (sqlSessionTemplate == null) { - return null; + throw new IllegalStateException("Spring SqlSessionTemplate is not configured for ProjectMapper."); } if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { @@ -250,6 +102,9 @@ private ProjectMapper springMapper() { } private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate == null) { + throw new IllegalStateException("Spring TransactionTemplate is not configured for ProjectMapper."); + } return m_transactionTemplate; } @@ -327,57 +182,4 @@ private ProjectDO toRecord(Project model) { return record; } - private static final class UnidalDataSource implements DataSource { - private final DataSourceManager m_dataSourceManager; - - private final String m_dataSourceName; - - private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { - m_dataSourceManager = dataSourceManager; - m_dataSourceName = dataSourceName; - } - - @Override - public Connection getConnection() throws java.sql.SQLException { - return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); - } - - @Override - public Connection getConnection(String username, String password) throws java.sql.SQLException { - return getConnection(); - } - - @Override - public int getLoginTimeout() { - return 0; - } - - @Override - public java.io.PrintWriter getLogWriter() { - return null; - } - - @Override - public java.util.logging.Logger getParentLogger() { - return java.util.logging.Logger.getGlobal(); - } - - @Override - public boolean isWrapperFor(Class iface) { - return false; - } - - @Override - public void setLoginTimeout(int seconds) { - } - - @Override - public void setLogWriter(java.io.PrintWriter out) { - } - - @Override - public T unwrap(Class iface) throws java.sql.SQLException { - throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); - } - } } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java index 5affd82e42..39e385bb4f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java @@ -2,8 +2,6 @@ import java.util.concurrent.atomic.AtomicBoolean; -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,28 +10,20 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -import org.unidal.dal.jdbc.datasource.DataSourceManager; import com.dianping.cat.core.dal.Task; import com.dianping.cat.core.mybatis.generated.task.dao.TaskMapper; import com.dianping.cat.core.mybatis.generated.task.dao.data.TaskDO; -import com.dianping.cat.core.mybatis.repository.SupportingMyBatisRepository; public class TaskRepository { private static final Logger LOGGER = LoggerFactory.getLogger(TaskRepository.class); - private static final String MAPPER_RESOURCE = "mybatis/mapper/TaskMapper.xml"; - private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - private DataSourceManager m_dataSourceManager; - private SqlSessionTemplate m_sqlSessionTemplate; private TransactionTemplate m_transactionTemplate; - private volatile SqlSessionFactory m_sqlSessionFactory; - public Task createLocal() { return new Task(); } @@ -41,36 +31,13 @@ public Task createLocal() { public int deleteByPK(Task proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(TaskMapper.class).deleteByPrimaryKey(proto.getKeyId()); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for Task.", e); - } + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } public Task findByPK(int keyId, Readset readset) throws DalException { TaskMapper mapper = springMapper(); - if (mapper != null) { - return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - TaskDO record = session.getMapper(TaskMapper.class).findByPrimaryKey(keyId); - - return requireFound(record, "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when executing findByPK for Task.", e); - } + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } public Task findByStatusConsumer(int status, String consumer, Readset readset) throws DalException { @@ -79,176 +46,61 @@ public Task findByStatusConsumer(int status, String consumer, Readset read record.setStatus(status); record.setConsumer(consumer); - if (mapper != null) { - TaskDO result = mapper.findByStatusConsumer(record).stream().findFirst().orElse(null); - - return requireFound(result, "findByStatusConsumer", record.toString()); - } + TaskDO result = mapper.findByStatusConsumer(record).stream().findFirst().orElse(null); - try (SqlSession session = openSession()) { - TaskDO result = session.getMapper(TaskMapper.class).findByStatusConsumer(record).stream().findFirst() - .orElse(null); - - return requireFound(result, "findByStatusConsumer", record.toString()); - } catch (DalNotFoundException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when executing findByStatusConsumer for Task.", e); - } + return requireFound(result, "findByStatusConsumer", record.toString()); } public int insert(Task proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - TaskDO record = toRecord(proto); - int count = transactionTemplate.execute(status -> springMapper().insert(record)); - - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } + TaskDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(record)); - try (SqlSession session = openSession()) { - TaskDO record = toRecord(proto); - int count = session.getMapper(TaskMapper.class).insert(record); - - session.commit(); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } catch (Exception e) { - throw new DalException("Error when executing insert for Task.", e); - } + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; } public int updateByPK(Task proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(TaskMapper.class).updateByPrimaryKey(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing updateByPK for Task.", e); - } + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } public int updateTodoToDoing(Task proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateTodoToDoing(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(TaskMapper.class).updateTodoToDoing(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing updateTodoToDoing for Task.", e); - } + return transactionTemplate.execute(status -> springMapper().updateTodoToDoing(toRecord(proto))); } public int updateDoingToDone(Task proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateDoingToDone(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(TaskMapper.class).updateDoingToDone(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing updateDoingToDone for Task.", e); - } + return transactionTemplate.execute(status -> springMapper().updateDoingToDone(toRecord(proto))); } public int updateFailureToDone(Task proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateFailureToDone(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(TaskMapper.class).updateFailureToDone(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing updateFailureToDone for Task.", e); - } + return transactionTemplate.execute(status -> springMapper().updateFailureToDone(toRecord(proto))); } public int updateStatusToTodo(Task proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateStatusToTodo(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(TaskMapper.class).updateStatusToTodo(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing updateStatusToTodo for Task.", e); - } + return transactionTemplate.execute(status -> springMapper().updateStatusToTodo(toRecord(proto))); } public int updateDoingToFail(Task proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateDoingToFail(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(TaskMapper.class).updateDoingToFail(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing updateDoingToFail for Task.", e); - } - } - - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - sqlSessionFactory = SupportingMyBatisRepository.newSqlSessionFactory(m_dataSourceManager, - TaskMapper.class, MAPPER_RESOURCE); - m_sqlSessionFactory = sqlSessionFactory; - } - } - } - - return sqlSessionFactory; - } - - private SqlSession openSession() { - return getSqlSessionFactory().openSession(false); + return transactionTemplate.execute(status -> springMapper().updateDoingToFail(toRecord(proto))); } private TaskMapper springMapper() { if (m_sqlSessionTemplate == null) { - return null; + throw new IllegalStateException("Spring SqlSessionTemplate is not configured for TaskMapper."); } if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { LOGGER.info("TaskRepository is using Spring managed TaskMapper."); @@ -257,6 +109,9 @@ private TaskMapper springMapper() { } private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate == null) { + throw new IllegalStateException("Spring TransactionTemplate is not configured for TaskMapper."); + } return m_transactionTemplate; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java index c7254e869a..88c6b67292 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java @@ -4,8 +4,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,31 +12,20 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -import org.unidal.dal.jdbc.datasource.DataSourceManager; import com.dianping.cat.core.dal.WeeklyReportContent; import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.WeeklyReportContentMapper; import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.data.WeeklyReportContentDO; -import com.dianping.cat.core.mybatis.repository.SupportingMyBatisRepository; public class WeeklyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(WeeklyReportContentRepository.class); - private static final String MAPPER_RESOURCE = "mybatis/mapper/WeeklyReportContentMapper.xml"; - private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - private DataSourceManager m_dataSourceManager; private SqlSessionTemplate m_sqlSessionTemplate; private TransactionTemplate m_transactionTemplate; - private volatile SqlSessionFactory m_sqlSessionFactory; - - public void setDataSourceManager(DataSourceManager dataSourceManager) { - m_dataSourceManager = dataSourceManager; - } - public WeeklyReportContent createLocal() { return new WeeklyReportContent(); } @@ -46,15 +33,8 @@ public WeeklyReportContent createLocal() { public int deleteByPK(WeeklyReportContent proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyReportId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(WeeklyReportContentMapper.class).deleteByPrimaryKey(proto.getKeyReportId()); - - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for WeeklyReportContent.", e); } @@ -66,14 +46,8 @@ public List findOverloadReport(int startId, Readset findOverloadReport(int startId, Readset readset) throws DalException { WeeklyReportContentMapper mapper = springMapper(); - if (mapper != null) { + try { return requireFound(mapper.findByPrimaryKey(keyReportId), "primary key", String.valueOf(keyReportId)); - } - - try (SqlSession session = openSession()) { - WeeklyReportContentDO record = session.getMapper(WeeklyReportContentMapper.class) - .findByPrimaryKey(keyReportId); - - return requireFound(record, "primary key", String.valueOf(keyReportId)); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -101,16 +68,8 @@ public WeeklyReportContent findByPK(int keyReportId, Readset springMapper().insert(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - WeeklyReportContentDO record = toRecord(proto); - int count = session.getMapper(WeeklyReportContentMapper.class).insert(record); - - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing insert for WeeklyReportContent.", e); } @@ -119,45 +78,16 @@ public int insert(WeeklyReportContent proto) throws DalException { public int updateByPK(WeeklyReportContent proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(WeeklyReportContentMapper.class).updateByPrimaryKey(toRecord(proto)); - - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for WeeklyReportContent.", e); } } - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - sqlSessionFactory = SupportingMyBatisRepository.newSqlSessionFactory(m_dataSourceManager, - WeeklyReportContentMapper.class, MAPPER_RESOURCE); - m_sqlSessionFactory = sqlSessionFactory; - } - } - } - - return sqlSessionFactory; - } - - private SqlSession openSession() { - return getSqlSessionFactory().openSession(false); - } - private WeeklyReportContentMapper springMapper() { if (m_sqlSessionTemplate == null) { - return null; + throw new IllegalStateException("Spring SqlSessionTemplate is not configured for WeeklyReportContentMapper."); } if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { LOGGER.info("WeeklyReportContentRepository is using Spring managed WeeklyReportContentMapper."); @@ -166,6 +96,9 @@ private WeeklyReportContentMapper springMapper() { } private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate == null) { + throw new IllegalStateException("Spring TransactionTemplate is not configured for WeeklyReportContentMapper."); + } return m_transactionTemplate; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java index 4189531895..04dec1de37 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java @@ -1,20 +1,7 @@ package com.dianping.cat.core.mybatis.repository.weeklyreport; -import java.io.IOException; -import java.io.Reader; -import java.sql.Connection; import java.util.concurrent.atomic.AtomicBoolean; -import javax.sql.DataSource; - -import org.apache.ibatis.builder.xml.XMLMapperBuilder; -import org.apache.ibatis.io.Resources; -import org.apache.ibatis.mapping.Environment; -import org.apache.ibatis.session.Configuration; -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; -import org.apache.ibatis.session.SqlSessionFactoryBuilder; -import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,7 +10,6 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -import org.unidal.dal.jdbc.datasource.DataSourceManager; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.WeeklyreportMapper; @@ -32,23 +18,12 @@ public class WeeklyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(WeeklyReportRepository.class); - private static final String DATA_SOURCE_NAME = "cat"; - - private static final String MAPPER_RESOURCE = "mybatis/mapper/WeeklyreportMapper.xml"; - private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - private DataSourceManager m_dataSourceManager; private SqlSessionTemplate m_sqlSessionTemplate; private TransactionTemplate m_transactionTemplate; - private volatile SqlSessionFactory m_sqlSessionFactory; - - public void setDataSourceManager(DataSourceManager dataSourceManager) { - m_dataSourceManager = dataSourceManager; - } - public WeeklyReport createLocal() { return new WeeklyReport(); } @@ -56,53 +31,19 @@ public WeeklyReport createLocal() { public int deleteByPK(WeeklyReport proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(WeeklyreportMapper.class).deleteByPrimaryKey(proto.getKeyId()); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for WeeklyReport.", e); - } + return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } public int deleteReportByDomainNamePeriod(WeeklyReport proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().deleteReportByDomainNamePeriod(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(WeeklyreportMapper.class).deleteReportByDomainNamePeriod(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing deleteReportByDomainNamePeriod for WeeklyReport.", e); - } + return transactionTemplate.execute(status -> springMapper().deleteReportByDomainNamePeriod(toRecord(proto))); } public WeeklyReport findByPK(int keyId, Readset readset) throws DalException { WeeklyreportMapper mapper = springMapper(); - if (mapper != null) { - return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - WeeklyreportDO record = session.getMapper(WeeklyreportMapper.class).findByPrimaryKey(keyId); - - return requireFound(record, "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when executing findByPK for WeeklyReport.", e); - } + return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } public WeeklyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name, @@ -113,114 +54,33 @@ public WeeklyReport findReportByDomainNamePeriod(java.util.Date period, String d record.setPeriod(period); record.setDomain(domain); record.setName(name); - if (mapper != null) { - WeeklyreportDO result = mapper.findReportByDomainNamePeriod(record).stream().findFirst().orElse(null); - - return requireFound(result, "findReportByDomainNamePeriod", record.toString()); - } + WeeklyreportDO result = mapper.findReportByDomainNamePeriod(record).stream().findFirst().orElse(null); - try (SqlSession session = openSession()) { - WeeklyreportDO result = session.getMapper(WeeklyreportMapper.class).findReportByDomainNamePeriod(record) - .stream() - .findFirst() - .orElse(null); - - return requireFound(result, "findReportByDomainNamePeriod", record.toString()); - } catch (DalNotFoundException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when executing findReportByDomainNamePeriod for WeeklyReport.", e); - } + return requireFound(result, "findReportByDomainNamePeriod", record.toString()); } public int insert(WeeklyReport proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - WeeklyreportDO record = toRecord(proto); - int count = transactionTemplate.execute(status -> springMapper().insert(record)); + WeeklyreportDO record = toRecord(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(record)); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - WeeklyreportDO record = toRecord(proto); - int count = session.getMapper(WeeklyreportMapper.class).insert(record); - - session.commit(); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } catch (Exception e) { - throw new DalException("Error when executing insert for WeeklyReport.", e); - } + proto.setId(record.getId()); + proto.setKeyId(record.getId()); + return count; } public int updateByPK(WeeklyReport proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(WeeklyreportMapper.class).updateByPrimaryKey(toRecord(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when executing updateByPK for WeeklyReport.", e); - } - } - - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - sqlSessionFactory = newSqlSessionFactory(); - m_sqlSessionFactory = sqlSessionFactory; - } - } - } - - return sqlSessionFactory; - } - - private void loadMapperXml(Configuration configuration) { - try (Reader reader = Resources.getResourceAsReader(MAPPER_RESOURCE)) { - XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, MAPPER_RESOURCE, - configuration.getSqlFragments()); - - mapperParser.parse(); - } catch (IOException e) { - throw new IllegalStateException("Error when loading MyBatis mapper: " + MAPPER_RESOURCE, e); - } - } - - private SqlSessionFactory newSqlSessionFactory() { - Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), - new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); - - configuration.addMapper(WeeklyreportMapper.class); - loadMapperXml(configuration); - return new SqlSessionFactoryBuilder().build(configuration); - } - - private SqlSession openSession() { - return getSqlSessionFactory().openSession(false); + return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } private WeeklyreportMapper springMapper() { SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; if (sqlSessionTemplate == null) { - return null; + throw new IllegalStateException("Spring SqlSessionTemplate is not configured for WeeklyreportMapper."); } if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { @@ -231,6 +91,9 @@ private WeeklyreportMapper springMapper() { } private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate == null) { + throw new IllegalStateException("Spring TransactionTemplate is not configured for WeeklyreportMapper."); + } return m_transactionTemplate; } @@ -292,57 +155,4 @@ private WeeklyreportDO toRecord(WeeklyReport model) { return record; } - private static final class UnidalDataSource implements DataSource { - private final DataSourceManager m_dataSourceManager; - - private final String m_dataSourceName; - - private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { - m_dataSourceManager = dataSourceManager; - m_dataSourceName = dataSourceName; - } - - @Override - public Connection getConnection() throws java.sql.SQLException { - return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); - } - - @Override - public Connection getConnection(String username, String password) throws java.sql.SQLException { - return getConnection(); - } - - @Override - public int getLoginTimeout() { - return 0; - } - - @Override - public java.io.PrintWriter getLogWriter() { - return null; - } - - @Override - public java.util.logging.Logger getParentLogger() { - return java.util.logging.Logger.getGlobal(); - } - - @Override - public boolean isWrapperFor(Class iface) { - return false; - } - - @Override - public void setLoginTimeout(int seconds) { - } - - @Override - public void setLogWriter(java.io.PrintWriter out) { - } - - @Override - public T unwrap(Class iface) throws java.sql.SQLException { - throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); - } - } } diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java index b376a6b574..88fb364665 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java @@ -1,22 +1,9 @@ package com.dianping.cat.core.report.daily.repository; -import java.io.IOException; -import java.io.Reader; -import java.sql.Connection; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; -import javax.sql.DataSource; - -import org.apache.ibatis.builder.xml.XMLMapperBuilder; -import org.apache.ibatis.io.Resources; -import org.apache.ibatis.mapping.Environment; -import org.apache.ibatis.session.Configuration; -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; -import org.apache.ibatis.session.SqlSessionFactoryBuilder; -import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +12,6 @@ import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.Readset; import org.unidal.dal.jdbc.Updateset; -import org.unidal.dal.jdbc.datasource.DataSourceManager; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.report.daily.dao.DailyReportMapper; @@ -34,24 +20,12 @@ public class DailyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(DailyReportRepository.class); - private static final String DATA_SOURCE_NAME = "cat"; - - private static final String MAPPER_RESOURCE = "mybatis/mapper/DailyReportMapper.xml"; - private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); - private DataSourceManager m_dataSourceManager; - private SqlSessionTemplate m_sqlSessionTemplate; private TransactionTemplate m_transactionTemplate; - private volatile SqlSessionFactory m_sqlSessionFactory; - - public void setDataSourceManager(DataSourceManager dataSourceManager) { - m_dataSourceManager = dataSourceManager; - } - public DailyReport createLocal() { return new DailyReport(); } @@ -59,188 +33,61 @@ public DailyReport createLocal() { public int deleteByDomainNamePeriod(DailyReport proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().deleteByDomainNamePeriod(proto.getDomain(), - proto.getName(), proto.getPeriod())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(DailyReportMapper.class).deleteByDomainNamePeriod(proto.getDomain(), - proto.getName(), proto.getPeriod()); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when deleting daily report by domain/name/period: " + proto, e); - } + return transactionTemplate.execute(status -> springMapper().deleteByDomainNamePeriod(proto.getDomain(), + proto.getName(), proto.getPeriod())); } public int deleteByPK(DailyReport proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().deleteById(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(DailyReportMapper.class).deleteById(proto.getKeyId()); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when deleting daily report by primary key: " + proto, e); - } + return transactionTemplate.execute(status -> springMapper().deleteById(proto.getKeyId())); } public DailyReport findByDomainNamePeriod(String domain, String name, java.util.Date period, Readset readset) throws DalException { DailyReportMapper mapper = springMapper(); - if (mapper != null) { - return requireFound(mapper.findByDomainNamePeriod(domain, name, period), "domain/name/period", - domain + "/" + name + "/" + period); - } - - try (SqlSession session = openSession()) { - DailyReportDO report = session.getMapper(DailyReportMapper.class).findByDomainNamePeriod(domain, name, - period); - - return requireFound(report, "domain/name/period", domain + "/" + name + "/" + period); - } catch (DalException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when finding daily report by domain/name/period: " + domain + "/" + name - + "/" + period, e); - } + return requireFound(mapper.findByDomainNamePeriod(domain, name, period), "domain/name/period", + domain + "/" + name + "/" + period); } public DailyReport findByPK(int keyId, Readset readset) throws DalException { DailyReportMapper mapper = springMapper(); - if (mapper != null) { - return requireFound(mapper.findById(keyId), "id", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - DailyReportDO report = session.getMapper(DailyReportMapper.class).findById(keyId); - - return requireFound(report, "id", String.valueOf(keyId)); - } catch (DalException e) { - throw e; - } catch (Exception e) { - throw new DalException("Error when finding daily report by primary key: " + keyId, e); - } + return requireFound(mapper.findById(keyId), "id", String.valueOf(keyId)); } public int insert(DailyReport proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - DailyReportDO report = toDailyReportDO(proto); - int count = transactionTemplate.execute(status -> springMapper().insert(report)); + DailyReportDO report = toDailyReportDO(proto); + int count = transactionTemplate.execute(status -> springMapper().insert(report)); - proto.setId(report.getId()); - proto.setKeyId(report.getId()); - return count; - } - - try (SqlSession session = openSession()) { - DailyReportDO report = toDailyReportDO(proto); - int count = session.getMapper(DailyReportMapper.class).insert(report); - - session.commit(); - proto.setId(report.getId()); - proto.setKeyId(report.getId()); - return count; - } catch (Exception e) { - throw new DalException("Error when inserting daily report: " + proto, e); - } + proto.setId(report.getId()); + proto.setKeyId(report.getId()); + return count; } public List queryLatestReportsByDomainName(String domain, String name, int limits, Readset readset) throws DalException { DailyReportMapper mapper = springMapper(); - if (mapper != null) { - return mapper.queryLatestReportsByDomainName(domain, name, limits).stream() - .map(this::toDailyReport) - .collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(DailyReportMapper.class).queryLatestReportsByDomainName(domain, name, limits) - .stream() - .map(this::toDailyReport) - .collect(Collectors.toList()); - } catch (Exception e) { - throw new DalException("Error when querying latest daily reports by domain/name: " + domain + "/" + name, - e); - } + return mapper.queryLatestReportsByDomainName(domain, name, limits).stream() + .map(this::toDailyReport) + .collect(Collectors.toList()); } public int updateByPK(DailyReport proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { - return transactionTemplate.execute(status -> springMapper().updateById(toDailyReportDO(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(DailyReportMapper.class).updateById(toDailyReportDO(proto)); - - session.commit(); - return count; - } catch (Exception e) { - throw new DalException("Error when updating daily report by primary key: " + proto, e); - } - } - - private SqlSessionFactory getSqlSessionFactory() { - SqlSessionFactory sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - synchronized (this) { - sqlSessionFactory = m_sqlSessionFactory; - - if (sqlSessionFactory == null) { - sqlSessionFactory = newSqlSessionFactory(); - m_sqlSessionFactory = sqlSessionFactory; - } - } - } - - return sqlSessionFactory; - } - - private void loadMapperXml(Configuration configuration) { - try (Reader reader = Resources.getResourceAsReader(MAPPER_RESOURCE)) { - XMLMapperBuilder mapperParser = new XMLMapperBuilder(reader, configuration, MAPPER_RESOURCE, - configuration.getSqlFragments()); - - mapperParser.parse(); - } catch (IOException e) { - throw new IllegalStateException("Error when loading MyBatis mapper: " + MAPPER_RESOURCE, e); - } - } - - private SqlSessionFactory newSqlSessionFactory() { - Configuration configuration = new Configuration(new Environment(DATA_SOURCE_NAME, new JdbcTransactionFactory(), - new UnidalDataSource(m_dataSourceManager, DATA_SOURCE_NAME))); - - configuration.addMapper(DailyReportMapper.class); - loadMapperXml(configuration); - return new SqlSessionFactoryBuilder().build(configuration); - } - - private SqlSession openSession() { - return getSqlSessionFactory().openSession(false); + return transactionTemplate.execute(status -> springMapper().updateById(toDailyReportDO(proto))); } private DailyReportMapper springMapper() { SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; if (sqlSessionTemplate == null) { - return null; + throw new IllegalStateException("Spring SqlSessionTemplate is not configured for DailyReportMapper."); } if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { @@ -251,6 +98,9 @@ private DailyReportMapper springMapper() { } private TransactionTemplate springTransactionTemplate() { + if (m_transactionTemplate == null) { + throw new IllegalStateException("Spring TransactionTemplate is not configured for DailyReportMapper."); + } return m_transactionTemplate; } @@ -297,57 +147,4 @@ private DailyReportDO toDailyReportDO(DailyReport report) { return reportDO; } - private static final class UnidalDataSource implements DataSource { - private final DataSourceManager m_dataSourceManager; - - private final String m_dataSourceName; - - private UnidalDataSource(DataSourceManager dataSourceManager, String dataSourceName) { - m_dataSourceManager = dataSourceManager; - m_dataSourceName = dataSourceName; - } - - @Override - public Connection getConnection() throws java.sql.SQLException { - return m_dataSourceManager.getDataSource(m_dataSourceName).getConnection(); - } - - @Override - public Connection getConnection(String username, String password) throws java.sql.SQLException { - return getConnection(); - } - - @Override - public int getLoginTimeout() { - return 0; - } - - @Override - public java.io.PrintWriter getLogWriter() { - return null; - } - - @Override - public java.util.logging.Logger getParentLogger() { - return java.util.logging.Logger.getGlobal(); - } - - @Override - public boolean isWrapperFor(Class iface) { - return false; - } - - @Override - public void setLoginTimeout(int seconds) { - } - - @Override - public void setLogWriter(java.io.PrintWriter out) { - } - - @Override - public T unwrap(Class iface) throws java.sql.SQLException { - throw new java.sql.SQLException("Not a wrapper for " + iface.getName()); - } - } } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java index 47d1e7bdee..8efe4d7efc 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java @@ -4,7 +4,6 @@ import com.dianping.cat.core.mybatis.generated.alert.summary.dao.AlertSummaryMapper; import com.dianping.cat.core.mybatis.generated.alert.summary.dao.data.AlertSummaryDO; import com.dianping.cat.home.dal.report.AlertSummary; -import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; @@ -30,14 +29,8 @@ public AlertSummary createLocal() { public int deleteByPK(AlertSummary proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(AlertSummaryMapper.class).deleteByPrimaryKey(proto.getKeyId()); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for AlertSummary.", e); } @@ -46,13 +39,8 @@ public int deleteByPK(AlertSummary proto) throws DalException { public AlertSummary findByPK(int keyId, Readset readset) throws DalException { AlertSummaryMapper mapper = springMapper(LOGGER); - if (mapper != null) { + try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - AlertSummaryDO record = session.getMapper(AlertSummaryMapper.class).findByPrimaryKey(keyId); - return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -63,19 +51,10 @@ public AlertSummary findByPK(int keyId, Readset readset) throws Da public int insert(AlertSummary proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { AlertSummaryDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - AlertSummaryDO record = toRecord(proto); - int count = session.getMapper(AlertSummaryMapper.class).insert(record); - session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); return count; @@ -87,14 +66,8 @@ public int insert(AlertSummary proto) throws DalException { public int updateByPK(AlertSummary proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(AlertSummaryMapper.class).updateByPrimaryKey(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for AlertSummary.", e); } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java index de7c0040db..5c700d94ec 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java @@ -6,7 +6,6 @@ import com.dianping.cat.home.dal.report.Alteration; import java.util.List; import java.util.stream.Collectors; -import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; @@ -32,14 +31,8 @@ public Alteration createLocal() { public int deleteByPK(Alteration proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(AlterationMapper.class).deleteByPrimaryKey(proto.getKeyId()); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for Alteration.", e); } @@ -52,14 +45,8 @@ public List findByTypeDruation(java.util.Date startTime, java.util.D record.setStartTime(startTime); record.setEndTime(endTime); record.setType(type); - if (mapper != null) { + try { return mapper.findByTypeDruation(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(AlterationMapper.class).findByTypeDruation(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findByTypeDruation for Alteration.", e); } @@ -74,14 +61,8 @@ public List findByDtdh(java.util.Date startTime, java.util.Date endT record.setType(type); record.setDomain(domain); record.setHostname(hostname); - if (mapper != null) { + try { return mapper.findByDtdh(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(AlterationMapper.class).findByDtdh(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findByDtdh for Alteration.", e); } @@ -97,14 +78,8 @@ public List findByDtdhTypes(java.util.Date startTime, java.util.Date record.setDomain(domain); record.setHostname(hostname); record.setTypes(types); - if (mapper != null) { + try { return mapper.findByDtdhTypes(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(AlterationMapper.class).findByDtdhTypes(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findByDtdhTypes for Alteration.", e); } @@ -117,14 +92,8 @@ public List findByDomainAndTime(java.util.Date startTime, java.util. record.setStartTime(startTime); record.setEndTime(endTime); record.setDomain(domain); - if (mapper != null) { + try { return mapper.findByDomainAndTime(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(AlterationMapper.class).findByDomainAndTime(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findByDomainAndTime for Alteration.", e); } @@ -133,13 +102,8 @@ public List findByDomainAndTime(java.util.Date startTime, java.util. public Alteration findByPK(int keyId, Readset readset) throws DalException { AlterationMapper mapper = springMapper(LOGGER); - if (mapper != null) { + try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - AlterationDO record = session.getMapper(AlterationMapper.class).findByPrimaryKey(keyId); - return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -150,19 +114,10 @@ public Alteration findByPK(int keyId, Readset readset) throws DalExc public int insert(Alteration proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { AlterationDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - AlterationDO record = toRecord(proto); - int count = session.getMapper(AlterationMapper.class).insert(record); - session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); return count; @@ -174,14 +129,8 @@ public int insert(Alteration proto) throws DalException { public int updateByPK(Alteration proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(AlterationMapper.class).updateByPrimaryKey(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for Alteration.", e); } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java index 80f83d1fa0..d0d70c224c 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java @@ -4,7 +4,6 @@ import com.dianping.cat.core.mybatis.generated.baseline.dao.BaselineMapper; import com.dianping.cat.core.mybatis.generated.baseline.dao.data.BaselineDO; import com.dianping.cat.home.dal.report.Baseline; -import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; @@ -29,14 +28,8 @@ public Baseline createLocal() { public int deleteByPK(Baseline proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(BaselineMapper.class).deleteByPrimaryKey(proto.getKeyId()); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for Baseline.", e); } @@ -45,13 +38,8 @@ public int deleteByPK(Baseline proto) throws DalException { public Baseline findByPK(int keyId, Readset readset) throws DalException { BaselineMapper mapper = springMapper(LOGGER); - if (mapper != null) { + try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - BaselineDO record = session.getMapper(BaselineMapper.class).findByPrimaryKey(keyId); - return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -66,17 +54,10 @@ public Baseline findByReportNameKeyTime(java.util.Date reportPeriod, String repo record.setReportPeriod(reportPeriod); record.setReportName(reportName); record.setIndexKey(indexKey); - if (mapper != null) { + try { BaselineDO result = mapper.findByReportNameKeyTime(record).stream().findFirst().orElse(null); return requireFound(result, "findByReportNameKeyTime", record.toString()); - } - - try (SqlSession session = openSession()) { - BaselineDO result = session.getMapper(BaselineMapper.class).findByReportNameKeyTime(record).stream() - .findFirst() - .orElse(null); - return requireFound(result, "findByReportNameKeyTime", record.toString()); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -87,19 +68,10 @@ public Baseline findByReportNameKeyTime(java.util.Date reportPeriod, String repo public int insert(Baseline proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { BaselineDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - BaselineDO record = toRecord(proto); - int count = session.getMapper(BaselineMapper.class).insert(record); - session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); return count; @@ -111,14 +83,8 @@ public int insert(Baseline proto) throws DalException { public int updateByPK(Baseline proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(BaselineMapper.class).updateByPrimaryKey(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for Baseline.", e); } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java index ffa2d07ae7..8270a308c3 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java @@ -4,7 +4,6 @@ import com.dianping.cat.core.mybatis.generated.config.modification.dao.ConfigModificationMapper; import com.dianping.cat.core.mybatis.generated.config.modification.dao.data.ConfigModificationDO; import com.dianping.cat.home.dal.report.ConfigModification; -import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; @@ -30,14 +29,8 @@ public ConfigModification createLocal() { public int deleteByPK(ConfigModification proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(ConfigModificationMapper.class).deleteByPrimaryKey(proto.getKeyId()); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for ConfigModification.", e); } @@ -46,13 +39,8 @@ public int deleteByPK(ConfigModification proto) throws DalException { public ConfigModification findByPK(int keyId, Readset readset) throws DalException { ConfigModificationMapper mapper = springMapper(LOGGER); - if (mapper != null) { + try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - ConfigModificationDO record = session.getMapper(ConfigModificationMapper.class).findByPrimaryKey(keyId); - return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -63,19 +51,10 @@ public ConfigModification findByPK(int keyId, Readset readse public int insert(ConfigModification proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { ConfigModificationDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - ConfigModificationDO record = toRecord(proto); - int count = session.getMapper(ConfigModificationMapper.class).insert(record); - session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); return count; @@ -87,14 +66,8 @@ public int insert(ConfigModification proto) throws DalException { public int updateByPK(ConfigModification proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(ConfigModificationMapper.class).updateByPrimaryKey(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for ConfigModification.", e); } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java index 0ccaac9b35..ebc195a91b 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java @@ -4,7 +4,6 @@ import com.dianping.cat.core.mybatis.generated.metric.graph.dao.MetricGraphMapper; import com.dianping.cat.core.mybatis.generated.metric.graph.dao.data.MetricGraphDO; import com.dianping.cat.home.dal.report.MetricGraph; -import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; @@ -30,14 +29,8 @@ public MetricGraph createLocal() { public int deleteByPK(MetricGraph proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(MetricGraphMapper.class).deleteByPrimaryKey(proto.getKeyId()); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for MetricGraph.", e); } @@ -46,14 +39,8 @@ public int deleteByPK(MetricGraph proto) throws DalException { public int deleteBeforeDate(MetricGraph proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteBeforeDate(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(MetricGraphMapper.class).deleteBeforeDate(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteBeforeDate for MetricGraph.", e); } @@ -62,13 +49,8 @@ public int deleteBeforeDate(MetricGraph proto) throws DalException { public MetricGraph findByPK(int keyId, Readset readset) throws DalException { MetricGraphMapper mapper = springMapper(LOGGER); - if (mapper != null) { + try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - MetricGraphDO record = session.getMapper(MetricGraphMapper.class).findByPrimaryKey(keyId); - return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -81,17 +63,10 @@ public MetricGraph findByGrapId(long graphId, Readset readset) thro MetricGraphDO record = new MetricGraphDO(); record.setGraphId(graphId); - if (mapper != null) { + try { MetricGraphDO result = mapper.findByGrapId(record).stream().findFirst().orElse(null); return requireFound(result, "findByGrapId", record.toString()); - } - - try (SqlSession session = openSession()) { - MetricGraphDO result = session.getMapper(MetricGraphMapper.class).findByGrapId(record).stream() - .findFirst() - .orElse(null); - return requireFound(result, "findByGrapId", record.toString()); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -104,16 +79,10 @@ public MetricGraph findLast(int number, Readset readset) throws Dal MetricGraphDO record = new MetricGraphDO(); record.setNumber(number); - if (mapper != null) { + try { MetricGraphDO result = mapper.findLast(record).stream().findFirst().orElse(null); return requireFound(result, "findLast", record.toString()); - } - - try (SqlSession session = openSession()) { - MetricGraphDO result = session.getMapper(MetricGraphMapper.class).findLast(record).stream().findFirst() - .orElse(null); - return requireFound(result, "findLast", record.toString()); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -124,19 +93,10 @@ public MetricGraph findLast(int number, Readset readset) throws Dal public int insert(MetricGraph proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { MetricGraphDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - MetricGraphDO record = toRecord(proto); - int count = session.getMapper(MetricGraphMapper.class).insert(record); - session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); return count; @@ -148,14 +108,8 @@ public int insert(MetricGraph proto) throws DalException { public int updateByPK(MetricGraph proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(MetricGraphMapper.class).updateByPrimaryKey(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for MetricGraph.", e); } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java index 97c953f237..fbae454c61 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java @@ -6,7 +6,6 @@ import com.dianping.cat.home.dal.report.MetricScreen; import java.util.List; import java.util.stream.Collectors; -import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; @@ -32,14 +31,8 @@ public MetricScreen createLocal() { public int deleteByPK(MetricScreen proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(MetricScreenMapper.class).deleteByPrimaryKey(proto.getKeyId()); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for MetricScreen.", e); } @@ -48,14 +41,8 @@ public int deleteByPK(MetricScreen proto) throws DalException { public int deleteByName(MetricScreen proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByName(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(MetricScreenMapper.class).deleteByName(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByName for MetricScreen.", e); } @@ -64,14 +51,8 @@ public int deleteByName(MetricScreen proto) throws DalException { public int deleteByNameGraph(MetricScreen proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByNameGraph(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(MetricScreenMapper.class).deleteByNameGraph(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByNameGraph for MetricScreen.", e); } @@ -81,14 +62,8 @@ public List findAll(Readset readset) throws DalExcep MetricScreenMapper mapper = springMapper(LOGGER); MetricScreenDO record = new MetricScreenDO(); - if (mapper != null) { + try { return mapper.findAll(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(MetricScreenMapper.class).findAll(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findAll for MetricScreen.", e); } @@ -99,14 +74,8 @@ public List findByName(String name, Readset readset) MetricScreenDO record = new MetricScreenDO(); record.setName(name); - if (mapper != null) { + try { return mapper.findByName(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(MetricScreenMapper.class).findByName(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findByName for MetricScreen.", e); } @@ -115,13 +84,8 @@ public List findByName(String name, Readset readset) public MetricScreen findByPK(int keyId, Readset readset) throws DalException { MetricScreenMapper mapper = springMapper(LOGGER); - if (mapper != null) { + try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - MetricScreenDO record = session.getMapper(MetricScreenMapper.class).findByPrimaryKey(keyId); - return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -135,17 +99,10 @@ public MetricScreen findByNameGraph(String name, String graphName, Readset springMapper(LOGGER).insert(record)); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - MetricScreenDO record = toRecord(proto); - int count = session.getMapper(MetricScreenMapper.class).insert(record); - session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); return count; @@ -180,14 +128,8 @@ public int insert(MetricScreen proto) throws DalException { public int insertOrUpdateByNameGraph(MetricScreen proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).insertOrUpdateByNameGraph(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(MetricScreenMapper.class).insertOrUpdateByNameGraph(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing insertOrUpdateByNameGraph for MetricScreen.", e); } @@ -196,14 +138,8 @@ public int insertOrUpdateByNameGraph(MetricScreen proto) throws DalException { public int updateByPK(MetricScreen proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(MetricScreenMapper.class).updateByPrimaryKey(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for MetricScreen.", e); } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java index c2a613126f..5bef80391d 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java @@ -6,7 +6,6 @@ import com.dianping.cat.home.dal.report.Overload; import java.util.List; import java.util.stream.Collectors; -import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; @@ -31,14 +30,8 @@ public Overload createLocal() { public int deleteByPK(Overload proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(OverloadMapper.class).deleteByPrimaryKey(proto.getKeyId()); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for Overload.", e); } @@ -50,14 +43,8 @@ public List findIdAndSizeByDuration(java.util.Date startTime, java.uti record.setStartTime(startTime); record.setEndTime(endTime); - if (mapper != null) { + try { return mapper.findIdAndSizeByDuration(record).stream().map(this::toModel).collect(Collectors.toList()); - } - - try (SqlSession session = openSession()) { - return session.getMapper(OverloadMapper.class).findIdAndSizeByDuration(record).stream() - .map(this::toModel) - .collect(Collectors.toList()); } catch (Exception e) { throw new DalException("Error when executing findIdAndSizeByDuration for Overload.", e); } @@ -66,13 +53,8 @@ public List findIdAndSizeByDuration(java.util.Date startTime, java.uti public Overload findByPK(int keyId, Readset readset) throws DalException { OverloadMapper mapper = springMapper(LOGGER); - if (mapper != null) { + try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - OverloadDO record = session.getMapper(OverloadMapper.class).findByPrimaryKey(keyId); - return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -85,17 +67,10 @@ public Overload findMaxIdByType(int type, Readset readset) throws DalE OverloadDO record = new OverloadDO(); record.setType(type); - if (mapper != null) { + try { OverloadDO result = mapper.findMaxIdByType(record).stream().findFirst().orElse(null); return requireFound(result, "findMaxIdByType", record.toString()); - } - - try (SqlSession session = openSession()) { - OverloadDO result = session.getMapper(OverloadMapper.class).findMaxIdByType(record).stream() - .findFirst() - .orElse(null); - return requireFound(result, "findMaxIdByType", record.toString()); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -107,16 +82,10 @@ public Overload findCount(Readset readset) throws DalException { OverloadMapper mapper = springMapper(LOGGER); OverloadDO record = new OverloadDO(); - if (mapper != null) { + try { OverloadDO result = mapper.findCount(record).stream().findFirst().orElse(null); return requireFound(result, "findCount", record.toString()); - } - - try (SqlSession session = openSession()) { - OverloadDO result = session.getMapper(OverloadMapper.class).findCount(record).stream().findFirst() - .orElse(null); - return requireFound(result, "findCount", record.toString()); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -127,19 +96,10 @@ public Overload findCount(Readset readset) throws DalException { public int insert(Overload proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { OverloadDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - OverloadDO record = toRecord(proto); - int count = session.getMapper(OverloadMapper.class).insert(record); - session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); return count; @@ -151,14 +111,8 @@ public int insert(Overload proto) throws DalException { public int updateByPK(Overload proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(OverloadMapper.class).updateByPrimaryKey(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for Overload.", e); } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java index 44cb073bd7..5ec45a338b 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java @@ -4,7 +4,6 @@ import com.dianping.cat.core.mybatis.generated.topologygraph.dao.TopologyGraphMapper; import com.dianping.cat.core.mybatis.generated.topologygraph.dao.data.TopologyGraphDO; import com.dianping.cat.home.dal.report.TopologyGraph; -import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; @@ -30,14 +29,8 @@ public TopologyGraph createLocal() { public int deleteByPK(TopologyGraph proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(TopologyGraphMapper.class).deleteByPrimaryKey(proto.getKeyId()); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing deleteByPK for TopologyGraph.", e); } @@ -46,13 +39,8 @@ public int deleteByPK(TopologyGraph proto) throws DalException { public TopologyGraph findByPK(int keyId, Readset readset) throws DalException { TopologyGraphMapper mapper = springMapper(LOGGER); - if (mapper != null) { + try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } - - try (SqlSession session = openSession()) { - TopologyGraphDO record = session.getMapper(TopologyGraphMapper.class).findByPrimaryKey(keyId); - return requireFound(record, "primary key", String.valueOf(keyId)); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -65,17 +53,10 @@ public TopologyGraph findByPeriod(java.util.Date period, Readset TopologyGraphDO record = new TopologyGraphDO(); record.setPeriod(period); - if (mapper != null) { + try { TopologyGraphDO result = mapper.findByPeriod(record).stream().findFirst().orElse(null); return requireFound(result, "findByPeriod", record.toString()); - } - - try (SqlSession session = openSession()) { - TopologyGraphDO result = session.getMapper(TopologyGraphMapper.class).findByPeriod(record).stream() - .findFirst() - .orElse(null); - return requireFound(result, "findByPeriod", record.toString()); } catch (DalNotFoundException e) { throw e; } catch (Exception e) { @@ -86,19 +67,10 @@ public TopologyGraph findByPeriod(java.util.Date period, Readset public int insert(TopologyGraph proto) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { TopologyGraphDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); - proto.setId(record.getId()); - proto.setKeyId(record.getId()); - return count; - } - - try (SqlSession session = openSession()) { - TopologyGraphDO record = toRecord(proto); - int count = session.getMapper(TopologyGraphMapper.class).insert(record); - session.commit(); proto.setId(record.getId()); proto.setKeyId(record.getId()); return count; @@ -110,14 +82,8 @@ public int insert(TopologyGraph proto) throws DalException { public int updateByPK(TopologyGraph proto, Updateset updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); - if (transactionTemplate != null) { + try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); - } - - try (SqlSession session = openSession()) { - int count = session.getMapper(TopologyGraphMapper.class).updateByPrimaryKey(toRecord(proto)); - session.commit(); - return count; } catch (Exception e) { throw new DalException("Error when executing updateByPK for TopologyGraph.", e); } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index d19b42d1b4..8a025e6a75 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -58,7 +58,6 @@ import org.unidal.cat.message.storage.local.LocalTokenMappingManager; import org.unidal.cat.message.storage.clean.HdfsUploader; import org.unidal.cat.message.storage.clean.LogviewProcessor; -import org.unidal.dal.jdbc.datasource.DataSourceManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; @@ -2737,93 +2736,80 @@ public HostinfoRepository hostinfoRepository(SqlSessionTemplate sqlSessionTempla } @Bean - public DataSourceManager dataSourceManager(DataSource catDataSource) { - return new SpringDataSourceManager(catDataSource); - } - - @Bean - public DailyReportRepository dailyReportRepository(DataSourceManager dataSourceManager, - SqlSessionTemplate sqlSessionTemplate, TransactionTemplate transactionTemplate) { + public DailyReportRepository dailyReportRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { DailyReportRepository repository = new DailyReportRepository(); - repository.setDataSourceManager(dataSourceManager); repository.setSqlSessionTemplate(sqlSessionTemplate); repository.setTransactionTemplate(transactionTemplate); return repository; } @Bean - public DailyReportContentRepository dailyReportContentRepository(DataSourceManager dataSourceManager, - SqlSessionTemplate sqlSessionTemplate, TransactionTemplate transactionTemplate) { + public DailyReportContentRepository dailyReportContentRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { DailyReportContentRepository repository = new DailyReportContentRepository(); - repository.setDataSourceManager(dataSourceManager); repository.setSqlSessionTemplate(sqlSessionTemplate); repository.setTransactionTemplate(transactionTemplate); return repository; } @Bean - public HourlyReportRepository hourlyReportRepository(DataSourceManager dataSourceManager, - SqlSessionTemplate sqlSessionTemplate, TransactionTemplate transactionTemplate) { + public HourlyReportRepository hourlyReportRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { HourlyReportRepository repository = new HourlyReportRepository(); - repository.setDataSourceManager(dataSourceManager); repository.setSqlSessionTemplate(sqlSessionTemplate); repository.setTransactionTemplate(transactionTemplate); return repository; } @Bean - public HourlyReportContentRepository hourlyReportContentRepository(DataSourceManager dataSourceManager, - SqlSessionTemplate sqlSessionTemplate, TransactionTemplate transactionTemplate) { + public HourlyReportContentRepository hourlyReportContentRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { HourlyReportContentRepository repository = new HourlyReportContentRepository(); - repository.setDataSourceManager(dataSourceManager); repository.setSqlSessionTemplate(sqlSessionTemplate); repository.setTransactionTemplate(transactionTemplate); return repository; } @Bean - public WeeklyReportRepository weeklyReportRepository(DataSourceManager dataSourceManager, - SqlSessionTemplate sqlSessionTemplate, TransactionTemplate transactionTemplate) { + public WeeklyReportRepository weeklyReportRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { WeeklyReportRepository repository = new WeeklyReportRepository(); - repository.setDataSourceManager(dataSourceManager); repository.setSqlSessionTemplate(sqlSessionTemplate); repository.setTransactionTemplate(transactionTemplate); return repository; } @Bean - public WeeklyReportContentRepository weeklyReportContentRepository(DataSourceManager dataSourceManager, - SqlSessionTemplate sqlSessionTemplate, TransactionTemplate transactionTemplate) { + public WeeklyReportContentRepository weeklyReportContentRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { WeeklyReportContentRepository repository = new WeeklyReportContentRepository(); - repository.setDataSourceManager(dataSourceManager); repository.setSqlSessionTemplate(sqlSessionTemplate); repository.setTransactionTemplate(transactionTemplate); return repository; } @Bean - public MonthlyReportRepository monthlyReportRepository(DataSourceManager dataSourceManager, - SqlSessionTemplate sqlSessionTemplate, TransactionTemplate transactionTemplate) { + public MonthlyReportRepository monthlyReportRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { MonthlyReportRepository repository = new MonthlyReportRepository(); - repository.setDataSourceManager(dataSourceManager); repository.setSqlSessionTemplate(sqlSessionTemplate); repository.setTransactionTemplate(transactionTemplate); return repository; } @Bean - public MonthlyReportContentRepository monthlyReportContentRepository(DataSourceManager dataSourceManager, - SqlSessionTemplate sqlSessionTemplate, TransactionTemplate transactionTemplate) { + public MonthlyReportContentRepository monthlyReportContentRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { MonthlyReportContentRepository repository = new MonthlyReportContentRepository(); - repository.setDataSourceManager(dataSourceManager); repository.setSqlSessionTemplate(sqlSessionTemplate); repository.setTransactionTemplate(transactionTemplate); return repository; diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/SpringDataSourceManager.java b/cat-home/src/main/java/com/dianping/cat/home/spring/SpringDataSourceManager.java deleted file mode 100644 index f90259eb5a..0000000000 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/SpringDataSourceManager.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.dianping.cat.home.spring; - -import java.sql.Connection; -import java.sql.SQLException; -import java.util.Collections; -import java.util.List; - -import org.unidal.dal.jdbc.datasource.DataSource; -import org.unidal.dal.jdbc.datasource.DataSourceDescriptor; -import org.unidal.dal.jdbc.datasource.DataSourceManager; -import org.unidal.dal.jdbc.datasource.JdbcDataSourceDescriptor; - -final class SpringDataSourceManager implements DataSourceManager { - private static final String CAT_DATA_SOURCE_NAME = "cat"; - - private final DataSource m_catDataSource; - - SpringDataSourceManager(javax.sql.DataSource catDataSource) { - m_catDataSource = new SpringDataSource(catDataSource); - } - - @Override - public DataSource getDataSource(String name) { - if (CAT_DATA_SOURCE_NAME.equals(name)) { - return m_catDataSource; - } - throw new IllegalArgumentException("Unsupported datasource: " + name); - } - - @Override - public List getDataSourceNames() { - return Collections.singletonList(CAT_DATA_SOURCE_NAME); - } - - private static final class SpringDataSource implements DataSource { - private final javax.sql.DataSource m_delegate; - - private final DataSourceDescriptor m_descriptor; - - private SpringDataSource(javax.sql.DataSource delegate) { - m_delegate = delegate; - JdbcDataSourceDescriptor descriptor = new JdbcDataSourceDescriptor(); - - descriptor.setId(CAT_DATA_SOURCE_NAME); - descriptor.setType("jdbc"); - m_descriptor = descriptor; - } - - @Override - public Connection getConnection() throws SQLException { - return m_delegate.getConnection(); - } - - @Override - public DataSourceDescriptor getDescriptor() { - return m_descriptor; - } - - @Override - public void initialize(DataSourceDescriptor descriptor) { - } - } -} From 02691fc7d73fba644c5ea650f89a1bf9fcf5699d Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 15:18:33 +0800 Subject: [PATCH 139/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=20DAL=20JDBC=20?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E5=B9=B6=E7=A6=81=E7=94=A8=E7=94=9F=E6=88=90?= =?UTF-8?q?=20DAO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cat-alarm/pom.xml | 27 ++++++++-- .../cat/alarm/service/AlertService.java | 4 +- .../alarm/spi/config/AlertConfigManager.java | 2 +- .../alarm/spi/config/AlertPolicyManager.java | 2 +- .../alarm/spi/config/SenderConfigManager.java | 2 +- .../repository/alert/AlertRepository.java | 18 +++---- .../alarm/rule/ServerAlarmRuleRepository.java | 12 ++--- .../define/rule/UserDefineRuleRepository.java | 12 ++--- .../config/AllReportConfigManager.java | 4 +- cat-core/pom.xml | 29 +++++++++-- .../config/AtomicMessageConfigManager.java | 2 +- .../cat/config/ReportReloadConfigManager.java | 2 +- .../business/BusinessConfigManager.java | 4 +- .../config/sample/SampleConfigManager.java | 2 +- .../config/server/ServerConfigManager.java | 2 +- .../server/ServerFilterConfigManager.java | 4 +- .../TpValueStatisticConfigManager.java | 2 +- .../config/repository/ConfigRepository.java | 14 +++--- .../cat/core/dal/jdbc/DalException.java | 17 +++++++ .../core/dal/jdbc/DalNotFoundException.java | 13 +++++ .../dianping/cat/core/dal/jdbc/DataField.java | 38 ++++++++++++++ .../cat/core/dal/jdbc/DataObject.java | 39 +++++++++++++++ .../dianping/cat/core/dal/jdbc/QueryDef.java | 50 +++++++++++++++++++ .../dianping/cat/core/dal/jdbc/QueryType.java | 8 +++ .../dianping/cat/core/dal/jdbc/Readset.java | 30 +++++++++++ .../dianping/cat/core/dal/jdbc/Updateset.java | 17 +++++++ .../core/dal/jdbc/annotation/Attribute.java | 17 +++++++ .../cat/core/dal/jdbc/annotation/Entity.java | 9 ++++ .../core/dal/jdbc/annotation/Variable.java | 7 +++ .../core/dal/jdbc/mapping/TableProvider.java | 9 ++++ .../config/BusinessConfigRepository.java | 16 +++--- .../content/DailyReportContentRepository.java | 12 ++--- .../hostinfo/HostinfoRepository.java | 14 +++--- .../HourlyReportContentRepository.java | 12 ++--- .../hourlyreport/HourlyReportRepository.java | 14 +++--- .../MonthlyReportContentRepository.java | 12 ++--- .../monthreport/MonthlyReportRepository.java | 12 ++--- .../repository/project/ProjectRepository.java | 16 +++--- .../repository/task/TaskRepository.java | 22 ++++---- .../WeeklyReportContentRepository.java | 12 ++--- .../weeklyreport/WeeklyReportRepository.java | 12 ++--- .../repository/DailyReportRepository.java | 14 +++--- .../HourlyReportContentTableProvider.java | 2 +- .../cat/report/HourlyReportTableProvider.java | 2 +- .../report/service/AbstractReportService.java | 4 +- .../dianping/cat/service/HostinfoService.java | 4 +- .../dianping/cat/service/ProjectService.java | 2 +- .../com/dianping/cat/task/TaskManager.java | 2 +- .../cat/service/DefaultReportManagerTest.java | 2 +- .../dianping/cat/task/TaskManagerTest.java | 2 +- cat-home/pom.xml | 29 +++++++++-- .../alert/summary/AlertSummaryRepository.java | 10 ++-- .../alteration/AlterationRepository.java | 18 +++---- .../baseline/BaselineRepository.java | 12 ++--- .../ConfigModificationRepository.java | 10 ++-- .../metric/graph/MetricGraphRepository.java | 14 +++--- .../metric/screen/MetricScreenRepository.java | 16 +++--- .../overload/OverloadRepository.java | 16 +++--- .../TopologyGraphRepository.java | 12 ++--- .../business/BusinessRuleConfigManager.java | 2 +- .../exception/ExceptionRuleConfigManager.java | 2 +- .../spi/config/BaseRuleConfigManager.java | 4 +- .../spi/config/UserDefinedRuleManager.java | 2 +- .../alert/summary/AlertSummaryService.java | 2 +- .../alert/summary/build/AlertInfoBuilder.java | 2 +- .../build/AlterationSummaryBuilder.java | 2 +- .../report/page/DomainGroupConfigManager.java | 2 +- .../cat/report/page/alert/Handler.java | 2 +- .../cat/report/page/alteration/Handler.java | 2 +- .../service/BusinessReportService.java | 4 +- .../cross/service/CrossReportService.java | 4 +- .../config/TopoGraphFormatConfigManager.java | 2 +- .../graph/TopologyGraphConfigManager.java | 2 +- .../graph/TopologyGraphManager.java | 2 +- .../service/DependencyReportService.java | 4 +- .../event/service/EventReportService.java | 4 +- .../page/event/task/EventReportBuilder.java | 2 +- .../config/HeartbeatDisplayPolicyManager.java | 2 +- .../service/HeartbeatReportService.java | 4 +- .../matrix/service/MatrixReportService.java | 4 +- .../service/DefaultBaselineService.java | 2 +- .../task/CapacityUpdateStatusManager.java | 2 +- .../overload/task/CapacityUpdateTask.java | 2 +- .../page/overload/task/CapacityUpdater.java | 2 +- .../overload/task/DailyCapacityUpdater.java | 4 +- .../overload/task/HourlyCapacityUpdater.java | 4 +- .../overload/task/MonthlyCapacityUpdater.java | 4 +- .../overload/task/TableCapacityService.java | 4 +- .../overload/task/WeeklyCapacityUpdater.java | 4 +- .../problem/service/ProblemReportService.java | 4 +- .../problem/task/ProblemReportBuilder.java | 2 +- .../state/service/StateReportService.java | 4 +- .../service/ClientReportService.java | 4 +- .../service/HeavyReportService.java | 4 +- .../statistics/service/JarReportService.java | 2 +- .../service/ServiceReportService.java | 4 +- .../service/UtilizationReportService.java | 4 +- .../cat/report/page/storage/Handler.java | 2 +- .../config/StorageGroupConfigManager.java | 2 +- .../storage/task/StorageReportBuilder.java | 2 +- .../storage/task/StorageReportService.java | 4 +- .../page/top/service/TopReportService.java | 4 +- .../service/TransactionReportService.java | 4 +- .../task/TransactionReportBuilder.java | 2 +- .../cat/report/task/DefaultTaskConsumer.java | 2 +- .../report/task/cmdb/ProjectUpdateTask.java | 2 +- .../task/current/CurrentReportBuilder.java | 2 +- .../task/reload/AbstractReportReloader.java | 2 +- .../permission/ResourceConfigManager.java | 2 +- .../page/permission/UserConfigManager.java | 2 +- .../router/config/RouterConfigAdjustor.java | 2 +- .../router/config/RouterConfigManager.java | 4 +- .../router/service/RouterConfigService.java | 4 +- .../cat/report/service/ReportDaoTest.java | 21 ++++---- .../cat/report/task/ConfigsBackupTest.java | 2 +- .../cat/report/task/DatabaseCapacityTest.java | 2 +- 116 files changed, 582 insertions(+), 320 deletions(-) create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalException.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalNotFoundException.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataField.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataObject.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryDef.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryType.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Readset.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Updateset.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Attribute.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Entity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Variable.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/mapping/TableProvider.java diff --git a/cat-alarm/pom.xml b/cat-alarm/pom.xml index 3e3ebf1415..c90abf0718 100644 --- a/cat-alarm/pom.xml +++ b/cat-alarm/pom.xml @@ -27,10 +27,6 @@ org.unidal.framework web-framework - - org.unidal.framework - dal-jdbc - org.mybatis mybatis @@ -126,6 +122,29 @@ + + maven-antrun-plugin + + + rewrite generated dal jdbc sources + generate-sources + + run + + + + + + + + + + + + + + + diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java index c25d2ed269..4fe989e46d 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java @@ -22,8 +22,8 @@ import java.util.LinkedList; import java.util.List; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java index dd64e438bf..58064ad47a 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java @@ -21,7 +21,7 @@ import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.alarm.receiver.entity.AlertConfig; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java index a10d71564b..e68da105e8 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java @@ -23,7 +23,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.alarm.policy.entity.AlertPolicy; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java index 31f87f80d4..6817a74b28 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java @@ -22,7 +22,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.alarm.sender.entity.Par; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java index d97f13aaf0..b820ab2162 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java @@ -9,10 +9,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; public class AlertRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(AlertRepository.class); @@ -37,7 +35,7 @@ public int deleteByPK(Alert proto) throws DalException { } } - public List queryAlertsByTimeDomain(java.util.Date startTime, java.util.Date endTime, String domain, Readset readset) throws DalException { + public List queryAlertsByTimeDomain(java.util.Date startTime, java.util.Date endTime, String domain, Object readset) throws DalException { AlertMapper mapper = springMapper(LOGGER); AlertDO record = new AlertDO(); @@ -51,7 +49,7 @@ public List queryAlertsByTimeDomain(java.util.Date startTime, java.util.D } } - public List queryAlertsByTimeDomainCategories(java.util.Date startTime, java.util.Date endTime, String domain, String[] categories, Readset readset) throws DalException { + public List queryAlertsByTimeDomainCategories(java.util.Date startTime, java.util.Date endTime, String domain, String[] categories, Object readset) throws DalException { AlertMapper mapper = springMapper(LOGGER); AlertDO record = new AlertDO(); @@ -67,7 +65,7 @@ public List queryAlertsByTimeDomainCategories(java.util.Date startTime, j } } - public List queryAlertsByTimeCategoryDomain(java.util.Date startTime, java.util.Date endTime, String category, String domain, Readset readset) throws DalException { + public List queryAlertsByTimeCategoryDomain(java.util.Date startTime, java.util.Date endTime, String category, String domain, Object readset) throws DalException { AlertMapper mapper = springMapper(LOGGER); AlertDO record = new AlertDO(); @@ -83,7 +81,7 @@ public List queryAlertsByTimeCategoryDomain(java.util.Date startTime, jav } } - public List queryAlertsByTimeCategory(java.util.Date startTime, java.util.Date endTime, String category, Readset readset) throws DalException { + public List queryAlertsByTimeCategory(java.util.Date startTime, java.util.Date endTime, String category, Object readset) throws DalException { AlertMapper mapper = springMapper(LOGGER); AlertDO record = new AlertDO(); @@ -97,7 +95,7 @@ public List queryAlertsByTimeCategory(java.util.Date startTime, java.util } } - public Alert findByPK(int keyId, Readset readset) throws DalException { + public Alert findByPK(int keyId, Object readset) throws DalException { AlertMapper mapper = springMapper(LOGGER); try { @@ -124,7 +122,7 @@ public int insert(Alert proto) throws DalException { } } - public int updateByPK(Alert proto, Updateset updateset) throws DalException { + public int updateByPK(Alert proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java index 8f498ea47f..35d24417bf 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java @@ -9,10 +9,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; public class ServerAlarmRuleRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(ServerAlarmRuleRepository.class); @@ -38,7 +36,7 @@ public int deleteByPK(ServerAlarmRule proto) throws DalException { } } - public List findAll(Readset readset) throws DalException { + public List findAll(Object readset) throws DalException { ServerAlarmRuleMapper mapper = springMapper(LOGGER); ServerAlarmRuleDO record = new ServerAlarmRuleDO(); @@ -49,7 +47,7 @@ public List findAll(Readset readset) throws Da } } - public ServerAlarmRule findByPK(int keyId, Readset readset) throws DalException { + public ServerAlarmRule findByPK(int keyId, Object readset) throws DalException { ServerAlarmRuleMapper mapper = springMapper(LOGGER); try { @@ -76,7 +74,7 @@ public int insert(ServerAlarmRule proto) throws DalException { } } - public int updateByPK(ServerAlarmRule proto, Updateset updateset) throws DalException { + public int updateByPK(ServerAlarmRule proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java index fc0db2611b..26500c0bda 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java @@ -7,10 +7,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; public class UserDefineRuleRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(UserDefineRuleRepository.class); @@ -36,7 +34,7 @@ public int deleteByPK(UserDefineRule proto) throws DalException { } } - public UserDefineRule findByPK(int keyId, Readset readset) throws DalException { + public UserDefineRule findByPK(int keyId, Object readset) throws DalException { UserDefineRuleMapper mapper = springMapper(LOGGER); try { @@ -48,7 +46,7 @@ public UserDefineRule findByPK(int keyId, Readset readset) throw } } - public UserDefineRule findMaxId(Readset readset) throws DalException { + public UserDefineRule findMaxId(Object readset) throws DalException { UserDefineRuleMapper mapper = springMapper(LOGGER); UserDefineRuleDO record = new UserDefineRuleDO(); @@ -78,7 +76,7 @@ public int insert(UserDefineRule proto) throws DalException { } } - public int updateByPK(UserDefineRule proto, Updateset updateset) throws DalException { + public int updateByPK(UserDefineRule proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java index 335f716cf3..2d7110b56a 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java @@ -24,8 +24,8 @@ import java.util.Map; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.xml.sax.SAXException; import com.dianping.cat.Cat; diff --git a/cat-core/pom.xml b/cat-core/pom.xml index 85b252d9a6..06a33da2fd 100644 --- a/cat-core/pom.xml +++ b/cat-core/pom.xml @@ -39,10 +39,6 @@ com.google.guava guava - - org.unidal.framework - dal-jdbc - org.mybatis mybatis @@ -131,7 +127,30 @@ - + + + maven-antrun-plugin + + + rewrite generated dal jdbc sources + generate-sources + + run + + + + + + + + + + + + + + + diff --git a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java index 76ec70d3cd..2d350bf4ff 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java @@ -20,7 +20,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; diff --git a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java index ae641a3349..47377d3dd1 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java @@ -26,7 +26,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; diff --git a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java index 559d291aa7..a3c11b487e 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java @@ -27,8 +27,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; diff --git a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java index 4c8e83b970..917f6531f7 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java @@ -20,7 +20,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java index e932c8500b..eaae46575d 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java @@ -34,7 +34,7 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.tuple.Pair; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.support.Threads; import org.xml.sax.SAXException; diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java index 47415630b0..004ec0fa14 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java @@ -22,8 +22,8 @@ import java.util.HashSet; import java.util.Set; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.xml.sax.SAXException; import com.dianping.cat.Cat; diff --git a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java index da1971c5a2..c80af95868 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java @@ -21,7 +21,7 @@ import java.util.HashSet; import java.util.Set; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java index 0856dff8bd..8a6b0d01dd 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java @@ -8,10 +8,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.dao.ConfigMapper; @@ -36,19 +34,19 @@ public int deleteByPK(Config proto) throws DalException { return transactionTemplate.execute(status -> springMapper().deleteById(proto.getKeyId())); } - public List findAllConfig(Readset readset) throws DalException { + public List findAllConfig(Object readset) throws DalException { ConfigMapper mapper = springMapper(); return mapper.queryAll().stream().map(this::toConfig).collect(Collectors.toList()); } - public Config findByName(String name, Readset readset) throws DalException { + public Config findByName(String name, Object readset) throws DalException { ConfigMapper mapper = springMapper(); return requireFound(mapper.findByName(name), "name", name); } - public Config findByPK(int keyId, Readset readset) throws DalException { + public Config findByPK(int keyId, Object readset) throws DalException { ConfigMapper mapper = springMapper(); return requireFound(mapper.findById(keyId), "id", String.valueOf(keyId)); @@ -65,7 +63,7 @@ public int insert(Config proto) throws DalException { return count; } - public int updateByPK(Config proto, Updateset updateset) throws DalException { + public int updateByPK(Config proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateById(toConfigDO(proto))); diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalException.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalException.java new file mode 100644 index 0000000000..c12ceec06f --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalException.java @@ -0,0 +1,17 @@ +package com.dianping.cat.core.dal.jdbc; + +public class DalException extends Exception { + private static final long serialVersionUID = 1L; + + public DalException(String message) { + super(message); + } + + public DalException(String message, Throwable cause) { + super(message, cause); + } + + public DalException(Throwable cause) { + super(cause); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalNotFoundException.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalNotFoundException.java new file mode 100644 index 0000000000..3a8c1c9110 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalNotFoundException.java @@ -0,0 +1,13 @@ +package com.dianping.cat.core.dal.jdbc; + +public class DalNotFoundException extends DalException { + private static final long serialVersionUID = 1L; + + public DalNotFoundException(String message) { + super(message); + } + + public DalNotFoundException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataField.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataField.java new file mode 100644 index 0000000000..ebd1abb1e3 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataField.java @@ -0,0 +1,38 @@ +package com.dianping.cat.core.dal.jdbc; + +public class DataField { + private Class m_entityClass; + + private int m_index; + + private final String m_name; + + public DataField(String name) { + m_name = name; + } + + public Class getEntityClass() { + return m_entityClass; + } + + public int getIndex() { + return m_index; + } + + public String getName() { + return m_name; + } + + public void setEntityClass(Class entityClass) { + m_entityClass = entityClass; + } + + public void setIndex(int index) { + m_index = index; + } + + @Override + public String toString() { + return m_name; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataObject.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataObject.java new file mode 100644 index 0000000000..fa79ccb6c6 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataObject.java @@ -0,0 +1,39 @@ +package com.dianping.cat.core.dal.jdbc; + +import java.util.HashMap; +import java.util.Map; + +public abstract class DataObject { + private Map m_queryHints; + + private final Map m_usedFields = new HashMap<>(); + + public void afterLoad() { + } + + public void beforeSave() { + } + + protected void clearUsage() { + m_usedFields.clear(); + } + + public Map getQueryHints() { + if (m_queryHints == null) { + m_queryHints = new HashMap<>(); + } + return m_queryHints; + } + + public boolean isFieldUsed(DataField field) { + return Boolean.TRUE.equals(m_usedFields.get(field)); + } + + protected void setFieldUsed(DataField field, boolean used) { + m_usedFields.put(field, used); + } + + public void setQueryHint(String name, Object value) { + getQueryHints().put(name, value); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryDef.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryDef.java new file mode 100644 index 0000000000..94dfd5778c --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryDef.java @@ -0,0 +1,50 @@ +package com.dianping.cat.core.dal.jdbc; + +public class QueryDef { + private final Class m_entityClass; + + private final String m_name; + + private final boolean m_raw; + + private final String m_statement; + + private final QueryType m_type; + + public QueryDef(String name, Class entityClass, QueryType type, String statement) { + this(name, entityClass, type, statement, false); + } + + public QueryDef(String name, Class entityClass, QueryType type, String statement, boolean raw) { + m_name = name; + m_entityClass = entityClass; + m_type = type; + m_statement = statement; + m_raw = raw; + } + + public Class getEntityClass() { + return m_entityClass; + } + + public String getName() { + return m_name; + } + + public QueryType getType() { + return m_type; + } + + public boolean isRaw() { + return m_raw; + } + + public boolean isStoreProcedure() { + return false; + } + + @Override + public String toString() { + return m_statement; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryType.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryType.java new file mode 100644 index 0000000000..a6e1c18c62 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryType.java @@ -0,0 +1,8 @@ +package com.dianping.cat.core.dal.jdbc; + +public enum QueryType { + SELECT, + INSERT, + UPDATE, + DELETE +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Readset.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Readset.java new file mode 100644 index 0000000000..21c69d6c8c --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Readset.java @@ -0,0 +1,30 @@ +package com.dianping.cat.core.dal.jdbc; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Readset { + private final List> m_children; + + private final List m_fields; + + @SafeVarargs + public Readset(Readset... children) { + m_children = Collections.unmodifiableList(Arrays.asList(children)); + m_fields = Collections.emptyList(); + } + + public Readset(DataField... fields) { + m_children = Collections.emptyList(); + m_fields = Collections.unmodifiableList(Arrays.asList(fields)); + } + + public List> getChildren() { + return m_children; + } + + public List getFields() { + return m_fields; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Updateset.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Updateset.java new file mode 100644 index 0000000000..c352277770 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Updateset.java @@ -0,0 +1,17 @@ +package com.dianping.cat.core.dal.jdbc; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Updateset { + private final List m_fields; + + public Updateset(DataField... fields) { + m_fields = Collections.unmodifiableList(Arrays.asList(fields)); + } + + public List getFields() { + return m_fields; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Attribute.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Attribute.java new file mode 100644 index 0000000000..61a1dda514 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Attribute.java @@ -0,0 +1,17 @@ +package com.dianping.cat.core.dal.jdbc.annotation; + +public @interface Attribute { + boolean autoIncrement() default false; + + String field(); + + String insertExpr() default ""; + + boolean nullable() default true; + + boolean primaryKey() default false; + + String selectExpr() default ""; + + String updateExpr() default ""; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Entity.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Entity.java new file mode 100644 index 0000000000..cf59a53813 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Entity.java @@ -0,0 +1,9 @@ +package com.dianping.cat.core.dal.jdbc.annotation; + +public @interface Entity { + String alias(); + + String logicalName(); + + String physicalName(); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Variable.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Variable.java new file mode 100644 index 0000000000..d89382f043 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Variable.java @@ -0,0 +1,7 @@ +package com.dianping.cat.core.dal.jdbc.annotation; + +public @interface Variable { + int scale() default 0; + + int sqlType() default 0; +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/mapping/TableProvider.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/mapping/TableProvider.java new file mode 100644 index 0000000000..481a66e3a4 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/mapping/TableProvider.java @@ -0,0 +1,9 @@ +package com.dianping.cat.core.dal.jdbc.mapping; + +import java.util.Map; + +public interface TableProvider { + String getDataSourceName(Map hints, String logicalTableName); + + String getPhysicalTableName(Map hints, String logicalTableName); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java index 5da14fedb0..846c7b612e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java @@ -8,10 +8,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.config.BusinessConfig; import com.dianping.cat.core.mybatis.generated.business.config.dao.BusinessConfigMapper; @@ -36,7 +34,7 @@ public int deleteByPK(BusinessConfig proto) throws DalException { return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } - public List findByName(String name, Readset readset) throws DalException { + public List findByName(String name, Object readset) throws DalException { BusinessConfigMapper mapper = springMapper(); BusinessConfigDO record = new BusinessConfigDO(); @@ -44,13 +42,13 @@ public List findByName(String name, Readset read return mapper.findByName(record).stream().map(this::toModel).collect(Collectors.toList()); } - public BusinessConfig findByPK(int keyId, Readset readset) throws DalException { + public BusinessConfig findByPK(int keyId, Object readset) throws DalException { BusinessConfigMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } - public BusinessConfig findByNameDomain(String name, String domain, Readset readset) + public BusinessConfig findByNameDomain(String name, String domain, Object readset) throws DalException { BusinessConfigMapper mapper = springMapper(); BusinessConfigDO record = new BusinessConfigDO(); @@ -73,13 +71,13 @@ public int insert(BusinessConfig proto) throws DalException { return count; } - public int updateByPK(BusinessConfig proto, Updateset updateset) throws DalException { + public int updateByPK(BusinessConfig proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } - public int updateBaseConfigByDomain(BusinessConfig proto, Updateset updateset) throws DalException { + public int updateBaseConfigByDomain(BusinessConfig proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateBaseConfigByDomain(toRecord(proto))); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java index e6ed90bf88..1e2e817654 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java @@ -8,10 +8,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.DailyReportContent; import com.dianping.cat.core.mybatis.generated.daily.report.content.dao.DailyReportContentMapper; @@ -40,7 +38,7 @@ public int deleteByPK(DailyReportContent proto) throws DalException { } } - public List findOverloadReport(int startId, Readset readset) + public List findOverloadReport(int startId, Object readset) throws DalException { DailyReportContentMapper mapper = springMapper(); DailyReportContentDO record = new DailyReportContentDO(); @@ -53,7 +51,7 @@ public List findOverloadReport(int startId, Readset readset) throws DalException { + public DailyReportContent findByPK(int keyReportId, Object readset) throws DalException { DailyReportContentMapper mapper = springMapper(); try { @@ -75,7 +73,7 @@ public int insert(DailyReportContent proto) throws DalException { } } - public int updateByPK(DailyReportContent proto, Updateset updateset) throws DalException { + public int updateByPK(DailyReportContent proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java index 7e140a8120..3a496e9c51 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java @@ -8,10 +8,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.Hostinfo; import com.dianping.cat.core.mybatis.generated.hostinfo.dao.HostinfoMapper; @@ -36,7 +34,7 @@ public int deleteByPK(Hostinfo proto) throws DalException { return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } - public List findAllIp(Readset readset) throws DalException { + public List findAllIp(Object readset) throws DalException { HostinfoMapper mapper = springMapper(); HostinfoDO record = new HostinfoDO(); @@ -44,13 +42,13 @@ public List findAllIp(Readset readset) throws DalException { return mapper.findAllIp(record).stream().map(this::toModel).collect(Collectors.toList()); } - public Hostinfo findByPK(int keyId, Readset readset) throws DalException { + public Hostinfo findByPK(int keyId, Object readset) throws DalException { HostinfoMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } - public Hostinfo findByIp(String ip, Readset readset) throws DalException { + public Hostinfo findByIp(String ip, Object readset) throws DalException { HostinfoMapper mapper = springMapper(); HostinfoDO record = new HostinfoDO(); @@ -71,7 +69,7 @@ public int insert(Hostinfo proto) throws DalException { return count; } - public int updateByPK(Hostinfo proto, Updateset updateset) throws DalException { + public int updateByPK(Hostinfo proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java index a05d998834..b2376e7d89 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java @@ -8,10 +8,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.HourlyReportContent; import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.HourlyReportContentMapper; @@ -40,7 +38,7 @@ public int deleteByPK(HourlyReportContent proto) throws DalException { } } - public List findOverloadReport(int startId, Readset readset) + public List findOverloadReport(int startId, Object readset) throws DalException { HourlyReportContentMapper mapper = springMapper(); HourlyReportContentDO record = new HourlyReportContentDO(); @@ -53,7 +51,7 @@ public List findOverloadReport(int startId, Readset readset) + public HourlyReportContent findByPK(int keyReportId, java.util.Date period, Object readset) throws DalException { HourlyReportContentMapper mapper = springMapper(); @@ -76,7 +74,7 @@ public int insert(HourlyReportContent proto) throws DalException { } } - public int updateByPK(HourlyReportContent proto, Updateset updateset) throws DalException { + public int updateByPK(HourlyReportContent proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java index 5a2949d21b..49719e86b3 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java @@ -8,10 +8,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.HourlyreportMapper; @@ -37,7 +35,7 @@ public int deleteByPK(HourlyReport proto) throws DalException { } public List findAllByDomainNamePeriod(java.util.Date period, String domain, String name, - Readset readset) throws DalException { + Object readset) throws DalException { HourlyreportDO record = new HourlyreportDO(); HourlyreportMapper mapper = springMapper(); @@ -47,7 +45,7 @@ public List findAllByDomainNamePeriod(java.util.Date period, Strin return mapper.findAllByDomainNamePeriod(record).stream().map(this::toModel).collect(Collectors.toList()); } - public List findAllByPeriodName(java.util.Date period, String name, Readset readset) + public List findAllByPeriodName(java.util.Date period, String name, Object readset) throws DalException { HourlyreportDO record = new HourlyreportDO(); HourlyreportMapper mapper = springMapper(); @@ -57,7 +55,7 @@ public List findAllByPeriodName(java.util.Date period, String name return mapper.findAllByPeriodName(record).stream().map(this::toModel).collect(Collectors.toList()); } - public HourlyReport findByPK(int keyId, Readset readset) throws DalException { + public HourlyReport findByPK(int keyId, Object readset) throws DalException { HourlyreportMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); @@ -74,7 +72,7 @@ public int insert(HourlyReport proto) throws DalException { return count; } - public int updateByPK(HourlyReport proto, Updateset updateset) throws DalException { + public int updateByPK(HourlyReport proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java index f590c23582..ec66c8801e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java @@ -8,10 +8,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.MonthlyReportContent; import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.MonthlyReportContentMapper; @@ -40,7 +38,7 @@ public int deleteByPK(MonthlyReportContent proto) throws DalException { } } - public List findOverloadReport(int startId, Readset readset) + public List findOverloadReport(int startId, Object readset) throws DalException { MonthlyReportContentMapper mapper = springMapper(); MonthlyReportContentDO record = new MonthlyReportContentDO(); @@ -53,7 +51,7 @@ public List findOverloadReport(int startId, Readset readset) throws DalException { + public MonthlyReportContent findByPK(int keyReportId, Object readset) throws DalException { MonthlyReportContentMapper mapper = springMapper(); try { @@ -75,7 +73,7 @@ public int insert(MonthlyReportContent proto) throws DalException { } } - public int updateByPK(MonthlyReportContent proto, Updateset updateset) throws DalException { + public int updateByPK(MonthlyReportContent proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java index a0ff272867..b432ecf613 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java @@ -6,10 +6,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.mybatis.generated.monthreport.dao.MonthreportMapper; @@ -40,14 +38,14 @@ public int deleteReportByDomainNamePeriod(MonthlyReport proto) throws DalExcepti return transactionTemplate.execute(status -> springMapper().deleteReportByDomainNamePeriod(toRecord(proto))); } - public MonthlyReport findByPK(int keyId, Readset readset) throws DalException { + public MonthlyReport findByPK(int keyId, Object readset) throws DalException { MonthreportMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } public MonthlyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name, - Readset readset) throws DalException { + Object readset) throws DalException { MonthreportDO record = new MonthreportDO(); MonthreportMapper mapper = springMapper(); @@ -70,7 +68,7 @@ public int insert(MonthlyReport proto) throws DalException { return count; } - public int updateByPK(MonthlyReport proto, Updateset updateset) throws DalException { + public int updateByPK(MonthlyReport proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java index aafb6517ad..ab6e8ad09e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java @@ -8,10 +8,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.Project; import com.dianping.cat.core.mybatis.generated.project.dao.ProjectMapper; @@ -36,7 +34,7 @@ public int deleteByPK(Project proto) throws DalException { return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } - public List findAll(Readset readset) throws DalException { + public List findAll(Object readset) throws DalException { ProjectMapper mapper = springMapper(); ProjectDO record = new ProjectDO(); @@ -44,13 +42,13 @@ public List findAll(Readset readset) throws DalException { return mapper.findAll(record).stream().map(this::toModel).collect(Collectors.toList()); } - public Project findByPK(int keyId, Readset readset) throws DalException { + public Project findByPK(int keyId, Object readset) throws DalException { ProjectMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } - public Project findByDomain(String domain, Readset readset) throws DalException { + public Project findByDomain(String domain, Object readset) throws DalException { ProjectDO record = new ProjectDO(); ProjectMapper mapper = springMapper(); @@ -60,7 +58,7 @@ public Project findByDomain(String domain, Readset readset) throws DalE return requireFound(result, "findByDomain", record.toString()); } - public Project findByCmdbDomain(String domain, Readset readset) throws DalException { + public Project findByCmdbDomain(String domain, Object readset) throws DalException { ProjectDO record = new ProjectDO(); ProjectMapper mapper = springMapper(); @@ -81,7 +79,7 @@ public int insert(Project proto) throws DalException { return count; } - public int updateByPK(Project proto, Updateset updateset) throws DalException { + public int updateByPK(Project proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java index 39e385bb4f..a134c5112d 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java @@ -6,10 +6,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.Task; import com.dianping.cat.core.mybatis.generated.task.dao.TaskMapper; @@ -34,13 +32,13 @@ public int deleteByPK(Task proto) throws DalException { return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } - public Task findByPK(int keyId, Readset readset) throws DalException { + public Task findByPK(int keyId, Object readset) throws DalException { TaskMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } - public Task findByStatusConsumer(int status, String consumer, Readset readset) throws DalException { + public Task findByStatusConsumer(int status, String consumer, Object readset) throws DalException { TaskMapper mapper = springMapper(); TaskDO record = new TaskDO(); @@ -62,37 +60,37 @@ public int insert(Task proto) throws DalException { return count; } - public int updateByPK(Task proto, Updateset updateset) throws DalException { + public int updateByPK(Task proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } - public int updateTodoToDoing(Task proto, Updateset updateset) throws DalException { + public int updateTodoToDoing(Task proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateTodoToDoing(toRecord(proto))); } - public int updateDoingToDone(Task proto, Updateset updateset) throws DalException { + public int updateDoingToDone(Task proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateDoingToDone(toRecord(proto))); } - public int updateFailureToDone(Task proto, Updateset updateset) throws DalException { + public int updateFailureToDone(Task proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateFailureToDone(toRecord(proto))); } - public int updateStatusToTodo(Task proto, Updateset updateset) throws DalException { + public int updateStatusToTodo(Task proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateStatusToTodo(toRecord(proto))); } - public int updateDoingToFail(Task proto, Updateset updateset) throws DalException { + public int updateDoingToFail(Task proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateDoingToFail(toRecord(proto))); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java index 88c6b67292..6734c2ae67 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java @@ -8,10 +8,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.WeeklyReportContent; import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.WeeklyReportContentMapper; @@ -40,7 +38,7 @@ public int deleteByPK(WeeklyReportContent proto) throws DalException { } } - public List findOverloadReport(int startId, Readset readset) + public List findOverloadReport(int startId, Object readset) throws DalException { WeeklyReportContentMapper mapper = springMapper(); WeeklyReportContentDO record = new WeeklyReportContentDO(); @@ -53,7 +51,7 @@ public List findOverloadReport(int startId, Readset readset) throws DalException { + public WeeklyReportContent findByPK(int keyReportId, Object readset) throws DalException { WeeklyReportContentMapper mapper = springMapper(); try { @@ -75,7 +73,7 @@ public int insert(WeeklyReportContent proto) throws DalException { } } - public int updateByPK(WeeklyReportContent proto, Updateset updateset) throws DalException { + public int updateByPK(WeeklyReportContent proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java index 04dec1de37..9ee2e0b0ef 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java @@ -6,10 +6,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.WeeklyreportMapper; @@ -40,14 +38,14 @@ public int deleteReportByDomainNamePeriod(WeeklyReport proto) throws DalExceptio return transactionTemplate.execute(status -> springMapper().deleteReportByDomainNamePeriod(toRecord(proto))); } - public WeeklyReport findByPK(int keyId, Readset readset) throws DalException { + public WeeklyReport findByPK(int keyId, Object readset) throws DalException { WeeklyreportMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } public WeeklyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name, - Readset readset) throws DalException { + Object readset) throws DalException { WeeklyreportDO record = new WeeklyreportDO(); WeeklyreportMapper mapper = springMapper(); @@ -70,7 +68,7 @@ public int insert(WeeklyReport proto) throws DalException { return count; } - public int updateByPK(WeeklyReport proto, Updateset updateset) throws DalException { + public int updateByPK(WeeklyReport proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java index 88fb364665..cd9c556bc6 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java @@ -8,10 +8,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.report.daily.dao.DailyReportMapper; @@ -44,14 +42,14 @@ public int deleteByPK(DailyReport proto) throws DalException { } public DailyReport findByDomainNamePeriod(String domain, String name, java.util.Date period, - Readset readset) throws DalException { + Object readset) throws DalException { DailyReportMapper mapper = springMapper(); return requireFound(mapper.findByDomainNamePeriod(domain, name, period), "domain/name/period", domain + "/" + name + "/" + period); } - public DailyReport findByPK(int keyId, Readset readset) throws DalException { + public DailyReport findByPK(int keyId, Object readset) throws DalException { DailyReportMapper mapper = springMapper(); return requireFound(mapper.findById(keyId), "id", String.valueOf(keyId)); @@ -69,7 +67,7 @@ public int insert(DailyReport proto) throws DalException { } public List queryLatestReportsByDomainName(String domain, String name, int limits, - Readset readset) throws DalException { + Object readset) throws DalException { DailyReportMapper mapper = springMapper(); return mapper.queryLatestReportsByDomainName(domain, name, limits).stream() @@ -77,7 +75,7 @@ public List queryLatestReportsByDomainName(String domain, String na .collect(Collectors.toList()); } - public int updateByPK(DailyReport proto, Updateset updateset) throws DalException { + public int updateByPK(DailyReport proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateById(toDailyReportDO(proto))); diff --git a/cat-core/src/main/java/com/dianping/cat/report/HourlyReportContentTableProvider.java b/cat-core/src/main/java/com/dianping/cat/report/HourlyReportContentTableProvider.java index 1aac94bbcd..c4c9331c9e 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/HourlyReportContentTableProvider.java +++ b/cat-core/src/main/java/com/dianping/cat/report/HourlyReportContentTableProvider.java @@ -20,7 +20,7 @@ import java.util.Map; -import org.unidal.dal.jdbc.mapping.TableProvider; +import com.dianping.cat.core.dal.jdbc.mapping.TableProvider; public class HourlyReportContentTableProvider implements TableProvider { diff --git a/cat-core/src/main/java/com/dianping/cat/report/HourlyReportTableProvider.java b/cat-core/src/main/java/com/dianping/cat/report/HourlyReportTableProvider.java index c6d68e6981..f07ffcd20f 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/HourlyReportTableProvider.java +++ b/cat-core/src/main/java/com/dianping/cat/report/HourlyReportTableProvider.java @@ -20,7 +20,7 @@ import java.util.Map; -import org.unidal.dal.jdbc.mapping.TableProvider; +import com.dianping.cat.core.dal.jdbc.mapping.TableProvider; public class HourlyReportTableProvider implements TableProvider { diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java index 46abd3cb8e..4a2695c1bc 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java @@ -28,8 +28,8 @@ import java.util.Map.Entry; import java.util.Set; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; diff --git a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java index fbe5540873..d042ea8503 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java @@ -26,8 +26,8 @@ import java.util.regex.Pattern; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.support.Threads; import com.dianping.cat.support.Threads.Task; diff --git a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java index f335eb7ba9..d9323bb8a2 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java @@ -25,7 +25,7 @@ import com.dianping.cat.core.dal.ProjectEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import java.util.*; import java.util.Map.Entry; diff --git a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java index 92d41e6d18..2c28ed47bc 100644 --- a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java +++ b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java @@ -22,7 +22,7 @@ import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.core.dal.Task; import com.dianping.cat.core.mybatis.repository.task.TaskRepository; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import java.util.Calendar; import java.util.Date; diff --git a/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java b/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java index 48aa19d69c..dcd037f5cc 100644 --- a/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java +++ b/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java @@ -30,8 +30,8 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; diff --git a/cat-core/src/test/java/com/dianping/cat/task/TaskManagerTest.java b/cat-core/src/test/java/com/dianping/cat/task/TaskManagerTest.java index 942f713374..9ce9a4a765 100644 --- a/cat-core/src/test/java/com/dianping/cat/task/TaskManagerTest.java +++ b/cat-core/src/test/java/com/dianping/cat/task/TaskManagerTest.java @@ -27,8 +27,8 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.task.TaskManager.TaskProlicy; public class TaskManagerTest { diff --git a/cat-home/pom.xml b/cat-home/pom.xml index 3860174f2d..2d9d626170 100755 --- a/cat-home/pom.xml +++ b/cat-home/pom.xml @@ -50,10 +50,6 @@ servlet-api provided - - org.unidal.framework - dal-jdbc - org.mybatis mybatis @@ -214,7 +210,30 @@ - + + + maven-antrun-plugin + + + rewrite generated dal jdbc sources + generate-sources + + run + + + + + + + + + + + + + + + org.apache.maven.plugins maven-war-plugin diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java index 8efe4d7efc..dd8c514868 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java @@ -7,10 +7,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; public class AlertSummaryRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(AlertSummaryRepository.class); @@ -36,7 +34,7 @@ public int deleteByPK(AlertSummary proto) throws DalException { } } - public AlertSummary findByPK(int keyId, Readset readset) throws DalException { + public AlertSummary findByPK(int keyId, Object readset) throws DalException { AlertSummaryMapper mapper = springMapper(LOGGER); try { @@ -63,7 +61,7 @@ public int insert(AlertSummary proto) throws DalException { } } - public int updateByPK(AlertSummary proto, Updateset updateset) throws DalException { + public int updateByPK(AlertSummary proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java index 5c700d94ec..fb43318961 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java @@ -9,10 +9,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; public class AlterationRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(AlterationRepository.class); @@ -38,7 +36,7 @@ public int deleteByPK(Alteration proto) throws DalException { } } - public List findByTypeDruation(java.util.Date startTime, java.util.Date endTime, String type, Readset readset) throws DalException { + public List findByTypeDruation(java.util.Date startTime, java.util.Date endTime, String type, Object readset) throws DalException { AlterationMapper mapper = springMapper(LOGGER); AlterationDO record = new AlterationDO(); @@ -52,7 +50,7 @@ public List findByTypeDruation(java.util.Date startTime, java.util.D } } - public List findByDtdh(java.util.Date startTime, java.util.Date endTime, String type, String domain, String hostname, Readset readset) throws DalException { + public List findByDtdh(java.util.Date startTime, java.util.Date endTime, String type, String domain, String hostname, Object readset) throws DalException { AlterationMapper mapper = springMapper(LOGGER); AlterationDO record = new AlterationDO(); @@ -68,7 +66,7 @@ public List findByDtdh(java.util.Date startTime, java.util.Date endT } } - public List findByDtdhTypes(java.util.Date startTime, java.util.Date endTime, String type, String domain, String hostname, String[] types, Readset readset) throws DalException { + public List findByDtdhTypes(java.util.Date startTime, java.util.Date endTime, String type, String domain, String hostname, String[] types, Object readset) throws DalException { AlterationMapper mapper = springMapper(LOGGER); AlterationDO record = new AlterationDO(); @@ -85,7 +83,7 @@ public List findByDtdhTypes(java.util.Date startTime, java.util.Date } } - public List findByDomainAndTime(java.util.Date startTime, java.util.Date endTime, String domain, Readset readset) throws DalException { + public List findByDomainAndTime(java.util.Date startTime, java.util.Date endTime, String domain, Object readset) throws DalException { AlterationMapper mapper = springMapper(LOGGER); AlterationDO record = new AlterationDO(); @@ -99,7 +97,7 @@ public List findByDomainAndTime(java.util.Date startTime, java.util. } } - public Alteration findByPK(int keyId, Readset readset) throws DalException { + public Alteration findByPK(int keyId, Object readset) throws DalException { AlterationMapper mapper = springMapper(LOGGER); try { @@ -126,7 +124,7 @@ public int insert(Alteration proto) throws DalException { } } - public int updateByPK(Alteration proto, Updateset updateset) throws DalException { + public int updateByPK(Alteration proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java index d0d70c224c..37d198d3d0 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java @@ -7,10 +7,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; public class BaselineRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(BaselineRepository.class); @@ -35,7 +33,7 @@ public int deleteByPK(Baseline proto) throws DalException { } } - public Baseline findByPK(int keyId, Readset readset) throws DalException { + public Baseline findByPK(int keyId, Object readset) throws DalException { BaselineMapper mapper = springMapper(LOGGER); try { @@ -47,7 +45,7 @@ public Baseline findByPK(int keyId, Readset readset) throws DalExcepti } } - public Baseline findByReportNameKeyTime(java.util.Date reportPeriod, String reportName, String indexKey, Readset readset) throws DalException { + public Baseline findByReportNameKeyTime(java.util.Date reportPeriod, String reportName, String indexKey, Object readset) throws DalException { BaselineMapper mapper = springMapper(LOGGER); BaselineDO record = new BaselineDO(); @@ -80,7 +78,7 @@ public int insert(Baseline proto) throws DalException { } } - public int updateByPK(Baseline proto, Updateset updateset) throws DalException { + public int updateByPK(Baseline proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java index 8270a308c3..9023ea43a6 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java @@ -7,10 +7,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; public class ConfigModificationRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(ConfigModificationRepository.class); @@ -36,7 +34,7 @@ public int deleteByPK(ConfigModification proto) throws DalException { } } - public ConfigModification findByPK(int keyId, Readset readset) throws DalException { + public ConfigModification findByPK(int keyId, Object readset) throws DalException { ConfigModificationMapper mapper = springMapper(LOGGER); try { @@ -63,7 +61,7 @@ public int insert(ConfigModification proto) throws DalException { } } - public int updateByPK(ConfigModification proto, Updateset updateset) throws DalException { + public int updateByPK(ConfigModification proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java index ebc195a91b..ed5e641a1a 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java @@ -7,10 +7,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; public class MetricGraphRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(MetricGraphRepository.class); @@ -46,7 +44,7 @@ public int deleteBeforeDate(MetricGraph proto) throws DalException { } } - public MetricGraph findByPK(int keyId, Readset readset) throws DalException { + public MetricGraph findByPK(int keyId, Object readset) throws DalException { MetricGraphMapper mapper = springMapper(LOGGER); try { @@ -58,7 +56,7 @@ public MetricGraph findByPK(int keyId, Readset readset) throws DalE } } - public MetricGraph findByGrapId(long graphId, Readset readset) throws DalException { + public MetricGraph findByGrapId(long graphId, Object readset) throws DalException { MetricGraphMapper mapper = springMapper(LOGGER); MetricGraphDO record = new MetricGraphDO(); @@ -74,7 +72,7 @@ public MetricGraph findByGrapId(long graphId, Readset readset) thro } } - public MetricGraph findLast(int number, Readset readset) throws DalException { + public MetricGraph findLast(int number, Object readset) throws DalException { MetricGraphMapper mapper = springMapper(LOGGER); MetricGraphDO record = new MetricGraphDO(); @@ -105,7 +103,7 @@ public int insert(MetricGraph proto) throws DalException { } } - public int updateByPK(MetricGraph proto, Updateset updateset) throws DalException { + public int updateByPK(MetricGraph proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java index fbae454c61..c793f58618 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java @@ -9,10 +9,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; public class MetricScreenRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(MetricScreenRepository.class); @@ -58,7 +56,7 @@ public int deleteByNameGraph(MetricScreen proto) throws DalException { } } - public List findAll(Readset readset) throws DalException { + public List findAll(Object readset) throws DalException { MetricScreenMapper mapper = springMapper(LOGGER); MetricScreenDO record = new MetricScreenDO(); @@ -69,7 +67,7 @@ public List findAll(Readset readset) throws DalExcep } } - public List findByName(String name, Readset readset) throws DalException { + public List findByName(String name, Object readset) throws DalException { MetricScreenMapper mapper = springMapper(LOGGER); MetricScreenDO record = new MetricScreenDO(); @@ -81,7 +79,7 @@ public List findByName(String name, Readset readset) } } - public MetricScreen findByPK(int keyId, Readset readset) throws DalException { + public MetricScreen findByPK(int keyId, Object readset) throws DalException { MetricScreenMapper mapper = springMapper(LOGGER); try { @@ -93,7 +91,7 @@ public MetricScreen findByPK(int keyId, Readset readset) throws Da } } - public MetricScreen findByNameGraph(String name, String graphName, Readset readset) throws DalException { + public MetricScreen findByNameGraph(String name, String graphName, Object readset) throws DalException { MetricScreenMapper mapper = springMapper(LOGGER); MetricScreenDO record = new MetricScreenDO(); @@ -135,7 +133,7 @@ public int insertOrUpdateByNameGraph(MetricScreen proto) throws DalException { } } - public int updateByPK(MetricScreen proto, Updateset updateset) throws DalException { + public int updateByPK(MetricScreen proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java index 5bef80391d..b29b1f2404 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java @@ -9,10 +9,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; public class OverloadRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(OverloadRepository.class); @@ -37,7 +35,7 @@ public int deleteByPK(Overload proto) throws DalException { } } - public List findIdAndSizeByDuration(java.util.Date startTime, java.util.Date endTime, Readset readset) throws DalException { + public List findIdAndSizeByDuration(java.util.Date startTime, java.util.Date endTime, Object readset) throws DalException { OverloadMapper mapper = springMapper(LOGGER); OverloadDO record = new OverloadDO(); @@ -50,7 +48,7 @@ public List findIdAndSizeByDuration(java.util.Date startTime, java.uti } } - public Overload findByPK(int keyId, Readset readset) throws DalException { + public Overload findByPK(int keyId, Object readset) throws DalException { OverloadMapper mapper = springMapper(LOGGER); try { @@ -62,7 +60,7 @@ public Overload findByPK(int keyId, Readset readset) throws DalExcepti } } - public Overload findMaxIdByType(int type, Readset readset) throws DalException { + public Overload findMaxIdByType(int type, Object readset) throws DalException { OverloadMapper mapper = springMapper(LOGGER); OverloadDO record = new OverloadDO(); @@ -78,7 +76,7 @@ public Overload findMaxIdByType(int type, Readset readset) throws DalE } } - public Overload findCount(Readset readset) throws DalException { + public Overload findCount(Object readset) throws DalException { OverloadMapper mapper = springMapper(LOGGER); OverloadDO record = new OverloadDO(); @@ -108,7 +106,7 @@ public int insert(Overload proto) throws DalException { } } - public int updateByPK(Overload proto, Updateset updateset) throws DalException { + public int updateByPK(Overload proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java index 5ec45a338b..76e3676300 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java @@ -7,10 +7,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; -import org.unidal.dal.jdbc.Readset; -import org.unidal.dal.jdbc.Updateset; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; public class TopologyGraphRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(TopologyGraphRepository.class); @@ -36,7 +34,7 @@ public int deleteByPK(TopologyGraph proto) throws DalException { } } - public TopologyGraph findByPK(int keyId, Readset readset) throws DalException { + public TopologyGraph findByPK(int keyId, Object readset) throws DalException { TopologyGraphMapper mapper = springMapper(LOGGER); try { @@ -48,7 +46,7 @@ public TopologyGraph findByPK(int keyId, Readset readset) throws } } - public TopologyGraph findByPeriod(java.util.Date period, Readset readset) throws DalException { + public TopologyGraph findByPeriod(java.util.Date period, Object readset) throws DalException { TopologyGraphMapper mapper = springMapper(LOGGER); TopologyGraphDO record = new TopologyGraphDO(); @@ -79,7 +77,7 @@ public int insert(TopologyGraph proto) throws DalException { } } - public int updateByPK(TopologyGraph proto, Updateset updateset) throws DalException { + public int updateByPK(TopologyGraph proto, Object updateset) throws DalException { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java index be55257ab3..9d2efe3e31 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java @@ -27,7 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.alarm.rule.entity.Condition; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java index 691aff68cd..f7acff326c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java @@ -23,7 +23,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java index 040badb162..ea2d1da2c0 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java @@ -30,8 +30,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.xml.sax.SAXException; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java index 29ad82cc78..c1d2e908ec 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java @@ -18,7 +18,7 @@ */ package com.dianping.cat.report.alert.spi.config; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.alarm.UserDefineRule; import com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java index 3768e96435..2f2a0d9136 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java @@ -20,7 +20,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.home.dal.report.AlertSummary; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java index 60cbc06619..248a0bc79b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java @@ -28,7 +28,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.alarm.Alert; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java index 015a07962b..b9d531457e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java @@ -25,7 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.home.dal.report.Alteration; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java index 1a2d9bbb86..9b6edb4ab7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java @@ -23,7 +23,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java index e15f7fba48..8ff362221f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java @@ -31,7 +31,7 @@ import java.util.List; import java.util.Map; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java index 01d767eaff..346dbac125 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java @@ -33,7 +33,7 @@ import java.util.List; import java.util.Map; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java index 7539e5ff3f..0dbf8700ff 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java @@ -21,8 +21,8 @@ import java.util.Date; import java.util.List; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.consumer.business.BusinessAnalyzer; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java index 3258d40c10..7610b26a38 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java @@ -23,8 +23,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.consumer.cross.CrossAnalyzer; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java index 00fbf765bc..f05a89c945 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.Map; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java index c547364dd0..ee18702e70 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java @@ -27,7 +27,7 @@ import java.util.Set; import org.apache.commons.io.FileUtils; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.apache.commons.lang3.tuple.Pair; import com.dianping.cat.Cat; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java index faf4e5559f..c6b78527f4 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java @@ -29,7 +29,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.support.Threads; import com.dianping.cat.support.Threads.Task; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java index 928fae90cd..728d554e08 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java @@ -23,8 +23,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.consumer.dependency.DependencyAnalyzer; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java index 2450e8e3c8..d8806d0921 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java @@ -22,8 +22,8 @@ import java.util.Date; import java.util.List; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java index edd221a614..68bbba7ffe 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java @@ -22,7 +22,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.config.AtomicMessageConfigManager; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java index 4710ee1451..73513b90ce 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java @@ -25,7 +25,7 @@ import java.util.Map.Entry; import java.util.Set; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java index ee7f13f81f..8128719ed4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java @@ -21,8 +21,8 @@ import java.util.Date; import java.util.List; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java index 039a25be30..6dc62ab026 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java @@ -23,8 +23,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.consumer.matrix.MatrixAnalyzer; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java b/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java index af058e6022..1664fed6aa 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java @@ -28,7 +28,7 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.helper.TimeHelper; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java index 59ca8e772b..d857d2052c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java @@ -20,7 +20,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.core.config.Config; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java index 7ed6762381..c99fdcb473 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java @@ -21,7 +21,7 @@ import java.util.Date; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.Constants; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdater.java index 1de5e5b658..11987b6fa1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdater.java @@ -18,7 +18,7 @@ */ package com.dianping.cat.report.page.overload.task; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; public interface CapacityUpdater { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java index 87103c6c7a..0e8d754700 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java @@ -20,8 +20,8 @@ import java.util.List; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java index c77646f0bd..c101d668c7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java @@ -20,8 +20,8 @@ import java.util.List; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java index 17aababcd0..2d408f8c8b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java @@ -20,8 +20,8 @@ import java.util.List; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java index 3ad34c6300..dd44eed254 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java @@ -22,8 +22,8 @@ import java.util.Date; import java.util.List; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java index bdd9004c8f..79c258c0d8 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java @@ -20,8 +20,8 @@ import java.util.List; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java index 09c19ef0ba..d985c679bd 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java @@ -21,8 +21,8 @@ import java.util.Date; import java.util.List; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java index 50d76ccf7e..7e448de14b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java @@ -22,7 +22,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java index 14849d012f..d68205add7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java @@ -23,8 +23,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.consumer.state.StateAnalyzer; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java index 9485921889..d9d18ea731 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java @@ -22,8 +22,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.Constants; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java index 510d8bbde8..85502ea819 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java @@ -23,8 +23,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.Constants; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java index da5c619954..9da0020fbc 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java @@ -23,7 +23,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.Constants; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java index ec61e78c7e..16d562cbd6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java @@ -23,8 +23,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.Constants; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java index 0fcd23e26f..ed26f15838 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java @@ -23,8 +23,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.Constants; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java index 2988e99960..b34bc96586 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java @@ -32,7 +32,7 @@ import java.util.Map.Entry; import java.util.Set; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.slf4j.Logger; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java index 506e15e9a9..fe5c063b6b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java @@ -24,7 +24,7 @@ import java.util.List; import java.util.Map; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.apache.commons.lang3.StringUtils; import com.dianping.cat.Cat; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java index 65d36a709c..9f4831d50e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java @@ -23,7 +23,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.Constants; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java index 5b0ca8dfb5..c516f92cd4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java @@ -25,8 +25,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.consumer.storage.StorageAnalyzer; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java index 930cd86b7d..40a4ec1c07 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java @@ -23,8 +23,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.consumer.top.TopAnalyzer; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java index 8c00271da4..61e766bf5a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java @@ -22,8 +22,8 @@ import java.util.List; import java.util.Map; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java index c8955f1c21..91f08e7103 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java @@ -21,7 +21,7 @@ import java.util.Date; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.config.AtomicMessageConfigManager; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java index ead0fc82b4..c97d460388 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java @@ -26,7 +26,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java index 1de173f3e4..01c6d212b5 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java @@ -32,7 +32,7 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.support.Threads.Task; import org.unidal.webres.json.JsonArray; import org.unidal.webres.json.JsonObject; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java index 9ea9c9e1f5..85ad5cb2d7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java @@ -24,7 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.support.Threads; import com.dianping.cat.Cat; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java index a8f4664bed..6ecc12c5f8 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java @@ -22,7 +22,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java index 044c9cf78c..4c4764b8da 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java @@ -23,7 +23,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java index 3fb0c0c087..80037bfc0f 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java @@ -20,7 +20,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java index 8782f66df9..909804f1bc 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java @@ -26,7 +26,7 @@ import java.util.Map; import java.util.Map.Entry; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.google.common.base.Splitter; import com.dianping.cat.Cat; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java index bf7a76c342..28befd51f2 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java @@ -38,8 +38,8 @@ import org.apache.commons.net.util.SubnetUtils.SubnetInfo; import org.apache.commons.lang3.tuple.Pair; import org.slf4j.LoggerFactory; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.xml.sax.SAXException; import java.io.IOException; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java index 4dfa927f4e..365734219c 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java @@ -22,8 +22,8 @@ import java.util.List; import java.util.Map; -import org.unidal.dal.jdbc.DalException; -import org.unidal.dal.jdbc.DalNotFoundException; +import com.dianping.cat.core.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.apache.commons.lang3.tuple.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java b/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java index c38179b193..5d4b19fef1 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java @@ -21,23 +21,22 @@ import java.util.Date; import org.junit.Test; -import org.unidal.dal.jdbc.DalException; import com.dianping.cat.SpringCatHomeTestSupport; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.HourlyReport; -import com.dianping.cat.core.dal.HourlyReportDao; import com.dianping.cat.core.dal.MonthlyReport; -import com.dianping.cat.core.dal.MonthlyReportDao; import com.dianping.cat.core.dal.WeeklyReport; -import com.dianping.cat.core.dal.WeeklyReportDao; +import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; import com.dianping.cat.core.report.daily.repository.DailyReportRepository; public class ReportDaoTest extends SpringCatHomeTestSupport { @Test - public void test() throws DalException { - HourlyReportDao dao = lookup(HourlyReportDao.class); + public void test() throws Exception { + HourlyReportRepository dao = lookup(HourlyReportRepository.class); HourlyReport proto = new HourlyReport(); proto.setCreationDate(new Date()); @@ -51,7 +50,7 @@ public void test() throws DalException { } @Test - public void testDaily() throws DalException { + public void testDaily() throws Exception { DailyReportRepository dao = lookup(DailyReportRepository.class); DailyReport proto = new DailyReport(); @@ -66,8 +65,8 @@ public void testDaily() throws DalException { } @Test - public void testWeek() throws DalException { - WeeklyReportDao dao = lookup(WeeklyReportDao.class); + public void testWeek() throws Exception { + WeeklyReportRepository dao = lookup(WeeklyReportRepository.class); WeeklyReport proto = new WeeklyReport(); proto.setCreationDate(new Date()); @@ -80,8 +79,8 @@ public void testWeek() throws DalException { } @Test - public void testMonth() throws DalException { - MonthlyReportDao dao = lookup(MonthlyReportDao.class); + public void testMonth() throws Exception { + MonthlyReportRepository dao = lookup(MonthlyReportRepository.class); MonthlyReport proto = new MonthlyReport(); proto.setCreationDate(new Date()); diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java index 4cde478dec..eaaab933b1 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java @@ -24,8 +24,8 @@ import org.junit.Assert; import org.junit.Test; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; import com.dianping.cat.core.config.ConfigEntity; diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/DatabaseCapacityTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/DatabaseCapacityTest.java index e0dfe9440b..4cb05eec43 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/DatabaseCapacityTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/DatabaseCapacityTest.java @@ -18,8 +18,8 @@ */ package com.dianping.cat.report.task; -import org.unidal.dal.jdbc.DalException; +import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.report.page.overload.task.CapacityUpdater; import com.dianping.cat.report.page.overload.task.HourlyCapacityUpdater; From b7982028cfcb23bf9964b3339630570e5609fbe6 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 16:45:29 +0800 Subject: [PATCH 140/231] =?UTF-8?q?=E7=A7=BB=E9=99=A4=20DalException=20?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cat-alarm/pom.xml | 58 -- .../java/com/dianping/cat/alarm/Alert.java | 162 ++++ .../dianping/cat/alarm/ServerAlarmRule.java | 150 ++++ .../dianping/cat/alarm/UserDefineRule.java | 78 ++ .../dianping/cat/alarm/policy/BaseEntity.java | 42 + .../dianping/cat/alarm/policy/Constants.java | 26 + .../dianping/cat/alarm/policy/IEntity.java | 8 + .../dianping/cat/alarm/policy/IVisitor.java | 17 + .../cat/alarm/policy/entity/AlertPolicy.java | 83 ++ .../cat/alarm/policy/entity/Group.java | 102 +++ .../cat/alarm/policy/entity/Level.java | 107 +++ .../cat/alarm/policy/entity/Type.java | 102 +++ .../policy/transform/DefaultDomMaker.java | 116 +++ .../policy/transform/DefaultDomParser.java | 149 ++++ .../alarm/policy/transform/DefaultLinker.java | 72 ++ .../policy/transform/DefaultSaxMaker.java | 89 +++ .../policy/transform/DefaultSaxParser.java | 273 +++++++ .../policy/transform/DefaultXmlBuilder.java | 245 ++++++ .../cat/alarm/policy/transform/ILinker.java | 15 + .../cat/alarm/policy/transform/IMaker.java | 17 + .../cat/alarm/policy/transform/IParser.java | 16 + .../cat/alarm/receiver/BaseEntity.java | 42 + .../cat/alarm/receiver/Constants.java | 30 + .../dianping/cat/alarm/receiver/IEntity.java | 8 + .../dianping/cat/alarm/receiver/IVisitor.java | 11 + .../alarm/receiver/entity/AlertConfig.java | 106 +++ .../cat/alarm/receiver/entity/Receiver.java | 128 +++ .../receiver/transform/DefaultDomMaker.java | 132 ++++ .../receiver/transform/DefaultDomParser.java | 153 ++++ .../receiver/transform/DefaultLinker.java | 38 + .../receiver/transform/DefaultSaxMaker.java | 84 ++ .../receiver/transform/DefaultSaxParser.java | 254 ++++++ .../receiver/transform/DefaultXmlBuilder.java | 286 +++++++ .../cat/alarm/receiver/transform/ILinker.java | 9 + .../cat/alarm/receiver/transform/IMaker.java | 19 + .../cat/alarm/receiver/transform/IParser.java | 10 + .../dianping/cat/alarm/rule/BaseEntity.java | 56 ++ .../dianping/cat/alarm/rule/Constants.java | 54 ++ .../com/dianping/cat/alarm/rule/IEntity.java | 8 + .../com/dianping/cat/alarm/rule/IVisitor.java | 23 + .../cat/alarm/rule/entity/Condition.java | 120 +++ .../cat/alarm/rule/entity/Config.java | 100 +++ .../cat/alarm/rule/entity/MetricItem.java | 150 ++++ .../cat/alarm/rule/entity/MonitorRules.java | 83 ++ .../dianping/cat/alarm/rule/entity/Rule.java | 126 +++ .../cat/alarm/rule/entity/SubCondition.java | 78 ++ .../alarm/rule/transform/DefaultDomMaker.java | 208 +++++ .../rule/transform/DefaultDomParser.java | 174 +++++ .../rule/transform/DefaultJsonBuilder.java | 345 ++++++++ .../rule/transform/DefaultJsonParser.java | 489 ++++++++++++ .../alarm/rule/transform/DefaultLinker.java | 66 ++ .../alarm/rule/transform/DefaultSaxMaker.java | 177 +++++ .../rule/transform/DefaultSaxParser.java | 316 ++++++++ .../rule/transform/DefaultXmlBuilder.java | 283 +++++++ .../cat/alarm/rule/transform/ILinker.java | 21 + .../cat/alarm/rule/transform/IMaker.java | 23 + .../cat/alarm/rule/transform/IParser.java | 22 + .../dianping/cat/alarm/sender/BaseEntity.java | 42 + .../dianping/cat/alarm/sender/Constants.java | 24 + .../dianping/cat/alarm/sender/IEntity.java | 8 + .../dianping/cat/alarm/sender/IVisitor.java | 14 + .../dianping/cat/alarm/sender/entity/Par.java | 58 ++ .../cat/alarm/sender/entity/Sender.java | 138 ++++ .../cat/alarm/sender/entity/SenderConfig.java | 66 ++ .../alarm/sender/transform/DefaultLinker.java | 45 ++ .../sender/transform/DefaultSaxMaker.java | 90 +++ .../sender/transform/DefaultSaxParser.java | 250 ++++++ .../sender/transform/DefaultXmlBuilder.java | 231 ++++++ .../cat/alarm/sender/transform/ILinker.java | 12 + .../cat/alarm/sender/transform/IMaker.java | 14 + .../cat/alarm/sender/transform/IParser.java | 13 + .../dianping/cat/alarm/server/BaseEntity.java | 56 ++ .../dianping/cat/alarm/server/Constants.java | 34 + .../dianping/cat/alarm/server/IEntity.java | 8 + .../dianping/cat/alarm/server/IVisitor.java | 17 + .../cat/alarm/server/entity/Condition.java | 118 +++ .../cat/alarm/server/entity/Rule.java | 100 +++ .../server/entity/ServerAlarmRuleConfig.java | 80 ++ .../cat/alarm/server/entity/SubCondition.java | 78 ++ .../server/transform/DefaultJsonBuilder.java | 300 +++++++ .../server/transform/DefaultJsonParser.java | 426 ++++++++++ .../alarm/server/transform/DefaultLinker.java | 43 + .../server/transform/DefaultSaxMaker.java | 115 +++ .../server/transform/DefaultSaxParser.java | 273 +++++++ .../server/transform/DefaultXmlBuilder.java | 249 ++++++ .../cat/alarm/server/transform/ILinker.java | 15 + .../cat/alarm/server/transform/IMaker.java | 17 + .../cat/alarm/server/transform/IParser.java | 16 + .../cat/alarm/service/AlertService.java | 12 +- .../alarm/spi/config/AlertConfigManager.java | 9 +- .../alarm/spi/config/AlertPolicyManager.java | 9 +- .../alarm/spi/config/SenderConfigManager.java | 9 +- .../repository/alert/AlertRepository.java | 41 +- .../alarm/rule/ServerAlarmRuleRepository.java | 29 +- .../define/rule/UserDefineRuleRepository.java | 31 +- .../META-INF/dal/jdbc/alarm-codegen.xml | 125 --- .../resources/META-INF/dal/jdbc/alarm-dal.xml | 110 --- .../META-INF/dal/jdbc/alarm-manifest.xml | 6 - .../dal/model/alert-policy-codegen.xml | 19 - .../dal/model/alert-policy-manifest.xml | 6 - .../META-INF/dal/model/alert-policy-model.xml | 24 - .../dal/model/alert-receiver-codegen.xml | 14 - .../dal/model/alert-receiver-manifest.xml | 6 - .../dal/model/alert-receiver-model.xml | 18 - .../dal/model/monitor-rules-codegen.xml | 32 - .../dal/model/monitor-rules-manifest.xml | 6 - .../dal/model/monitor-rules-model.xml | 34 - .../dal/model/sender-config-codegen.xml | 18 - .../dal/model/sender-config-manifest.xml | 6 - .../dal/model/sender-config-model.xml | 19 - .../dal/model/server-alarm-rule-codegen.xml | 23 - .../dal/model/server-alarm-rule-manifest.xml | 6 - .../dal/model/server-alarm-rule-model.xml | 23 - cat-client/pom.xml | 25 +- .../cat/configuration/model/BaseEntity.java | 1 - .../model/ClientConfigHelper.java | 1 - .../cat/configuration/model/Constants.java | 1 - .../cat/configuration/model/IEntity.java | 1 - .../cat/configuration/model/IVisitor.java | 1 - .../model/entity/ClientConfig.java | 1 - .../configuration/model/entity/Domain.java | 1 - .../cat/configuration/model/entity/Host.java | 1 - .../configuration/model/entity/Property.java | 1 - .../configuration/model/entity/Server.java | 1 - .../model/transform/BaseVisitor.java | 1 - .../model/transform/DefaultLinker.java | 1 - .../model/transform/DefaultXmlBuilder.java | 1 - .../model/transform/DefaultXmlMaker.java | 1 - .../model/transform/DefaultXmlParser.java | 1 - .../dianping/cat/status/model/BaseEntity.java | 1 - .../dianping/cat/status/model/Constants.java | 1 - .../dianping/cat/status/model/IEntity.java | 1 - .../dianping/cat/status/model/IVisitor.java | 1 - .../cat/status/model/StatusInfoHelper.java | 1 - .../cat/status/model/entity/DiskInfo.java | 1 - .../status/model/entity/DiskVolumeInfo.java | 1 - .../cat/status/model/entity/Extension.java | 1 - .../status/model/entity/ExtensionDetail.java | 1 - .../cat/status/model/entity/GcInfo.java | 1 - .../cat/status/model/entity/MemoryInfo.java | 1 - .../cat/status/model/entity/MessageInfo.java | 1 - .../cat/status/model/entity/OsInfo.java | 1 - .../cat/status/model/entity/RuntimeInfo.java | 1 - .../cat/status/model/entity/StatusInfo.java | 1 - .../cat/status/model/entity/ThreadsInfo.java | 1 - .../status/model/transform/BaseVisitor.java | 1 - .../status/model/transform/DefaultLinker.java | 1 - .../model/transform/DefaultXmlBuilder.java | 1 - .../model/transform/DefaultXmlMaker.java | 1 - .../model/transform/DefaultXmlParser.java | 1 - cat-consumer/pom.xml | 34 +- .../cat/consumer/all/config/BaseEntity.java | 42 + .../cat/consumer/all/config/Constants.java | 20 + .../cat/consumer/all/config/IEntity.java | 8 + .../cat/consumer/all/config/IVisitor.java | 17 + .../consumer/all/config/entity/AllConfig.java | 83 ++ .../cat/consumer/all/config/entity/Name.java | 58 ++ .../consumer/all/config/entity/Report.java | 102 +++ .../cat/consumer/all/config/entity/Type.java | 77 ++ .../all/config/transform/BaseVisitor.java | 34 + .../all/config/transform/DefaultLinker.java | 62 ++ .../all/config/transform/DefaultMerger.java | 135 ++++ .../all/config/transform/DefaultSaxMaker.java | 75 ++ .../config/transform/DefaultSaxParser.java | 273 +++++++ .../config/transform/DefaultXmlBuilder.java | 242 ++++++ .../all/config/transform/ILinker.java | 15 + .../consumer/all/config/transform/IMaker.java | 17 + .../all/config/transform/IParser.java | 16 + .../consumer/business/model/BaseEntity.java | 42 + .../consumer/business/model/Constants.java | 30 + .../cat/consumer/business/model/IEntity.java | 8 + .../cat/consumer/business/model/IVisitor.java | 14 + .../business/model/entity/BusinessItem.java | 116 +++ .../business/model/entity/BusinessReport.java | 131 ++++ .../business/model/entity/Segment.java | 121 +++ .../business/model/transform/BaseVisitor.java | 26 + .../model/transform/DefaultLinker.java | 55 ++ .../model/transform/DefaultMerger.java | 107 +++ .../model/transform/DefaultNativeBuilder.java | 164 ++++ .../model/transform/DefaultNativeParser.java | 203 +++++ .../model/transform/DefaultSaxMaker.java | 112 +++ .../model/transform/DefaultSaxParser.java | 258 ++++++ .../model/transform/DefaultXmlBuilder.java | 242 ++++++ .../business/model/transform/ILinker.java | 12 + .../business/model/transform/IMaker.java | 14 + .../business/model/transform/IParser.java | 13 + .../config/AllReportConfigManager.java | 14 +- .../cat/consumer/cross/model/BaseEntity.java | 42 + .../cat/consumer/cross/model/Constants.java | 54 ++ .../cat/consumer/cross/model/IEntity.java | 8 + .../cat/consumer/cross/model/IVisitor.java | 20 + .../cross/model/entity/CrossReport.java | 155 ++++ .../consumer/cross/model/entity/Local.java | 102 +++ .../cat/consumer/cross/model/entity/Name.java | 160 ++++ .../consumer/cross/model/entity/Remote.java | 118 +++ .../cat/consumer/cross/model/entity/Type.java | 230 ++++++ .../cross/model/transform/BaseVisitor.java | 42 + .../cross/model/transform/DefaultLinker.java | 79 ++ .../cross/model/transform/DefaultMerger.java | 165 ++++ .../model/transform/DefaultNativeBuilder.java | 263 +++++++ .../model/transform/DefaultNativeParser.java | 319 ++++++++ .../model/transform/DefaultSaxMaker.java | 216 +++++ .../model/transform/DefaultSaxParser.java | 328 ++++++++ .../model/transform/DefaultXmlBuilder.java | 340 ++++++++ .../cross/model/transform/ILinker.java | 18 + .../cross/model/transform/IMaker.java | 24 + .../cross/model/transform/IParser.java | 19 + .../consumer/dependency/model/BaseEntity.java | 42 + .../consumer/dependency/model/Constants.java | 48 ++ .../consumer/dependency/model/IEntity.java | 8 + .../consumer/dependency/model/IVisitor.java | 17 + .../dependency/model/entity/Dependency.java | 164 ++++ .../model/entity/DependencyReport.java | 144 ++++ .../dependency/model/entity/Index.java | 134 ++++ .../dependency/model/entity/Segment.java | 152 ++++ .../model/transform/BaseVisitor.java | 35 + .../model/transform/DefaultLinker.java | 72 ++ .../model/transform/DefaultMerger.java | 137 ++++ .../model/transform/DefaultNativeBuilder.java | 226 ++++++ .../model/transform/DefaultNativeParser.java | 274 +++++++ .../model/transform/DefaultSaxMaker.java | 178 +++++ .../model/transform/DefaultSaxParser.java | 298 +++++++ .../model/transform/DefaultXmlBuilder.java | 318 ++++++++ .../dependency/model/transform/ILinker.java | 15 + .../dependency/model/transform/IMaker.java | 19 + .../dependency/model/transform/IParser.java | 16 + .../cat/consumer/event/model/BaseEntity.java | 42 + .../cat/consumer/event/model/Constants.java | 66 ++ .../cat/consumer/event/model/IEntity.java | 8 + .../cat/consumer/event/model/IVisitor.java | 26 + .../event/model/entity/EventName.java | 255 ++++++ .../event/model/entity/EventReport.java | 155 ++++ .../event/model/entity/EventType.java | 206 +++++ .../event/model/entity/GraphTrend.java | 88 +++ .../consumer/event/model/entity/Machine.java | 102 +++ .../consumer/event/model/entity/Range.java | 108 +++ .../event/model/entity/StatusCode.java | 85 ++ .../event/model/transform/BaseVisitor.java | 64 ++ .../event/model/transform/DefaultLinker.java | 119 +++ .../event/model/transform/DefaultMerger.java | 244 ++++++ .../model/transform/DefaultNativeBuilder.java | 314 ++++++++ .../model/transform/DefaultNativeParser.java | 397 ++++++++++ .../model/transform/DefaultSaxMaker.java | 220 ++++++ .../model/transform/DefaultSaxParser.java | 395 ++++++++++ .../model/transform/DefaultXmlBuilder.java | 380 +++++++++ .../event/model/transform/ILinker.java | 26 + .../event/model/transform/IMaker.java | 30 + .../event/model/transform/IParser.java | 25 + .../consumer/heartbeat/model/BaseEntity.java | 42 + .../consumer/heartbeat/model/Constants.java | 88 +++ .../cat/consumer/heartbeat/model/IEntity.java | 8 + .../consumer/heartbeat/model/IVisitor.java | 23 + .../heartbeat/model/entity/Detail.java | 75 ++ .../consumer/heartbeat/model/entity/Disk.java | 101 +++ .../heartbeat/model/entity/Extension.java | 102 +++ .../model/entity/HeartbeatReport.java | 155 ++++ .../heartbeat/model/entity/Machine.java | 119 +++ .../heartbeat/model/entity/Period.java | 355 +++++++++ .../model/transform/BaseVisitor.java | 51 ++ .../model/transform/DefaultLinker.java | 86 ++ .../model/transform/DefaultMerger.java | 194 +++++ .../model/transform/DefaultNativeBuilder.java | 308 ++++++++ .../model/transform/DefaultNativeParser.java | 388 +++++++++ .../model/transform/DefaultSaxMaker.java | 288 +++++++ .../model/transform/DefaultSaxParser.java | 348 +++++++++ .../model/transform/DefaultXmlBuilder.java | 369 +++++++++ .../heartbeat/model/transform/ILinker.java | 21 + .../heartbeat/model/transform/IMaker.java | 27 + .../heartbeat/model/transform/IParser.java | 22 + .../cat/consumer/matrix/model/BaseEntity.java | 42 + .../cat/consumer/matrix/model/Constants.java | 40 + .../cat/consumer/matrix/model/IEntity.java | 8 + .../cat/consumer/matrix/model/IVisitor.java | 14 + .../consumer/matrix/model/entity/Matrix.java | 167 ++++ .../matrix/model/entity/MatrixReport.java | 144 ++++ .../consumer/matrix/model/entity/Ratio.java | 139 ++++ .../matrix/model/transform/BaseVisitor.java | 26 + .../matrix/model/transform/DefaultLinker.java | 55 ++ .../matrix/model/transform/DefaultMerger.java | 108 +++ .../model/transform/DefaultNativeBuilder.java | 192 +++++ .../model/transform/DefaultNativeParser.java | 227 ++++++ .../model/transform/DefaultSaxMaker.java | 145 ++++ .../model/transform/DefaultSaxParser.java | 270 +++++++ .../model/transform/DefaultXmlBuilder.java | 295 +++++++ .../matrix/model/transform/ILinker.java | 12 + .../matrix/model/transform/IMaker.java | 16 + .../matrix/model/transform/IParser.java | 13 + .../consumer/problem/model/BaseEntity.java | 42 + .../cat/consumer/problem/model/Constants.java | 70 ++ .../cat/consumer/problem/model/IEntity.java | 8 + .../cat/consumer/problem/model/IVisitor.java | 29 + .../problem/model/entity/Duration.java | 99 +++ .../consumer/problem/model/entity/Entity.java | 178 +++++ .../consumer/problem/model/entity/Entry.java | 163 ++++ .../problem/model/entity/GraphTrend.java | 75 ++ .../problem/model/entity/JavaThread.java | 131 ++++ .../problem/model/entity/Machine.java | 115 +++ .../problem/model/entity/ProblemReport.java | 155 ++++ .../problem/model/entity/Segment.java | 99 +++ .../problem/model/transform/BaseVisitor.java | 76 ++ .../model/transform/DefaultLinker.java | 152 ++++ .../model/transform/DefaultMerger.java | 281 +++++++ .../model/transform/DefaultNativeBuilder.java | 322 ++++++++ .../model/transform/DefaultNativeParser.java | 429 ++++++++++ .../model/transform/DefaultSaxMaker.java | 201 +++++ .../model/transform/DefaultSaxParser.java | 417 ++++++++++ .../model/transform/DefaultXmlBuilder.java | 402 ++++++++++ .../problem/model/transform/ILinker.java | 31 + .../problem/model/transform/IMaker.java | 35 + .../problem/model/transform/IParser.java | 28 + .../cat/consumer/state/model/BaseEntity.java | 42 + .../cat/consumer/state/model/Constants.java | 72 ++ .../cat/consumer/state/model/IEntity.java | 8 + .../cat/consumer/state/model/IVisitor.java | 20 + .../consumer/state/model/entity/Detail.java | 101 +++ .../consumer/state/model/entity/Machine.java | 332 ++++++++ .../consumer/state/model/entity/Message.java | 233 ++++++ .../state/model/entity/ProcessDomain.java | 166 ++++ .../state/model/entity/StateReport.java | 131 ++++ .../state/model/transform/BaseVisitor.java | 43 + .../state/model/transform/DefaultLinker.java | 89 +++ .../state/model/transform/DefaultMerger.java | 165 ++++ .../model/transform/DefaultNativeBuilder.java | 314 ++++++++ .../model/transform/DefaultNativeParser.java | 379 +++++++++ .../model/transform/DefaultSaxMaker.java | 317 ++++++++ .../model/transform/DefaultSaxParser.java | 324 ++++++++ .../model/transform/DefaultXmlBuilder.java | 348 +++++++++ .../state/model/transform/ILinker.java | 18 + .../state/model/transform/IMaker.java | 22 + .../state/model/transform/IParser.java | 19 + .../consumer/storage/model/BaseEntity.java | 42 + .../cat/consumer/storage/model/Constants.java | 60 ++ .../cat/consumer/storage/model/IEntity.java | 8 + .../cat/consumer/storage/model/IVisitor.java | 23 + .../consumer/storage/model/entity/Domain.java | 138 ++++ .../storage/model/entity/Machine.java | 102 +++ .../storage/model/entity/Operation.java | 206 +++++ .../storage/model/entity/Segment.java | 167 ++++ .../consumer/storage/model/entity/Sql.java | 100 +++ .../storage/model/entity/StorageReport.java | 196 +++++ .../storage/model/transform/BaseVisitor.java | 51 ++ .../model/transform/DefaultLinker.java | 106 +++ .../model/transform/DefaultMerger.java | 195 +++++ .../model/transform/DefaultNativeBuilder.java | 291 +++++++ .../model/transform/DefaultNativeParser.java | 367 +++++++++ .../model/transform/DefaultSaxMaker.java | 219 ++++++ .../model/transform/DefaultSaxParser.java | 352 +++++++++ .../model/transform/DefaultXmlBuilder.java | 360 +++++++++ .../storage/model/transform/ILinker.java | 21 + .../storage/model/transform/IMaker.java | 29 + .../storage/model/transform/IParser.java | 22 + .../cat/consumer/top/model/BaseEntity.java | 42 + .../cat/consumer/top/model/Constants.java | 76 ++ .../cat/consumer/top/model/IEntity.java | 8 + .../cat/consumer/top/model/IVisitor.java | 20 + .../cat/consumer/top/model/entity/Domain.java | 102 +++ .../cat/consumer/top/model/entity/Error.java | 85 ++ .../consumer/top/model/entity/Machine.java | 85 ++ .../consumer/top/model/entity/Segment.java | 420 ++++++++++ .../consumer/top/model/entity/TopReport.java | 131 ++++ .../top/model/transform/BaseVisitor.java | 43 + .../top/model/transform/DefaultLinker.java | 89 +++ .../top/model/transform/DefaultMerger.java | 164 ++++ .../model/transform/DefaultNativeBuilder.java | 267 +++++++ .../model/transform/DefaultNativeParser.java | 334 ++++++++ .../top/model/transform/DefaultSaxMaker.java | 256 ++++++ .../top/model/transform/DefaultSaxParser.java | 309 ++++++++ .../model/transform/DefaultXmlBuilder.java | 297 +++++++ .../consumer/top/model/transform/ILinker.java | 18 + .../consumer/top/model/transform/IMaker.java | 20 + .../consumer/top/model/transform/IParser.java | 19 + .../transaction/model/BaseEntity.java | 42 + .../consumer/transaction/model/Constants.java | 110 +++ .../consumer/transaction/model/IEntity.java | 8 + .../consumer/transaction/model/IVisitor.java | 41 + .../transaction/model/entity/AllDuration.java | 85 ++ .../transaction/model/entity/Duration.java | 85 ++ .../transaction/model/entity/Graph.java | 114 +++ .../transaction/model/entity/Graph2.java | 114 +++ .../transaction/model/entity/GraphTrend.java | 114 +++ .../transaction/model/entity/Machine.java | 102 +++ .../transaction/model/entity/Range.java | 294 +++++++ .../transaction/model/entity/Range2.java | 294 +++++++ .../transaction/model/entity/StatusCode.java | 85 ++ .../model/entity/TransactionName.java | 530 +++++++++++++ .../model/entity/TransactionReport.java | 155 ++++ .../model/entity/TransactionType.java | 500 ++++++++++++ .../model/transform/BaseVisitor.java | 119 +++ .../model/transform/DefaultLinker.java | 252 ++++++ .../model/transform/DefaultMerger.java | 428 ++++++++++ .../model/transform/DefaultNativeBuilder.java | 589 ++++++++++++++ .../model/transform/DefaultNativeParser.java | 739 ++++++++++++++++++ .../model/transform/DefaultSaxMaker.java | 596 ++++++++++++++ .../model/transform/DefaultSaxParser.java | 488 ++++++++++++ .../model/transform/DefaultXmlBuilder.java | 456 +++++++++++ .../transaction/model/transform/ILinker.java | 47 ++ .../transaction/model/transform/IMaker.java | 45 ++ .../transaction/model/transform/IParser.java | 40 + .../META-INF/dal/model/all-report-codegen.xml | 4 - .../dal/model/all-report-manifest.xml | 6 - .../META-INF/dal/model/all-report-model.xml | 19 - .../dal/model/business-report-codegen.xml | 21 - .../dal/model/business-report-manifest.xml | 6 - .../dal/model/business-report-model.xml | 23 - .../dal/model/cross-report-codegen.xml | 40 - .../dal/model/cross-report-manifest.xml | 6 - .../META-INF/dal/model/cross-report-model.xml | 41 - .../dal/model/dependency-report-codegen.xml | 30 - .../dal/model/dependency-report-manifest.xml | 6 - .../dal/model/dependency-report-model.xml | 33 - .../dal/model/event-report-codegen.xml | 38 - .../dal/model/event-report-manifest.xml | 6 - .../META-INF/dal/model/event-report-model.xml | 49 -- .../dal/model/heartbeat-report-codegen.xml | 16 - .../dal/model/heartbeat-report-manifest.xml | 6 - .../dal/model/heartbeat-report-model.xml | 53 -- .../dal/model/matrix-report-codegen.xml | 26 - .../dal/model/matrix-report-manifest.xml | 6 - .../dal/model/matrix-report-model.xml | 28 - .../dal/model/problem-report-codegen.xml | 36 - .../dal/model/problem-report-manifest.xml | 6 - .../dal/model/problem-report-model.xml | 44 -- .../dal/model/state-report-codegen.xml | 30 - .../dal/model/state-report-manifest.xml | 6 - .../META-INF/dal/model/state-report-model.xml | 63 -- .../dal/model/storage-report-codegen.xml | 46 -- .../dal/model/storage-report-manifest.xml | 6 - .../dal/model/storage-report-model.xml | 48 -- .../META-INF/dal/model/top-report-codegen.xml | 28 - .../dal/model/top-report-manifest.xml | 6 - .../META-INF/dal/model/top-report-model.xml | 48 -- .../dal/model/transaction-report-codegen.xml | 57 -- .../dal/model/transaction-report-manifest.xml | 6 - .../dal/model/transaction-report-model.xml | 139 ---- .../dal/model/url-pattern-codegen.xml | 12 - .../dal/model/url-pattern-manifest.xml | 6 - .../META-INF/dal/model/url-pattern-model.xml | 3 - cat-core/pom.xml | 65 +- .../config/AtomicMessageConfigManager.java | 11 +- .../cat/config/ReportReloadConfigManager.java | 11 +- .../business/BusinessConfigManager.java | 28 +- .../config/sample/SampleConfigManager.java | 11 +- .../config/server/ServerConfigManager.java | 11 +- .../server/ServerFilterConfigManager.java | 14 +- .../TpValueStatisticConfigManager.java | 11 +- .../configuration/business/BaseEntity.java | 42 + .../cat/configuration/business/Constants.java | 32 + .../cat/configuration/business/IEntity.java | 8 + .../cat/configuration/business/IVisitor.java | 14 + .../business/entity/BusinessItemConfig.java | 175 +++++ .../business/entity/BusinessReportConfig.java | 109 +++ .../business/entity/CustomConfig.java | 135 ++++ .../business/transform/DefaultLinker.java | 55 ++ .../business/transform/DefaultSaxMaker.java | 129 +++ .../business/transform/DefaultSaxParser.java | 261 +++++++ .../business/transform/DefaultXmlBuilder.java | 280 +++++++ .../business/transform/ILinker.java | 12 + .../business/transform/IMaker.java | 14 + .../business/transform/IParser.java | 13 + .../cat/configuration/message/BaseEntity.java | 42 + .../cat/configuration/message/Constants.java | 24 + .../cat/configuration/message/IEntity.java | 8 + .../cat/configuration/message/IVisitor.java | 14 + .../message/entity/AtomicMessageConfig.java | 66 ++ .../configuration/message/entity/Domain.java | 107 +++ .../message/entity/Property.java | 77 ++ .../message/transform/DefaultLinker.java | 55 ++ .../message/transform/DefaultSaxMaker.java | 69 ++ .../message/transform/DefaultSaxParser.java | 265 +++++++ .../message/transform/DefaultXmlBuilder.java | 283 +++++++ .../message/transform/ILinker.java | 12 + .../message/transform/IMaker.java | 14 + .../message/transform/IParser.java | 13 + .../cat/configuration/reload/BaseEntity.java | 42 + .../cat/configuration/reload/Constants.java | 16 + .../cat/configuration/reload/IEntity.java | 8 + .../cat/configuration/reload/IVisitor.java | 14 + .../reload/entity/ReportPeriod.java | 58 ++ .../reload/entity/ReportReloadConfig.java | 66 ++ .../reload/entity/ReportType.java | 77 ++ .../reload/transform/DefaultLinker.java | 45 ++ .../reload/transform/DefaultSaxMaker.java | 66 ++ .../reload/transform/DefaultSaxParser.java | 250 ++++++ .../reload/transform/DefaultXmlBuilder.java | 227 ++++++ .../reload/transform/ILinker.java | 12 + .../reload/transform/IMaker.java | 14 + .../reload/transform/IParser.java | 13 + .../cat/configuration/server/BaseEntity.java | 42 + .../cat/configuration/server/Constants.java | 68 ++ .../cat/configuration/server/IEntity.java | 8 + .../cat/configuration/server/IVisitor.java | 32 + .../server/entity/ConsumerConfig.java | 55 ++ .../configuration/server/entity/Domain.java | 107 +++ .../server/entity/HarfsConfig.java | 107 +++ .../server/entity/HdfsConfig.java | 107 +++ .../server/entity/LongConfig.java | 119 +++ .../configuration/server/entity/Property.java | 77 ++ .../configuration/server/entity/Server.java | 107 +++ .../server/entity/ServerConfig.java | 66 ++ .../server/entity/StorageConfig.java | 227 ++++++ .../server/filter/BaseEntity.java | 42 + .../server/filter/Constants.java | 32 + .../configuration/server/filter/IEntity.java | 8 + .../configuration/server/filter/IVisitor.java | 14 + .../filter/entity/AtomicTreeConfig.java | 78 ++ .../server/filter/entity/CrashLogDomain.java | 77 ++ .../filter/entity/ServerFilterConfig.java | 141 ++++ .../filter/transform/DefaultLinker.java | 45 ++ .../filter/transform/DefaultSaxMaker.java | 94 +++ .../filter/transform/DefaultSaxParser.java | 267 +++++++ .../filter/transform/DefaultValidator.java | 85 ++ .../filter/transform/DefaultXmlBuilder.java | 290 +++++++ .../server/filter/transform/ILinker.java | 12 + .../server/filter/transform/IMaker.java | 20 + .../server/filter/transform/IParser.java | 13 + .../server/transform/BaseVisitor.java | 81 ++ .../server/transform/DefaultLinker.java | 143 ++++ .../server/transform/DefaultMerger.java | 291 +++++++ .../server/transform/DefaultSaxMaker.java | 225 ++++++ .../server/transform/DefaultSaxParser.java | 389 +++++++++ .../server/transform/DefaultValidator.java | 205 +++++ .../server/transform/DefaultXmlBuilder.java | 337 ++++++++ .../server/transform/ILinker.java | 32 + .../server/transform/IMaker.java | 32 + .../server/transform/IParser.java | 31 + .../cat/configuration/tp/BaseEntity.java | 42 + .../cat/configuration/tp/Constants.java | 16 + .../cat/configuration/tp/IEntity.java | 8 + .../cat/configuration/tp/IVisitor.java | 11 + .../cat/configuration/tp/entity/Domain.java | 77 ++ .../tp/entity/TpValueStatisticConfig.java | 83 ++ .../tp/transform/DefaultLinker.java | 38 + .../tp/transform/DefaultSaxMaker.java | 58 ++ .../tp/transform/DefaultSaxParser.java | 242 ++++++ .../tp/transform/DefaultXmlBuilder.java | 264 +++++++ .../configuration/tp/transform/ILinker.java | 9 + .../configuration/tp/transform/IMaker.java | 13 + .../configuration/tp/transform/IParser.java | 10 + .../cat/configuration/web/url/BaseEntity.java | 56 ++ .../cat/configuration/web/url/Constants.java | 26 + .../cat/configuration/web/url/IEntity.java | 8 + .../cat/configuration/web/url/IVisitor.java | 14 + .../configuration/web/url/entity/Code.java | 92 +++ .../web/url/entity/PatternItem.java | 120 +++ .../web/url/entity/UrlPattern.java | 124 +++ .../web/url/transform/BaseVisitor.java | 27 + .../web/url/transform/DefaultJsonBuilder.java | 282 +++++++ .../web/url/transform/DefaultJsonParser.java | 375 +++++++++ .../web/url/transform/DefaultLinker.java | 55 ++ .../web/url/transform/DefaultMerger.java | 108 +++ .../url/transform/DefaultNativeBuilder.java | 147 ++++ .../url/transform/DefaultNativeParser.java | 184 +++++ .../web/url/transform/DefaultSaxMaker.java | 97 +++ .../web/url/transform/DefaultSaxParser.java | 247 ++++++ .../web/url/transform/DefaultXmlBuilder.java | 230 ++++++ .../web/url/transform/ILinker.java | 12 + .../web/url/transform/IMaker.java | 14 + .../web/url/transform/IParser.java | 13 + .../cat/core/config/BusinessConfig.java | 90 +++ .../com/dianping/cat/core/config/Config.java | 90 +++ .../config/repository/ConfigRepository.java | 19 +- .../dianping/cat/core/dal/DailyReport.java | 162 ++++ .../cat/core/dal/DailyReportContent.java | 114 +++ .../com/dianping/cat/core/dal/Hostinfo.java | 102 +++ .../dianping/cat/core/dal/HourlyReport.java | 138 ++++ .../cat/core/dal/HourlyReportContent.java | 114 +++ .../dianping/cat/core/dal/MonthlyReport.java | 114 +++ .../cat/core/dal/MonthlyReportContent.java | 102 +++ .../com/dianping/cat/core/dal/Project.java | 162 ++++ .../java/com/dianping/cat/core/dal/Task.java | 210 +++++ .../dianping/cat/core/dal/WeeklyReport.java | 114 +++ .../cat/core/dal/WeeklyReportContent.java | 102 +++ .../cat/core/dal/jdbc/DalException.java | 17 - .../core/dal/jdbc/DalNotFoundException.java | 13 - .../dianping/cat/core/dal/jdbc/DataField.java | 38 - .../cat/core/dal/jdbc/DataObject.java | 39 - .../dianping/cat/core/dal/jdbc/QueryDef.java | 50 -- .../dianping/cat/core/dal/jdbc/QueryType.java | 8 - .../dianping/cat/core/dal/jdbc/Readset.java | 30 - .../dianping/cat/core/dal/jdbc/Updateset.java | 17 - .../core/dal/jdbc/annotation/Attribute.java | 17 - .../cat/core/dal/jdbc/annotation/Entity.java | 9 - .../core/dal/jdbc/annotation/Variable.java | 7 - .../config/BusinessConfigRepository.java | 22 +- .../content/DailyReportContentRepository.java | 31 +- .../hostinfo/HostinfoRepository.java | 19 +- .../HourlyReportContentRepository.java | 32 +- .../hourlyreport/HourlyReportRepository.java | 21 +- .../MonthlyReportContentRepository.java | 31 +- .../monthreport/MonthlyReportRepository.java | 20 +- .../repository/project/ProjectRepository.java | 21 +- .../repository/task/TaskRepository.java | 27 +- .../WeeklyReportContentRepository.java | 31 +- .../weeklyreport/WeeklyReportRepository.java | 20 +- .../repository/DailyReportRepository.java | 23 +- .../report/service/AbstractReportService.java | 28 +- .../com/dianping/cat/sample/BaseEntity.java | 42 + .../com/dianping/cat/sample/Constants.java | 14 + .../java/com/dianping/cat/sample/IEntity.java | 8 + .../com/dianping/cat/sample/IVisitor.java | 11 + .../dianping/cat/sample/entity/Domain.java | 77 ++ .../cat/sample/entity/SampleConfig.java | 66 ++ .../cat/sample/transform/DefaultLinker.java | 38 + .../cat/sample/transform/DefaultSaxMaker.java | 59 ++ .../sample/transform/DefaultSaxParser.java | 227 ++++++ .../sample/transform/DefaultXmlBuilder.java | 213 +++++ .../cat/sample/transform/ILinker.java | 9 + .../dianping/cat/sample/transform/IMaker.java | 11 + .../cat/sample/transform/IParser.java | 10 + .../dianping/cat/service/HostinfoService.java | 22 +- .../dianping/cat/service/ProjectService.java | 19 +- .../com/dianping/cat/task/TaskManager.java | 5 +- .../META-INF/dal/jdbc/config-codegen.xml | 82 -- .../META-INF/dal/jdbc/config-dal.xml | 66 -- .../META-INF/dal/jdbc/config-manifest.xml | 6 - .../META-INF/dal/jdbc/report-codegen.xml | 447 ----------- .../META-INF/dal/jdbc/report-dal.xml | 432 ---------- .../META-INF/dal/jdbc/report-manifest.xml | 6 - .../model/atomic-message-config-codegen.xml | 12 - .../model/atomic-message-config-manifest.xml | 6 - .../dal/model/atomic-message-config-model.xml | 17 - .../model/business-report-config-codegen.xml | 27 - .../model/business-report-config-manifest.xml | 6 - .../model/business-report-config-model.xml | 29 - .../model/report-reload-config-codegen.xml | 14 - .../model/report-reload-config-manifest.xml | 6 - .../dal/model/report-reload-config-model.xml | 14 - .../dal/model/sample-config-codegen.xml | 11 - .../dal/model/sample-config-manifest.xml | 6 - .../dal/model/sample-config-model.xml | 11 - .../META-INF/dal/model/server-codegen.xml | 47 -- .../dal/model/server-config-codegen.xml | 52 -- .../dal/model/server-config-manifest.xml | 6 - .../dal/model/server-config-model.xml | 56 -- .../model/server-filter-config-codegen.xml | 14 - .../model/server-filter-config-manifest.xml | 6 - .../dal/model/server-filter-config-model.xml | 19 - .../META-INF/dal/model/server-manifest.xml | 6 - .../META-INF/dal/model/server-model.xml | 54 -- .../tp-value-statistic-config-codegen.xml | 11 - .../tp-value-statistic-config-manifest.xml | 6 - .../model/tp-value-statistic-config-model.xml | 11 - .../dal/model/url-pattern-codegen.xml | 12 - .../dal/model/url-pattern-manifest.xml | 6 - .../META-INF/dal/model/url-pattern-model.xml | 21 - .../cat/service/DefaultReportManagerTest.java | 5 +- .../dianping/cat/task/TaskManagerTest.java | 3 +- cat-home/pom.xml | 68 -- .../alert/summary/AlertSummaryRepository.java | 25 +- .../alteration/AlterationRepository.java | 41 +- .../baseline/BaselineRepository.java | 31 +- .../ConfigModificationRepository.java | 25 +- .../metric/graph/MetricGraphRepository.java | 41 +- .../metric/screen/MetricScreenRepository.java | 51 +- .../overload/OverloadRepository.java | 41 +- .../TopologyGraphRepository.java | 31 +- .../cat/home/alert/summary/BaseEntity.java | 42 + .../cat/home/alert/summary/Constants.java | 30 + .../cat/home/alert/summary/IEntity.java | 8 + .../cat/home/alert/summary/IVisitor.java | 14 + .../cat/home/alert/summary/entity/Alert.java | 158 ++++ .../alert/summary/entity/AlertSummary.java | 122 +++ .../home/alert/summary/entity/Category.java | 77 ++ .../alert/summary/transform/BaseVisitor.java | 26 + .../summary/transform/DefaultDomMaker.java | 147 ++++ .../summary/transform/DefaultDomParser.java | 137 ++++ .../summary/transform/DefaultLinker.java | 45 ++ .../summary/transform/DefaultSaxMaker.java | 120 +++ .../summary/transform/DefaultSaxParser.java | 258 ++++++ .../summary/transform/DefaultXmlBuilder.java | 242 ++++++ .../home/alert/summary/transform/ILinker.java | 12 + .../home/alert/summary/transform/IMaker.java | 14 + .../home/alert/summary/transform/IParser.java | 13 + .../cat/home/business/BaseEntity.java | 42 + .../dianping/cat/home/business/Constants.java | 20 + .../dianping/cat/home/business/IEntity.java | 8 + .../dianping/cat/home/business/IVisitor.java | 14 + .../home/business/entity/BusinessItem.java | 78 ++ .../business/entity/BusinessTagConfig.java | 66 ++ .../cat/home/business/entity/Tag.java | 77 ++ .../business/transform/DefaultLinker.java | 45 ++ .../business/transform/DefaultSaxMaker.java | 73 ++ .../business/transform/DefaultSaxParser.java | 250 ++++++ .../business/transform/DefaultXmlBuilder.java | 229 ++++++ .../cat/home/business/transform/ILinker.java | 12 + .../cat/home/business/transform/IMaker.java | 14 + .../cat/home/business/transform/IParser.java | 13 + .../cat/home/dal/report/AlertSummary.java | 90 +++ .../cat/home/dal/report/Alteration.java | 222 ++++++ .../cat/home/dal/report/Baseline.java | 114 +++ .../home/dal/report/ConfigModification.java | 114 +++ .../cat/home/dal/report/MetricGraph.java | 102 +++ .../cat/home/dal/report/MetricScreen.java | 138 ++++ .../cat/home/dal/report/Overload.java | 162 ++++ .../cat/home/dal/report/TopologyGraph.java | 102 +++ .../home/dependency/config/BaseEntity.java | 42 + .../cat/home/dependency/config/Constants.java | 48 ++ .../cat/home/dependency/config/IEntity.java | 8 + .../cat/home/dependency/config/IVisitor.java | 17 + .../config/entity/DomainConfig.java | 127 +++ .../dependency/config/entity/EdgeConfig.java | 172 ++++ .../dependency/config/entity/NodeConfig.java | 174 +++++ .../config/entity/TopologyGraphConfig.java | 124 +++ .../config/transform/BaseVisitor.java | 35 + .../config/transform/DefaultLinker.java | 72 ++ .../config/transform/DefaultMerger.java | 136 ++++ .../config/transform/DefaultSaxMaker.java | 175 +++++ .../config/transform/DefaultSaxParser.java | 270 +++++++ .../config/transform/DefaultXmlBuilder.java | 254 ++++++ .../dependency/config/transform/ILinker.java | 15 + .../dependency/config/transform/IMaker.java | 17 + .../dependency/config/transform/IParser.java | 16 + .../home/dependency/format/BaseEntity.java | 42 + .../cat/home/dependency/format/Constants.java | 18 + .../cat/home/dependency/format/IEntity.java | 8 + .../cat/home/dependency/format/IVisitor.java | 14 + .../home/dependency/format/entity/Domain.java | 78 ++ .../dependency/format/entity/ProductLine.java | 100 +++ .../format/entity/TopoGraphFormatConfig.java | 61 ++ .../format/transform/DefaultLinker.java | 36 + .../format/transform/DefaultSaxMaker.java | 81 ++ .../format/transform/DefaultSaxParser.java | 250 ++++++ .../format/transform/DefaultXmlBuilder.java | 228 ++++++ .../dependency/format/transform/ILinker.java | 12 + .../dependency/format/transform/IMaker.java | 14 + .../dependency/format/transform/IParser.java | 13 + .../cat/home/dependency/graph/BaseEntity.java | 56 ++ .../cat/home/dependency/graph/Constants.java | 36 + .../cat/home/dependency/graph/IEntity.java | 8 + .../cat/home/dependency/graph/IVisitor.java | 14 + .../dependency/graph/entity/TopologyEdge.java | 197 +++++ .../graph/entity/TopologyGraph.java | 201 +++++ .../dependency/graph/entity/TopologyNode.java | 133 ++++ .../graph/transform/BaseVisitor.java | 27 + .../graph/transform/DefaultJsonBuilder.java | 288 +++++++ .../graph/transform/DefaultJsonParser.java | 404 ++++++++++ .../graph/transform/DefaultLinker.java | 55 ++ .../graph/transform/DefaultMerger.java | 108 +++ .../graph/transform/DefaultNativeBuilder.java | 203 +++++ .../graph/transform/DefaultNativeParser.java | 228 ++++++ .../graph/transform/DefaultSaxMaker.java | 162 ++++ .../graph/transform/DefaultSaxParser.java | 247 ++++++ .../graph/transform/DefaultXmlBuilder.java | 235 ++++++ .../dependency/graph/transform/ILinker.java | 12 + .../dependency/graph/transform/IMaker.java | 14 + .../dependency/graph/transform/IParser.java | 13 + .../cat/home/exception/BaseEntity.java | 42 + .../cat/home/exception/Constants.java | 26 + .../dianping/cat/home/exception/IEntity.java | 8 + .../dianping/cat/home/exception/IVisitor.java | 14 + .../exception/entity/ExceptionExclude.java | 92 +++ .../home/exception/entity/ExceptionLimit.java | 137 ++++ .../exception/entity/ExceptionRuleConfig.java | 124 +++ .../exception/transform/DefaultLinker.java | 55 ++ .../exception/transform/DefaultSaxMaker.java | 102 +++ .../exception/transform/DefaultSaxParser.java | 247 ++++++ .../transform/DefaultXmlBuilder.java | 230 ++++++ .../cat/home/exception/transform/ILinker.java | 12 + .../cat/home/exception/transform/IMaker.java | 14 + .../cat/home/exception/transform/IParser.java | 13 + .../dianping/cat/home/graph/BaseEntity.java | 42 + .../dianping/cat/home/graph/Constants.java | 28 + .../com/dianping/cat/home/graph/IEntity.java | 8 + .../com/dianping/cat/home/graph/IVisitor.java | 14 + .../dianping/cat/home/graph/entity/Graph.java | 85 ++ .../dianping/cat/home/graph/entity/Item.java | 99 +++ .../cat/home/graph/entity/Segment.java | 137 ++++ .../home/graph/transform/DefaultLinker.java | 55 ++ .../home/graph/transform/DefaultSaxMaker.java | 99 +++ .../graph/transform/DefaultSaxParser.java | 250 ++++++ .../graph/transform/DefaultXmlBuilder.java | 233 ++++++ .../cat/home/graph/transform/ILinker.java | 12 + .../cat/home/graph/transform/IMaker.java | 14 + .../cat/home/graph/transform/IParser.java | 13 + .../dianping/cat/home/group/BaseEntity.java | 56 ++ .../dianping/cat/home/group/Constants.java | 20 + .../com/dianping/cat/home/group/IEntity.java | 8 + .../com/dianping/cat/home/group/IVisitor.java | 14 + .../cat/home/group/entity/Domain.java | 85 ++ .../cat/home/group/entity/DomainGroup.java | 66 ++ .../dianping/cat/home/group/entity/Group.java | 77 ++ .../cat/home/group/transform/BaseVisitor.java | 26 + .../group/transform/DefaultJsonBuilder.java | 289 +++++++ .../group/transform/DefaultJsonParser.java | 373 +++++++++ .../home/group/transform/DefaultLinker.java | 55 ++ .../home/group/transform/DefaultMerger.java | 108 +++ .../group/transform/DefaultNativeBuilder.java | 128 +++ .../group/transform/DefaultNativeParser.java | 175 +++++ .../home/group/transform/DefaultSaxMaker.java | 67 ++ .../group/transform/DefaultSaxParser.java | 265 +++++++ .../group/transform/DefaultXmlBuilder.java | 279 +++++++ .../cat/home/group/transform/ILinker.java | 12 + .../cat/home/group/transform/IMaker.java | 16 + .../cat/home/group/transform/IParser.java | 13 + .../cat/home/heartbeat/BaseEntity.java | 42 + .../cat/home/heartbeat/Constants.java | 28 + .../dianping/cat/home/heartbeat/IEntity.java | 8 + .../dianping/cat/home/heartbeat/IVisitor.java | 14 + .../cat/home/heartbeat/entity/Group.java | 97 +++ .../entity/HeartbeatDisplayPolicy.java | 66 ++ .../cat/home/heartbeat/entity/Metric.java | 154 ++++ .../heartbeat/transform/DefaultLinker.java | 55 ++ .../heartbeat/transform/DefaultSaxMaker.java | 103 +++ .../heartbeat/transform/DefaultSaxParser.java | 250 ++++++ .../transform/DefaultXmlBuilder.java | 233 ++++++ .../cat/home/heartbeat/transform/ILinker.java | 12 + .../cat/home/heartbeat/transform/IMaker.java | 14 + .../cat/home/heartbeat/transform/IParser.java | 13 + .../dianping/cat/home/heavy/BaseEntity.java | 42 + .../dianping/cat/home/heavy/Constants.java | 34 + .../com/dianping/cat/home/heavy/IEntity.java | 8 + .../com/dianping/cat/home/heavy/IVisitor.java | 23 + .../cat/home/heavy/entity/HeavyCache.java | 124 +++ .../cat/home/heavy/entity/HeavyCall.java | 124 +++ .../cat/home/heavy/entity/HeavyReport.java | 125 +++ .../cat/home/heavy/entity/HeavySql.java | 124 +++ .../cat/home/heavy/entity/Service.java | 120 +++ .../dianping/cat/home/heavy/entity/Url.java | 120 +++ .../cat/home/heavy/transform/BaseVisitor.java | 67 ++ .../home/heavy/transform/DefaultLinker.java | 140 ++++ .../home/heavy/transform/DefaultMerger.java | 244 ++++++ .../heavy/transform/DefaultNativeBuilder.java | 255 ++++++ .../heavy/transform/DefaultNativeParser.java | 338 ++++++++ .../home/heavy/transform/DefaultSaxMaker.java | 155 ++++ .../heavy/transform/DefaultSaxParser.java | 344 ++++++++ .../heavy/transform/DefaultXmlBuilder.java | 302 +++++++ .../cat/home/heavy/transform/ILinker.java | 29 + .../cat/home/heavy/transform/IMaker.java | 23 + .../cat/home/heavy/transform/IParser.java | 22 + .../com/dianping/cat/home/jar/BaseEntity.java | 42 + .../com/dianping/cat/home/jar/Constants.java | 28 + .../com/dianping/cat/home/jar/IEntity.java | 8 + .../com/dianping/cat/home/jar/IVisitor.java | 17 + .../dianping/cat/home/jar/entity/Domain.java | 102 +++ .../com/dianping/cat/home/jar/entity/Jar.java | 78 ++ .../cat/home/jar/entity/JarReport.java | 142 ++++ .../dianping/cat/home/jar/entity/Machine.java | 77 ++ .../cat/home/jar/transform/BaseVisitor.java | 34 + .../cat/home/jar/transform/DefaultLinker.java | 62 ++ .../cat/home/jar/transform/DefaultMerger.java | 135 ++++ .../jar/transform/DefaultNativeBuilder.java | 167 ++++ .../jar/transform/DefaultNativeParser.java | 219 ++++++ .../home/jar/transform/DefaultSaxMaker.java | 111 +++ .../home/jar/transform/DefaultSaxParser.java | 281 +++++++ .../home/jar/transform/DefaultXmlBuilder.java | 254 ++++++ .../cat/home/jar/transform/ILinker.java | 15 + .../cat/home/jar/transform/IMaker.java | 17 + .../cat/home/jar/transform/IParser.java | 16 + .../cat/home/resource/BaseEntity.java | 42 + .../dianping/cat/home/resource/Constants.java | 16 + .../dianping/cat/home/resource/IEntity.java | 8 + .../dianping/cat/home/resource/IVisitor.java | 11 + .../cat/home/resource/entity/Resource.java | 96 +++ .../home/resource/entity/ResourceConfig.java | 61 ++ .../resource/transform/DefaultLinker.java | 29 + .../resource/transform/DefaultSaxMaker.java | 69 ++ .../resource/transform/DefaultSaxParser.java | 227 ++++++ .../resource/transform/DefaultXmlBuilder.java | 214 +++++ .../cat/home/resource/transform/ILinker.java | 9 + .../cat/home/resource/transform/IMaker.java | 11 + .../cat/home/resource/transform/IParser.java | 10 + .../dianping/cat/home/router/BaseEntity.java | 56 ++ .../dianping/cat/home/router/Constants.java | 62 ++ .../com/dianping/cat/home/router/IEntity.java | 8 + .../dianping/cat/home/router/IVisitor.java | 32 + .../cat/home/router/entity/DefaultServer.java | 105 +++ .../cat/home/router/entity/Domain.java | 102 +++ .../cat/home/router/entity/Group.java | 77 ++ .../cat/home/router/entity/GroupServer.java | 63 ++ .../cat/home/router/entity/Network.java | 63 ++ .../cat/home/router/entity/NetworkPolicy.java | 148 ++++ .../cat/home/router/entity/RouterConfig.java | 250 ++++++ .../cat/home/router/entity/Server.java | 94 +++ .../cat/home/router/entity/ServerGroup.java | 116 +++ .../home/router/transform/BaseVisitor.java | 77 ++ .../router/transform/DefaultJsonBuilder.java | 421 ++++++++++ .../router/transform/DefaultJsonParser.java | 563 +++++++++++++ .../home/router/transform/DefaultLinker.java | 147 ++++ .../home/router/transform/DefaultMerger.java | 278 +++++++ .../transform/DefaultNativeBuilder.java | 319 ++++++++ .../router/transform/DefaultNativeParser.java | 430 ++++++++++ .../router/transform/DefaultSaxMaker.java | 209 +++++ .../router/transform/DefaultSaxParser.java | 387 +++++++++ .../router/transform/DefaultXmlBuilder.java | 330 ++++++++ .../cat/home/router/transform/ILinker.java | 30 + .../cat/home/router/transform/IMaker.java | 32 + .../cat/home/router/transform/IParser.java | 31 + .../dianping/cat/home/server/BaseEntity.java | 42 + .../dianping/cat/home/server/Constants.java | 24 + .../com/dianping/cat/home/server/IEntity.java | 8 + .../dianping/cat/home/server/IVisitor.java | 17 + .../cat/home/server/entity/Group.java | 102 +++ .../dianping/cat/home/server/entity/Item.java | 102 +++ .../cat/home/server/entity/Segment.java | 92 +++ .../server/entity/ServerMetricConfig.java | 83 ++ .../home/server/transform/DefaultLinker.java | 72 ++ .../home/server/transform/DefaultMerger.java | 135 ++++ .../server/transform/DefaultSaxMaker.java | 83 ++ .../server/transform/DefaultSaxParser.java | 273 +++++++ .../server/transform/DefaultXmlBuilder.java | 244 ++++++ .../cat/home/server/transform/ILinker.java | 15 + .../cat/home/server/transform/IMaker.java | 17 + .../cat/home/server/transform/IParser.java | 16 + .../dianping/cat/home/service/BaseEntity.java | 56 ++ .../dianping/cat/home/service/Constants.java | 30 + .../dianping/cat/home/service/IEntity.java | 8 + .../dianping/cat/home/service/IVisitor.java | 11 + .../cat/home/service/client/BaseEntity.java | 56 ++ .../cat/home/service/client/Constants.java | 38 + .../cat/home/service/client/IEntity.java | 8 + .../cat/home/service/client/IVisitor.java | 14 + .../service/client/entity/ClientReport.java | 131 ++++ .../home/service/client/entity/Domain.java | 196 +++++ .../home/service/client/entity/Method.java | 198 +++++ .../service/client/transform/BaseVisitor.java | 26 + .../client/transform/DefaultJsonBuilder.java | 297 +++++++ .../client/transform/DefaultJsonParser.java | 421 ++++++++++ .../client/transform/DefaultLinker.java | 55 ++ .../client/transform/DefaultMerger.java | 107 +++ .../transform/DefaultNativeBuilder.java | 199 +++++ .../client/transform/DefaultNativeParser.java | 238 ++++++ .../client/transform/DefaultSaxMaker.java | 161 ++++ .../client/transform/DefaultSaxParser.java | 258 ++++++ .../client/transform/DefaultXmlBuilder.java | 246 ++++++ .../service/client/transform/ILinker.java | 12 + .../home/service/client/transform/IMaker.java | 14 + .../service/client/transform/IParser.java | 13 + .../cat/home/service/entity/Domain.java | 129 +++ .../home/service/entity/ServiceReport.java | 131 ++++ .../home/service/transform/BaseVisitor.java | 18 + .../service/transform/DefaultJsonBuilder.java | 274 +++++++ .../service/transform/DefaultJsonParser.java | 376 +++++++++ .../home/service/transform/DefaultLinker.java | 38 + .../home/service/transform/DefaultMerger.java | 85 ++ .../transform/DefaultNativeBuilder.java | 156 ++++ .../transform/DefaultNativeParser.java | 184 +++++ .../service/transform/DefaultSaxMaker.java | 79 ++ .../service/transform/DefaultSaxParser.java | 264 +++++++ .../service/transform/DefaultXmlBuilder.java | 286 +++++++ .../cat/home/service/transform/ILinker.java | 9 + .../cat/home/service/transform/IMaker.java | 11 + .../cat/home/service/transform/IParser.java | 10 + .../dianping/cat/home/storage/BaseEntity.java | 42 + .../dianping/cat/home/storage/Constants.java | 30 + .../dianping/cat/home/storage/IEntity.java | 8 + .../dianping/cat/home/storage/IVisitor.java | 17 + .../cat/home/storage/alert/BaseEntity.java | 42 + .../cat/home/storage/alert/Constants.java | 40 + .../cat/home/storage/alert/IEntity.java | 8 + .../cat/home/storage/alert/IVisitor.java | 23 + .../cat/home/storage/alert/entity/Detail.java | 75 ++ .../home/storage/alert/entity/Machine.java | 137 ++++ .../home/storage/alert/entity/Operation.java | 137 ++++ .../home/storage/alert/entity/Storage.java | 137 ++++ .../alert/entity/StorageAlertInfo.java | 131 ++++ .../cat/home/storage/alert/entity/Target.java | 155 ++++ .../alert/transform/DefaultXmlBuilder.java | 286 +++++++ .../cat/home/storage/entity/Link.java | 80 ++ .../cat/home/storage/entity/Storage.java | 107 +++ .../cat/home/storage/entity/StorageGroup.java | 96 +++ .../storage/entity/StorageGroupConfig.java | 66 ++ .../home/storage/transform/DefaultLinker.java | 62 ++ .../home/storage/transform/DefaultMerger.java | 137 ++++ .../storage/transform/DefaultSaxMaker.java | 99 +++ .../storage/transform/DefaultSaxParser.java | 285 +++++++ .../storage/transform/DefaultXmlBuilder.java | 294 +++++++ .../cat/home/storage/transform/ILinker.java | 15 + .../cat/home/storage/transform/IMaker.java | 19 + .../cat/home/storage/transform/IParser.java | 16 + .../dianping/cat/home/user/BaseEntity.java | 42 + .../com/dianping/cat/home/user/Constants.java | 14 + .../com/dianping/cat/home/user/IEntity.java | 8 + .../com/dianping/cat/home/user/IVisitor.java | 11 + .../dianping/cat/home/user/entity/User.java | 75 ++ .../cat/home/user/entity/UserConfig.java | 66 ++ .../home/user/transform/DefaultLinker.java | 38 + .../home/user/transform/DefaultSaxMaker.java | 59 ++ .../home/user/transform/DefaultSaxParser.java | 227 ++++++ .../user/transform/DefaultXmlBuilder.java | 213 +++++ .../cat/home/user/transform/ILinker.java | 9 + .../cat/home/user/transform/IMaker.java | 11 + .../cat/home/user/transform/IParser.java | 10 + .../cat/home/utilization/BaseEntity.java | 42 + .../cat/home/utilization/Constants.java | 46 ++ .../cat/home/utilization/IEntity.java | 8 + .../cat/home/utilization/IVisitor.java | 17 + .../utilization/entity/ApplicationState.java | 153 ++++ .../cat/home/utilization/entity/Domain.java | 165 ++++ .../home/utilization/entity/MachineState.java | 114 +++ .../utilization/entity/UtilizationReport.java | 131 ++++ .../utilization/transform/BaseVisitor.java | 35 + .../utilization/transform/DefaultLinker.java | 72 ++ .../utilization/transform/DefaultMerger.java | 136 ++++ .../transform/DefaultNativeBuilder.java | 219 ++++++ .../transform/DefaultNativeParser.java | 271 +++++++ .../transform/DefaultSaxMaker.java | 184 +++++ .../transform/DefaultSaxParser.java | 286 +++++++ .../transform/DefaultXmlBuilder.java | 269 +++++++ .../home/utilization/transform/ILinker.java | 15 + .../home/utilization/transform/IMaker.java | 17 + .../home/utilization/transform/IParser.java | 16 + .../business/BusinessRuleConfigManager.java | 8 +- .../exception/ExceptionRuleConfigManager.java | 9 +- .../spi/config/BaseRuleConfigManager.java | 23 +- .../spi/config/UserDefinedRuleManager.java | 12 +- .../alert/summary/AlertSummaryService.java | 3 +- .../alert/summary/build/AlertInfoBuilder.java | 10 +- .../build/AlterationSummaryBuilder.java | 6 +- .../report/page/DomainGroupConfigManager.java | 9 +- .../cat/report/page/alert/Handler.java | 11 +- .../cat/report/page/alteration/Handler.java | 9 +- .../service/BusinessReportService.java | 16 +- .../cross/service/CrossReportService.java | 45 +- .../config/TopoGraphFormatConfigManager.java | 10 +- .../graph/TopologyGraphConfigManager.java | 9 +- .../graph/TopologyGraphManager.java | 6 +- .../service/DependencyReportService.java | 15 +- .../event/service/EventReportService.java | 45 +- .../page/event/task/EventReportBuilder.java | 4 +- .../config/HeartbeatDisplayPolicyManager.java | 10 +- .../service/HeartbeatReportService.java | 25 +- .../matrix/service/MatrixReportService.java | 45 +- .../service/DefaultBaselineService.java | 12 +- .../task/CapacityUpdateStatusManager.java | 19 +- .../overload/task/CapacityUpdateTask.java | 9 +- .../page/overload/task/CapacityUpdater.java | 3 +- .../overload/task/DailyCapacityUpdater.java | 13 +- .../overload/task/HourlyCapacityUpdater.java | 13 +- .../overload/task/MonthlyCapacityUpdater.java | 13 +- .../overload/task/TableCapacityService.java | 22 +- .../overload/task/WeeklyCapacityUpdater.java | 13 +- .../problem/service/ProblemReportService.java | 45 +- .../problem/task/ProblemReportBuilder.java | 6 +- .../state/service/StateReportService.java | 45 +- .../service/ClientReportService.java | 13 +- .../service/HeavyReportService.java | 45 +- .../statistics/service/JarReportService.java | 13 +- .../service/ServiceReportService.java | 45 +- .../service/UtilizationReportService.java | 45 +- .../cat/report/page/storage/Handler.java | 7 +- .../config/StorageGroupConfigManager.java | 9 +- .../storage/task/StorageReportBuilder.java | 3 +- .../storage/task/StorageReportService.java | 45 +- .../page/top/service/TopReportService.java | 15 +- .../service/TransactionReportService.java | 45 +- .../task/TransactionReportBuilder.java | 4 +- .../cat/report/task/DefaultTaskConsumer.java | 22 +- .../report/task/cmdb/ProjectUpdateTask.java | 3 +- .../task/current/CurrentReportBuilder.java | 3 +- .../task/reload/AbstractReportReloader.java | 3 +- .../config/BusinessTagConfigManager.java | 5 +- .../permission/ResourceConfigManager.java | 11 +- .../page/permission/UserConfigManager.java | 11 +- .../router/config/RouterConfigAdjustor.java | 6 +- .../router/config/RouterConfigManager.java | 24 +- .../router/service/RouterConfigService.java | 17 +- .../META-INF/dal/jdbc/report-codegen.xml | 332 -------- .../META-INF/dal/jdbc/report-dal.xml | 264 ------- .../META-INF/dal/jdbc/report-manifest.xml | 6 - .../dal/model/alert-receiver-codegen.xml | 14 - .../dal/model/alert-receiver-manifest.xml | 6 - .../dal/model/alert-receiver-model.xml | 17 - .../dal/model/alert-summary-codegen.xml | 21 - .../dal/model/alert-summary-manifest.xml | 6 - .../dal/model/alert-summary-model.xml | 4 - .../dal/model/business-tag-config-codegen.xml | 15 - .../model/business-tag-config-manifest.xml | 6 - .../dal/model/business-tag-config-model.xml | 16 - .../dal/model/client-report-codegen.xml | 30 - .../dal/model/client-report-manifest.xml | 6 - .../dal/model/client-report-model.xml | 32 - .../dal/model/domain-group-codegen.xml | 15 - .../dal/model/domain-group-manifest.xml | 6 - .../META-INF/dal/model/domain-group-model.xml | 16 - .../model/exception-rule-config-codegen.xml | 21 - .../model/exception-rule-config-manifest.xml | 6 - .../dal/model/exception-rule-config-model.xml | 22 - .../META-INF/dal/model/graph-codegen.xml | 21 - .../META-INF/dal/model/graph-manifest.xml | 6 - .../META-INF/dal/model/graph-model.xml | 21 - .../heartbeat-display-config-codegen.xml | 18 - .../heartbeat-display-config-manifest.xml | 6 - .../model/heartbeat-display-config-model.xml | 21 - .../dal/model/heavy-report-codegen.xml | 36 - .../dal/model/heavy-report-manifest.xml | 6 - .../META-INF/dal/model/heavy-report-model.xml | 38 - .../META-INF/dal/model/highload-codegen.xml | 26 - .../META-INF/dal/model/highload-manifest.xml | 6 - .../META-INF/dal/model/highload-model.xml | 5 - .../META-INF/dal/model/jar-report-codegen.xml | 9 - .../dal/model/jar-report-manifest.xml | 6 - .../META-INF/dal/model/jar-report-model.xml | 24 - .../dal/model/monitor-rules-codegen.xml | 32 - .../dal/model/monitor-rules-manifest.xml | 6 - .../dal/model/monitor-rules-model.xml | 35 - .../dal/model/resource-config-codegen.xml | 12 - .../dal/model/resource-config-manifest.xml | 6 - .../dal/model/resource-config-model.xml | 12 - .../META-INF/dal/model/router-codegen.xml | 49 -- .../META-INF/dal/model/router-manifest.xml | 6 - .../META-INF/dal/model/router-model.xml | 51 -- .../model/server-metric-config-codegen.xml | 20 - .../model/server-metric-config-manifest.xml | 6 - .../dal/model/server-metric-config-model.xml | 20 - .../dal/model/service-report-codegen.xml | 19 - .../dal/model/service-report-manifest.xml | 6 - .../dal/model/service-report-model.xml | 20 - .../dal/model/storage-alert-info-codegen.xml | 39 - .../dal/model/storage-alert-info-manifest.xml | 6 - .../dal/model/storage-alert-info-model.xml | 39 - .../model/storage-group-config-codegen.xml | 22 - .../model/storage-group-config-manifest.xml | 6 - .../dal/model/storage-group-config-model.xml | 22 - .../dal/model/system-report-codegen.xml | 32 - .../dal/model/system-report-manifest.xml | 6 - .../dal/model/system-report-model.xml | 33 - .../model/topology-format-config-codegen.xml | 11 - .../model/topology-format-config-manifest.xml | 6 - .../model/topology-format-config-model.xml | 16 - .../dal/model/topology-graph-codegen.xml | 30 - .../model/topology-graph-config-codegen.xml | 33 - .../model/topology-graph-config-manifest.xml | 6 - .../dal/model/topology-graph-config-model.xml | 39 - .../dal/model/topology-graph-manifest.xml | 6 - .../dal/model/topology-graph-model.xml | 36 - .../dal/model/user-config-codegen.xml | 11 - .../dal/model/user-config-manifest.xml | 6 - .../META-INF/dal/model/user-config-model.xml | 12 - .../dal/model/utilization-report-codegen.xml | 14 - .../dal/model/utilization-report-manifest.xml | 6 - .../dal/model/utilization-report-model.xml | 34 - .../cat/report/task/ConfigsBackupTest.java | 6 +- .../cat/report/task/DatabaseCapacityTest.java | 3 +- pom.xml | 10 - 1134 files changed, 93753 insertions(+), 6558 deletions(-) create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/Alert.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/ServerAlarmRule.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/UserDefineRule.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/BaseEntity.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/Constants.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/IEntity.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/IVisitor.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/AlertPolicy.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/Group.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/Level.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/Type.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultDomMaker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultDomParser.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultLinker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultSaxMaker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultSaxParser.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultXmlBuilder.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/ILinker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/IMaker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/IParser.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/BaseEntity.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/Constants.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/IEntity.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/IVisitor.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/entity/AlertConfig.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/entity/Receiver.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultDomMaker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultDomParser.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultLinker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultSaxMaker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultSaxParser.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultXmlBuilder.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/ILinker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/IMaker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/IParser.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/BaseEntity.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/Constants.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/IEntity.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/IVisitor.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/Condition.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/Config.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/MetricItem.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/MonitorRules.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/Rule.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/SubCondition.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultDomMaker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultDomParser.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultJsonBuilder.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultJsonParser.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultLinker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultSaxMaker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultSaxParser.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultXmlBuilder.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/ILinker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/IMaker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/IParser.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/sender/BaseEntity.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/sender/Constants.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/sender/IEntity.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/sender/IVisitor.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/sender/entity/Par.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/sender/entity/Sender.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/sender/entity/SenderConfig.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultLinker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultSaxMaker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultSaxParser.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultXmlBuilder.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/ILinker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/IMaker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/IParser.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/BaseEntity.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/Constants.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/IEntity.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/IVisitor.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/Condition.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/Rule.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/ServerAlarmRuleConfig.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/SubCondition.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultJsonBuilder.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultJsonParser.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultLinker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultSaxMaker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultSaxParser.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultXmlBuilder.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/ILinker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/IMaker.java create mode 100644 cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/IParser.java delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/jdbc/alarm-codegen.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/jdbc/alarm-dal.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/jdbc/alarm-manifest.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/alert-policy-codegen.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/alert-policy-manifest.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/alert-policy-model.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/alert-receiver-codegen.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/alert-receiver-manifest.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/alert-receiver-model.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/monitor-rules-codegen.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/monitor-rules-manifest.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/monitor-rules-model.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/sender-config-codegen.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/sender-config-manifest.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/sender-config-model.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/server-alarm-rule-codegen.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/server-alarm-rule-manifest.xml delete mode 100644 cat-alarm/src/main/resources/META-INF/dal/model/server-alarm-rule-model.xml create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/BaseEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/Constants.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/IEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/IVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/AllConfig.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/Name.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/Report.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/Type.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/BaseVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultLinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultMerger.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultSaxMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultSaxParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultXmlBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/ILinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/IMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/IParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/BaseEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/Constants.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/IEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/IVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/entity/BusinessItem.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/entity/BusinessReport.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/entity/Segment.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/BaseVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultLinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultMerger.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultNativeBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultNativeParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultSaxMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultSaxParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultXmlBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/ILinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/IMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/IParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/BaseEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/Constants.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/IEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/IVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/CrossReport.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Local.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Name.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Remote.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Type.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/BaseVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultLinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultMerger.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultNativeBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultNativeParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultSaxMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultSaxParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultXmlBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/ILinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/IMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/IParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/BaseEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/Constants.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/IEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/IVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/Dependency.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/DependencyReport.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/Index.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/Segment.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/BaseVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultLinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultMerger.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultNativeBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultNativeParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultSaxMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultSaxParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultXmlBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/ILinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/IMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/IParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/BaseEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/Constants.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/IEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/IVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/EventName.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/EventReport.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/EventType.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/GraphTrend.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/Machine.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/Range.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/StatusCode.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/BaseVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultLinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultMerger.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultNativeBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultNativeParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultSaxMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultSaxParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultXmlBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/ILinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/IMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/IParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/BaseEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/Constants.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/IEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/IVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Detail.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Disk.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Extension.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/HeartbeatReport.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Machine.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Period.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/BaseVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultLinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultMerger.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultNativeBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultNativeParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultSaxMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultSaxParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultXmlBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/ILinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/IMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/IParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/BaseEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/Constants.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/IEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/IVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/entity/Matrix.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/entity/MatrixReport.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/entity/Ratio.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/BaseVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultLinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultMerger.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultNativeBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultNativeParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultSaxMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultSaxParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultXmlBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/ILinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/IMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/IParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/BaseEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/Constants.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/IEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/IVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Duration.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Entity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Entry.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/GraphTrend.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/JavaThread.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Machine.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/ProblemReport.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Segment.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/BaseVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultLinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultMerger.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultNativeBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultNativeParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultSaxMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultSaxParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultXmlBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/ILinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/IMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/IParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/BaseEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/Constants.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/IEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/IVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/Detail.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/Machine.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/Message.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/ProcessDomain.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/StateReport.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/BaseVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultLinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultMerger.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultNativeBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultNativeParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultSaxMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultSaxParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultXmlBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/ILinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/IMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/IParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/BaseEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/Constants.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/IEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/IVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Domain.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Machine.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Operation.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Segment.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Sql.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/StorageReport.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/BaseVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultLinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultMerger.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultNativeBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultNativeParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultSaxMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultSaxParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultXmlBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/ILinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/IMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/IParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/BaseEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/Constants.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/IEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/IVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Domain.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Error.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Machine.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Segment.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/TopReport.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/BaseVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultLinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultMerger.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultNativeBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultNativeParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultSaxMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultSaxParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultXmlBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/ILinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/IMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/IParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/BaseEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/Constants.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/IEntity.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/IVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/AllDuration.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Duration.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Graph.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Graph2.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/GraphTrend.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Machine.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Range.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Range2.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/StatusCode.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/TransactionName.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/TransactionReport.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/TransactionType.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/BaseVisitor.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultLinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultMerger.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultNativeBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultNativeParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultSaxMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultSaxParser.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultXmlBuilder.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/ILinker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/IMaker.java create mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/IParser.java delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/all-report-codegen.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/all-report-manifest.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/all-report-model.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/business-report-codegen.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/business-report-manifest.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/business-report-model.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/cross-report-codegen.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/cross-report-manifest.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/cross-report-model.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/dependency-report-codegen.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/dependency-report-manifest.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/dependency-report-model.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/event-report-codegen.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/event-report-manifest.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/event-report-model.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/heartbeat-report-codegen.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/heartbeat-report-manifest.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/heartbeat-report-model.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/matrix-report-codegen.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/matrix-report-manifest.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/matrix-report-model.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/problem-report-codegen.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/problem-report-manifest.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/problem-report-model.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/state-report-codegen.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/state-report-manifest.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/state-report-model.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/storage-report-codegen.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/storage-report-manifest.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/storage-report-model.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/top-report-codegen.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/top-report-manifest.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/top-report-model.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/transaction-report-codegen.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/transaction-report-manifest.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/transaction-report-model.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/url-pattern-codegen.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/url-pattern-manifest.xml delete mode 100644 cat-consumer/src/main/resources/META-INF/dal/model/url-pattern-model.xml create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/business/BaseEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/business/Constants.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/business/IEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/business/IVisitor.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/business/entity/BusinessItemConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/business/entity/BusinessReportConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/business/entity/CustomConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultLinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultSaxMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultSaxParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultXmlBuilder.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/business/transform/ILinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/business/transform/IMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/business/transform/IParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/message/BaseEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/message/Constants.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/message/IEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/message/IVisitor.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/message/entity/AtomicMessageConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/message/entity/Domain.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/message/entity/Property.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultLinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultSaxMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultSaxParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultXmlBuilder.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/message/transform/ILinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/message/transform/IMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/message/transform/IParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/reload/BaseEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/reload/Constants.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/reload/IEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/reload/IVisitor.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/reload/entity/ReportPeriod.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/reload/entity/ReportReloadConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/reload/entity/ReportType.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultLinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultSaxMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultSaxParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultXmlBuilder.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/ILinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/IMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/IParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/BaseEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/Constants.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/IEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/IVisitor.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/entity/ConsumerConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/entity/Domain.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/entity/HarfsConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/entity/HdfsConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/entity/LongConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/entity/Property.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/entity/Server.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/entity/ServerConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/entity/StorageConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/BaseEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/Constants.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/IEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/IVisitor.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/entity/AtomicTreeConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/entity/CrashLogDomain.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/entity/ServerFilterConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultLinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultSaxMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultSaxParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultValidator.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultXmlBuilder.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/ILinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/IMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/IParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/transform/BaseVisitor.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultLinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultMerger.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultSaxMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultSaxParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultValidator.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultXmlBuilder.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/transform/ILinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/transform/IMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/server/transform/IParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/tp/BaseEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/tp/Constants.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/tp/IEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/tp/IVisitor.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/tp/entity/Domain.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/tp/entity/TpValueStatisticConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultLinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultSaxMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultSaxParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultXmlBuilder.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/ILinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/IMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/IParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/BaseEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/Constants.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/IEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/IVisitor.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/entity/Code.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/entity/PatternItem.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/entity/UrlPattern.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/BaseVisitor.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultJsonBuilder.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultJsonParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultLinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultMerger.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultNativeBuilder.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultNativeParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultSaxMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultSaxParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultXmlBuilder.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/ILinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/IMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/IParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/config/BusinessConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/config/Config.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/DailyReport.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/DailyReportContent.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/Hostinfo.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReport.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReportContent.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReport.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReportContent.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/Project.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/Task.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReport.java create mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReportContent.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalException.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalNotFoundException.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataField.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataObject.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryDef.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryType.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Readset.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Updateset.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Attribute.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Entity.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Variable.java create mode 100644 cat-core/src/main/java/com/dianping/cat/sample/BaseEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/sample/Constants.java create mode 100644 cat-core/src/main/java/com/dianping/cat/sample/IEntity.java create mode 100644 cat-core/src/main/java/com/dianping/cat/sample/IVisitor.java create mode 100644 cat-core/src/main/java/com/dianping/cat/sample/entity/Domain.java create mode 100644 cat-core/src/main/java/com/dianping/cat/sample/entity/SampleConfig.java create mode 100644 cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultLinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultSaxMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultSaxParser.java create mode 100644 cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultXmlBuilder.java create mode 100644 cat-core/src/main/java/com/dianping/cat/sample/transform/ILinker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/sample/transform/IMaker.java create mode 100644 cat-core/src/main/java/com/dianping/cat/sample/transform/IParser.java delete mode 100644 cat-core/src/main/resources/META-INF/dal/jdbc/config-codegen.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/jdbc/config-dal.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/jdbc/config-manifest.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/jdbc/report-codegen.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/jdbc/report-dal.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/jdbc/report-manifest.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/atomic-message-config-codegen.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/atomic-message-config-manifest.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/atomic-message-config-model.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/business-report-config-codegen.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/business-report-config-manifest.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/business-report-config-model.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/report-reload-config-codegen.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/report-reload-config-manifest.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/report-reload-config-model.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/sample-config-codegen.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/sample-config-manifest.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/sample-config-model.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/server-codegen.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/server-config-codegen.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/server-config-manifest.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/server-config-model.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/server-filter-config-codegen.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/server-filter-config-manifest.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/server-filter-config-model.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/server-manifest.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/server-model.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/tp-value-statistic-config-codegen.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/tp-value-statistic-config-manifest.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/tp-value-statistic-config-model.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/url-pattern-codegen.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/url-pattern-manifest.xml delete mode 100644 cat-core/src/main/resources/META-INF/dal/model/url-pattern-model.xml create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/entity/Alert.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/entity/AlertSummary.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/entity/Category.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/BaseVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultDomMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultDomParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/business/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/business/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/business/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/business/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/business/entity/BusinessItem.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/business/entity/BusinessTagConfig.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/business/entity/Tag.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/business/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/business/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/business/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dal/report/AlertSummary.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dal/report/Alteration.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dal/report/Baseline.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dal/report/ConfigModification.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricGraph.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricScreen.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dal/report/Overload.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dal/report/TopologyGraph.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/DomainConfig.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/EdgeConfig.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/NodeConfig.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/TopologyGraphConfig.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/BaseVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultMerger.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/format/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/format/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/format/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/format/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/format/entity/Domain.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/format/entity/ProductLine.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/format/entity/TopoGraphFormatConfig.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/entity/TopologyEdge.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/entity/TopologyGraph.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/entity/TopologyNode.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/BaseVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultJsonBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultJsonParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultMerger.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultNativeBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultNativeParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/exception/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/exception/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/exception/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/exception/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/exception/entity/ExceptionExclude.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/exception/entity/ExceptionLimit.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/exception/entity/ExceptionRuleConfig.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/exception/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/exception/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/exception/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/graph/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/graph/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/graph/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/graph/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/graph/entity/Graph.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/graph/entity/Item.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/graph/entity/Segment.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/graph/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/graph/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/graph/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/entity/Domain.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/entity/DomainGroup.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/entity/Group.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/transform/BaseVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultJsonBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultJsonParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultMerger.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultNativeBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultNativeParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/group/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heartbeat/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heartbeat/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heartbeat/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heartbeat/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heartbeat/entity/Group.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heartbeat/entity/HeartbeatDisplayPolicy.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heartbeat/entity/Metric.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavyCache.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavyCall.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavyReport.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavySql.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/entity/Service.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/entity/Url.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/transform/BaseVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultMerger.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultNativeBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultNativeParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/heavy/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/entity/Domain.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/entity/Jar.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/entity/JarReport.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/entity/Machine.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/transform/BaseVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultMerger.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultNativeBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultNativeParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/jar/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/resource/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/resource/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/resource/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/resource/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/resource/entity/Resource.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/resource/entity/ResourceConfig.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/resource/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/resource/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/resource/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/entity/DefaultServer.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/entity/Domain.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/entity/Group.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/entity/GroupServer.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/entity/Network.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/entity/NetworkPolicy.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/entity/RouterConfig.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/entity/Server.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/entity/ServerGroup.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/transform/BaseVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultJsonBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultJsonParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultMerger.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultNativeBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultNativeParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/router/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/entity/Group.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/entity/Item.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/entity/Segment.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/entity/ServerMetricConfig.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultMerger.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/server/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/entity/ClientReport.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/entity/Domain.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/entity/Method.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/transform/BaseVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultJsonBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultJsonParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultMerger.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultNativeBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultNativeParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/client/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/entity/Domain.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/entity/ServiceReport.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/transform/BaseVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultJsonBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultJsonParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultMerger.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultNativeBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultNativeParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/service/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/alert/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/alert/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/alert/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/alert/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Detail.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Machine.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Operation.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Storage.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/StorageAlertInfo.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Target.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/alert/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/entity/Link.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/entity/Storage.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/entity/StorageGroup.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/entity/StorageGroupConfig.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultMerger.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/storage/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/user/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/user/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/user/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/user/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/user/entity/User.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/user/entity/UserConfig.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/user/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/user/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/user/transform/IParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/BaseEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/Constants.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/IEntity.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/IVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/entity/ApplicationState.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/entity/Domain.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/entity/MachineState.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/entity/UtilizationReport.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/transform/BaseVisitor.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultLinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultMerger.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultNativeBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultNativeParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultSaxMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultSaxParser.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultXmlBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/transform/ILinker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/transform/IMaker.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/utilization/transform/IParser.java delete mode 100644 cat-home/src/main/resources/META-INF/dal/jdbc/report-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/jdbc/report-dal.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/jdbc/report-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/alert-receiver-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/alert-receiver-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/alert-receiver-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/alert-summary-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/alert-summary-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/alert-summary-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/business-tag-config-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/business-tag-config-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/business-tag-config-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/client-report-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/client-report-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/client-report-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/domain-group-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/domain-group-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/domain-group-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/exception-rule-config-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/exception-rule-config-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/exception-rule-config-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/graph-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/graph-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/graph-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/heartbeat-display-config-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/heartbeat-display-config-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/heartbeat-display-config-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/heavy-report-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/heavy-report-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/heavy-report-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/highload-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/highload-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/highload-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/jar-report-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/jar-report-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/jar-report-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/monitor-rules-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/monitor-rules-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/monitor-rules-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/resource-config-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/resource-config-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/resource-config-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/router-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/router-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/router-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/server-metric-config-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/server-metric-config-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/server-metric-config-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/service-report-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/service-report-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/service-report-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/storage-alert-info-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/storage-alert-info-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/storage-alert-info-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/storage-group-config-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/storage-group-config-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/storage-group-config-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/system-report-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/system-report-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/system-report-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/topology-format-config-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/topology-format-config-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/topology-format-config-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/topology-graph-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/topology-graph-config-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/topology-graph-config-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/topology-graph-config-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/topology-graph-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/topology-graph-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/user-config-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/user-config-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/user-config-model.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/utilization-report-codegen.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/utilization-report-manifest.xml delete mode 100644 cat-home/src/main/resources/META-INF/dal/model/utilization-report-model.xml diff --git a/cat-alarm/pom.xml b/cat-alarm/pom.xml index c90abf0718..00e3698d16 100644 --- a/cat-alarm/pom.xml +++ b/cat-alarm/pom.xml @@ -89,64 +89,6 @@ test - - - - org.unidal.maven.plugins - codegen-maven-plugin - - - generate data model - generate-sources - - dal-model - - - ${basedir}/src/main/resources/META-INF/dal/model/server-alarm-rule-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/sender-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/alert-policy-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/monitor-rules-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/alert-receiver-manifest.xml, - - - - - generate dal jdbc model - generate-sources - - dal-jdbc - - - ${basedir}/src/main/resources/META-INF/dal/jdbc/alarm-manifest.xml, - - - - - - maven-antrun-plugin - - - rewrite generated dal jdbc sources - generate-sources - - run - - - - - - - - - - - - - - - - - utf-8 diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/Alert.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/Alert.java new file mode 100644 index 0000000000..886d0c2e1a --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/Alert.java @@ -0,0 +1,162 @@ +package com.dianping.cat.alarm; + + +public class Alert { + private int m_id; + + private String m_domain; + + private java.util.Date m_alertTime; + + private String m_category; + + private String m_type; + + private String m_content; + + private String m_metric; + + private java.util.Date m_creationDate; + + private int m_keyId; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private String[] m_categories; + public void afterLoad() { + m_keyId = m_id; + } + + public java.util.Date getAlertTime() { + return m_alertTime; + } + + public String[] getCategories() { + return m_categories; + } + + public String getCategory() { + return m_category; + } + + public String getContent() { + return m_content; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public String getDomain() { + return m_domain; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public int getId() { + return m_id; + } + + public int getKeyId() { + return m_keyId; + } + + public String getMetric() { + return m_metric; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + public String getType() { + return m_type; + } + + public Alert setAlertTime(java.util.Date alertTime) { + m_alertTime = alertTime; + return this; + } + + public Alert setCategories(String[] categories) { + m_categories = categories; + return this; + } + + public Alert setCategory(String category) { + m_category = category; + return this; + } + + public Alert setContent(String content) { + m_content = content; + return this; + } + + public Alert setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public Alert setDomain(String domain) { + m_domain = domain; + return this; + } + + public Alert setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public Alert setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public Alert setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public Alert setMetric(String metric) { + m_metric = metric; + return this; + } + + public Alert setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + + public Alert setType(String type) { + m_type = type; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("Alert["); + sb.append("alert-time: ").append(m_alertTime); + sb.append(", categories: ").append(m_categories == null ? null : java.util.Arrays.asList(m_categories)); + sb.append(", category: ").append(m_category); + sb.append(", content: ").append(m_content); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", domain: ").append(m_domain); + sb.append(", end-time: ").append(m_endTime); + sb.append(", id: ").append(m_id); + sb.append(", key-id: ").append(m_keyId); + sb.append(", metric: ").append(m_metric); + sb.append(", start-time: ").append(m_startTime); + sb.append(", type: ").append(m_type); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/ServerAlarmRule.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/ServerAlarmRule.java new file mode 100644 index 0000000000..b165524148 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/ServerAlarmRule.java @@ -0,0 +1,150 @@ +package com.dianping.cat.alarm; + + +public class ServerAlarmRule { + private int m_id; + + private String m_category; + + private String m_endPoint; + + private String m_measurement; + + private String m_tags; + + private String m_content; + + private String m_type; + + private String m_creator; + + private java.util.Date m_creationDate; + + private java.util.Date m_updatetime; + + private int m_keyId; + public void afterLoad() { + m_keyId = m_id; + } + + public String getCategory() { + return m_category; + } + + public String getContent() { + return m_content; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public String getCreator() { + return m_creator; + } + + public String getEndPoint() { + return m_endPoint; + } + + public int getId() { + return m_id; + } + + public int getKeyId() { + return m_keyId; + } + + public String getMeasurement() { + return m_measurement; + } + + public String getTags() { + return m_tags; + } + + public String getType() { + return m_type; + } + + public java.util.Date getUpdatetime() { + return m_updatetime; + } + + public ServerAlarmRule setCategory(String category) { + m_category = category; + return this; + } + + public ServerAlarmRule setContent(String content) { + m_content = content; + return this; + } + + public ServerAlarmRule setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public ServerAlarmRule setCreator(String creator) { + m_creator = creator; + return this; + } + + public ServerAlarmRule setEndPoint(String endPoint) { + m_endPoint = endPoint; + return this; + } + + public ServerAlarmRule setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public ServerAlarmRule setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public ServerAlarmRule setMeasurement(String measurement) { + m_measurement = measurement; + return this; + } + + public ServerAlarmRule setTags(String tags) { + m_tags = tags; + return this; + } + + public ServerAlarmRule setType(String type) { + m_type = type; + return this; + } + + public ServerAlarmRule setUpdatetime(java.util.Date updatetime) { + m_updatetime = updatetime; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("ServerAlarmRule["); + sb.append("category: ").append(m_category); + sb.append(", content: ").append(m_content); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", creator: ").append(m_creator); + sb.append(", end-point: ").append(m_endPoint); + sb.append(", id: ").append(m_id); + sb.append(", key-id: ").append(m_keyId); + sb.append(", measurement: ").append(m_measurement); + sb.append(", tags: ").append(m_tags); + sb.append(", type: ").append(m_type); + sb.append(", updatetime: ").append(m_updatetime); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/UserDefineRule.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/UserDefineRule.java new file mode 100644 index 0000000000..d92b48b875 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/UserDefineRule.java @@ -0,0 +1,78 @@ +package com.dianping.cat.alarm; + + +public class UserDefineRule { + private int m_id; + + private String m_content; + + private java.util.Date m_creationDate; + + private int m_keyId; + + private int m_maxId; + public void afterLoad() { + m_keyId = m_id; + } + + public String getContent() { + return m_content; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public int getId() { + return m_id; + } + + public int getKeyId() { + return m_keyId; + } + + public int getMaxId() { + return m_maxId; + } + + public UserDefineRule setContent(String content) { + m_content = content; + return this; + } + + public UserDefineRule setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public UserDefineRule setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public UserDefineRule setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public UserDefineRule setMaxId(int maxId) { + m_maxId = maxId; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("UserDefineRule["); + sb.append("content: ").append(m_content); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", id: ").append(m_id); + sb.append(", key-id: ").append(m_keyId); + sb.append(", max-id: ").append(m_maxId); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/BaseEntity.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/BaseEntity.java new file mode 100644 index 0000000000..fcd9cd02b3 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.alarm.policy; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.alarm.policy.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/Constants.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/Constants.java new file mode 100644 index 0000000000..2de9d8fb83 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/Constants.java @@ -0,0 +1,26 @@ +package com.dianping.cat.alarm.policy; + +public class Constants { + + public static final String ATTR_ID = "id"; + + public static final String ATTR_RECOVERMINUTE = "recoverMinute"; + + public static final String ATTR_SEND = "send"; + + public static final String ATTR_SUSPENDMINUTE = "suspendMinute"; + + public static final String ENTITY_ALERT_POLICY = "alert-policy"; + + public static final String ENTITY_GROUP = "group"; + + public static final String ENTITY_GROUPS = "groups"; + + public static final String ENTITY_LEVEL = "level"; + + public static final String ENTITY_LEVELS = "levels"; + + public static final String ENTITY_TYPE = "type"; + + public static final String ENTITY_TYPES = "types"; +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/IEntity.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/IEntity.java new file mode 100644 index 0000000000..1bddc46d2c --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.alarm.policy; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/IVisitor.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/IVisitor.java new file mode 100644 index 0000000000..3c09a897d0 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/IVisitor.java @@ -0,0 +1,17 @@ +package com.dianping.cat.alarm.policy; + +import com.dianping.cat.alarm.policy.entity.AlertPolicy; +import com.dianping.cat.alarm.policy.entity.Group; +import com.dianping.cat.alarm.policy.entity.Level; +import com.dianping.cat.alarm.policy.entity.Type; + +public interface IVisitor { + + public void visitAlertPolicy(AlertPolicy alertPolicy); + + public void visitGroup(Group group); + + public void visitLevel(Level level); + + public void visitType(Type type); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/AlertPolicy.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/AlertPolicy.java new file mode 100644 index 0000000000..0812cf78c9 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/AlertPolicy.java @@ -0,0 +1,83 @@ +package com.dianping.cat.alarm.policy.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.alarm.policy.BaseEntity; +import com.dianping.cat.alarm.policy.IVisitor; + +public class AlertPolicy extends BaseEntity { + private Map m_types = new LinkedHashMap(); + + public AlertPolicy() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitAlertPolicy(this); + } + + public AlertPolicy addType(Type type) { + m_types.put(type.getId(), type); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AlertPolicy) { + AlertPolicy _o = (AlertPolicy) obj; + + if (!equals(getTypes(), _o.getTypes())) { + return false; + } + + + return true; + } + + return false; + } + + public Type findType(String id) { + return m_types.get(id); + } + + public Type findOrCreateType(String id) { + Type type = m_types.get(id); + + if (type == null) { + synchronized (m_types) { + type = m_types.get(id); + + if (type == null) { + type = new Type(id); + m_types.put(id, type); + } + } + } + + return type; + } + + public Map getTypes() { + return m_types; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_types == null ? 0 : m_types.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(AlertPolicy other) { + } + + public Type removeType(String id) { + return m_types.remove(id); + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/Group.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/Group.java new file mode 100644 index 0000000000..cae86c01d6 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/Group.java @@ -0,0 +1,102 @@ +package com.dianping.cat.alarm.policy.entity; + +import static com.dianping.cat.alarm.policy.Constants.ATTR_ID; +import static com.dianping.cat.alarm.policy.Constants.ENTITY_GROUP; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.alarm.policy.BaseEntity; +import com.dianping.cat.alarm.policy.IVisitor; + +public class Group extends BaseEntity { + private String m_id; + + private Map m_levels = new LinkedHashMap(); + + public Group() { + } + + public Group(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitGroup(this); + } + + public Group addLevel(Level level) { + m_levels.put(level.getId(), level); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Group) { + Group _o = (Group) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Level findLevel(String id) { + return m_levels.get(id); + } + + public Level findOrCreateLevel(String id) { + Level level = m_levels.get(id); + + if (level == null) { + synchronized (m_levels) { + level = m_levels.get(id); + + if (level == null) { + level = new Level(id); + m_levels.put(id, level); + } + } + } + + return level; + } + + public String getId() { + return m_id; + } + + public Map getLevels() { + return m_levels; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Group other) { + assertAttributeEquals(other, ENTITY_GROUP, ATTR_ID, m_id, other.getId()); + + } + + public Level removeLevel(String id) { + return m_levels.remove(id); + } + + public Group setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/Level.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/Level.java new file mode 100644 index 0000000000..2aac2c6b7f --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/Level.java @@ -0,0 +1,107 @@ +package com.dianping.cat.alarm.policy.entity; + +import static com.dianping.cat.alarm.policy.Constants.ATTR_ID; +import static com.dianping.cat.alarm.policy.Constants.ENTITY_LEVEL; + +import com.dianping.cat.alarm.policy.BaseEntity; +import com.dianping.cat.alarm.policy.IVisitor; + +public class Level extends BaseEntity { + private String m_id; + + private String m_send; + + private Integer m_suspendMinute; + + private Integer m_recoverMinute; + + public Level() { + } + + public Level(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitLevel(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Level) { + Level _o = (Level) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + public Integer getRecoverMinute() { + return m_recoverMinute; + } + + public String getSend() { + return m_send; + } + + public Integer getSuspendMinute() { + return m_suspendMinute; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Level other) { + assertAttributeEquals(other, ENTITY_LEVEL, ATTR_ID, m_id, other.getId()); + + if (other.getSend() != null) { + m_send = other.getSend(); + } + + if (other.getSuspendMinute() != null) { + m_suspendMinute = other.getSuspendMinute(); + } + + if (other.getRecoverMinute() != null) { + m_recoverMinute = other.getRecoverMinute(); + } + } + + public Level setId(String id) { + m_id = id; + return this; + } + + public Level setRecoverMinute(Integer recoverMinute) { + m_recoverMinute = recoverMinute; + return this; + } + + public Level setSend(String send) { + m_send = send; + return this; + } + + public Level setSuspendMinute(Integer suspendMinute) { + m_suspendMinute = suspendMinute; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/Type.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/Type.java new file mode 100644 index 0000000000..3eeab28f53 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/entity/Type.java @@ -0,0 +1,102 @@ +package com.dianping.cat.alarm.policy.entity; + +import static com.dianping.cat.alarm.policy.Constants.ATTR_ID; +import static com.dianping.cat.alarm.policy.Constants.ENTITY_TYPE; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.alarm.policy.BaseEntity; +import com.dianping.cat.alarm.policy.IVisitor; + +public class Type extends BaseEntity { + private String m_id; + + private Map m_groups = new LinkedHashMap(); + + public Type() { + } + + public Type(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitType(this); + } + + public Type addGroup(Group group) { + m_groups.put(group.getId(), group); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Type) { + Type _o = (Type) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Group findGroup(String id) { + return m_groups.get(id); + } + + public Group findOrCreateGroup(String id) { + Group group = m_groups.get(id); + + if (group == null) { + synchronized (m_groups) { + group = m_groups.get(id); + + if (group == null) { + group = new Group(id); + m_groups.put(id, group); + } + } + } + + return group; + } + + public Map getGroups() { + return m_groups; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Type other) { + assertAttributeEquals(other, ENTITY_TYPE, ATTR_ID, m_id, other.getId()); + + } + + public Group removeGroup(String id) { + return m_groups.remove(id); + } + + public Type setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultDomMaker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultDomMaker.java new file mode 100644 index 0000000000..d0fd90d155 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultDomMaker.java @@ -0,0 +1,116 @@ +package com.dianping.cat.alarm.policy.transform; + +import static com.dianping.cat.alarm.policy.Constants.ATTR_ID; +import static com.dianping.cat.alarm.policy.Constants.ATTR_RECOVERMINUTE; +import static com.dianping.cat.alarm.policy.Constants.ATTR_SEND; +import static com.dianping.cat.alarm.policy.Constants.ATTR_SUSPENDMINUTE; + +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import com.dianping.cat.alarm.policy.entity.AlertPolicy; +import com.dianping.cat.alarm.policy.entity.Group; +import com.dianping.cat.alarm.policy.entity.Level; +import com.dianping.cat.alarm.policy.entity.Type; + +public class DefaultDomMaker implements IMaker { + + @Override + public AlertPolicy buildAlertPolicy(Node node) { + AlertPolicy alertPolicy = new AlertPolicy(); + + return alertPolicy; + } + + @Override + public Group buildGroup(Node node) { + String id = getAttribute(node, ATTR_ID); + + Group group = new Group(id); + + return group; + } + + @Override + public Level buildLevel(Node node) { + String id = getAttribute(node, ATTR_ID); + String send = getAttribute(node, ATTR_SEND); + String suspendMinute = getAttribute(node, ATTR_SUSPENDMINUTE); + String recoverMinute = getAttribute(node, ATTR_RECOVERMINUTE); + + Level level = new Level(id); + + if (send != null) { + level.setSend(send); + } + + if (suspendMinute != null) { + level.setSuspendMinute(convert(Integer.class, suspendMinute, null)); + } + + if (recoverMinute != null) { + level.setRecoverMinute(convert(Integer.class, recoverMinute, null)); + } + + return level; + } + + @Override + public Type buildType(Node node) { + String id = getAttribute(node, ATTR_ID); + + Type type = new Type(id); + + return type; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected String getAttribute(Node node, String name) { + Node attribute = node.getAttributes().getNamedItem(name); + + return attribute == null ? null : attribute.getNodeValue(); + } + + protected Node getChildTagNode(Node parent, String name) { + NodeList children = parent.getChildNodes(); + int len = children.getLength(); + + for (int i = 0; i < len; i++) { + Node child = children.item(i); + + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (child.getNodeName().equals(name)) { + return child; + } + } + } + + return null; + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultDomParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultDomParser.java new file mode 100644 index 0000000000..0a38445621 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultDomParser.java @@ -0,0 +1,149 @@ +package com.dianping.cat.alarm.policy.transform; + +import static com.dianping.cat.alarm.policy.Constants.ENTITY_ALERT_POLICY; +import static com.dianping.cat.alarm.policy.Constants.ENTITY_GROUP; +import static com.dianping.cat.alarm.policy.Constants.ENTITY_LEVEL; +import static com.dianping.cat.alarm.policy.Constants.ENTITY_TYPE; + +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import com.dianping.cat.alarm.policy.entity.AlertPolicy; +import com.dianping.cat.alarm.policy.entity.Group; +import com.dianping.cat.alarm.policy.entity.Level; +import com.dianping.cat.alarm.policy.entity.Type; + +public class DefaultDomParser implements IParser { + + protected Node getChildTagNode(Node parent, String name) { + NodeList children = parent.getChildNodes(); + int len = children.getLength(); + + for (int i = 0; i < len; i++) { + Node child = children.item(i); + + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (child.getNodeName().equals(name)) { + return child; + } + } + } + + return null; + } + + protected List getChildTagNodes(Node parent, String name) { + NodeList children = parent.getChildNodes(); + int len = children.getLength(); + List nodes = new ArrayList(len); + + for (int i = 0; i < len; i++) { + Node child = children.item(i); + + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (name == null || child.getNodeName().equals(name)) { + nodes.add(child); + } + } + } + + return nodes; + } + + protected Node getDocument(String xml) { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + + dbf.setIgnoringElementContentWhitespace(true); + dbf.setIgnoringComments(true); + + try { + DocumentBuilder db = dbf.newDocumentBuilder(); + + return db.parse(new InputSource(new StringReader(xml))); + } catch (Exception x) { + throw new RuntimeException(x); + } + } + + protected List getGrandChildTagNodes(Node parent, String name) { + Node child = getChildTagNode(parent, name); + NodeList children = child == null ? null : child.getChildNodes(); + int len = children == null ? 0 : children.getLength(); + List nodes = new ArrayList(len); + + for (int i = 0; i < len; i++) { + Node grandChild = children.item(i); + + if (grandChild.getNodeType() == Node.ELEMENT_NODE) { + nodes.add(grandChild); + } + } + + return nodes; + } + + public AlertPolicy parse(Node node) { + return parse(new DefaultDomMaker(), new DefaultLinker(false), node); + } + + public AlertPolicy parse(String xml) throws SAXException, IOException { + Node doc = getDocument(xml); + Node rootNode = getChildTagNode(doc, ENTITY_ALERT_POLICY); + + if (rootNode == null) { + throw new RuntimeException(String.format("alert-policy element(%s) is expected!", ENTITY_ALERT_POLICY)); + } + + return parse(new DefaultDomMaker(), new DefaultLinker(false), rootNode); + } + + public AlertPolicy parse(IMaker maker, ILinker linker, Node node) { + AlertPolicy alertPolicy = maker.buildAlertPolicy(node); + + if (node != null) { + AlertPolicy parent = alertPolicy; + + for (Node child : getChildTagNodes(node, ENTITY_TYPE)) { + Type type = maker.buildType(child); + + if (linker.onType(parent, type)) { + parseForType(maker, linker, type, child); + } + } + } + + return alertPolicy; + } + + public void parseForGroup(IMaker maker, ILinker linker, Group parent, Node node) { + for (Node child : getChildTagNodes(node, ENTITY_LEVEL)) { + Level level = maker.buildLevel(child); + + if (linker.onLevel(parent, level)) { + parseForLevel(maker, linker, level, child); + } + } + } + + public void parseForLevel(IMaker maker, ILinker linker, Level parent, Node node) { + } + + public void parseForType(IMaker maker, ILinker linker, Type parent, Node node) { + for (Node child : getChildTagNodes(node, ENTITY_GROUP)) { + Group group = maker.buildGroup(child); + + if (linker.onGroup(parent, group)) { + parseForGroup(maker, linker, group, child); + } + } + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultLinker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultLinker.java new file mode 100644 index 0000000000..2c2031ca07 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultLinker.java @@ -0,0 +1,72 @@ +package com.dianping.cat.alarm.policy.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.alarm.policy.entity.AlertPolicy; +import com.dianping.cat.alarm.policy.entity.Group; +import com.dianping.cat.alarm.policy.entity.Level; +import com.dianping.cat.alarm.policy.entity.Type; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onGroup(final Type parent, final Group group) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addGroup(group); + } + }); + } else { + parent.addGroup(group); + } + + return true; + } + + @Override + public boolean onLevel(final Group parent, final Level level) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addLevel(level); + } + }); + } else { + parent.addLevel(level); + } + + return true; + } + + @Override + public boolean onType(final AlertPolicy parent, final Type type) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addType(type); + } + }); + } else { + parent.addType(type); + } + + return true; + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultSaxMaker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..5404bc19c7 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultSaxMaker.java @@ -0,0 +1,89 @@ +package com.dianping.cat.alarm.policy.transform; + +import static com.dianping.cat.alarm.policy.Constants.ATTR_ID; +import static com.dianping.cat.alarm.policy.Constants.ATTR_RECOVERMINUTE; +import static com.dianping.cat.alarm.policy.Constants.ATTR_SEND; +import static com.dianping.cat.alarm.policy.Constants.ATTR_SUSPENDMINUTE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.alarm.policy.entity.AlertPolicy; +import com.dianping.cat.alarm.policy.entity.Group; +import com.dianping.cat.alarm.policy.entity.Level; +import com.dianping.cat.alarm.policy.entity.Type; + +public class DefaultSaxMaker implements IMaker { + + @Override + public AlertPolicy buildAlertPolicy(Attributes attributes) { + AlertPolicy alertPolicy = new AlertPolicy(); + + return alertPolicy; + } + + @Override + public Group buildGroup(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Group group = new Group(id); + + return group; + } + + @Override + public Level buildLevel(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String send = attributes.getValue(ATTR_SEND); + String suspendMinute = attributes.getValue(ATTR_SUSPENDMINUTE); + String recoverMinute = attributes.getValue(ATTR_RECOVERMINUTE); + Level level = new Level(id); + + if (send != null) { + level.setSend(send); + } + + if (suspendMinute != null) { + level.setSuspendMinute(convert(Integer.class, suspendMinute, null)); + } + + if (recoverMinute != null) { + level.setRecoverMinute(convert(Integer.class, recoverMinute, null)); + } + + return level; + } + + @Override + public Type buildType(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Type type = new Type(id); + + return type; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultSaxParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..3eba9a572b --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultSaxParser.java @@ -0,0 +1,273 @@ +package com.dianping.cat.alarm.policy.transform; + +import static com.dianping.cat.alarm.policy.Constants.ENTITY_ALERT_POLICY; +import static com.dianping.cat.alarm.policy.Constants.ENTITY_GROUP; +import static com.dianping.cat.alarm.policy.Constants.ENTITY_LEVEL; +import static com.dianping.cat.alarm.policy.Constants.ENTITY_TYPE; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.alarm.policy.IEntity; +import com.dianping.cat.alarm.policy.entity.AlertPolicy; +import com.dianping.cat.alarm.policy.entity.Group; +import com.dianping.cat.alarm.policy.entity.Level; +import com.dianping.cat.alarm.policy.entity.Type; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static AlertPolicy parse(InputStream in) throws SAXException, IOException { + return parseEntity(AlertPolicy.class, new InputSource(removeBOM(in))); + } + + public static AlertPolicy parse(Reader reader) throws SAXException, IOException { + return parseEntity(AlertPolicy.class, new InputSource(removeBOM(reader))); + } + + public static AlertPolicy parse(String xml) throws SAXException, IOException { + return parseEntity(AlertPolicy.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForAlertPolicy(AlertPolicy parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_TYPE.equals(qName)) { + Type type = m_maker.buildType(attributes); + + m_linker.onType(parentObj, type); + m_objs.push(type); + } else { + throw new SAXException(String.format("Element(%s) is not expected under alert-policy!", qName)); + } + + m_tags.push(qName); + } + + private void parseForGroup(Group parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_LEVEL.equals(qName)) { + Level level = m_maker.buildLevel(attributes); + + m_linker.onLevel(parentObj, level); + m_objs.push(level); + } else { + throw new SAXException(String.format("Element(%s) is not expected under group!", qName)); + } + + m_tags.push(qName); + } + + private void parseForLevel(Level parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForType(Type parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_GROUP.equals(qName)) { + Group group = m_maker.buildGroup(attributes); + + m_linker.onGroup(parentObj, group); + m_objs.push(group); + } else { + throw new SAXException(String.format("Element(%s) is not expected under type!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_ALERT_POLICY.equals(qName)) { + AlertPolicy alertPolicy = m_maker.buildAlertPolicy(attributes); + + m_entity = alertPolicy; + m_objs.push(alertPolicy); + m_tags.push(qName); + } else if (ENTITY_TYPE.equals(qName)) { + Type type = m_maker.buildType(attributes); + + m_entity = type; + m_objs.push(type); + m_tags.push(qName); + } else if (ENTITY_GROUP.equals(qName)) { + Group group = m_maker.buildGroup(attributes); + + m_entity = group; + m_objs.push(group); + m_tags.push(qName); + } else if (ENTITY_LEVEL.equals(qName)) { + Level level = m_maker.buildLevel(attributes); + + m_entity = level; + m_objs.push(level); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof AlertPolicy) { + parseForAlertPolicy((AlertPolicy) parent, tag, qName, attributes); + } else if (parent instanceof Type) { + parseForType((Type) parent, tag, qName, attributes); + } else if (parent instanceof Group) { + parseForGroup((Group) parent, tag, qName, attributes); + } else if (parent instanceof Level) { + parseForLevel((Level) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultXmlBuilder.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..f8b3bf22eb --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/DefaultXmlBuilder.java @@ -0,0 +1,245 @@ +package com.dianping.cat.alarm.policy.transform; + +import static com.dianping.cat.alarm.policy.Constants.ATTR_ID; +import static com.dianping.cat.alarm.policy.Constants.ATTR_RECOVERMINUTE; +import static com.dianping.cat.alarm.policy.Constants.ATTR_SEND; +import static com.dianping.cat.alarm.policy.Constants.ATTR_SUSPENDMINUTE; +import static com.dianping.cat.alarm.policy.Constants.ENTITY_ALERT_POLICY; +import static com.dianping.cat.alarm.policy.Constants.ENTITY_GROUP; +import static com.dianping.cat.alarm.policy.Constants.ENTITY_LEVEL; +import static com.dianping.cat.alarm.policy.Constants.ENTITY_TYPE; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.alarm.policy.IEntity; +import com.dianping.cat.alarm.policy.IVisitor; +import com.dianping.cat.alarm.policy.entity.AlertPolicy; +import com.dianping.cat.alarm.policy.entity.Group; +import com.dianping.cat.alarm.policy.entity.Level; +import com.dianping.cat.alarm.policy.entity.Type; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitAlertPolicy(AlertPolicy alertPolicy) { + startTag(ENTITY_ALERT_POLICY, null); + + if (!alertPolicy.getTypes().isEmpty()) { + for (Type type : alertPolicy.getTypes().values()) { + type.accept(m_visitor); + } + } + + endTag(ENTITY_ALERT_POLICY); + } + + @Override + public void visitGroup(Group group) { + startTag(ENTITY_GROUP, null, ATTR_ID, group.getId()); + + if (!group.getLevels().isEmpty()) { + for (Level level : group.getLevels().values()) { + level.accept(m_visitor); + } + } + + endTag(ENTITY_GROUP); + } + + @Override + public void visitLevel(Level level) { + startTag(ENTITY_LEVEL, true, null, ATTR_ID, level.getId(), ATTR_SEND, level.getSend(), ATTR_SUSPENDMINUTE, level.getSuspendMinute(), ATTR_RECOVERMINUTE, level.getRecoverMinute()); + } + + @Override + public void visitType(Type type) { + startTag(ENTITY_TYPE, null, ATTR_ID, type.getId()); + + if (!type.getGroups().isEmpty()) { + for (Group group : type.getGroups().values()) { + group.accept(m_visitor); + } + } + + endTag(ENTITY_TYPE); + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/ILinker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/ILinker.java new file mode 100644 index 0000000000..4d74e92727 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/ILinker.java @@ -0,0 +1,15 @@ +package com.dianping.cat.alarm.policy.transform; + +import com.dianping.cat.alarm.policy.entity.AlertPolicy; +import com.dianping.cat.alarm.policy.entity.Group; +import com.dianping.cat.alarm.policy.entity.Level; +import com.dianping.cat.alarm.policy.entity.Type; + +public interface ILinker { + + public boolean onGroup(Type parent, Group group); + + public boolean onLevel(Group parent, Level level); + + public boolean onType(AlertPolicy parent, Type type); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/IMaker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/IMaker.java new file mode 100644 index 0000000000..efce96ec78 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/IMaker.java @@ -0,0 +1,17 @@ +package com.dianping.cat.alarm.policy.transform; + +import com.dianping.cat.alarm.policy.entity.AlertPolicy; +import com.dianping.cat.alarm.policy.entity.Group; +import com.dianping.cat.alarm.policy.entity.Level; +import com.dianping.cat.alarm.policy.entity.Type; + +public interface IMaker { + + public AlertPolicy buildAlertPolicy(T node); + + public Group buildGroup(T node); + + public Level buildLevel(T node); + + public Type buildType(T node); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/IParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/IParser.java new file mode 100644 index 0000000000..e9638dbf61 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/policy/transform/IParser.java @@ -0,0 +1,16 @@ +package com.dianping.cat.alarm.policy.transform; + +import com.dianping.cat.alarm.policy.entity.AlertPolicy; +import com.dianping.cat.alarm.policy.entity.Group; +import com.dianping.cat.alarm.policy.entity.Level; +import com.dianping.cat.alarm.policy.entity.Type; + +public interface IParser { + public AlertPolicy parse(IMaker maker, ILinker linker, T node); + + public void parseForGroup(IMaker maker, ILinker linker, Group parent, T node); + + public void parseForLevel(IMaker maker, ILinker linker, Level parent, T node); + + public void parseForType(IMaker maker, ILinker linker, Type parent, T node); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/BaseEntity.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/BaseEntity.java new file mode 100644 index 0000000000..77a874569a --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.alarm.receiver; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.alarm.receiver.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/Constants.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/Constants.java new file mode 100644 index 0000000000..421ceec0e4 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/Constants.java @@ -0,0 +1,30 @@ +package com.dianping.cat.alarm.receiver; + +public class Constants { + + public static final String ATTR_ENABLE = "enable"; + + public static final String ATTR_ID = "id"; + + public static final String ELEMENT_DX = "dx"; + + public static final String ELEMENT_DXS = "dxs"; + + public static final String ELEMENT_EMAIL = "email"; + + public static final String ELEMENT_EMAILS = "emails"; + + public static final String ELEMENT_PHONE = "phone"; + + public static final String ELEMENT_PHONES = "phones"; + + public static final String ELEMENT_WEIXIN = "weixin"; + + public static final String ELEMENT_WEIXINS = "weixins"; + + public static final String ENTITY_ALERT_CONFIG = "alert-config"; + + public static final String ENTITY_RECEIVER = "receiver"; + + public static final String ENTITY_RECEIVERS = "receivers"; +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/IEntity.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/IEntity.java new file mode 100644 index 0000000000..a5ee7e616e --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.alarm.receiver; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/IVisitor.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/IVisitor.java new file mode 100644 index 0000000000..0bfc6780b1 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/IVisitor.java @@ -0,0 +1,11 @@ +package com.dianping.cat.alarm.receiver; + +import com.dianping.cat.alarm.receiver.entity.AlertConfig; +import com.dianping.cat.alarm.receiver.entity.Receiver; + +public interface IVisitor { + + public void visitAlertConfig(AlertConfig alertConfig); + + public void visitReceiver(Receiver receiver); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/entity/AlertConfig.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/entity/AlertConfig.java new file mode 100644 index 0000000000..46998d24ac --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/entity/AlertConfig.java @@ -0,0 +1,106 @@ +package com.dianping.cat.alarm.receiver.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.alarm.receiver.BaseEntity; +import com.dianping.cat.alarm.receiver.IVisitor; + +public class AlertConfig extends BaseEntity { + private Map m_receivers = new LinkedHashMap(); + + private Boolean m_enable; + + public AlertConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitAlertConfig(this); + } + + public AlertConfig addReceiver(Receiver receiver) { + m_receivers.put(receiver.getId(), receiver); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AlertConfig) { + AlertConfig _o = (AlertConfig) obj; + + if (!equals(getReceivers(), _o.getReceivers())) { + return false; + } + + if (!equals(getEnable(), _o.getEnable())) { + return false; + } + + + return true; + } + + return false; + } + + public Receiver findReceiver(String id) { + return m_receivers.get(id); + } + + public Receiver findOrCreateReceiver(String id) { + Receiver receiver = m_receivers.get(id); + + if (receiver == null) { + synchronized (m_receivers) { + receiver = m_receivers.get(id); + + if (receiver == null) { + receiver = new Receiver(id); + m_receivers.put(id, receiver); + } + } + } + + return receiver; + } + + public Boolean getEnable() { + return m_enable; + } + + public Map getReceivers() { + return m_receivers; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_receivers == null ? 0 : m_receivers.hashCode()); + hash = hash * 31 + (m_enable == null ? 0 : m_enable.hashCode()); + + return hash; + } + + public boolean isEnable() { + return m_enable != null && m_enable.booleanValue(); + } + + @Override + public void mergeAttributes(AlertConfig other) { + if (other.getEnable() != null) { + m_enable = other.getEnable(); + } + } + + public Receiver removeReceiver(String id) { + return m_receivers.remove(id); + } + + public AlertConfig setEnable(Boolean enable) { + m_enable = enable; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/entity/Receiver.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/entity/Receiver.java new file mode 100644 index 0000000000..ebdcaacb12 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/entity/Receiver.java @@ -0,0 +1,128 @@ +package com.dianping.cat.alarm.receiver.entity; + +import static com.dianping.cat.alarm.receiver.Constants.ATTR_ID; +import static com.dianping.cat.alarm.receiver.Constants.ENTITY_RECEIVER; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.alarm.receiver.BaseEntity; +import com.dianping.cat.alarm.receiver.IVisitor; + +public class Receiver extends BaseEntity { + private String m_id; + + private Boolean m_enable; + + private List m_emails = new ArrayList(); + + private List m_dxs = new ArrayList(); + + private List m_phones = new ArrayList(); + + private List m_weixins = new ArrayList(); + + public Receiver() { + } + + public Receiver(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitReceiver(this); + } + + public Receiver addDx(String dx) { + m_dxs.add(dx); + return this; + } + + public Receiver addEmail(String email) { + m_emails.add(email); + return this; + } + + public Receiver addPhone(String phone) { + m_phones.add(phone); + return this; + } + + public Receiver addWeixin(String weixin) { + m_weixins.add(weixin); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Receiver) { + Receiver _o = (Receiver) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public List getDxs() { + return m_dxs; + } + + public List getEmails() { + return m_emails; + } + + public Boolean getEnable() { + return m_enable; + } + + public String getId() { + return m_id; + } + + public List getPhones() { + return m_phones; + } + + public List getWeixins() { + return m_weixins; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public boolean isEnable() { + return m_enable != null && m_enable.booleanValue(); + } + + @Override + public void mergeAttributes(Receiver other) { + assertAttributeEquals(other, ENTITY_RECEIVER, ATTR_ID, m_id, other.getId()); + + if (other.getEnable() != null) { + m_enable = other.getEnable(); + } + } + + public Receiver setEnable(Boolean enable) { + m_enable = enable; + return this; + } + + public Receiver setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultDomMaker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultDomMaker.java new file mode 100644 index 0000000000..e9569c5908 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultDomMaker.java @@ -0,0 +1,132 @@ +package com.dianping.cat.alarm.receiver.transform; + +import static com.dianping.cat.alarm.receiver.Constants.ATTR_ENABLE; +import static com.dianping.cat.alarm.receiver.Constants.ATTR_ID; + +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import com.dianping.cat.alarm.receiver.entity.AlertConfig; +import com.dianping.cat.alarm.receiver.entity.Receiver; + +public class DefaultDomMaker implements IMaker { + + @Override + public AlertConfig buildAlertConfig(Node node) { + String enable = getAttribute(node, ATTR_ENABLE); + + AlertConfig alertConfig = new AlertConfig(); + + if (enable != null) { + alertConfig.setEnable(convert(Boolean.class, enable, null)); + } + + return alertConfig; + } + + @Override + public String buildDx(Node node) { + return getText(node); + } + + @Override + public String buildEmail(Node node) { + return getText(node); + } + + @Override + public String buildPhone(Node node) { + return getText(node); + } + + @Override + public Receiver buildReceiver(Node node) { + String id = getAttribute(node, ATTR_ID); + String enable = getAttribute(node, ATTR_ENABLE); + + Receiver receiver = new Receiver(id); + + if (enable != null) { + receiver.setEnable(convert(Boolean.class, enable, null)); + } + + return receiver; + } + + @Override + public String buildWeixin(Node node) { + return getText(node); + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected String getAttribute(Node node, String name) { + Node attribute = node.getAttributes().getNamedItem(name); + + return attribute == null ? null : attribute.getNodeValue(); + } + + protected Node getChildTagNode(Node parent, String name) { + NodeList children = parent.getChildNodes(); + int len = children.getLength(); + + for (int i = 0; i < len; i++) { + Node child = children.item(i); + + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (child.getNodeName().equals(name)) { + return child; + } + } + } + + return null; + } + + protected String getText(Node node) { + if (node != null) { + StringBuilder sb = new StringBuilder(); + NodeList children = node.getChildNodes(); + int len = children.getLength(); + + for (int i = 0; i < len; i++) { + Node child = children.item(i); + + if (child.getNodeType() == Node.TEXT_NODE || child.getNodeType() == Node.CDATA_SECTION_NODE) { + sb.append(child.getNodeValue()); + } + } + + if (sb.length() != 0) { + return sb.toString(); + } + } + + return null; + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultDomParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultDomParser.java new file mode 100644 index 0000000000..49cea115c5 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultDomParser.java @@ -0,0 +1,153 @@ +package com.dianping.cat.alarm.receiver.transform; + +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_DX; +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_EMAIL; +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_PHONE; +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_WEIXIN; + +import static com.dianping.cat.alarm.receiver.Constants.ENTITY_ALERT_CONFIG; +import static com.dianping.cat.alarm.receiver.Constants.ENTITY_RECEIVER; + +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import com.dianping.cat.alarm.receiver.entity.AlertConfig; +import com.dianping.cat.alarm.receiver.entity.Receiver; + +public class DefaultDomParser implements IParser { + + protected Node getChildTagNode(Node parent, String name) { + NodeList children = parent.getChildNodes(); + int len = children.getLength(); + + for (int i = 0; i < len; i++) { + Node child = children.item(i); + + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (child.getNodeName().equals(name)) { + return child; + } + } + } + + return null; + } + + protected List getChildTagNodes(Node parent, String name) { + NodeList children = parent.getChildNodes(); + int len = children.getLength(); + List nodes = new ArrayList(len); + + for (int i = 0; i < len; i++) { + Node child = children.item(i); + + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (name == null || child.getNodeName().equals(name)) { + nodes.add(child); + } + } + } + + return nodes; + } + + protected Node getDocument(String xml) { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + + dbf.setIgnoringElementContentWhitespace(true); + dbf.setIgnoringComments(true); + + try { + DocumentBuilder db = dbf.newDocumentBuilder(); + + return db.parse(new InputSource(new StringReader(xml))); + } catch (Exception x) { + throw new RuntimeException(x); + } + } + + protected List getGrandChildTagNodes(Node parent, String name) { + Node child = getChildTagNode(parent, name); + NodeList children = child == null ? null : child.getChildNodes(); + int len = children == null ? 0 : children.getLength(); + List nodes = new ArrayList(len); + + for (int i = 0; i < len; i++) { + Node grandChild = children.item(i); + + if (grandChild.getNodeType() == Node.ELEMENT_NODE) { + nodes.add(grandChild); + } + } + + return nodes; + } + + public AlertConfig parse(Node node) { + return parse(new DefaultDomMaker(), new DefaultLinker(false), node); + } + + public AlertConfig parse(String xml) throws SAXException, IOException { + Node doc = getDocument(xml); + Node rootNode = getChildTagNode(doc, ENTITY_ALERT_CONFIG); + + if (rootNode == null) { + throw new RuntimeException(String.format("alert-config element(%s) is expected!", ENTITY_ALERT_CONFIG)); + } + + return parse(new DefaultDomMaker(), new DefaultLinker(false), rootNode); + } + + public AlertConfig parse(IMaker maker, ILinker linker, Node node) { + AlertConfig alertConfig = maker.buildAlertConfig(node); + + if (node != null) { + AlertConfig parent = alertConfig; + + for (Node child : getChildTagNodes(node, ENTITY_RECEIVER)) { + Receiver receiver = maker.buildReceiver(child); + + if (linker.onReceiver(parent, receiver)) { + parseForReceiver(maker, linker, receiver, child); + } + } + } + + return alertConfig; + } + + public void parseForReceiver(IMaker maker, ILinker linker, Receiver parent, Node node) { + for (Node child : getChildTagNodes(node, ELEMENT_EMAIL)) { + String email = maker.buildEmail(child); + + parent.addEmail(email); + } + + for (Node child : getChildTagNodes(node, ELEMENT_DX)) { + String dx = maker.buildDx(child); + + parent.addDx(dx); + } + + for (Node child : getChildTagNodes(node, ELEMENT_PHONE)) { + String phone = maker.buildPhone(child); + + parent.addPhone(phone); + } + + for (Node child : getChildTagNodes(node, ELEMENT_WEIXIN)) { + String weixin = maker.buildWeixin(child); + + parent.addWeixin(weixin); + } + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultLinker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultLinker.java new file mode 100644 index 0000000000..9377631af9 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultLinker.java @@ -0,0 +1,38 @@ +package com.dianping.cat.alarm.receiver.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.alarm.receiver.entity.AlertConfig; +import com.dianping.cat.alarm.receiver.entity.Receiver; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onReceiver(final AlertConfig parent, final Receiver receiver) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addReceiver(receiver); + } + }); + } else { + parent.addReceiver(receiver); + } + + return true; + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultSaxMaker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..ba3a3f1dc3 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultSaxMaker.java @@ -0,0 +1,84 @@ +package com.dianping.cat.alarm.receiver.transform; + +import static com.dianping.cat.alarm.receiver.Constants.ATTR_ENABLE; +import static com.dianping.cat.alarm.receiver.Constants.ATTR_ID; + +import org.xml.sax.Attributes; + +import com.dianping.cat.alarm.receiver.entity.AlertConfig; +import com.dianping.cat.alarm.receiver.entity.Receiver; + +public class DefaultSaxMaker implements IMaker { + + @Override + public AlertConfig buildAlertConfig(Attributes attributes) { + String enable = attributes.getValue(ATTR_ENABLE); + AlertConfig alertConfig = new AlertConfig(); + + if (enable != null) { + alertConfig.setEnable(convert(Boolean.class, enable, null)); + } + + return alertConfig; + } + + @Override + public String buildDx(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public String buildEmail(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public String buildPhone(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Receiver buildReceiver(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String enable = attributes.getValue(ATTR_ENABLE); + Receiver receiver = new Receiver(id); + + if (enable != null) { + receiver.setEnable(convert(Boolean.class, enable, null)); + } + + return receiver; + } + + @Override + public String buildWeixin(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultSaxParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..e777e9d77a --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultSaxParser.java @@ -0,0 +1,254 @@ +package com.dianping.cat.alarm.receiver.transform; + +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_DX; +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_DXS; +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_EMAIL; +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_EMAILS; +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_PHONE; +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_PHONES; +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_WEIXIN; +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_WEIXINS; + +import static com.dianping.cat.alarm.receiver.Constants.ENTITY_ALERT_CONFIG; +import static com.dianping.cat.alarm.receiver.Constants.ENTITY_RECEIVER; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.alarm.receiver.IEntity; +import com.dianping.cat.alarm.receiver.entity.AlertConfig; +import com.dianping.cat.alarm.receiver.entity.Receiver; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static AlertConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(AlertConfig.class, new InputSource(removeBOM(in))); + } + + public static AlertConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(AlertConfig.class, new InputSource(removeBOM(reader))); + } + + public static AlertConfig parse(String xml) throws SAXException, IOException { + return parseEntity(AlertConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof Receiver) { + Receiver receiver = (Receiver) currentObj; + + if (ELEMENT_EMAIL.equals(currentTag)) { + receiver.addEmail(getText()); + } else if (ELEMENT_DX.equals(currentTag)) { + receiver.addDx(getText()); + } else if (ELEMENT_PHONE.equals(currentTag)) { + receiver.addPhone(getText()); + } else if (ELEMENT_WEIXIN.equals(currentTag)) { + receiver.addWeixin(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForAlertConfig(AlertConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_RECEIVER.equals(qName)) { + Receiver receiver = m_maker.buildReceiver(attributes); + + m_linker.onReceiver(parentObj, receiver); + m_objs.push(receiver); + } else { + throw new SAXException(String.format("Element(%s) is not expected under alert-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseForReceiver(Receiver parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_EMAILS.equals(qName) || ELEMENT_EMAIL.equals(qName) || ELEMENT_DXS.equals(qName) || ELEMENT_DX.equals(qName) || ELEMENT_PHONES.equals(qName) || ELEMENT_PHONE.equals(qName) || ELEMENT_WEIXINS.equals(qName) || ELEMENT_WEIXIN.equals(qName)) { + m_objs.push(parentObj); + } else { + throw new SAXException(String.format("Element(%s) is not expected under receiver!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_ALERT_CONFIG.equals(qName)) { + AlertConfig alertConfig = m_maker.buildAlertConfig(attributes); + + m_entity = alertConfig; + m_objs.push(alertConfig); + m_tags.push(qName); + } else if (ENTITY_RECEIVER.equals(qName)) { + Receiver receiver = m_maker.buildReceiver(attributes); + + m_entity = receiver; + m_objs.push(receiver); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof AlertConfig) { + parseForAlertConfig((AlertConfig) parent, tag, qName, attributes); + } else if (parent instanceof Receiver) { + parseForReceiver((Receiver) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultXmlBuilder.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..ce4867f688 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/DefaultXmlBuilder.java @@ -0,0 +1,286 @@ +package com.dianping.cat.alarm.receiver.transform; + +import static com.dianping.cat.alarm.receiver.Constants.ATTR_ENABLE; +import static com.dianping.cat.alarm.receiver.Constants.ATTR_ID; +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_DX; +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_EMAIL; +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_PHONE; +import static com.dianping.cat.alarm.receiver.Constants.ELEMENT_WEIXIN; +import static com.dianping.cat.alarm.receiver.Constants.ENTITY_ALERT_CONFIG; +import static com.dianping.cat.alarm.receiver.Constants.ENTITY_RECEIVER; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.alarm.receiver.IEntity; +import com.dianping.cat.alarm.receiver.IVisitor; +import com.dianping.cat.alarm.receiver.entity.AlertConfig; +import com.dianping.cat.alarm.receiver.entity.Receiver; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + @Override + public void visitAlertConfig(AlertConfig alertConfig) { + startTag(ENTITY_ALERT_CONFIG, null, ATTR_ENABLE, alertConfig.getEnable()); + + if (!alertConfig.getReceivers().isEmpty()) { + for (Receiver receiver : alertConfig.getReceivers().values()) { + receiver.accept(m_visitor); + } + } + + endTag(ENTITY_ALERT_CONFIG); + } + + @Override + public void visitReceiver(Receiver receiver) { + startTag(ENTITY_RECEIVER, null, ATTR_ID, receiver.getId(), ATTR_ENABLE, receiver.getEnable()); + + if (!receiver.getEmails().isEmpty()) { + for (String email : receiver.getEmails()) { + tagWithText(ELEMENT_EMAIL, email); + } + } + + if (!receiver.getDxs().isEmpty()) { + for (String dx : receiver.getDxs()) { + tagWithText(ELEMENT_DX, dx); + } + } + + if (!receiver.getPhones().isEmpty()) { + for (String phone : receiver.getPhones()) { + tagWithText(ELEMENT_PHONE, phone); + } + } + + if (!receiver.getWeixins().isEmpty()) { + for (String weixin : receiver.getWeixins()) { + tagWithText(ELEMENT_WEIXIN, weixin); + } + } + + endTag(ENTITY_RECEIVER); + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/ILinker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/ILinker.java new file mode 100644 index 0000000000..c56cd0a11a --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/ILinker.java @@ -0,0 +1,9 @@ +package com.dianping.cat.alarm.receiver.transform; + +import com.dianping.cat.alarm.receiver.entity.AlertConfig; +import com.dianping.cat.alarm.receiver.entity.Receiver; + +public interface ILinker { + + public boolean onReceiver(AlertConfig parent, Receiver receiver); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/IMaker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/IMaker.java new file mode 100644 index 0000000000..f1612ff1c5 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/IMaker.java @@ -0,0 +1,19 @@ +package com.dianping.cat.alarm.receiver.transform; + +import com.dianping.cat.alarm.receiver.entity.AlertConfig; +import com.dianping.cat.alarm.receiver.entity.Receiver; + +public interface IMaker { + + public AlertConfig buildAlertConfig(T node); + + public String buildDx(T node); + + public String buildEmail(T node); + + public String buildPhone(T node); + + public Receiver buildReceiver(T node); + + public String buildWeixin(T node); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/IParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/IParser.java new file mode 100644 index 0000000000..4c90c5a657 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/receiver/transform/IParser.java @@ -0,0 +1,10 @@ +package com.dianping.cat.alarm.receiver.transform; + +import com.dianping.cat.alarm.receiver.entity.AlertConfig; +import com.dianping.cat.alarm.receiver.entity.Receiver; + +public interface IParser { + public AlertConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForReceiver(IMaker maker, ILinker linker, Receiver parent, T node); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/BaseEntity.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/BaseEntity.java new file mode 100644 index 0000000000..c04c49f8e9 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/BaseEntity.java @@ -0,0 +1,56 @@ +package com.dianping.cat.alarm.rule; + +import java.util.Formattable; +import java.util.FormattableFlags; +import java.util.Formatter; + +import com.dianping.cat.alarm.rule.transform.DefaultXmlBuilder; +import com.dianping.cat.alarm.rule.transform.DefaultJsonBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String JSON = "%#.3s"; + + public static final String JSON_COMPACT = "%#s"; + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean useJson = (flags & FormattableFlags.ALTERNATE) == FormattableFlags.ALTERNATE; + boolean compact = (precision <= 0); + + if (useJson) { + DefaultJsonBuilder builder = new DefaultJsonBuilder(compact); + + formatter.format("%s", builder.build(this)); + } else { + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/Constants.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/Constants.java new file mode 100644 index 0000000000..ed44b37c0c --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/Constants.java @@ -0,0 +1,54 @@ +package com.dianping.cat.alarm.rule; + +public class Constants { + + public static final String ATTR_ALERTTYPE = "alertType"; + + public static final String ATTR_AVAILABLE = "available"; + + public static final String ATTR_ENDTIME = "endtime"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_METRICITEMTEXT = "metricItemText"; + + public static final String ATTR_MINUTE = "minute"; + + public static final String ATTR_MONITORAVG = "monitorAvg"; + + public static final String ATTR_MONITORCOUNT = "monitorCount"; + + public static final String ATTR_MONITORSUM = "monitorSum"; + + public static final String ATTR_PRODUCTTEXT = "productText"; + + public static final String ATTR_STARTTIME = "starttime"; + + public static final String ATTR_TEXT = "text"; + + public static final String ATTR_TITLE = "title"; + + public static final String ATTR_TYPE = "type"; + + public static final String ENTITY_CONDITION = "condition"; + + public static final String ENTITY_CONDITIONS = "conditions"; + + public static final String ENTITY_CONFIG = "config"; + + public static final String ENTITY_CONFIGS = "configs"; + + public static final String ENTITY_METRIC_ITEM = "metric-item"; + + public static final String ENTITY_METRIC_ITEMS = "metric-items"; + + public static final String ENTITY_MONITOR_RULES = "monitor-rules"; + + public static final String ENTITY_RULE = "rule"; + + public static final String ENTITY_RULES = "rules"; + + public static final String ENTITY_SUB_CONDITION = "sub-condition"; + + public static final String ENTITY_SUB_CONDITIONS = "sub-conditions"; +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/IEntity.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/IEntity.java new file mode 100644 index 0000000000..6b34588ba5 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.alarm.rule; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/IVisitor.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/IVisitor.java new file mode 100644 index 0000000000..1ac211f563 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/IVisitor.java @@ -0,0 +1,23 @@ +package com.dianping.cat.alarm.rule; + +import com.dianping.cat.alarm.rule.entity.Condition; +import com.dianping.cat.alarm.rule.entity.Config; +import com.dianping.cat.alarm.rule.entity.MetricItem; +import com.dianping.cat.alarm.rule.entity.MonitorRules; +import com.dianping.cat.alarm.rule.entity.Rule; +import com.dianping.cat.alarm.rule.entity.SubCondition; + +public interface IVisitor { + + public void visitCondition(Condition condition); + + public void visitConfig(Config config); + + public void visitMetricItem(MetricItem metricItem); + + public void visitMonitorRules(MonitorRules monitorRules); + + public void visitRule(Rule rule); + + public void visitSubCondition(SubCondition subCondition); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/Condition.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/Condition.java new file mode 100644 index 0000000000..8db90c3b32 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/Condition.java @@ -0,0 +1,120 @@ +package com.dianping.cat.alarm.rule.entity; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.alarm.rule.BaseEntity; +import com.dianping.cat.alarm.rule.IVisitor; + +public class Condition extends BaseEntity { + private Integer m_minute = 3; + + private List m_subConditions = new ArrayList(); + + private String m_title; + + private String m_alertType = "error"; + + public Condition() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitCondition(this); + } + + public Condition addSubCondition(SubCondition subCondition) { + m_subConditions.add(subCondition); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Condition) { + Condition _o = (Condition) obj; + + if (!equals(getMinute(), _o.getMinute())) { + return false; + } + + if (!equals(getSubConditions(), _o.getSubConditions())) { + return false; + } + + if (!equals(getTitle(), _o.getTitle())) { + return false; + } + + if (!equals(getAlertType(), _o.getAlertType())) { + return false; + } + + + return true; + } + + return false; + } + + public String getAlertType() { + return m_alertType; + } + + public Integer getMinute() { + return m_minute; + } + + public List getSubConditions() { + return m_subConditions; + } + + public String getTitle() { + return m_title; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_minute == null ? 0 : m_minute.hashCode()); + for (SubCondition e : m_subConditions) { + hash = hash * 31 + (e == null ? 0 :e.hashCode()); + } + + hash = hash * 31 + (m_title == null ? 0 : m_title.hashCode()); + hash = hash * 31 + (m_alertType == null ? 0 : m_alertType.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Condition other) { + if (other.getMinute() != null) { + m_minute = other.getMinute(); + } + + if (other.getTitle() != null) { + m_title = other.getTitle(); + } + + if (other.getAlertType() != null) { + m_alertType = other.getAlertType(); + } + } + + public Condition setAlertType(String alertType) { + m_alertType = alertType; + return this; + } + + public Condition setMinute(Integer minute) { + m_minute = minute; + return this; + } + + public Condition setTitle(String title) { + m_title = title; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/Config.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/Config.java new file mode 100644 index 0000000000..6da3f1d71e --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/Config.java @@ -0,0 +1,100 @@ +package com.dianping.cat.alarm.rule.entity; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.alarm.rule.BaseEntity; +import com.dianping.cat.alarm.rule.IVisitor; + +public class Config extends BaseEntity { + private String m_starttime; + + private String m_endtime; + + private List m_conditions = new ArrayList(); + + public Config() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitConfig(this); + } + + public Config addCondition(Condition condition) { + m_conditions.add(condition); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Config) { + Config _o = (Config) obj; + + if (!equals(getStarttime(), _o.getStarttime())) { + return false; + } + + if (!equals(getEndtime(), _o.getEndtime())) { + return false; + } + + if (!equals(getConditions(), _o.getConditions())) { + return false; + } + + + return true; + } + + return false; + } + + public List getConditions() { + return m_conditions; + } + + public String getEndtime() { + return m_endtime; + } + + public String getStarttime() { + return m_starttime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_starttime == null ? 0 : m_starttime.hashCode()); + hash = hash * 31 + (m_endtime == null ? 0 : m_endtime.hashCode()); + for (Condition e : m_conditions) { + hash = hash * 31 + (e == null ? 0 :e.hashCode()); + } + + + return hash; + } + + @Override + public void mergeAttributes(Config other) { + if (other.getStarttime() != null) { + m_starttime = other.getStarttime(); + } + + if (other.getEndtime() != null) { + m_endtime = other.getEndtime(); + } + } + + public Config setEndtime(String endtime) { + m_endtime = endtime; + return this; + } + + public Config setStarttime(String starttime) { + m_starttime = starttime; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/MetricItem.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/MetricItem.java new file mode 100644 index 0000000000..51ab107c01 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/MetricItem.java @@ -0,0 +1,150 @@ +package com.dianping.cat.alarm.rule.entity; + +import com.dianping.cat.alarm.rule.BaseEntity; +import com.dianping.cat.alarm.rule.IVisitor; + +public class MetricItem extends BaseEntity { + private Boolean m_monitorCount; + + private Boolean m_monitorSum; + + private Boolean m_monitorAvg; + + private String m_metricItemText; + + private String m_productText; + + public MetricItem() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMetricItem(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof MetricItem) { + MetricItem _o = (MetricItem) obj; + + if (!equals(getMonitorCount(), _o.getMonitorCount())) { + return false; + } + + if (!equals(getMonitorSum(), _o.getMonitorSum())) { + return false; + } + + if (!equals(getMonitorAvg(), _o.getMonitorAvg())) { + return false; + } + + if (!equals(getMetricItemText(), _o.getMetricItemText())) { + return false; + } + + if (!equals(getProductText(), _o.getProductText())) { + return false; + } + + + return true; + } + + return false; + } + + public String getMetricItemText() { + return m_metricItemText; + } + + public Boolean getMonitorAvg() { + return m_monitorAvg; + } + + public Boolean getMonitorCount() { + return m_monitorCount; + } + + public Boolean getMonitorSum() { + return m_monitorSum; + } + + public String getProductText() { + return m_productText; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_monitorCount == null ? 0 : m_monitorCount.hashCode()); + hash = hash * 31 + (m_monitorSum == null ? 0 : m_monitorSum.hashCode()); + hash = hash * 31 + (m_monitorAvg == null ? 0 : m_monitorAvg.hashCode()); + hash = hash * 31 + (m_metricItemText == null ? 0 : m_metricItemText.hashCode()); + hash = hash * 31 + (m_productText == null ? 0 : m_productText.hashCode()); + + return hash; + } + + public boolean isMonitorAvg() { + return m_monitorAvg != null && m_monitorAvg.booleanValue(); + } + + public boolean isMonitorCount() { + return m_monitorCount != null && m_monitorCount.booleanValue(); + } + + public boolean isMonitorSum() { + return m_monitorSum != null && m_monitorSum.booleanValue(); + } + + @Override + public void mergeAttributes(MetricItem other) { + if (other.getMonitorCount() != null) { + m_monitorCount = other.getMonitorCount(); + } + + if (other.getMonitorSum() != null) { + m_monitorSum = other.getMonitorSum(); + } + + if (other.getMonitorAvg() != null) { + m_monitorAvg = other.getMonitorAvg(); + } + + if (other.getMetricItemText() != null) { + m_metricItemText = other.getMetricItemText(); + } + + if (other.getProductText() != null) { + m_productText = other.getProductText(); + } + } + + public MetricItem setMetricItemText(String metricItemText) { + m_metricItemText = metricItemText; + return this; + } + + public MetricItem setMonitorAvg(Boolean monitorAvg) { + m_monitorAvg = monitorAvg; + return this; + } + + public MetricItem setMonitorCount(Boolean monitorCount) { + m_monitorCount = monitorCount; + return this; + } + + public MetricItem setMonitorSum(Boolean monitorSum) { + m_monitorSum = monitorSum; + return this; + } + + public MetricItem setProductText(String productText) { + m_productText = productText; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/MonitorRules.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/MonitorRules.java new file mode 100644 index 0000000000..5c859b23c0 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/MonitorRules.java @@ -0,0 +1,83 @@ +package com.dianping.cat.alarm.rule.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.alarm.rule.BaseEntity; +import com.dianping.cat.alarm.rule.IVisitor; + +public class MonitorRules extends BaseEntity { + private Map m_rules = new LinkedHashMap(); + + public MonitorRules() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMonitorRules(this); + } + + public MonitorRules addRule(Rule rule) { + m_rules.put(rule.getId(), rule); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof MonitorRules) { + MonitorRules _o = (MonitorRules) obj; + + if (!equals(getRules(), _o.getRules())) { + return false; + } + + + return true; + } + + return false; + } + + public Rule findRule(String id) { + return m_rules.get(id); + } + + public Rule findOrCreateRule(String id) { + Rule rule = m_rules.get(id); + + if (rule == null) { + synchronized (m_rules) { + rule = m_rules.get(id); + + if (rule == null) { + rule = new Rule(id); + m_rules.put(id, rule); + } + } + } + + return rule; + } + + public Map getRules() { + return m_rules; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_rules == null ? 0 : m_rules.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(MonitorRules other) { + } + + public Rule removeRule(String id) { + return m_rules.remove(id); + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/Rule.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/Rule.java new file mode 100644 index 0000000000..d75351279b --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/Rule.java @@ -0,0 +1,126 @@ +package com.dianping.cat.alarm.rule.entity; + +import static com.dianping.cat.alarm.rule.Constants.ATTR_ID; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_RULE; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import com.dianping.cat.alarm.rule.BaseEntity; +import com.dianping.cat.alarm.rule.IVisitor; + +public class Rule extends BaseEntity { + private String m_id; + + private Boolean m_available; + + private List m_metricItems = new ArrayList(); + + private List m_configs = new ArrayList(); + + private Map m_dynamicAttributes = new LinkedHashMap(); + + public Rule() { + } + + public Rule(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitRule(this); + } + + public Rule addConfig(Config config) { + m_configs.add(config); + return this; + } + + public Rule addMetricItem(MetricItem metricItem) { + m_metricItems.add(metricItem); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Rule) { + Rule _o = (Rule) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getDynamicAttribute(String name) { + return m_dynamicAttributes.get(name); + } + + public Map getDynamicAttributes() { + return m_dynamicAttributes; + } + + public Boolean getAvailable() { + return m_available; + } + + public List getConfigs() { + return m_configs; + } + + public String getId() { + return m_id; + } + + public List getMetricItems() { + return m_metricItems; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public boolean isAvailable() { + return m_available != null && m_available.booleanValue(); + } + + @Override + public void mergeAttributes(Rule other) { + assertAttributeEquals(other, ENTITY_RULE, ATTR_ID, m_id, other.getId()); + + for (Map.Entry e : other.getDynamicAttributes().entrySet()) { + m_dynamicAttributes.put(e.getKey(), e.getValue()); + } + + if (other.getAvailable() != null) { + m_available = other.getAvailable(); + } + } + + public void setDynamicAttribute(String name, String value) { + m_dynamicAttributes.put(name, value); + } + + public Rule setAvailable(Boolean available) { + m_available = available; + return this; + } + + public Rule setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/SubCondition.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/SubCondition.java new file mode 100644 index 0000000000..04de3a6b70 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/entity/SubCondition.java @@ -0,0 +1,78 @@ +package com.dianping.cat.alarm.rule.entity; + +import com.dianping.cat.alarm.rule.BaseEntity; +import com.dianping.cat.alarm.rule.IVisitor; + +public class SubCondition extends BaseEntity { + private String m_type; + + private String m_text; + + public SubCondition() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitSubCondition(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SubCondition) { + SubCondition _o = (SubCondition) obj; + + if (!equals(getType(), _o.getType())) { + return false; + } + + if (!equals(getText(), _o.getText())) { + return false; + } + + + return true; + } + + return false; + } + + public String getText() { + return m_text; + } + + public String getType() { + return m_type; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_type == null ? 0 : m_type.hashCode()); + hash = hash * 31 + (m_text == null ? 0 : m_text.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(SubCondition other) { + if (other.getType() != null) { + m_type = other.getType(); + } + + if (other.getText() != null) { + m_text = other.getText(); + } + } + + public SubCondition setText(String text) { + m_text = text; + return this; + } + + public SubCondition setType(String type) { + m_type = type; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultDomMaker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultDomMaker.java new file mode 100644 index 0000000000..7013972986 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultDomMaker.java @@ -0,0 +1,208 @@ +package com.dianping.cat.alarm.rule.transform; + +import static com.dianping.cat.alarm.rule.Constants.ATTR_ALERTTYPE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_AVAILABLE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_ENDTIME; +import static com.dianping.cat.alarm.rule.Constants.ATTR_ID; +import static com.dianping.cat.alarm.rule.Constants.ATTR_METRICITEMTEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MINUTE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORAVG; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORCOUNT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORSUM; +import static com.dianping.cat.alarm.rule.Constants.ATTR_PRODUCTTEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_STARTTIME; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TITLE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TYPE; + +import java.util.Map; + +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import com.dianping.cat.alarm.rule.entity.Condition; +import com.dianping.cat.alarm.rule.entity.Config; +import com.dianping.cat.alarm.rule.entity.MetricItem; +import com.dianping.cat.alarm.rule.entity.MonitorRules; +import com.dianping.cat.alarm.rule.entity.Rule; +import com.dianping.cat.alarm.rule.entity.SubCondition; + +public class DefaultDomMaker implements IMaker { + + @Override + public Condition buildCondition(Node node) { + String minute = getAttribute(node, ATTR_MINUTE); + String title = getAttribute(node, ATTR_TITLE); + String alertType = getAttribute(node, ATTR_ALERTTYPE); + + Condition condition = new Condition(); + + if (minute != null) { + condition.setMinute(convert(Integer.class, minute, null)); + } + + if (title != null) { + condition.setTitle(title); + } + + if (alertType != null) { + condition.setAlertType(alertType); + } + + return condition; + } + + @Override + public Config buildConfig(Node node) { + String starttime = getAttribute(node, ATTR_STARTTIME); + String endtime = getAttribute(node, ATTR_ENDTIME); + + Config config = new Config(); + + if (starttime != null) { + config.setStarttime(starttime); + } + + if (endtime != null) { + config.setEndtime(endtime); + } + + return config; + } + + @Override + public MetricItem buildMetricItem(Node node) { + String monitorCount = getAttribute(node, ATTR_MONITORCOUNT); + String monitorSum = getAttribute(node, ATTR_MONITORSUM); + String monitorAvg = getAttribute(node, ATTR_MONITORAVG); + String metricItemText = getAttribute(node, ATTR_METRICITEMTEXT); + String productText = getAttribute(node, ATTR_PRODUCTTEXT); + + MetricItem metricItem = new MetricItem(); + + if (monitorCount != null) { + metricItem.setMonitorCount(convert(Boolean.class, monitorCount, null)); + } + + if (monitorSum != null) { + metricItem.setMonitorSum(convert(Boolean.class, monitorSum, null)); + } + + if (monitorAvg != null) { + metricItem.setMonitorAvg(convert(Boolean.class, monitorAvg, null)); + } + + if (metricItemText != null) { + metricItem.setMetricItemText(metricItemText); + } + + if (productText != null) { + metricItem.setProductText(productText); + } + + return metricItem; + } + + @Override + public MonitorRules buildMonitorRules(Node node) { + MonitorRules monitorRules = new MonitorRules(); + + return monitorRules; + } + + @Override + public Rule buildRule(Node node) { + String id = getAttribute(node, ATTR_ID); + String available = getAttribute(node, ATTR_AVAILABLE); + + Rule rule = new Rule(id); + + if (available != null) { + rule.setAvailable(convert(Boolean.class, available, null)); + } + + Map dynamicAttributes = rule.getDynamicAttributes(); + NamedNodeMap attributes = node.getAttributes(); + int length = attributes == null ? 0 : attributes.getLength(); + + for (int i = 0; i < length; i++) { + Node item = attributes.item(i); + + dynamicAttributes.put(item.getNodeName(), item.getNodeValue()); + } + + dynamicAttributes.remove(ATTR_ID); + dynamicAttributes.remove(ATTR_AVAILABLE); + + return rule; + } + + @Override + public SubCondition buildSubCondition(Node node) { + String type = getAttribute(node, ATTR_TYPE); + String text = getAttribute(node, ATTR_TEXT); + + SubCondition subCondition = new SubCondition(); + + if (type != null) { + subCondition.setType(type); + } + + if (text != null) { + subCondition.setText(text); + } + + return subCondition; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected String getAttribute(Node node, String name) { + Node attribute = node.getAttributes().getNamedItem(name); + + return attribute == null ? null : attribute.getNodeValue(); + } + + protected Node getChildTagNode(Node parent, String name) { + NodeList children = parent.getChildNodes(); + int len = children.getLength(); + + for (int i = 0; i < len; i++) { + Node child = children.item(i); + + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (child.getNodeName().equals(name)) { + return child; + } + } + } + + return null; + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultDomParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultDomParser.java new file mode 100644 index 0000000000..5f094d55bb --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultDomParser.java @@ -0,0 +1,174 @@ +package com.dianping.cat.alarm.rule.transform; + +import static com.dianping.cat.alarm.rule.Constants.ENTITY_CONDITION; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_CONFIG; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_METRIC_ITEM; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_MONITOR_RULES; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_RULE; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_SUB_CONDITION; + +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import com.dianping.cat.alarm.rule.entity.Condition; +import com.dianping.cat.alarm.rule.entity.Config; +import com.dianping.cat.alarm.rule.entity.MetricItem; +import com.dianping.cat.alarm.rule.entity.MonitorRules; +import com.dianping.cat.alarm.rule.entity.Rule; +import com.dianping.cat.alarm.rule.entity.SubCondition; + +public class DefaultDomParser implements IParser { + + protected Node getChildTagNode(Node parent, String name) { + NodeList children = parent.getChildNodes(); + int len = children.getLength(); + + for (int i = 0; i < len; i++) { + Node child = children.item(i); + + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (child.getNodeName().equals(name)) { + return child; + } + } + } + + return null; + } + + protected List getChildTagNodes(Node parent, String name) { + NodeList children = parent.getChildNodes(); + int len = children.getLength(); + List nodes = new ArrayList(len); + + for (int i = 0; i < len; i++) { + Node child = children.item(i); + + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (name == null || child.getNodeName().equals(name)) { + nodes.add(child); + } + } + } + + return nodes; + } + + protected Node getDocument(String xml) { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + + dbf.setIgnoringElementContentWhitespace(true); + dbf.setIgnoringComments(true); + + try { + DocumentBuilder db = dbf.newDocumentBuilder(); + + return db.parse(new InputSource(new StringReader(xml))); + } catch (Exception x) { + throw new RuntimeException(x); + } + } + + protected List getGrandChildTagNodes(Node parent, String name) { + Node child = getChildTagNode(parent, name); + NodeList children = child == null ? null : child.getChildNodes(); + int len = children == null ? 0 : children.getLength(); + List nodes = new ArrayList(len); + + for (int i = 0; i < len; i++) { + Node grandChild = children.item(i); + + if (grandChild.getNodeType() == Node.ELEMENT_NODE) { + nodes.add(grandChild); + } + } + + return nodes; + } + + public MonitorRules parse(Node node) { + return parse(new DefaultDomMaker(), new DefaultLinker(false), node); + } + + public MonitorRules parse(String xml) throws SAXException, IOException { + Node doc = getDocument(xml); + Node rootNode = getChildTagNode(doc, ENTITY_MONITOR_RULES); + + if (rootNode == null) { + throw new RuntimeException(String.format("monitor-rules element(%s) is expected!", ENTITY_MONITOR_RULES)); + } + + return parse(new DefaultDomMaker(), new DefaultLinker(false), rootNode); + } + + public MonitorRules parse(IMaker maker, ILinker linker, Node node) { + MonitorRules monitorRules = maker.buildMonitorRules(node); + + if (node != null) { + MonitorRules parent = monitorRules; + + for (Node child : getChildTagNodes(node, ENTITY_RULE)) { + Rule rule = maker.buildRule(child); + + if (linker.onRule(parent, rule)) { + parseForRule(maker, linker, rule, child); + } + } + } + + return monitorRules; + } + + public void parseForCondition(IMaker maker, ILinker linker, Condition parent, Node node) { + for (Node child : getChildTagNodes(node, ENTITY_SUB_CONDITION)) { + SubCondition subCondition = maker.buildSubCondition(child); + + if (linker.onSubCondition(parent, subCondition)) { + parseForSubCondition(maker, linker, subCondition, child); + } + } + } + + public void parseForConfig(IMaker maker, ILinker linker, Config parent, Node node) { + for (Node child : getChildTagNodes(node, ENTITY_CONDITION)) { + Condition condition = maker.buildCondition(child); + + if (linker.onCondition(parent, condition)) { + parseForCondition(maker, linker, condition, child); + } + } + } + + public void parseForMetricItem(IMaker maker, ILinker linker, MetricItem parent, Node node) { + } + + public void parseForRule(IMaker maker, ILinker linker, Rule parent, Node node) { + for (Node child : getChildTagNodes(node, ENTITY_METRIC_ITEM)) { + MetricItem metricItem = maker.buildMetricItem(child); + + if (linker.onMetricItem(parent, metricItem)) { + parseForMetricItem(maker, linker, metricItem, child); + } + } + + for (Node child : getChildTagNodes(node, ENTITY_CONFIG)) { + Config config = maker.buildConfig(child); + + if (linker.onConfig(parent, config)) { + parseForConfig(maker, linker, config, child); + } + } + } + + public void parseForSubCondition(IMaker maker, ILinker linker, SubCondition parent, Node node) { + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultJsonBuilder.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultJsonBuilder.java new file mode 100644 index 0000000000..ab63a98090 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultJsonBuilder.java @@ -0,0 +1,345 @@ +package com.dianping.cat.alarm.rule.transform; + +import static com.dianping.cat.alarm.rule.Constants.ATTR_ALERTTYPE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_AVAILABLE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_ENDTIME; +import static com.dianping.cat.alarm.rule.Constants.ATTR_ID; +import static com.dianping.cat.alarm.rule.Constants.ATTR_METRICITEMTEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MINUTE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORAVG; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORCOUNT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORSUM; +import static com.dianping.cat.alarm.rule.Constants.ATTR_PRODUCTTEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_STARTTIME; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TITLE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TYPE; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_CONDITIONS; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_CONFIGS; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_METRIC_ITEMS; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_RULES; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_SUB_CONDITIONS; + +import java.lang.reflect.Array; +import java.util.Collection; +import java.util.Map; + +import com.dianping.cat.alarm.rule.IEntity; +import com.dianping.cat.alarm.rule.IVisitor; +import com.dianping.cat.alarm.rule.entity.Condition; +import com.dianping.cat.alarm.rule.entity.Config; +import com.dianping.cat.alarm.rule.entity.MetricItem; +import com.dianping.cat.alarm.rule.entity.MonitorRules; +import com.dianping.cat.alarm.rule.entity.Rule; +import com.dianping.cat.alarm.rule.entity.SubCondition; + +public class DefaultJsonBuilder implements IVisitor { + + private IVisitor m_visitor; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultJsonBuilder() { + this(false); + } + + public DefaultJsonBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultJsonBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_visitor = this; + } + + protected void arrayBegin(String name) { + indent(); + m_sb.append('"').append(name).append(m_compact ? "\":[" : "\": [\r\n"); + m_level++; + } + + protected void arrayEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append("],").append(m_compact ? "" : "\r\n"); + } + + protected void attributes(Map dynamicAttributes, Object... nameValues) { + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + if (attrValue instanceof Collection) { + @SuppressWarnings("unchecked") + Collection items = (Collection) attrValue; + + if (!items.isEmpty()) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (Object item : items) { + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else if (attrValue.getClass().isArray()) { + int length = Array.getLength(attrValue); + + if (length > 0) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (int j = 0; j < length; j++) { + Object item = Array.get(attrValue, j); + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else { + if (m_compact) { + m_sb.append('"').append(attrName).append("\":"); + toString(m_sb, attrValue); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(attrName).append("\": "); + toString(m_sb, attrValue); + m_sb.append(",\r\n"); + } + } + } + } + + if (dynamicAttributes != null) { + for (Map.Entry e : dynamicAttributes.entrySet()) { + if (m_compact) { + m_sb.append('"').append(e.getKey()).append("\":"); + toString(m_sb, e.getValue()); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(e.getKey()).append("\": "); + toString(m_sb, e.getValue()); + m_sb.append(",\r\n"); + } + } + } + } + + public String build(IEntity entity) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + trimComma(); + + return m_sb.toString(); + } + + public String buildArray(Collection> entities) { + m_sb.append('['); + + if (entities != null) { + for (IEntity entity : entities) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + } + + trimComma(); + } + + m_sb.append(']'); + + return m_sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void objectBegin(String name) { + indent(); + + if (name == null) { + m_sb.append("{").append(m_compact ? "" : "\r\n"); + } else { + m_sb.append('"').append(name).append(m_compact ? "\":{" : "\": {\r\n"); + } + + m_level++; + } + + protected void objectEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append(m_compact ? "}," : "},\r\n"); + } + + protected void toString(StringBuilder sb, Object value) { + if (value == null) { + sb.append("null"); + } else if (value instanceof Boolean || value instanceof Number) { + sb.append(value); + } else { + String val = value.toString(); + int len = val.length(); + + sb.append('"'); + + for (int i = 0; i < len; i++) { + char ch = val.charAt(i); + + switch (ch) { + case '\\': + case '/': + case '"': + sb.append('\\').append(ch); + break; + case '\t': + sb.append("\\t"); + break; + case '\r': + sb.append("\\r"); + break; + case '\n': + sb.append("\\n"); + break; + default: + sb.append(ch); + break; + } + } + + sb.append('"'); + } + } + + protected void trimComma() { + int len = m_sb.length(); + + if (m_compact) { + if (len > 1 && m_sb.charAt(len - 1) == ',') { + m_sb.replace(len - 1, len, ""); + } + } else { + if (len > 3 && m_sb.charAt(len - 3) == ',') { + m_sb.replace(len - 3, len - 2, ""); + } + } + } + + @Override + public void visitCondition(Condition condition) { + attributes(null, ATTR_MINUTE, condition.getMinute(), ATTR_TITLE, condition.getTitle(), ATTR_ALERTTYPE, condition.getAlertType()); + + if (!condition.getSubConditions().isEmpty()) { + arrayBegin(ENTITY_SUB_CONDITIONS); + + for (SubCondition subCondition : condition.getSubConditions()) { + objectBegin(null); + subCondition.accept(m_visitor); + objectEnd(null); + } + + arrayEnd(ENTITY_SUB_CONDITIONS); + } + } + + @Override + public void visitConfig(Config config) { + attributes(null, ATTR_STARTTIME, config.getStarttime(), ATTR_ENDTIME, config.getEndtime()); + + if (!config.getConditions().isEmpty()) { + arrayBegin(ENTITY_CONDITIONS); + + for (Condition condition : config.getConditions()) { + objectBegin(null); + condition.accept(m_visitor); + objectEnd(null); + } + + arrayEnd(ENTITY_CONDITIONS); + } + } + + @Override + public void visitMetricItem(MetricItem metricItem) { + attributes(null, ATTR_MONITORCOUNT, metricItem.getMonitorCount(), ATTR_MONITORSUM, metricItem.getMonitorSum(), ATTR_MONITORAVG, metricItem.getMonitorAvg(), ATTR_METRICITEMTEXT, metricItem.getMetricItemText(), ATTR_PRODUCTTEXT, metricItem.getProductText()); + } + + @Override + public void visitMonitorRules(MonitorRules monitorRules) { + + if (!monitorRules.getRules().isEmpty()) { + objectBegin(ENTITY_RULES); + + for (Map.Entry e : monitorRules.getRules().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_RULES); + } + } + + @Override + public void visitRule(Rule rule) { + attributes(rule.getDynamicAttributes(), ATTR_ID, rule.getId(), ATTR_AVAILABLE, rule.getAvailable()); + + if (!rule.getMetricItems().isEmpty()) { + arrayBegin(ENTITY_METRIC_ITEMS); + + for (MetricItem metricItem : rule.getMetricItems()) { + objectBegin(null); + metricItem.accept(m_visitor); + objectEnd(null); + } + + arrayEnd(ENTITY_METRIC_ITEMS); + } + + if (!rule.getConfigs().isEmpty()) { + arrayBegin(ENTITY_CONFIGS); + + for (Config config : rule.getConfigs()) { + objectBegin(null); + config.accept(m_visitor); + objectEnd(null); + } + + arrayEnd(ENTITY_CONFIGS); + } + } + + @Override + public void visitSubCondition(SubCondition subCondition) { + attributes(null, ATTR_TYPE, subCondition.getType(), ATTR_TEXT, subCondition.getText()); + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultJsonParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultJsonParser.java new file mode 100644 index 0000000000..aacf426030 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultJsonParser.java @@ -0,0 +1,489 @@ +package com.dianping.cat.alarm.rule.transform; + +import static com.dianping.cat.alarm.rule.Constants.ATTR_ALERTTYPE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_AVAILABLE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_ENDTIME; +import static com.dianping.cat.alarm.rule.Constants.ATTR_ID; +import static com.dianping.cat.alarm.rule.Constants.ATTR_METRICITEMTEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MINUTE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORAVG; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORCOUNT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORSUM; +import static com.dianping.cat.alarm.rule.Constants.ATTR_PRODUCTTEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_STARTTIME; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TITLE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TYPE; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_CONDITIONS; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_CONFIGS; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_METRIC_ITEMS; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_RULES; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_SUB_CONDITIONS; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.dianping.cat.alarm.rule.IEntity; +import com.dianping.cat.alarm.rule.entity.Condition; +import com.dianping.cat.alarm.rule.entity.Config; +import com.dianping.cat.alarm.rule.entity.MetricItem; +import com.dianping.cat.alarm.rule.entity.MonitorRules; +import com.dianping.cat.alarm.rule.entity.Rule; +import com.dianping.cat.alarm.rule.entity.SubCondition; + +public class DefaultJsonParser { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private List m_entities = new ArrayList(); + + private Class m_entityClass; + + private DefaultJsonParser(Class entityClass) { + m_entityClass = entityClass; + } + + public static > T parse(Class entityClass, InputStream in) throws IOException { + return parse(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > T parse(Class entityClass, Reader reader) throws IOException { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.onArrayBegin(); + parser.parse(new JsonReader(reader)); + parser.onArrayEnd(); + + if (parser.m_entities.isEmpty()) { + return null; + } else { + return (T) parser.m_entities.get(0); + } + } + + public static > T parse(Class entityClass, String json) throws IOException { + return parse(entityClass, new StringReader(json)); + } + + public static > List parseArray(Class entityClass, InputStream in) throws Exception { + return parseArray(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > List parseArray(Class entityClass, Reader reader) throws Exception { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.parse(new JsonReader(reader)); + return (List) (List) parser.m_entities; + } + + public static > List parseArray(Class entityClass, String json) throws Exception { + return parseArray(entityClass, new StringReader(json)); + } + + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + private Object createRootEntity() { + try { + Object entity = m_entityClass.newInstance(); + + return entity; + } catch (Exception e) { + throw new RuntimeException(String.format("Unable to create entity(%s) instance!", m_entityClass.getName()), e); + } + } + + private boolean isTopLevel() { + return m_objs.size() == 1; + } + + protected void onArrayBegin() { + if (m_objs.isEmpty()) { + m_objs.push(m_entities); + m_tags.push(""); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof Rule) { + if (ENTITY_METRIC_ITEMS.equals(tag)) { + m_objs.push(parent); + } else if (ENTITY_CONFIGS.equals(tag)) { + m_objs.push(parent); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } else if (parent instanceof Config) { + if (ENTITY_CONDITIONS.equals(tag)) { + m_objs.push(parent); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } else if (parent instanceof Condition) { + if (ENTITY_SUB_CONDITIONS.equals(tag)) { + m_objs.push(parent); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } } + + protected void onArrayEnd() { + m_objs.pop(); + m_tags.pop(); + + } + protected void onName(String name) { + m_tags.push(name); + } + + protected void onObjectBegin() { + if (isTopLevel()) { + m_objs.push(createRootEntity()); + m_tags.push(""); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof MonitorRules) { + if (ENTITY_RULES.equals(tag)) { + m_objs.push(parent); + } else { + String parentTag = m_tags.size() >= 2 ? m_tags.get(m_tags.size() - 2) : null; + + if (ENTITY_RULES.equals(parentTag)) { + Rule rules = new Rule(); + + m_linker.onRule((MonitorRules) parent, rules); + m_objs.push(rules); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } else if (parent instanceof Rule) { + if (ENTITY_METRIC_ITEMS.equals(tag)) { + MetricItem metricItems = new MetricItem(); + + m_linker.onMetricItem((Rule) parent, metricItems); + m_objs.push(metricItems); + m_tags.push(""); + } else if (ENTITY_CONFIGS.equals(tag)) { + Config configs = new Config(); + + m_linker.onConfig((Rule) parent, configs); + m_objs.push(configs); + m_tags.push(""); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); /// + } + } else if (parent instanceof Config) { + if (ENTITY_CONDITIONS.equals(tag)) { + Condition conditions = new Condition(); + + m_linker.onCondition((Config) parent, conditions); + m_objs.push(conditions); + m_tags.push(""); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); /// + } + } else if (parent instanceof Condition) { + if (ENTITY_SUB_CONDITIONS.equals(tag)) { + SubCondition subConditions = new SubCondition(); + + m_linker.onSubCondition((Condition) parent, subConditions); + m_objs.push(subConditions); + m_tags.push(""); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); /// + } + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } + + protected void onObjectEnd() { + m_tags.pop(); + + Object entity = m_objs.pop(); + + if (isTopLevel()) { + m_entities.add(entity); + } + } + + protected void onValue(String value) { + Object parent = m_objs.peek(); + String tag = m_tags.pop(); + + if (parent instanceof MonitorRules) { + parseForMonitorRules((MonitorRules) parent, tag, value); + } else if (parent instanceof Rule) { + parseForRule((Rule) parent, tag, value); + } else if (parent instanceof MetricItem) { + parseForMetricItem((MetricItem) parent, tag, value); + } else if (parent instanceof Config) { + parseForConfig((Config) parent, tag, value); + } else if (parent instanceof Condition) { + parseForCondition((Condition) parent, tag, value); + } else if (parent instanceof SubCondition) { + parseForSubCondition((SubCondition) parent, tag, value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) under %s!", tag, parent)); + } + } + + private void parse(JsonReader reader) throws IOException { + try { + reader.parse(this); + } catch (EOFException e) { + if (m_objs.size() > 1) { + throw new EOFException(String.format("Unexpected end while parsing json! tags: %s.", m_tags)); + } + } + + m_linker.finish(); + } + + public void parseForCondition(Condition condition, String tag, String value) { + if (ENTITY_SUB_CONDITIONS.equals(tag)) { + // do nothing here + } else if (ATTR_MINUTE.equals(tag)) { + condition.setMinute(convert(Integer.class, value, null)); + } else if (ATTR_TITLE.equals(tag)) { + condition.setTitle(value); + } else if (ATTR_ALERTTYPE.equals(tag)) { + condition.setAlertType(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, condition, m_tags)); + } + } + + public void parseForConfig(Config config, String tag, String value) { + if (ENTITY_CONDITIONS.equals(tag)) { + // do nothing here + } else if (ATTR_STARTTIME.equals(tag)) { + config.setStarttime(value); + } else if (ATTR_ENDTIME.equals(tag)) { + config.setEndtime(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, config, m_tags)); + } + } + + public void parseForMetricItem(MetricItem metricItem, String tag, String value) { + if (ATTR_MONITORCOUNT.equals(tag)) { + metricItem.setMonitorCount(convert(Boolean.class, value, null)); + } else if (ATTR_MONITORSUM.equals(tag)) { + metricItem.setMonitorSum(convert(Boolean.class, value, null)); + } else if (ATTR_MONITORAVG.equals(tag)) { + metricItem.setMonitorAvg(convert(Boolean.class, value, null)); + } else if (ATTR_METRICITEMTEXT.equals(tag)) { + metricItem.setMetricItemText(value); + } else if (ATTR_PRODUCTTEXT.equals(tag)) { + metricItem.setProductText(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, metricItem, m_tags)); + } + } + + public void parseForMonitorRules(MonitorRules monitorRules, String tag, String value) { + if (ENTITY_RULES.equals(tag)) { + // do nothing here + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, monitorRules, m_tags)); + } + } + + public void parseForRule(Rule rule, String tag, String value) { + if (ENTITY_METRIC_ITEMS.equals(tag) || ENTITY_CONFIGS.equals(tag)) { + // do nothing here + } else if (ATTR_ID.equals(tag)) { + rule.setId(value); + } else if (ATTR_AVAILABLE.equals(tag)) { + rule.setAvailable(convert(Boolean.class, value, null)); + } else { + rule.setDynamicAttribute(tag, value); + } + } + + public void parseForSubCondition(SubCondition subCondition, String tag, String value) { + if (ATTR_TYPE.equals(tag)) { + subCondition.setType(value); + } else if (ATTR_TEXT.equals(tag)) { + subCondition.setText(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, subCondition, m_tags)); + } + } + + + static class JsonReader { + private Reader m_reader; + + private char[] m_buffer = new char[2048]; + + private int m_size; + + private int m_index; + + public JsonReader(Reader reader) { + m_reader = reader; + } + + private char next() throws IOException { + if (m_index >= m_size) { + m_size = m_reader.read(m_buffer); + m_index = 0; + + if (m_size == -1) { + throw new EOFException(); + } + } + + return m_buffer[m_index++]; + } + + public void parse(DefaultJsonParser parser) throws IOException { + StringBuilder sb = new StringBuilder(); + boolean flag = false; + + while (true) { + char ch = next(); + + switch (ch) { + case ' ': + case '\t': + case '\r': + case '\n': + break; + case '{': + parser.onObjectBegin(); + flag = false; + break; + case '}': + if (flag) { // have value + parser.onValue(sb.toString()); + sb.setLength(0); + } + + parser.onObjectEnd(); + flag = false; + break; + case '\'': + case '"': + while (true) { + char ch2 = next(); + + if (ch2 != ch) { + if (ch2 == '\\') { + char ch3 = next(); + + switch (ch3) { + case 't': + sb.append('\t'); + break; + case 'r': + sb.append('\r'); + break; + case 'n': + sb.append('\n'); + break; + default: + sb.append(ch3); + break; + } + } else { + sb.append(ch2); + } + } else { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + flag = false; + } + + sb.setLength(0); + break; + } + } + + break; + case ':': + if (sb.length() != 0) { + parser.onName(sb.toString()); + sb.setLength(0); + } + + flag = true; + break; + case ',': + if (sb.length() != 0) { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + } + + sb.setLength(0); + } + + flag = false; + break; + case '[': + parser.onArrayBegin(); + flag = false; + break; + case ']': + parser.onArrayEnd(); + flag = false; + break; + default: + sb.append(ch); + break; + } + } + } + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultLinker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultLinker.java new file mode 100644 index 0000000000..a6c53c4cc4 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultLinker.java @@ -0,0 +1,66 @@ +package com.dianping.cat.alarm.rule.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.alarm.rule.entity.Condition; +import com.dianping.cat.alarm.rule.entity.Config; +import com.dianping.cat.alarm.rule.entity.MetricItem; +import com.dianping.cat.alarm.rule.entity.MonitorRules; +import com.dianping.cat.alarm.rule.entity.Rule; +import com.dianping.cat.alarm.rule.entity.SubCondition; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onCondition(final Config parent, final Condition condition) { + parent.addCondition(condition); + return true; + } + + @Override + public boolean onConfig(final Rule parent, final Config config) { + parent.addConfig(config); + return true; + } + + @Override + public boolean onMetricItem(final Rule parent, final MetricItem metricItem) { + parent.addMetricItem(metricItem); + return true; + } + + @Override + public boolean onRule(final MonitorRules parent, final Rule rule) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addRule(rule); + } + }); + } else { + parent.addRule(rule); + } + + return true; + } + + @Override + public boolean onSubCondition(final Condition parent, final SubCondition subCondition) { + parent.addSubCondition(subCondition); + return true; + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultSaxMaker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..5add42fdc5 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultSaxMaker.java @@ -0,0 +1,177 @@ +package com.dianping.cat.alarm.rule.transform; + +import static com.dianping.cat.alarm.rule.Constants.ATTR_ALERTTYPE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_AVAILABLE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_ENDTIME; +import static com.dianping.cat.alarm.rule.Constants.ATTR_ID; +import static com.dianping.cat.alarm.rule.Constants.ATTR_METRICITEMTEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MINUTE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORAVG; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORCOUNT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORSUM; +import static com.dianping.cat.alarm.rule.Constants.ATTR_PRODUCTTEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_STARTTIME; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TITLE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TYPE; + +import java.util.Map; +import org.xml.sax.Attributes; + +import com.dianping.cat.alarm.rule.entity.Condition; +import com.dianping.cat.alarm.rule.entity.Config; +import com.dianping.cat.alarm.rule.entity.MetricItem; +import com.dianping.cat.alarm.rule.entity.MonitorRules; +import com.dianping.cat.alarm.rule.entity.Rule; +import com.dianping.cat.alarm.rule.entity.SubCondition; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Condition buildCondition(Attributes attributes) { + String minute = attributes.getValue(ATTR_MINUTE); + String title = attributes.getValue(ATTR_TITLE); + String alertType = attributes.getValue(ATTR_ALERTTYPE); + Condition condition = new Condition(); + + if (minute != null) { + condition.setMinute(convert(Integer.class, minute, null)); + } + + if (title != null) { + condition.setTitle(title); + } + + if (alertType != null) { + condition.setAlertType(alertType); + } + + return condition; + } + + @Override + public Config buildConfig(Attributes attributes) { + String starttime = attributes.getValue(ATTR_STARTTIME); + String endtime = attributes.getValue(ATTR_ENDTIME); + Config config = new Config(); + + if (starttime != null) { + config.setStarttime(starttime); + } + + if (endtime != null) { + config.setEndtime(endtime); + } + + return config; + } + + @Override + public MetricItem buildMetricItem(Attributes attributes) { + String monitorCount = attributes.getValue(ATTR_MONITORCOUNT); + String monitorSum = attributes.getValue(ATTR_MONITORSUM); + String monitorAvg = attributes.getValue(ATTR_MONITORAVG); + String metricItemText = attributes.getValue(ATTR_METRICITEMTEXT); + String productText = attributes.getValue(ATTR_PRODUCTTEXT); + MetricItem metricItem = new MetricItem(); + + if (monitorCount != null) { + metricItem.setMonitorCount(convert(Boolean.class, monitorCount, null)); + } + + if (monitorSum != null) { + metricItem.setMonitorSum(convert(Boolean.class, monitorSum, null)); + } + + if (monitorAvg != null) { + metricItem.setMonitorAvg(convert(Boolean.class, monitorAvg, null)); + } + + if (metricItemText != null) { + metricItem.setMetricItemText(metricItemText); + } + + if (productText != null) { + metricItem.setProductText(productText); + } + + return metricItem; + } + + @Override + public MonitorRules buildMonitorRules(Attributes attributes) { + MonitorRules monitorRules = new MonitorRules(); + + return monitorRules; + } + + @Override + public Rule buildRule(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String available = attributes.getValue(ATTR_AVAILABLE); + Rule rule = new Rule(id); + + if (available != null) { + rule.setAvailable(convert(Boolean.class, available, null)); + } + + Map dynamicAttributes = rule.getDynamicAttributes(); + int _length = attributes == null ? 0 : attributes.getLength(); + + for (int i = 0; i < _length; i++) { + String _name = attributes.getQName(i); + String _value = attributes.getValue(i); + + dynamicAttributes.put(_name, _value); + } + + dynamicAttributes.remove(ATTR_ID); + dynamicAttributes.remove(ATTR_AVAILABLE); + + return rule; + } + + @Override + public SubCondition buildSubCondition(Attributes attributes) { + String type = attributes.getValue(ATTR_TYPE); + String text = attributes.getValue(ATTR_TEXT); + SubCondition subCondition = new SubCondition(); + + if (type != null) { + subCondition.setType(type); + } + + if (text != null) { + subCondition.setText(text); + } + + return subCondition; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultSaxParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..c77f620dc9 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultSaxParser.java @@ -0,0 +1,316 @@ +package com.dianping.cat.alarm.rule.transform; + +import static com.dianping.cat.alarm.rule.Constants.ENTITY_CONDITION; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_CONFIG; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_METRIC_ITEM; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_MONITOR_RULES; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_RULE; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_SUB_CONDITION; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.alarm.rule.IEntity; +import com.dianping.cat.alarm.rule.entity.Condition; +import com.dianping.cat.alarm.rule.entity.Config; +import com.dianping.cat.alarm.rule.entity.MetricItem; +import com.dianping.cat.alarm.rule.entity.MonitorRules; +import com.dianping.cat.alarm.rule.entity.Rule; +import com.dianping.cat.alarm.rule.entity.SubCondition; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static MonitorRules parse(InputStream in) throws SAXException, IOException { + return parseEntity(MonitorRules.class, new InputSource(removeBOM(in))); + } + + public static MonitorRules parse(Reader reader) throws SAXException, IOException { + return parseEntity(MonitorRules.class, new InputSource(removeBOM(reader))); + } + + public static MonitorRules parse(String xml) throws SAXException, IOException { + return parseEntity(MonitorRules.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForCondition(Condition parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_SUB_CONDITION.equals(qName)) { + SubCondition subCondition = m_maker.buildSubCondition(attributes); + + m_linker.onSubCondition(parentObj, subCondition); + m_objs.push(subCondition); + } else { + throw new SAXException(String.format("Element(%s) is not expected under condition!", qName)); + } + + m_tags.push(qName); + } + + private void parseForConfig(Config parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_CONDITION.equals(qName)) { + Condition condition = m_maker.buildCondition(attributes); + + m_linker.onCondition(parentObj, condition); + m_objs.push(condition); + } else { + throw new SAXException(String.format("Element(%s) is not expected under config!", qName)); + } + + m_tags.push(qName); + } + + private void parseForMetricItem(MetricItem parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForMonitorRules(MonitorRules parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_RULE.equals(qName)) { + Rule rule = m_maker.buildRule(attributes); + + m_linker.onRule(parentObj, rule); + m_objs.push(rule); + } else { + throw new SAXException(String.format("Element(%s) is not expected under monitor-rules!", qName)); + } + + m_tags.push(qName); + } + + private void parseForRule(Rule parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_METRIC_ITEM.equals(qName)) { + MetricItem metricItem = m_maker.buildMetricItem(attributes); + + m_linker.onMetricItem(parentObj, metricItem); + m_objs.push(metricItem); + } else if (ENTITY_CONFIG.equals(qName)) { + Config config = m_maker.buildConfig(attributes); + + m_linker.onConfig(parentObj, config); + m_objs.push(config); + } else { + throw new SAXException(String.format("Element(%s) is not expected under rule!", qName)); + } + + m_tags.push(qName); + } + + private void parseForSubCondition(SubCondition parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_MONITOR_RULES.equals(qName)) { + MonitorRules monitorRules = m_maker.buildMonitorRules(attributes); + + m_entity = monitorRules; + m_objs.push(monitorRules); + m_tags.push(qName); + } else if (ENTITY_RULE.equals(qName)) { + Rule rule = m_maker.buildRule(attributes); + + m_entity = rule; + m_objs.push(rule); + m_tags.push(qName); + } else if (ENTITY_METRIC_ITEM.equals(qName)) { + MetricItem metricItem = m_maker.buildMetricItem(attributes); + + m_entity = metricItem; + m_objs.push(metricItem); + m_tags.push(qName); + } else if (ENTITY_CONFIG.equals(qName)) { + Config config = m_maker.buildConfig(attributes); + + m_entity = config; + m_objs.push(config); + m_tags.push(qName); + } else if (ENTITY_CONDITION.equals(qName)) { + Condition condition = m_maker.buildCondition(attributes); + + m_entity = condition; + m_objs.push(condition); + m_tags.push(qName); + } else if (ENTITY_SUB_CONDITION.equals(qName)) { + SubCondition subCondition = m_maker.buildSubCondition(attributes); + + m_entity = subCondition; + m_objs.push(subCondition); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof MonitorRules) { + parseForMonitorRules((MonitorRules) parent, tag, qName, attributes); + } else if (parent instanceof Rule) { + parseForRule((Rule) parent, tag, qName, attributes); + } else if (parent instanceof MetricItem) { + parseForMetricItem((MetricItem) parent, tag, qName, attributes); + } else if (parent instanceof Config) { + parseForConfig((Config) parent, tag, qName, attributes); + } else if (parent instanceof Condition) { + parseForCondition((Condition) parent, tag, qName, attributes); + } else if (parent instanceof SubCondition) { + parseForSubCondition((SubCondition) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultXmlBuilder.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..f44de04786 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/DefaultXmlBuilder.java @@ -0,0 +1,283 @@ +package com.dianping.cat.alarm.rule.transform; + +import static com.dianping.cat.alarm.rule.Constants.ATTR_ALERTTYPE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_AVAILABLE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_ENDTIME; +import static com.dianping.cat.alarm.rule.Constants.ATTR_ID; +import static com.dianping.cat.alarm.rule.Constants.ATTR_METRICITEMTEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MINUTE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORAVG; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORCOUNT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_MONITORSUM; +import static com.dianping.cat.alarm.rule.Constants.ATTR_PRODUCTTEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_STARTTIME; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TEXT; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TITLE; +import static com.dianping.cat.alarm.rule.Constants.ATTR_TYPE; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_CONDITION; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_CONFIG; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_METRIC_ITEM; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_MONITOR_RULES; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_RULE; +import static com.dianping.cat.alarm.rule.Constants.ENTITY_SUB_CONDITION; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.alarm.rule.IEntity; +import com.dianping.cat.alarm.rule.IVisitor; +import com.dianping.cat.alarm.rule.entity.Condition; +import com.dianping.cat.alarm.rule.entity.Config; +import com.dianping.cat.alarm.rule.entity.MetricItem; +import com.dianping.cat.alarm.rule.entity.MonitorRules; +import com.dianping.cat.alarm.rule.entity.Rule; +import com.dianping.cat.alarm.rule.entity.SubCondition; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitCondition(Condition condition) { + startTag(ENTITY_CONDITION, null, ATTR_MINUTE, condition.getMinute(), ATTR_TITLE, condition.getTitle(), ATTR_ALERTTYPE, condition.getAlertType()); + + if (!condition.getSubConditions().isEmpty()) { + for (SubCondition subCondition : condition.getSubConditions()) { + subCondition.accept(m_visitor); + } + } + + endTag(ENTITY_CONDITION); + } + + @Override + public void visitConfig(Config config) { + startTag(ENTITY_CONFIG, null, ATTR_STARTTIME, config.getStarttime(), ATTR_ENDTIME, config.getEndtime()); + + if (!config.getConditions().isEmpty()) { + for (Condition condition : config.getConditions()) { + condition.accept(m_visitor); + } + } + + endTag(ENTITY_CONFIG); + } + + @Override + public void visitMetricItem(MetricItem metricItem) { + startTag(ENTITY_METRIC_ITEM, true, null, ATTR_MONITORCOUNT, metricItem.getMonitorCount(), ATTR_MONITORSUM, metricItem.getMonitorSum(), ATTR_MONITORAVG, metricItem.getMonitorAvg(), ATTR_METRICITEMTEXT, metricItem.getMetricItemText(), ATTR_PRODUCTTEXT, metricItem.getProductText()); + } + + @Override + public void visitMonitorRules(MonitorRules monitorRules) { + startTag(ENTITY_MONITOR_RULES, null); + + if (!monitorRules.getRules().isEmpty()) { + for (Rule rule : monitorRules.getRules().values()) { + rule.accept(m_visitor); + } + } + + endTag(ENTITY_MONITOR_RULES); + } + + @Override + public void visitRule(Rule rule) { + startTag(ENTITY_RULE, rule.getDynamicAttributes(), ATTR_ID, rule.getId(), ATTR_AVAILABLE, rule.getAvailable()); + + if (!rule.getMetricItems().isEmpty()) { + for (MetricItem metricItem : rule.getMetricItems()) { + metricItem.accept(m_visitor); + } + } + + if (!rule.getConfigs().isEmpty()) { + for (Config config : rule.getConfigs()) { + config.accept(m_visitor); + } + } + + endTag(ENTITY_RULE); + } + + @Override + public void visitSubCondition(SubCondition subCondition) { + startTag(ENTITY_SUB_CONDITION, true, null, ATTR_TYPE, subCondition.getType(), ATTR_TEXT, subCondition.getText()); + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/ILinker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/ILinker.java new file mode 100644 index 0000000000..72003652dd --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/ILinker.java @@ -0,0 +1,21 @@ +package com.dianping.cat.alarm.rule.transform; + +import com.dianping.cat.alarm.rule.entity.Condition; +import com.dianping.cat.alarm.rule.entity.Config; +import com.dianping.cat.alarm.rule.entity.MetricItem; +import com.dianping.cat.alarm.rule.entity.MonitorRules; +import com.dianping.cat.alarm.rule.entity.Rule; +import com.dianping.cat.alarm.rule.entity.SubCondition; + +public interface ILinker { + + public boolean onCondition(Config parent, Condition condition); + + public boolean onConfig(Rule parent, Config config); + + public boolean onMetricItem(Rule parent, MetricItem metricItem); + + public boolean onRule(MonitorRules parent, Rule rule); + + public boolean onSubCondition(Condition parent, SubCondition subCondition); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/IMaker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/IMaker.java new file mode 100644 index 0000000000..57739bb476 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/IMaker.java @@ -0,0 +1,23 @@ +package com.dianping.cat.alarm.rule.transform; + +import com.dianping.cat.alarm.rule.entity.Condition; +import com.dianping.cat.alarm.rule.entity.Config; +import com.dianping.cat.alarm.rule.entity.MetricItem; +import com.dianping.cat.alarm.rule.entity.MonitorRules; +import com.dianping.cat.alarm.rule.entity.Rule; +import com.dianping.cat.alarm.rule.entity.SubCondition; + +public interface IMaker { + + public Condition buildCondition(T node); + + public Config buildConfig(T node); + + public MetricItem buildMetricItem(T node); + + public MonitorRules buildMonitorRules(T node); + + public Rule buildRule(T node); + + public SubCondition buildSubCondition(T node); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/IParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/IParser.java new file mode 100644 index 0000000000..9bdc891979 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/rule/transform/IParser.java @@ -0,0 +1,22 @@ +package com.dianping.cat.alarm.rule.transform; + +import com.dianping.cat.alarm.rule.entity.Condition; +import com.dianping.cat.alarm.rule.entity.Config; +import com.dianping.cat.alarm.rule.entity.MetricItem; +import com.dianping.cat.alarm.rule.entity.MonitorRules; +import com.dianping.cat.alarm.rule.entity.Rule; +import com.dianping.cat.alarm.rule.entity.SubCondition; + +public interface IParser { + public MonitorRules parse(IMaker maker, ILinker linker, T node); + + public void parseForCondition(IMaker maker, ILinker linker, Condition parent, T node); + + public void parseForConfig(IMaker maker, ILinker linker, Config parent, T node); + + public void parseForMetricItem(IMaker maker, ILinker linker, MetricItem parent, T node); + + public void parseForRule(IMaker maker, ILinker linker, Rule parent, T node); + + public void parseForSubCondition(IMaker maker, ILinker linker, SubCondition parent, T node); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/BaseEntity.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/BaseEntity.java new file mode 100644 index 0000000000..1d24677cd7 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.alarm.sender; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.alarm.sender.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/Constants.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/Constants.java new file mode 100644 index 0000000000..8f9c3a5dbc --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/Constants.java @@ -0,0 +1,24 @@ +package com.dianping.cat.alarm.sender; + +public class Constants { + + public static final String ATTR_BATCHSEND = "batchSend"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_SUCCESSCODE = "successCode"; + + public static final String ATTR_TYPE = "type"; + + public static final String ATTR_URL = "url"; + + public static final String ENTITY_PAR = "par"; + + public static final String ENTITY_PARS = "pars"; + + public static final String ENTITY_SENDER = "sender"; + + public static final String ENTITY_SENDERS = "senders"; + + public static final String ENTITY_SENDER_CONFIG = "sender-config"; +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/IEntity.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/IEntity.java new file mode 100644 index 0000000000..6e4d39599e --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.alarm.sender; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/IVisitor.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/IVisitor.java new file mode 100644 index 0000000000..5e8bde75a0 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.alarm.sender; + +import com.dianping.cat.alarm.sender.entity.Par; +import com.dianping.cat.alarm.sender.entity.Sender; +import com.dianping.cat.alarm.sender.entity.SenderConfig; + +public interface IVisitor { + + public void visitPar(Par par); + + public void visitSender(Sender sender); + + public void visitSenderConfig(SenderConfig senderConfig); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/entity/Par.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/entity/Par.java new file mode 100644 index 0000000000..c3732b821c --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/entity/Par.java @@ -0,0 +1,58 @@ +package com.dianping.cat.alarm.sender.entity; + +import com.dianping.cat.alarm.sender.BaseEntity; +import com.dianping.cat.alarm.sender.IVisitor; + +public class Par extends BaseEntity { + private String m_id; + + public Par() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitPar(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Par) { + Par _o = (Par) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Par other) { + if (other.getId() != null) { + m_id = other.getId(); + } + } + + public Par setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/entity/Sender.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/entity/Sender.java new file mode 100644 index 0000000000..4e2bb55af1 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/entity/Sender.java @@ -0,0 +1,138 @@ +package com.dianping.cat.alarm.sender.entity; + +import static com.dianping.cat.alarm.sender.Constants.ATTR_ID; +import static com.dianping.cat.alarm.sender.Constants.ENTITY_SENDER; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.alarm.sender.BaseEntity; +import com.dianping.cat.alarm.sender.IVisitor; + +public class Sender extends BaseEntity { + private String m_id; + + private String m_url; + + private String m_type; + + private String m_successCode; + + private boolean m_batchSend; + + private List m_pars = new ArrayList(); + + public Sender() { + } + + public Sender(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitSender(this); + } + + public Sender addPar(Par par) { + m_pars.add(par); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Sender) { + Sender _o = (Sender) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public boolean getBatchSend() { + return m_batchSend; + } + + public String getId() { + return m_id; + } + + public List getPars() { + return m_pars; + } + + public String getSuccessCode() { + return m_successCode; + } + + public String getType() { + return m_type; + } + + public String getUrl() { + return m_url; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public boolean isBatchSend() { + return m_batchSend; + } + + @Override + public void mergeAttributes(Sender other) { + assertAttributeEquals(other, ENTITY_SENDER, ATTR_ID, m_id, other.getId()); + + if (other.getUrl() != null) { + m_url = other.getUrl(); + } + + if (other.getType() != null) { + m_type = other.getType(); + } + + if (other.getSuccessCode() != null) { + m_successCode = other.getSuccessCode(); + } + + m_batchSend = other.getBatchSend(); + } + + public Sender setBatchSend(boolean batchSend) { + m_batchSend = batchSend; + return this; + } + + public Sender setId(String id) { + m_id = id; + return this; + } + + public Sender setSuccessCode(String successCode) { + m_successCode = successCode; + return this; + } + + public Sender setType(String type) { + m_type = type; + return this; + } + + public Sender setUrl(String url) { + m_url = url; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/entity/SenderConfig.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/entity/SenderConfig.java new file mode 100644 index 0000000000..c0e8aaf7be --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/entity/SenderConfig.java @@ -0,0 +1,66 @@ +package com.dianping.cat.alarm.sender.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.alarm.sender.BaseEntity; +import com.dianping.cat.alarm.sender.IVisitor; + +public class SenderConfig extends BaseEntity { + private Map m_senders = new LinkedHashMap(); + + public SenderConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitSenderConfig(this); + } + + public SenderConfig addSender(Sender sender) { + m_senders.put(sender.getId(), sender); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SenderConfig) { + SenderConfig _o = (SenderConfig) obj; + + if (!equals(getSenders(), _o.getSenders())) { + return false; + } + + + return true; + } + + return false; + } + + public Sender findSender(String id) { + return m_senders.get(id); + } + + public Map getSenders() { + return m_senders; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_senders == null ? 0 : m_senders.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(SenderConfig other) { + } + + public Sender removeSender(String id) { + return m_senders.remove(id); + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultLinker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultLinker.java new file mode 100644 index 0000000000..7f3326046c --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultLinker.java @@ -0,0 +1,45 @@ +package com.dianping.cat.alarm.sender.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.alarm.sender.entity.Par; +import com.dianping.cat.alarm.sender.entity.Sender; +import com.dianping.cat.alarm.sender.entity.SenderConfig; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onPar(final Sender parent, final Par par) { + parent.addPar(par); + return true; + } + + @Override + public boolean onSender(final SenderConfig parent, final Sender sender) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addSender(sender); + } + }); + } else { + parent.addSender(sender); + } + + return true; + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultSaxMaker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..65887daa01 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultSaxMaker.java @@ -0,0 +1,90 @@ +package com.dianping.cat.alarm.sender.transform; + +import static com.dianping.cat.alarm.sender.Constants.ATTR_BATCHSEND; +import static com.dianping.cat.alarm.sender.Constants.ATTR_ID; +import static com.dianping.cat.alarm.sender.Constants.ATTR_SUCCESSCODE; +import static com.dianping.cat.alarm.sender.Constants.ATTR_TYPE; +import static com.dianping.cat.alarm.sender.Constants.ATTR_URL; + +import org.xml.sax.Attributes; + +import com.dianping.cat.alarm.sender.entity.Par; +import com.dianping.cat.alarm.sender.entity.Sender; +import com.dianping.cat.alarm.sender.entity.SenderConfig; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Par buildPar(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Par par = new Par(); + + if (id != null) { + par.setId(id); + } + + return par; + } + + @Override + public Sender buildSender(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String url = attributes.getValue(ATTR_URL); + String type = attributes.getValue(ATTR_TYPE); + String successCode = attributes.getValue(ATTR_SUCCESSCODE); + String batchSend = attributes.getValue(ATTR_BATCHSEND); + Sender sender = new Sender(id); + + if (url != null) { + sender.setUrl(url); + } + + if (type != null) { + sender.setType(type); + } + + if (successCode != null) { + sender.setSuccessCode(successCode); + } + + if (batchSend != null) { + sender.setBatchSend(convert(Boolean.class, batchSend, false)); + } + + return sender; + } + + @Override + public SenderConfig buildSenderConfig(Attributes attributes) { + SenderConfig senderConfig = new SenderConfig(); + + return senderConfig; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultSaxParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..16f24eaf8b --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultSaxParser.java @@ -0,0 +1,250 @@ +package com.dianping.cat.alarm.sender.transform; + +import static com.dianping.cat.alarm.sender.Constants.ENTITY_PAR; +import static com.dianping.cat.alarm.sender.Constants.ENTITY_SENDER; +import static com.dianping.cat.alarm.sender.Constants.ENTITY_SENDER_CONFIG; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.alarm.sender.IEntity; +import com.dianping.cat.alarm.sender.entity.Par; +import com.dianping.cat.alarm.sender.entity.Sender; +import com.dianping.cat.alarm.sender.entity.SenderConfig; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static SenderConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(SenderConfig.class, new InputSource(removeBOM(in))); + } + + public static SenderConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(SenderConfig.class, new InputSource(removeBOM(reader))); + } + + public static SenderConfig parse(String xml) throws SAXException, IOException { + return parseEntity(SenderConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForPar(Par parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForSender(Sender parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_PAR.equals(qName)) { + Par par = m_maker.buildPar(attributes); + + m_linker.onPar(parentObj, par); + m_objs.push(par); + } else { + throw new SAXException(String.format("Element(%s) is not expected under sender!", qName)); + } + + m_tags.push(qName); + } + + private void parseForSenderConfig(SenderConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_SENDER.equals(qName)) { + Sender sender = m_maker.buildSender(attributes); + + m_linker.onSender(parentObj, sender); + m_objs.push(sender); + } else { + throw new SAXException(String.format("Element(%s) is not expected under sender-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_SENDER_CONFIG.equals(qName)) { + SenderConfig senderConfig = m_maker.buildSenderConfig(attributes); + + m_entity = senderConfig; + m_objs.push(senderConfig); + m_tags.push(qName); + } else if (ENTITY_SENDER.equals(qName)) { + Sender sender = m_maker.buildSender(attributes); + + m_entity = sender; + m_objs.push(sender); + m_tags.push(qName); + } else if (ENTITY_PAR.equals(qName)) { + Par par = m_maker.buildPar(attributes); + + m_entity = par; + m_objs.push(par); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof SenderConfig) { + parseForSenderConfig((SenderConfig) parent, tag, qName, attributes); + } else if (parent instanceof Sender) { + parseForSender((Sender) parent, tag, qName, attributes); + } else if (parent instanceof Par) { + parseForPar((Par) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultXmlBuilder.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..991df210d5 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/DefaultXmlBuilder.java @@ -0,0 +1,231 @@ +package com.dianping.cat.alarm.sender.transform; + +import static com.dianping.cat.alarm.sender.Constants.ATTR_BATCHSEND; +import static com.dianping.cat.alarm.sender.Constants.ATTR_ID; +import static com.dianping.cat.alarm.sender.Constants.ATTR_SUCCESSCODE; +import static com.dianping.cat.alarm.sender.Constants.ATTR_TYPE; +import static com.dianping.cat.alarm.sender.Constants.ATTR_URL; +import static com.dianping.cat.alarm.sender.Constants.ENTITY_PAR; +import static com.dianping.cat.alarm.sender.Constants.ENTITY_SENDER; +import static com.dianping.cat.alarm.sender.Constants.ENTITY_SENDER_CONFIG; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.alarm.sender.IEntity; +import com.dianping.cat.alarm.sender.IVisitor; +import com.dianping.cat.alarm.sender.entity.Par; +import com.dianping.cat.alarm.sender.entity.Sender; +import com.dianping.cat.alarm.sender.entity.SenderConfig; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitPar(Par par) { + startTag(ENTITY_PAR, true, null, ATTR_ID, par.getId()); + } + + @Override + public void visitSender(Sender sender) { + startTag(ENTITY_SENDER, null, ATTR_ID, sender.getId(), ATTR_URL, sender.getUrl(), ATTR_TYPE, sender.getType(), ATTR_SUCCESSCODE, sender.getSuccessCode(), ATTR_BATCHSEND, sender.isBatchSend()); + + if (!sender.getPars().isEmpty()) { + for (Par par : sender.getPars()) { + par.accept(m_visitor); + } + } + + endTag(ENTITY_SENDER); + } + + @Override + public void visitSenderConfig(SenderConfig senderConfig) { + startTag(ENTITY_SENDER_CONFIG, null); + + if (!senderConfig.getSenders().isEmpty()) { + for (Sender sender : senderConfig.getSenders().values()) { + sender.accept(m_visitor); + } + } + + endTag(ENTITY_SENDER_CONFIG); + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/ILinker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/ILinker.java new file mode 100644 index 0000000000..89898470b6 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.alarm.sender.transform; + +import com.dianping.cat.alarm.sender.entity.Par; +import com.dianping.cat.alarm.sender.entity.Sender; +import com.dianping.cat.alarm.sender.entity.SenderConfig; + +public interface ILinker { + + public boolean onPar(Sender parent, Par par); + + public boolean onSender(SenderConfig parent, Sender sender); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/IMaker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/IMaker.java new file mode 100644 index 0000000000..d28e40e5cf --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/IMaker.java @@ -0,0 +1,14 @@ +package com.dianping.cat.alarm.sender.transform; + +import com.dianping.cat.alarm.sender.entity.Par; +import com.dianping.cat.alarm.sender.entity.Sender; +import com.dianping.cat.alarm.sender.entity.SenderConfig; + +public interface IMaker { + + public Par buildPar(T node); + + public Sender buildSender(T node); + + public SenderConfig buildSenderConfig(T node); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/IParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/IParser.java new file mode 100644 index 0000000000..cf01cca49b --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/sender/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.alarm.sender.transform; + +import com.dianping.cat.alarm.sender.entity.Par; +import com.dianping.cat.alarm.sender.entity.Sender; +import com.dianping.cat.alarm.sender.entity.SenderConfig; + +public interface IParser { + public SenderConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForPar(IMaker maker, ILinker linker, Par parent, T node); + + public void parseForSender(IMaker maker, ILinker linker, Sender parent, T node); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/BaseEntity.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/BaseEntity.java new file mode 100644 index 0000000000..f665797d11 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/BaseEntity.java @@ -0,0 +1,56 @@ +package com.dianping.cat.alarm.server; + +import java.util.Formattable; +import java.util.FormattableFlags; +import java.util.Formatter; + +import com.dianping.cat.alarm.server.transform.DefaultXmlBuilder; +import com.dianping.cat.alarm.server.transform.DefaultJsonBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String JSON = "%#.3s"; + + public static final String JSON_COMPACT = "%#s"; + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean useJson = (flags & FormattableFlags.ALTERNATE) == FormattableFlags.ALTERNATE; + boolean compact = (precision <= 0); + + if (useJson) { + DefaultJsonBuilder builder = new DefaultJsonBuilder(compact); + + formatter.format("%s", builder.build(this)); + } else { + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/Constants.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/Constants.java new file mode 100644 index 0000000000..ac6da80602 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/Constants.java @@ -0,0 +1,34 @@ +package com.dianping.cat.alarm.server; + +public class Constants { + + public static final String ATTR_ALERT_TYPE = "alert-type"; + + public static final String ATTR_DURATION = "duration"; + + public static final String ATTR_END_TIME = "end-time"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_INTERVAL = "interval"; + + public static final String ATTR_START_TIME = "start-time"; + + public static final String ATTR_TYPE = "type"; + + public static final String ATTR_VALUE = "value"; + + public static final String ENTITY_CONDITION = "condition"; + + public static final String ENTITY_CONDITIONS = "conditions"; + + public static final String ENTITY_RULE = "rule"; + + public static final String ENTITY_RULES = "rules"; + + public static final String ENTITY_SERVER_ALARM_RULE_CONFIG = "server-alarm-rule-config"; + + public static final String ENTITY_SUB_CONDITION = "sub-condition"; + + public static final String ENTITY_SUB_CONDITIONS = "sub-conditions"; +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/IEntity.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/IEntity.java new file mode 100644 index 0000000000..20cec87eb5 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.alarm.server; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/IVisitor.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/IVisitor.java new file mode 100644 index 0000000000..9030b4f862 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/IVisitor.java @@ -0,0 +1,17 @@ +package com.dianping.cat.alarm.server; + +import com.dianping.cat.alarm.server.entity.Condition; +import com.dianping.cat.alarm.server.entity.Rule; +import com.dianping.cat.alarm.server.entity.ServerAlarmRuleConfig; +import com.dianping.cat.alarm.server.entity.SubCondition; + +public interface IVisitor { + + public void visitCondition(Condition condition); + + public void visitRule(Rule rule); + + public void visitServerAlarmRuleConfig(ServerAlarmRuleConfig serverAlarmRuleConfig); + + public void visitSubCondition(SubCondition subCondition); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/Condition.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/Condition.java new file mode 100644 index 0000000000..d6e8a62759 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/Condition.java @@ -0,0 +1,118 @@ +package com.dianping.cat.alarm.server.entity; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.alarm.server.BaseEntity; +import com.dianping.cat.alarm.server.IVisitor; + +public class Condition extends BaseEntity { + private String m_interval; + + private int m_duration; + + private String m_alertType; + + private List m_subConditions = new ArrayList(); + + public Condition() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitCondition(this); + } + + public Condition addSubCondition(SubCondition subCondition) { + m_subConditions.add(subCondition); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Condition) { + Condition _o = (Condition) obj; + + if (!equals(getInterval(), _o.getInterval())) { + return false; + } + + if (getDuration() != _o.getDuration()) { + return false; + } + + if (!equals(getAlertType(), _o.getAlertType())) { + return false; + } + + if (!equals(getSubConditions(), _o.getSubConditions())) { + return false; + } + + + return true; + } + + return false; + } + + public String getAlertType() { + return m_alertType; + } + + public int getDuration() { + return m_duration; + } + + public String getInterval() { + return m_interval; + } + + public List getSubConditions() { + return m_subConditions; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_interval == null ? 0 : m_interval.hashCode()); + hash = hash * 31 + m_duration; + hash = hash * 31 + (m_alertType == null ? 0 : m_alertType.hashCode()); + for (SubCondition e : m_subConditions) { + hash = hash * 31 + (e == null ? 0 :e.hashCode()); + } + + + return hash; + } + + @Override + public void mergeAttributes(Condition other) { + if (other.getInterval() != null) { + m_interval = other.getInterval(); + } + + m_duration = other.getDuration(); + + if (other.getAlertType() != null) { + m_alertType = other.getAlertType(); + } + } + + public Condition setAlertType(String alertType) { + m_alertType = alertType; + return this; + } + + public Condition setDuration(int duration) { + m_duration = duration; + return this; + } + + public Condition setInterval(String interval) { + m_interval = interval; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/Rule.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/Rule.java new file mode 100644 index 0000000000..35ef29b9e2 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/Rule.java @@ -0,0 +1,100 @@ +package com.dianping.cat.alarm.server.entity; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.alarm.server.BaseEntity; +import com.dianping.cat.alarm.server.IVisitor; + +public class Rule extends BaseEntity { + private String m_startTime; + + private String m_endTime; + + private List m_conditions = new ArrayList(); + + public Rule() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitRule(this); + } + + public Rule addCondition(Condition condition) { + m_conditions.add(condition); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Rule) { + Rule _o = (Rule) obj; + + if (!equals(getStartTime(), _o.getStartTime())) { + return false; + } + + if (!equals(getEndTime(), _o.getEndTime())) { + return false; + } + + if (!equals(getConditions(), _o.getConditions())) { + return false; + } + + + return true; + } + + return false; + } + + public List getConditions() { + return m_conditions; + } + + public String getEndTime() { + return m_endTime; + } + + public String getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_startTime == null ? 0 : m_startTime.hashCode()); + hash = hash * 31 + (m_endTime == null ? 0 : m_endTime.hashCode()); + for (Condition e : m_conditions) { + hash = hash * 31 + (e == null ? 0 :e.hashCode()); + } + + + return hash; + } + + @Override + public void mergeAttributes(Rule other) { + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Rule setEndTime(String endTime) { + m_endTime = endTime; + return this; + } + + public Rule setStartTime(String startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/ServerAlarmRuleConfig.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/ServerAlarmRuleConfig.java new file mode 100644 index 0000000000..1d41967be4 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/ServerAlarmRuleConfig.java @@ -0,0 +1,80 @@ +package com.dianping.cat.alarm.server.entity; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.alarm.server.BaseEntity; +import com.dianping.cat.alarm.server.IVisitor; + +public class ServerAlarmRuleConfig extends BaseEntity { + private String m_id; + + private List m_rules = new ArrayList(); + + public ServerAlarmRuleConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitServerAlarmRuleConfig(this); + } + + public ServerAlarmRuleConfig addRule(Rule rule) { + m_rules.add(rule); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ServerAlarmRuleConfig) { + ServerAlarmRuleConfig _o = (ServerAlarmRuleConfig) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + if (!equals(getRules(), _o.getRules())) { + return false; + } + + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + public List getRules() { + return m_rules; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + for (Rule e : m_rules) { + hash = hash * 31 + (e == null ? 0 :e.hashCode()); + } + + + return hash; + } + + @Override + public void mergeAttributes(ServerAlarmRuleConfig other) { + if (other.getId() != null) { + m_id = other.getId(); + } + } + + public ServerAlarmRuleConfig setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/SubCondition.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/SubCondition.java new file mode 100644 index 0000000000..9dab08ba5a --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/entity/SubCondition.java @@ -0,0 +1,78 @@ +package com.dianping.cat.alarm.server.entity; + +import com.dianping.cat.alarm.server.BaseEntity; +import com.dianping.cat.alarm.server.IVisitor; + +public class SubCondition extends BaseEntity { + private String m_type; + + private String m_value; + + public SubCondition() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitSubCondition(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SubCondition) { + SubCondition _o = (SubCondition) obj; + + if (!equals(getType(), _o.getType())) { + return false; + } + + if (!equals(getValue(), _o.getValue())) { + return false; + } + + + return true; + } + + return false; + } + + public String getType() { + return m_type; + } + + public String getValue() { + return m_value; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_type == null ? 0 : m_type.hashCode()); + hash = hash * 31 + (m_value == null ? 0 : m_value.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(SubCondition other) { + if (other.getType() != null) { + m_type = other.getType(); + } + + if (other.getValue() != null) { + m_value = other.getValue(); + } + } + + public SubCondition setType(String type) { + m_type = type; + return this; + } + + public SubCondition setValue(String value) { + m_value = value; + return this; + } + +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultJsonBuilder.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultJsonBuilder.java new file mode 100644 index 0000000000..208ab6f85c --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultJsonBuilder.java @@ -0,0 +1,300 @@ +package com.dianping.cat.alarm.server.transform; + +import static com.dianping.cat.alarm.server.Constants.ATTR_ALERT_TYPE; +import static com.dianping.cat.alarm.server.Constants.ATTR_DURATION; +import static com.dianping.cat.alarm.server.Constants.ATTR_END_TIME; +import static com.dianping.cat.alarm.server.Constants.ATTR_ID; +import static com.dianping.cat.alarm.server.Constants.ATTR_INTERVAL; +import static com.dianping.cat.alarm.server.Constants.ATTR_START_TIME; +import static com.dianping.cat.alarm.server.Constants.ATTR_TYPE; +import static com.dianping.cat.alarm.server.Constants.ATTR_VALUE; +import static com.dianping.cat.alarm.server.Constants.ENTITY_CONDITIONS; +import static com.dianping.cat.alarm.server.Constants.ENTITY_RULES; +import static com.dianping.cat.alarm.server.Constants.ENTITY_SUB_CONDITIONS; + +import java.lang.reflect.Array; +import java.util.Collection; +import java.util.Map; + +import com.dianping.cat.alarm.server.IEntity; +import com.dianping.cat.alarm.server.IVisitor; +import com.dianping.cat.alarm.server.entity.Condition; +import com.dianping.cat.alarm.server.entity.Rule; +import com.dianping.cat.alarm.server.entity.ServerAlarmRuleConfig; +import com.dianping.cat.alarm.server.entity.SubCondition; + +public class DefaultJsonBuilder implements IVisitor { + + private IVisitor m_visitor; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultJsonBuilder() { + this(false); + } + + public DefaultJsonBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultJsonBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_visitor = this; + } + + protected void arrayBegin(String name) { + indent(); + m_sb.append('"').append(name).append(m_compact ? "\":[" : "\": [\r\n"); + m_level++; + } + + protected void arrayEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append("],").append(m_compact ? "" : "\r\n"); + } + + protected void attributes(Map dynamicAttributes, Object... nameValues) { + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + if (attrValue instanceof Collection) { + @SuppressWarnings("unchecked") + Collection items = (Collection) attrValue; + + if (!items.isEmpty()) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (Object item : items) { + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else if (attrValue.getClass().isArray()) { + int length = Array.getLength(attrValue); + + if (length > 0) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (int j = 0; j < length; j++) { + Object item = Array.get(attrValue, j); + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else { + if (m_compact) { + m_sb.append('"').append(attrName).append("\":"); + toString(m_sb, attrValue); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(attrName).append("\": "); + toString(m_sb, attrValue); + m_sb.append(",\r\n"); + } + } + } + } + + if (dynamicAttributes != null) { + for (Map.Entry e : dynamicAttributes.entrySet()) { + if (m_compact) { + m_sb.append('"').append(e.getKey()).append("\":"); + toString(m_sb, e.getValue()); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(e.getKey()).append("\": "); + toString(m_sb, e.getValue()); + m_sb.append(",\r\n"); + } + } + } + } + + public String build(IEntity entity) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + trimComma(); + + return m_sb.toString(); + } + + public String buildArray(Collection> entities) { + m_sb.append('['); + + if (entities != null) { + for (IEntity entity : entities) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + } + + trimComma(); + } + + m_sb.append(']'); + + return m_sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void objectBegin(String name) { + indent(); + + if (name == null) { + m_sb.append("{").append(m_compact ? "" : "\r\n"); + } else { + m_sb.append('"').append(name).append(m_compact ? "\":{" : "\": {\r\n"); + } + + m_level++; + } + + protected void objectEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append(m_compact ? "}," : "},\r\n"); + } + + protected void toString(StringBuilder sb, Object value) { + if (value == null) { + sb.append("null"); + } else if (value instanceof Boolean || value instanceof Number) { + sb.append(value); + } else { + String val = value.toString(); + int len = val.length(); + + sb.append('"'); + + for (int i = 0; i < len; i++) { + char ch = val.charAt(i); + + switch (ch) { + case '\\': + case '/': + case '"': + sb.append('\\').append(ch); + break; + case '\t': + sb.append("\\t"); + break; + case '\r': + sb.append("\\r"); + break; + case '\n': + sb.append("\\n"); + break; + default: + sb.append(ch); + break; + } + } + + sb.append('"'); + } + } + + protected void trimComma() { + int len = m_sb.length(); + + if (m_compact) { + if (len > 1 && m_sb.charAt(len - 1) == ',') { + m_sb.replace(len - 1, len, ""); + } + } else { + if (len > 3 && m_sb.charAt(len - 3) == ',') { + m_sb.replace(len - 3, len - 2, ""); + } + } + } + + @Override + public void visitCondition(Condition condition) { + attributes(null, ATTR_INTERVAL, condition.getInterval(), ATTR_DURATION, condition.getDuration(), ATTR_ALERT_TYPE, condition.getAlertType()); + + if (!condition.getSubConditions().isEmpty()) { + arrayBegin(ENTITY_SUB_CONDITIONS); + + for (SubCondition subCondition : condition.getSubConditions()) { + objectBegin(null); + subCondition.accept(m_visitor); + objectEnd(null); + } + + arrayEnd(ENTITY_SUB_CONDITIONS); + } + } + + @Override + public void visitRule(Rule rule) { + attributes(null, ATTR_START_TIME, rule.getStartTime(), ATTR_END_TIME, rule.getEndTime()); + + if (!rule.getConditions().isEmpty()) { + arrayBegin(ENTITY_CONDITIONS); + + for (Condition condition : rule.getConditions()) { + objectBegin(null); + condition.accept(m_visitor); + objectEnd(null); + } + + arrayEnd(ENTITY_CONDITIONS); + } + } + + @Override + public void visitServerAlarmRuleConfig(ServerAlarmRuleConfig serverAlarmRuleConfig) { + attributes(null, ATTR_ID, serverAlarmRuleConfig.getId()); + + if (!serverAlarmRuleConfig.getRules().isEmpty()) { + arrayBegin(ENTITY_RULES); + + for (Rule rule : serverAlarmRuleConfig.getRules()) { + objectBegin(null); + rule.accept(m_visitor); + objectEnd(null); + } + + arrayEnd(ENTITY_RULES); + } + } + + @Override + public void visitSubCondition(SubCondition subCondition) { + attributes(null, ATTR_TYPE, subCondition.getType(), ATTR_VALUE, subCondition.getValue()); + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultJsonParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultJsonParser.java new file mode 100644 index 0000000000..2b0e35e8f5 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultJsonParser.java @@ -0,0 +1,426 @@ +package com.dianping.cat.alarm.server.transform; + +import static com.dianping.cat.alarm.server.Constants.ATTR_ALERT_TYPE; +import static com.dianping.cat.alarm.server.Constants.ATTR_DURATION; +import static com.dianping.cat.alarm.server.Constants.ATTR_END_TIME; +import static com.dianping.cat.alarm.server.Constants.ATTR_ID; +import static com.dianping.cat.alarm.server.Constants.ATTR_INTERVAL; +import static com.dianping.cat.alarm.server.Constants.ATTR_START_TIME; +import static com.dianping.cat.alarm.server.Constants.ATTR_TYPE; +import static com.dianping.cat.alarm.server.Constants.ATTR_VALUE; +import static com.dianping.cat.alarm.server.Constants.ENTITY_CONDITIONS; +import static com.dianping.cat.alarm.server.Constants.ENTITY_RULES; +import static com.dianping.cat.alarm.server.Constants.ENTITY_SUB_CONDITIONS; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.dianping.cat.alarm.server.IEntity; +import com.dianping.cat.alarm.server.entity.Condition; +import com.dianping.cat.alarm.server.entity.Rule; +import com.dianping.cat.alarm.server.entity.ServerAlarmRuleConfig; +import com.dianping.cat.alarm.server.entity.SubCondition; + +public class DefaultJsonParser { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private List m_entities = new ArrayList(); + + private Class m_entityClass; + + private DefaultJsonParser(Class entityClass) { + m_entityClass = entityClass; + } + + public static > T parse(Class entityClass, InputStream in) throws IOException { + return parse(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > T parse(Class entityClass, Reader reader) throws IOException { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.onArrayBegin(); + parser.parse(new JsonReader(reader)); + parser.onArrayEnd(); + + if (parser.m_entities.isEmpty()) { + return null; + } else { + return (T) parser.m_entities.get(0); + } + } + + public static > T parse(Class entityClass, String json) throws IOException { + return parse(entityClass, new StringReader(json)); + } + + public static > List parseArray(Class entityClass, InputStream in) throws Exception { + return parseArray(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > List parseArray(Class entityClass, Reader reader) throws Exception { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.parse(new JsonReader(reader)); + return (List) (List) parser.m_entities; + } + + public static > List parseArray(Class entityClass, String json) throws Exception { + return parseArray(entityClass, new StringReader(json)); + } + + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + private Object createRootEntity() { + try { + Object entity = m_entityClass.newInstance(); + + return entity; + } catch (Exception e) { + throw new RuntimeException(String.format("Unable to create entity(%s) instance!", m_entityClass.getName()), e); + } + } + + private boolean isTopLevel() { + return m_objs.size() == 1; + } + + protected void onArrayBegin() { + if (m_objs.isEmpty()) { + m_objs.push(m_entities); + m_tags.push(""); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof ServerAlarmRuleConfig) { + if (ENTITY_RULES.equals(tag)) { + m_objs.push(parent); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } else if (parent instanceof Rule) { + if (ENTITY_CONDITIONS.equals(tag)) { + m_objs.push(parent); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } else if (parent instanceof Condition) { + if (ENTITY_SUB_CONDITIONS.equals(tag)) { + m_objs.push(parent); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } } + + protected void onArrayEnd() { + m_objs.pop(); + m_tags.pop(); + + } + protected void onName(String name) { + m_tags.push(name); + } + + protected void onObjectBegin() { + if (isTopLevel()) { + m_objs.push(createRootEntity()); + m_tags.push(""); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof ServerAlarmRuleConfig) { + if (ENTITY_RULES.equals(tag)) { + Rule rules = new Rule(); + + m_linker.onRule((ServerAlarmRuleConfig) parent, rules); + m_objs.push(rules); + m_tags.push(""); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); /// + } + } else if (parent instanceof Rule) { + if (ENTITY_CONDITIONS.equals(tag)) { + Condition conditions = new Condition(); + + m_linker.onCondition((Rule) parent, conditions); + m_objs.push(conditions); + m_tags.push(""); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); /// + } + } else if (parent instanceof Condition) { + if (ENTITY_SUB_CONDITIONS.equals(tag)) { + SubCondition subConditions = new SubCondition(); + + m_linker.onSubCondition((Condition) parent, subConditions); + m_objs.push(subConditions); + m_tags.push(""); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); /// + } + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } + + protected void onObjectEnd() { + m_tags.pop(); + + Object entity = m_objs.pop(); + + if (isTopLevel()) { + m_entities.add(entity); + } + } + + protected void onValue(String value) { + Object parent = m_objs.peek(); + String tag = m_tags.pop(); + + if (parent instanceof ServerAlarmRuleConfig) { + parseForServerAlarmRuleConfig((ServerAlarmRuleConfig) parent, tag, value); + } else if (parent instanceof Rule) { + parseForRule((Rule) parent, tag, value); + } else if (parent instanceof Condition) { + parseForCondition((Condition) parent, tag, value); + } else if (parent instanceof SubCondition) { + parseForSubCondition((SubCondition) parent, tag, value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) under %s!", tag, parent)); + } + } + + private void parse(JsonReader reader) throws IOException { + try { + reader.parse(this); + } catch (EOFException e) { + if (m_objs.size() > 1) { + throw new EOFException(String.format("Unexpected end while parsing json! tags: %s.", m_tags)); + } + } + + m_linker.finish(); + } + + public void parseForCondition(Condition condition, String tag, String value) { + if (ENTITY_SUB_CONDITIONS.equals(tag)) { + // do nothing here + } else if (ATTR_INTERVAL.equals(tag)) { + condition.setInterval(value); + } else if (ATTR_DURATION.equals(tag)) { + condition.setDuration(convert(Integer.class, value, 0)); + } else if (ATTR_ALERT_TYPE.equals(tag)) { + condition.setAlertType(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, condition, m_tags)); + } + } + + public void parseForRule(Rule rule, String tag, String value) { + if (ENTITY_CONDITIONS.equals(tag)) { + // do nothing here + } else if (ATTR_START_TIME.equals(tag)) { + rule.setStartTime(value); + } else if (ATTR_END_TIME.equals(tag)) { + rule.setEndTime(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, rule, m_tags)); + } + } + + public void parseForServerAlarmRuleConfig(ServerAlarmRuleConfig serverAlarmRuleConfig, String tag, String value) { + if (ENTITY_RULES.equals(tag)) { + // do nothing here + } else if (ATTR_ID.equals(tag)) { + serverAlarmRuleConfig.setId(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, serverAlarmRuleConfig, m_tags)); + } + } + + public void parseForSubCondition(SubCondition subCondition, String tag, String value) { + if (ATTR_TYPE.equals(tag)) { + subCondition.setType(value); + } else if (ATTR_VALUE.equals(tag)) { + subCondition.setValue(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, subCondition, m_tags)); + } + } + + + static class JsonReader { + private Reader m_reader; + + private char[] m_buffer = new char[2048]; + + private int m_size; + + private int m_index; + + public JsonReader(Reader reader) { + m_reader = reader; + } + + private char next() throws IOException { + if (m_index >= m_size) { + m_size = m_reader.read(m_buffer); + m_index = 0; + + if (m_size == -1) { + throw new EOFException(); + } + } + + return m_buffer[m_index++]; + } + + public void parse(DefaultJsonParser parser) throws IOException { + StringBuilder sb = new StringBuilder(); + boolean flag = false; + + while (true) { + char ch = next(); + + switch (ch) { + case ' ': + case '\t': + case '\r': + case '\n': + break; + case '{': + parser.onObjectBegin(); + flag = false; + break; + case '}': + if (flag) { // have value + parser.onValue(sb.toString()); + sb.setLength(0); + } + + parser.onObjectEnd(); + flag = false; + break; + case '\'': + case '"': + while (true) { + char ch2 = next(); + + if (ch2 != ch) { + if (ch2 == '\\') { + char ch3 = next(); + + switch (ch3) { + case 't': + sb.append('\t'); + break; + case 'r': + sb.append('\r'); + break; + case 'n': + sb.append('\n'); + break; + default: + sb.append(ch3); + break; + } + } else { + sb.append(ch2); + } + } else { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + flag = false; + } + + sb.setLength(0); + break; + } + } + + break; + case ':': + if (sb.length() != 0) { + parser.onName(sb.toString()); + sb.setLength(0); + } + + flag = true; + break; + case ',': + if (sb.length() != 0) { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + } + + sb.setLength(0); + } + + flag = false; + break; + case '[': + parser.onArrayBegin(); + flag = false; + break; + case ']': + parser.onArrayEnd(); + flag = false; + break; + default: + sb.append(ch); + break; + } + } + } + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultLinker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultLinker.java new file mode 100644 index 0000000000..93c0ffe466 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultLinker.java @@ -0,0 +1,43 @@ +package com.dianping.cat.alarm.server.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.alarm.server.entity.Condition; +import com.dianping.cat.alarm.server.entity.Rule; +import com.dianping.cat.alarm.server.entity.ServerAlarmRuleConfig; +import com.dianping.cat.alarm.server.entity.SubCondition; + +public class DefaultLinker implements ILinker { + @SuppressWarnings("unused") + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onCondition(final Rule parent, final Condition condition) { + parent.addCondition(condition); + return true; + } + + @Override + public boolean onRule(final ServerAlarmRuleConfig parent, final Rule rule) { + parent.addRule(rule); + return true; + } + + @Override + public boolean onSubCondition(final Condition parent, final SubCondition subCondition) { + parent.addSubCondition(subCondition); + return true; + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultSaxMaker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..c92b031d64 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultSaxMaker.java @@ -0,0 +1,115 @@ +package com.dianping.cat.alarm.server.transform; + +import static com.dianping.cat.alarm.server.Constants.ATTR_ALERT_TYPE; +import static com.dianping.cat.alarm.server.Constants.ATTR_DURATION; +import static com.dianping.cat.alarm.server.Constants.ATTR_END_TIME; +import static com.dianping.cat.alarm.server.Constants.ATTR_ID; +import static com.dianping.cat.alarm.server.Constants.ATTR_INTERVAL; +import static com.dianping.cat.alarm.server.Constants.ATTR_START_TIME; +import static com.dianping.cat.alarm.server.Constants.ATTR_TYPE; +import static com.dianping.cat.alarm.server.Constants.ATTR_VALUE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.alarm.server.entity.Condition; +import com.dianping.cat.alarm.server.entity.Rule; +import com.dianping.cat.alarm.server.entity.ServerAlarmRuleConfig; +import com.dianping.cat.alarm.server.entity.SubCondition; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Condition buildCondition(Attributes attributes) { + String interval = attributes.getValue(ATTR_INTERVAL); + String duration = attributes.getValue(ATTR_DURATION); + String alertType = attributes.getValue(ATTR_ALERT_TYPE); + Condition condition = new Condition(); + + if (interval != null) { + condition.setInterval(interval); + } + + if (duration != null) { + condition.setDuration(convert(Integer.class, duration, 0)); + } + + if (alertType != null) { + condition.setAlertType(alertType); + } + + return condition; + } + + @Override + public Rule buildRule(Attributes attributes) { + String startTime = attributes.getValue(ATTR_START_TIME); + String endTime = attributes.getValue(ATTR_END_TIME); + Rule rule = new Rule(); + + if (startTime != null) { + rule.setStartTime(startTime); + } + + if (endTime != null) { + rule.setEndTime(endTime); + } + + return rule; + } + + @Override + public ServerAlarmRuleConfig buildServerAlarmRuleConfig(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + ServerAlarmRuleConfig serverAlarmRuleConfig = new ServerAlarmRuleConfig(); + + if (id != null) { + serverAlarmRuleConfig.setId(id); + } + + return serverAlarmRuleConfig; + } + + @Override + public SubCondition buildSubCondition(Attributes attributes) { + String type = attributes.getValue(ATTR_TYPE); + String value = attributes.getValue(ATTR_VALUE); + SubCondition subCondition = new SubCondition(); + + if (type != null) { + subCondition.setType(type); + } + + if (value != null) { + subCondition.setValue(value); + } + + return subCondition; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultSaxParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..f0bfda282b --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultSaxParser.java @@ -0,0 +1,273 @@ +package com.dianping.cat.alarm.server.transform; + +import static com.dianping.cat.alarm.server.Constants.ENTITY_CONDITION; +import static com.dianping.cat.alarm.server.Constants.ENTITY_RULE; +import static com.dianping.cat.alarm.server.Constants.ENTITY_SERVER_ALARM_RULE_CONFIG; +import static com.dianping.cat.alarm.server.Constants.ENTITY_SUB_CONDITION; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.alarm.server.IEntity; +import com.dianping.cat.alarm.server.entity.Condition; +import com.dianping.cat.alarm.server.entity.Rule; +import com.dianping.cat.alarm.server.entity.ServerAlarmRuleConfig; +import com.dianping.cat.alarm.server.entity.SubCondition; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static ServerAlarmRuleConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(ServerAlarmRuleConfig.class, new InputSource(removeBOM(in))); + } + + public static ServerAlarmRuleConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(ServerAlarmRuleConfig.class, new InputSource(removeBOM(reader))); + } + + public static ServerAlarmRuleConfig parse(String xml) throws SAXException, IOException { + return parseEntity(ServerAlarmRuleConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForCondition(Condition parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_SUB_CONDITION.equals(qName)) { + SubCondition subCondition = m_maker.buildSubCondition(attributes); + + m_linker.onSubCondition(parentObj, subCondition); + m_objs.push(subCondition); + } else { + throw new SAXException(String.format("Element(%s) is not expected under condition!", qName)); + } + + m_tags.push(qName); + } + + private void parseForRule(Rule parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_CONDITION.equals(qName)) { + Condition condition = m_maker.buildCondition(attributes); + + m_linker.onCondition(parentObj, condition); + m_objs.push(condition); + } else { + throw new SAXException(String.format("Element(%s) is not expected under rule!", qName)); + } + + m_tags.push(qName); + } + + private void parseForServerAlarmRuleConfig(ServerAlarmRuleConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_RULE.equals(qName)) { + Rule rule = m_maker.buildRule(attributes); + + m_linker.onRule(parentObj, rule); + m_objs.push(rule); + } else { + throw new SAXException(String.format("Element(%s) is not expected under server-alarm-rule-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseForSubCondition(SubCondition parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_SERVER_ALARM_RULE_CONFIG.equals(qName)) { + ServerAlarmRuleConfig serverAlarmRuleConfig = m_maker.buildServerAlarmRuleConfig(attributes); + + m_entity = serverAlarmRuleConfig; + m_objs.push(serverAlarmRuleConfig); + m_tags.push(qName); + } else if (ENTITY_RULE.equals(qName)) { + Rule rule = m_maker.buildRule(attributes); + + m_entity = rule; + m_objs.push(rule); + m_tags.push(qName); + } else if (ENTITY_CONDITION.equals(qName)) { + Condition condition = m_maker.buildCondition(attributes); + + m_entity = condition; + m_objs.push(condition); + m_tags.push(qName); + } else if (ENTITY_SUB_CONDITION.equals(qName)) { + SubCondition subCondition = m_maker.buildSubCondition(attributes); + + m_entity = subCondition; + m_objs.push(subCondition); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof ServerAlarmRuleConfig) { + parseForServerAlarmRuleConfig((ServerAlarmRuleConfig) parent, tag, qName, attributes); + } else if (parent instanceof Rule) { + parseForRule((Rule) parent, tag, qName, attributes); + } else if (parent instanceof Condition) { + parseForCondition((Condition) parent, tag, qName, attributes); + } else if (parent instanceof SubCondition) { + parseForSubCondition((SubCondition) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultXmlBuilder.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..514f973cf5 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/DefaultXmlBuilder.java @@ -0,0 +1,249 @@ +package com.dianping.cat.alarm.server.transform; + +import static com.dianping.cat.alarm.server.Constants.ATTR_ALERT_TYPE; +import static com.dianping.cat.alarm.server.Constants.ATTR_DURATION; +import static com.dianping.cat.alarm.server.Constants.ATTR_END_TIME; +import static com.dianping.cat.alarm.server.Constants.ATTR_ID; +import static com.dianping.cat.alarm.server.Constants.ATTR_INTERVAL; +import static com.dianping.cat.alarm.server.Constants.ATTR_START_TIME; +import static com.dianping.cat.alarm.server.Constants.ATTR_TYPE; +import static com.dianping.cat.alarm.server.Constants.ATTR_VALUE; +import static com.dianping.cat.alarm.server.Constants.ENTITY_CONDITION; +import static com.dianping.cat.alarm.server.Constants.ENTITY_RULE; +import static com.dianping.cat.alarm.server.Constants.ENTITY_SERVER_ALARM_RULE_CONFIG; +import static com.dianping.cat.alarm.server.Constants.ENTITY_SUB_CONDITION; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.alarm.server.IEntity; +import com.dianping.cat.alarm.server.IVisitor; +import com.dianping.cat.alarm.server.entity.Condition; +import com.dianping.cat.alarm.server.entity.Rule; +import com.dianping.cat.alarm.server.entity.ServerAlarmRuleConfig; +import com.dianping.cat.alarm.server.entity.SubCondition; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitCondition(Condition condition) { + startTag(ENTITY_CONDITION, null, ATTR_INTERVAL, condition.getInterval(), ATTR_DURATION, condition.getDuration(), ATTR_ALERT_TYPE, condition.getAlertType()); + + if (!condition.getSubConditions().isEmpty()) { + for (SubCondition subCondition : condition.getSubConditions()) { + subCondition.accept(m_visitor); + } + } + + endTag(ENTITY_CONDITION); + } + + @Override + public void visitRule(Rule rule) { + startTag(ENTITY_RULE, null, ATTR_START_TIME, rule.getStartTime(), ATTR_END_TIME, rule.getEndTime()); + + if (!rule.getConditions().isEmpty()) { + for (Condition condition : rule.getConditions()) { + condition.accept(m_visitor); + } + } + + endTag(ENTITY_RULE); + } + + @Override + public void visitServerAlarmRuleConfig(ServerAlarmRuleConfig serverAlarmRuleConfig) { + startTag(ENTITY_SERVER_ALARM_RULE_CONFIG, null, ATTR_ID, serverAlarmRuleConfig.getId()); + + if (!serverAlarmRuleConfig.getRules().isEmpty()) { + for (Rule rule : serverAlarmRuleConfig.getRules()) { + rule.accept(m_visitor); + } + } + + endTag(ENTITY_SERVER_ALARM_RULE_CONFIG); + } + + @Override + public void visitSubCondition(SubCondition subCondition) { + startTag(ENTITY_SUB_CONDITION, true, null, ATTR_TYPE, subCondition.getType(), ATTR_VALUE, subCondition.getValue()); + } +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/ILinker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/ILinker.java new file mode 100644 index 0000000000..4931283c40 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/ILinker.java @@ -0,0 +1,15 @@ +package com.dianping.cat.alarm.server.transform; + +import com.dianping.cat.alarm.server.entity.Condition; +import com.dianping.cat.alarm.server.entity.Rule; +import com.dianping.cat.alarm.server.entity.ServerAlarmRuleConfig; +import com.dianping.cat.alarm.server.entity.SubCondition; + +public interface ILinker { + + public boolean onCondition(Rule parent, Condition condition); + + public boolean onRule(ServerAlarmRuleConfig parent, Rule rule); + + public boolean onSubCondition(Condition parent, SubCondition subCondition); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/IMaker.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/IMaker.java new file mode 100644 index 0000000000..958f1caa19 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/IMaker.java @@ -0,0 +1,17 @@ +package com.dianping.cat.alarm.server.transform; + +import com.dianping.cat.alarm.server.entity.Condition; +import com.dianping.cat.alarm.server.entity.Rule; +import com.dianping.cat.alarm.server.entity.ServerAlarmRuleConfig; +import com.dianping.cat.alarm.server.entity.SubCondition; + +public interface IMaker { + + public Condition buildCondition(T node); + + public Rule buildRule(T node); + + public ServerAlarmRuleConfig buildServerAlarmRuleConfig(T node); + + public SubCondition buildSubCondition(T node); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/IParser.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/IParser.java new file mode 100644 index 0000000000..fd20b5d359 --- /dev/null +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/server/transform/IParser.java @@ -0,0 +1,16 @@ +package com.dianping.cat.alarm.server.transform; + +import com.dianping.cat.alarm.server.entity.Condition; +import com.dianping.cat.alarm.server.entity.Rule; +import com.dianping.cat.alarm.server.entity.ServerAlarmRuleConfig; +import com.dianping.cat.alarm.server.entity.SubCondition; + +public interface IParser { + public ServerAlarmRuleConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForCondition(IMaker maker, ILinker linker, Condition parent, T node); + + public void parseForRule(IMaker maker, ILinker linker, Rule parent, T node); + + public void parseForSubCondition(IMaker maker, ILinker linker, SubCondition parent, T node); +} diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java index 4fe989e46d..2271f9b959 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java @@ -22,16 +22,15 @@ import java.util.LinkedList; import java.util.List; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.alarm.Alert; -import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; import com.dianping.cat.alarm.spi.AlertEntity; import com.dianping.cat.alarm.spi.sender.SendMessageEntity; +import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; public class AlertService { private static final Logger LOGGER = LoggerFactory.getLogger(AlertService.class); @@ -55,9 +54,8 @@ public List query(Date start, Date end, String type) { List alerts = new LinkedList(); try { - alerts = m_alertDao.queryAlertsByTimeCategory(start, end, type, - com.dianping.cat.alarm.AlertEntity.READSET_FULL); - } catch (DalNotFoundException e) { + alerts = m_alertDao.queryAlertsByTimeCategory(start, end, type); + } catch (EmptyResultDataAccessException e) { // ignore } catch (Exception e) { LOGGER.error("Unable to query alerts, start={}, end={}, type={}.", start, end, type, e); @@ -78,7 +76,7 @@ public void insert(AlertEntity alertEntity, SendMessageEntity message) { alert.getDomain(), alert.getCategory(), alert.getMetric()); Cat.logError("insert alert error: " + alert.toString(), new RuntimeException()); } - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to insert alert, domain={}, type={}, metric={}.", alertEntity.getDomain(), alertEntity.getType().getName(), alertEntity.getMetric(), e); Cat.logError(e); diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java index 58064ad47a..1fed1615e7 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java @@ -19,9 +19,9 @@ package com.dianping.cat.alarm.spi.config; import org.apache.commons.lang.StringUtils; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.alarm.receiver.entity.AlertConfig; @@ -30,7 +30,6 @@ import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; public class AlertConfigManager { private static final Logger LOGGER = LoggerFactory.getLogger(AlertConfigManager.class); @@ -91,13 +90,13 @@ public void initialize() { return; } try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); LOGGER.info("Loaded alert config from repository, configId={}.", m_configId); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Alert config is missing in repository, loading default content from fetcher.", e); try { @@ -160,7 +159,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); LOGGER.info("Stored alert config, configId={}, receiverCount={}.", m_configId, m_config.getReceivers().size()); } catch (Exception e) { diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java index e68da105e8..1eb13dabac 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java @@ -22,8 +22,8 @@ import java.util.List; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.alarm.policy.entity.AlertPolicy; @@ -35,7 +35,6 @@ import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; public class AlertPolicyManager { private static final Logger LOGGER = LoggerFactory.getLogger(AlertPolicyManager.class); @@ -78,13 +77,13 @@ public void initialize() { return; } try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); LOGGER.info("Loaded alert policy from repository, configId={}.", m_configId); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Alert policy is missing in repository, loading default content from fetcher.", e); try { @@ -221,7 +220,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); LOGGER.info("Stored alert policy, configId={}, typeCount={}.", m_configId, m_config.getTypes().size()); } catch (Exception e) { LOGGER.error("Unable to store alert policy, configId={}.", m_configId, e); diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java index 6817a74b28..b09e8d787f 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java @@ -21,8 +21,8 @@ import java.util.List; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.alarm.sender.entity.Par; @@ -32,7 +32,6 @@ import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; public class SenderConfigManager { private static final Logger LOGGER = LoggerFactory.getLogger(SenderConfigManager.class); @@ -71,13 +70,13 @@ public void initialize() { return; } try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_senderConfig = DefaultSaxParser.parse(content); m_configId = config.getId(); LOGGER.info("Loaded sender config from repository, configId={}.", m_configId); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Sender config is missing in repository, loading default content from fetcher.", e); try { @@ -182,7 +181,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_senderConfig.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); LOGGER.info("Stored sender config, configId={}, senderCount={}.", m_configId, m_senderConfig.getSenders().size()); } catch (Exception e) { diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java index b820ab2162..a8bc9ba7cc 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java @@ -9,8 +9,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; public class AlertRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(AlertRepository.class); @@ -25,17 +24,17 @@ public Alert createLocal() { return new Alert(); } - public int deleteByPK(Alert proto) throws DalException { + public int deleteByPK(Alert proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for Alert.", e); + throw new IllegalStateException("Error when executing deleteByPK for Alert.", e); } } - public List queryAlertsByTimeDomain(java.util.Date startTime, java.util.Date endTime, String domain, Object readset) throws DalException { + public List queryAlertsByTimeDomain(java.util.Date startTime, java.util.Date endTime, String domain) { AlertMapper mapper = springMapper(LOGGER); AlertDO record = new AlertDO(); @@ -45,11 +44,11 @@ public List queryAlertsByTimeDomain(java.util.Date startTime, java.util.D try { return mapper.queryAlertsByTimeDomain(record).stream().map(this::toModel).collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing queryAlertsByTimeDomain for Alert.", e); + throw new IllegalStateException("Error when executing queryAlertsByTimeDomain for Alert.", e); } } - public List queryAlertsByTimeDomainCategories(java.util.Date startTime, java.util.Date endTime, String domain, String[] categories, Object readset) throws DalException { + public List queryAlertsByTimeDomainCategories(java.util.Date startTime, java.util.Date endTime, String domain, String[] categories) { AlertMapper mapper = springMapper(LOGGER); AlertDO record = new AlertDO(); @@ -61,11 +60,11 @@ public List queryAlertsByTimeDomainCategories(java.util.Date startTime, j return mapper.queryAlertsByTimeDomainCategories(record).stream().map(this::toModel) .collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing queryAlertsByTimeDomainCategories for Alert.", e); + throw new IllegalStateException("Error when executing queryAlertsByTimeDomainCategories for Alert.", e); } } - public List queryAlertsByTimeCategoryDomain(java.util.Date startTime, java.util.Date endTime, String category, String domain, Object readset) throws DalException { + public List queryAlertsByTimeCategoryDomain(java.util.Date startTime, java.util.Date endTime, String category, String domain) { AlertMapper mapper = springMapper(LOGGER); AlertDO record = new AlertDO(); @@ -77,11 +76,11 @@ public List queryAlertsByTimeCategoryDomain(java.util.Date startTime, jav return mapper.queryAlertsByTimeCategoryDomain(record).stream().map(this::toModel) .collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing queryAlertsByTimeCategoryDomain for Alert.", e); + throw new IllegalStateException("Error when executing queryAlertsByTimeCategoryDomain for Alert.", e); } } - public List queryAlertsByTimeCategory(java.util.Date startTime, java.util.Date endTime, String category, Object readset) throws DalException { + public List queryAlertsByTimeCategory(java.util.Date startTime, java.util.Date endTime, String category) { AlertMapper mapper = springMapper(LOGGER); AlertDO record = new AlertDO(); @@ -91,23 +90,23 @@ public List queryAlertsByTimeCategory(java.util.Date startTime, java.util try { return mapper.queryAlertsByTimeCategory(record).stream().map(this::toModel).collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing queryAlertsByTimeCategory for Alert.", e); + throw new IllegalStateException("Error when executing queryAlertsByTimeCategory for Alert.", e); } } - public Alert findByPK(int keyId, Object readset) throws DalException { + public Alert findByPK(int keyId) { AlertMapper mapper = springMapper(LOGGER); try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for Alert.", e); + throw new IllegalStateException("Error when executing findByPK for Alert.", e); } } - public int insert(Alert proto) throws DalException { + public int insert(Alert proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { @@ -118,23 +117,23 @@ public int insert(Alert proto) throws DalException { proto.setKeyId(record.getId()); return count; } catch (Exception e) { - throw new DalException("Error when executing insert for Alert.", e); + throw new IllegalStateException("Error when executing insert for Alert.", e); } } - public int updateByPK(Alert proto, Object updateset) throws DalException { + public int updateByPK(Alert proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for Alert.", e); + throw new IllegalStateException("Error when executing updateByPK for Alert.", e); } } - private Alert requireFound(AlertDO record, String field, String value) throws DalNotFoundException { + private Alert requireFound(AlertDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No Alert found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No Alert found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java index 35d24417bf..e77df0d59e 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java @@ -9,8 +9,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; public class ServerAlarmRuleRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(ServerAlarmRuleRepository.class); @@ -26,40 +25,40 @@ public ServerAlarmRule createLocal() { return new ServerAlarmRule(); } - public int deleteByPK(ServerAlarmRule proto) throws DalException { + public int deleteByPK(ServerAlarmRule proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for ServerAlarmRule.", e); + throw new IllegalStateException("Error when executing deleteByPK for ServerAlarmRule.", e); } } - public List findAll(Object readset) throws DalException { + public List findAll() { ServerAlarmRuleMapper mapper = springMapper(LOGGER); ServerAlarmRuleDO record = new ServerAlarmRuleDO(); try { return mapper.findAll(record).stream().map(this::toModel).collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing findAll for ServerAlarmRule.", e); + throw new IllegalStateException("Error when executing findAll for ServerAlarmRule.", e); } } - public ServerAlarmRule findByPK(int keyId, Object readset) throws DalException { + public ServerAlarmRule findByPK(int keyId) { ServerAlarmRuleMapper mapper = springMapper(LOGGER); try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for ServerAlarmRule.", e); + throw new IllegalStateException("Error when executing findByPK for ServerAlarmRule.", e); } } - public int insert(ServerAlarmRule proto) throws DalException { + public int insert(ServerAlarmRule proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { @@ -70,23 +69,23 @@ public int insert(ServerAlarmRule proto) throws DalException { proto.setKeyId(record.getId()); return count; } catch (Exception e) { - throw new DalException("Error when executing insert for ServerAlarmRule.", e); + throw new IllegalStateException("Error when executing insert for ServerAlarmRule.", e); } } - public int updateByPK(ServerAlarmRule proto, Object updateset) throws DalException { + public int updateByPK(ServerAlarmRule proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for ServerAlarmRule.", e); + throw new IllegalStateException("Error when executing updateByPK for ServerAlarmRule.", e); } } - private ServerAlarmRule requireFound(ServerAlarmRuleDO record, String field, String value) throws DalNotFoundException { + private ServerAlarmRule requireFound(ServerAlarmRuleDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No ServerAlarmRule found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No ServerAlarmRule found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java index 26500c0bda..f9f0e26850 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java @@ -7,8 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; public class UserDefineRuleRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(UserDefineRuleRepository.class); @@ -24,29 +23,29 @@ public UserDefineRule createLocal() { return new UserDefineRule(); } - public int deleteByPK(UserDefineRule proto) throws DalException { + public int deleteByPK(UserDefineRule proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for UserDefineRule.", e); + throw new IllegalStateException("Error when executing deleteByPK for UserDefineRule.", e); } } - public UserDefineRule findByPK(int keyId, Object readset) throws DalException { + public UserDefineRule findByPK(int keyId) { UserDefineRuleMapper mapper = springMapper(LOGGER); try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for UserDefineRule.", e); + throw new IllegalStateException("Error when executing findByPK for UserDefineRule.", e); } } - public UserDefineRule findMaxId(Object readset) throws DalException { + public UserDefineRule findMaxId() { UserDefineRuleMapper mapper = springMapper(LOGGER); UserDefineRuleDO record = new UserDefineRuleDO(); @@ -54,14 +53,14 @@ public UserDefineRule findMaxId(Object readset) throws DalException { UserDefineRuleDO result = mapper.findMaxId(record).stream().findFirst().orElse(null); return requireFound(result, "findMaxId", record.toString()); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findMaxId for UserDefineRule.", e); + throw new IllegalStateException("Error when executing findMaxId for UserDefineRule.", e); } } - public int insert(UserDefineRule proto) throws DalException { + public int insert(UserDefineRule proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { @@ -72,23 +71,23 @@ public int insert(UserDefineRule proto) throws DalException { proto.setKeyId(record.getId()); return count; } catch (Exception e) { - throw new DalException("Error when executing insert for UserDefineRule.", e); + throw new IllegalStateException("Error when executing insert for UserDefineRule.", e); } } - public int updateByPK(UserDefineRule proto, Object updateset) throws DalException { + public int updateByPK(UserDefineRule proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for UserDefineRule.", e); + throw new IllegalStateException("Error when executing updateByPK for UserDefineRule.", e); } } - private UserDefineRule requireFound(UserDefineRuleDO record, String field, String value) throws DalNotFoundException { + private UserDefineRule requireFound(UserDefineRuleDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No UserDefineRule found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No UserDefineRule found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-alarm/src/main/resources/META-INF/dal/jdbc/alarm-codegen.xml b/cat-alarm/src/main/resources/META-INF/dal/jdbc/alarm-codegen.xml deleted file mode 100644 index 6b5368fae1..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/jdbc/alarm-codegen.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - FROM - WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - diff --git a/cat-alarm/src/main/resources/META-INF/dal/jdbc/alarm-dal.xml b/cat-alarm/src/main/resources/META-INF/dal/jdbc/alarm-dal.xml deleted file mode 100644 index 9b91486b73..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/jdbc/alarm-dal.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - FROM
- WHERE >= ${start-time} - AND <= ${end-time} - - AND = ${domain} - - ORDER BY desc - ]]> - - - - - - - - FROM
- WHERE >= ${start-time} - AND <= ${end-time} - - AND = ${domain} - - AND in ${categories} - ORDER BY desc - ]]> - - - - - - - - FROM
- WHERE >= ${start-time} - AND <= ${end-time} - - AND = ${category} - - - AND = ${domain} - - ORDER BY asc - ]]> - - - - - - - FROM
- WHERE >= ${start-time} - AND <= ${end-time} - - AND = ${category} - - ORDER BY asc - ]]> - - - - - - - - - - - - - - - FROM
- ]]> - - - - - - - - - - FROM
- ]]> - - - - \ No newline at end of file diff --git a/cat-alarm/src/main/resources/META-INF/dal/jdbc/alarm-manifest.xml b/cat-alarm/src/main/resources/META-INF/dal/jdbc/alarm-manifest.xml deleted file mode 100644 index c0ba94caba..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/jdbc/alarm-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/alert-policy-codegen.xml b/cat-alarm/src/main/resources/META-INF/dal/model/alert-policy-codegen.xml deleted file mode 100644 index cf2eca960b..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/alert-policy-codegen.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/alert-policy-manifest.xml b/cat-alarm/src/main/resources/META-INF/dal/model/alert-policy-manifest.xml deleted file mode 100644 index 56a641db3c..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/alert-policy-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/alert-policy-model.xml b/cat-alarm/src/main/resources/META-INF/dal/model/alert-policy-model.xml deleted file mode 100644 index 830255b107..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/alert-policy-model.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/alert-receiver-codegen.xml b/cat-alarm/src/main/resources/META-INF/dal/model/alert-receiver-codegen.xml deleted file mode 100644 index e087edf599..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/alert-receiver-codegen.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/alert-receiver-manifest.xml b/cat-alarm/src/main/resources/META-INF/dal/model/alert-receiver-manifest.xml deleted file mode 100644 index 6e0178c847..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/alert-receiver-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/alert-receiver-model.xml b/cat-alarm/src/main/resources/META-INF/dal/model/alert-receiver-model.xml deleted file mode 100644 index 01dca8e96a..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/alert-receiver-model.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/monitor-rules-codegen.xml b/cat-alarm/src/main/resources/META-INF/dal/model/monitor-rules-codegen.xml deleted file mode 100644 index f8d095fd1f..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/monitor-rules-codegen.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/monitor-rules-manifest.xml b/cat-alarm/src/main/resources/META-INF/dal/model/monitor-rules-manifest.xml deleted file mode 100644 index 9e58540d66..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/monitor-rules-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/monitor-rules-model.xml b/cat-alarm/src/main/resources/META-INF/dal/model/monitor-rules-model.xml deleted file mode 100644 index e3aecc329e..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/monitor-rules-model.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/sender-config-codegen.xml b/cat-alarm/src/main/resources/META-INF/dal/model/sender-config-codegen.xml deleted file mode 100644 index 5ea2064b0e..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/sender-config-codegen.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/sender-config-manifest.xml b/cat-alarm/src/main/resources/META-INF/dal/model/sender-config-manifest.xml deleted file mode 100644 index b97718d367..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/sender-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/sender-config-model.xml b/cat-alarm/src/main/resources/META-INF/dal/model/sender-config-model.xml deleted file mode 100644 index 3b03a82d0e..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/sender-config-model.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/server-alarm-rule-codegen.xml b/cat-alarm/src/main/resources/META-INF/dal/model/server-alarm-rule-codegen.xml deleted file mode 100644 index 28f49e962a..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/server-alarm-rule-codegen.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/server-alarm-rule-manifest.xml b/cat-alarm/src/main/resources/META-INF/dal/model/server-alarm-rule-manifest.xml deleted file mode 100644 index b24907b32e..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/server-alarm-rule-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-alarm/src/main/resources/META-INF/dal/model/server-alarm-rule-model.xml b/cat-alarm/src/main/resources/META-INF/dal/model/server-alarm-rule-model.xml deleted file mode 100644 index baa7f0c329..0000000000 --- a/cat-alarm/src/main/resources/META-INF/dal/model/server-alarm-rule-model.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-client/pom.xml b/cat-client/pom.xml index 9163891a00..edee9247dc 100644 --- a/cat-client/pom.xml +++ b/cat-client/pom.xml @@ -69,30 +69,7 @@ - - + diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/BaseEntity.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/BaseEntity.java index 62449f88a1..1b184a1d2e 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/BaseEntity.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/BaseEntity.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model; import java.util.Formattable; diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/ClientConfigHelper.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/ClientConfigHelper.java index 2d65870575..2dc39dcfaf 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/ClientConfigHelper.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/ClientConfigHelper.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model; import java.io.BufferedInputStream; diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/Constants.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/Constants.java index a31240037b..1700a897fb 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/Constants.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/Constants.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model; public class Constants { diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/IEntity.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/IEntity.java index 8c9a278a4e..3cac9c9c95 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/IEntity.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/IEntity.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model; public interface IEntity { diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/IVisitor.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/IVisitor.java index 08a780cdcf..368219740c 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/IVisitor.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/IVisitor.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model; import com.dianping.cat.configuration.model.entity.ClientConfig; diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/ClientConfig.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/ClientConfig.java index edce8145f8..a3fd823491 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/ClientConfig.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/ClientConfig.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model.entity; import java.util.ArrayList; diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Domain.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Domain.java index 93068262cd..8a3d33f66b 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Domain.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Domain.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model.entity; import java.util.LinkedHashMap; diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Host.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Host.java index 8763293546..185eee1541 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Host.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Host.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model.entity; import com.dianping.cat.configuration.model.BaseEntity; diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Property.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Property.java index c4332b2bb7..8214c2337f 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Property.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Property.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model.entity; import static com.dianping.cat.configuration.model.Constants.ATTR_NAME; diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Server.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Server.java index 6f0ed9d154..3199de0c79 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Server.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/entity/Server.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model.entity; import static com.dianping.cat.configuration.model.Constants.ATTR_IP; diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/BaseVisitor.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/BaseVisitor.java index bb95cbba5f..a0413c3b69 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/BaseVisitor.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/BaseVisitor.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model.transform; import com.dianping.cat.configuration.model.IVisitor; diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultLinker.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultLinker.java index 729c4a4242..9c39ea28b2 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultLinker.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultLinker.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model.transform; import java.util.ArrayList; diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultXmlBuilder.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultXmlBuilder.java index 651e6fe3d6..18dce7bbe4 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultXmlBuilder.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultXmlBuilder.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model.transform; import static com.dianping.cat.configuration.model.Constants.ATTR_ENABLED; diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultXmlMaker.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultXmlMaker.java index f179bdeecf..e5e643950d 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultXmlMaker.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultXmlMaker.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model.transform; import static com.dianping.cat.configuration.model.Constants.ATTR_ENABLED; diff --git a/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultXmlParser.java b/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultXmlParser.java index ee353a5673..e443a14511 100644 --- a/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultXmlParser.java +++ b/cat-client/src/main/java/com/dianping/cat/configuration/model/transform/DefaultXmlParser.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.configuration.model.transform; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/BaseEntity.java b/cat-client/src/main/java/com/dianping/cat/status/model/BaseEntity.java index be49009095..5a9a7fe1b5 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/BaseEntity.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/BaseEntity.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model; import java.util.Formattable; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/Constants.java b/cat-client/src/main/java/com/dianping/cat/status/model/Constants.java index 884e53685e..14fcbb39e5 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/Constants.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/Constants.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model; public class Constants { diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/IEntity.java b/cat-client/src/main/java/com/dianping/cat/status/model/IEntity.java index 419e36927b..e13884169a 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/IEntity.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/IEntity.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model; public interface IEntity { diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/IVisitor.java b/cat-client/src/main/java/com/dianping/cat/status/model/IVisitor.java index 423f6f3617..2f01407b84 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/IVisitor.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/IVisitor.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model; import com.dianping.cat.status.model.entity.DiskInfo; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/StatusInfoHelper.java b/cat-client/src/main/java/com/dianping/cat/status/model/StatusInfoHelper.java index defdd84b16..465a6a7d61 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/StatusInfoHelper.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/StatusInfoHelper.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model; import java.io.BufferedInputStream; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/entity/DiskInfo.java b/cat-client/src/main/java/com/dianping/cat/status/model/entity/DiskInfo.java index d956979a73..22159c179d 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/entity/DiskInfo.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/entity/DiskInfo.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.entity; import java.util.ArrayList; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/entity/DiskVolumeInfo.java b/cat-client/src/main/java/com/dianping/cat/status/model/entity/DiskVolumeInfo.java index 66d1ea48e6..4dd1f46862 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/entity/DiskVolumeInfo.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/entity/DiskVolumeInfo.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.entity; import static com.dianping.cat.status.model.Constants.ATTR_ID; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/entity/Extension.java b/cat-client/src/main/java/com/dianping/cat/status/model/entity/Extension.java index ffce6768d6..cf5935300c 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/entity/Extension.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/entity/Extension.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.entity; import static com.dianping.cat.status.model.Constants.ATTR_ID; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/entity/ExtensionDetail.java b/cat-client/src/main/java/com/dianping/cat/status/model/entity/ExtensionDetail.java index 768fdd0d2c..3c3709201e 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/entity/ExtensionDetail.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/entity/ExtensionDetail.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.entity; import static com.dianping.cat.status.model.Constants.ATTR_ID; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/entity/GcInfo.java b/cat-client/src/main/java/com/dianping/cat/status/model/entity/GcInfo.java index 338da6c3b4..4599440e2c 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/entity/GcInfo.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/entity/GcInfo.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.entity; import com.dianping.cat.status.model.BaseEntity; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/entity/MemoryInfo.java b/cat-client/src/main/java/com/dianping/cat/status/model/entity/MemoryInfo.java index 381972dc9a..a948abc902 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/entity/MemoryInfo.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/entity/MemoryInfo.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.entity; import java.util.ArrayList; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/entity/MessageInfo.java b/cat-client/src/main/java/com/dianping/cat/status/model/entity/MessageInfo.java index 33900e2a65..f625657863 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/entity/MessageInfo.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/entity/MessageInfo.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.entity; import com.dianping.cat.status.model.BaseEntity; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/entity/OsInfo.java b/cat-client/src/main/java/com/dianping/cat/status/model/entity/OsInfo.java index e35ec729a3..18d1862846 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/entity/OsInfo.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/entity/OsInfo.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.entity; import com.dianping.cat.status.model.BaseEntity; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/entity/RuntimeInfo.java b/cat-client/src/main/java/com/dianping/cat/status/model/entity/RuntimeInfo.java index ccf65ced17..81a334c26a 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/entity/RuntimeInfo.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/entity/RuntimeInfo.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.entity; import com.dianping.cat.status.model.BaseEntity; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/entity/StatusInfo.java b/cat-client/src/main/java/com/dianping/cat/status/model/entity/StatusInfo.java index a59a7a5bfe..33cb65c54d 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/entity/StatusInfo.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/entity/StatusInfo.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.entity; import java.util.LinkedHashMap; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/entity/ThreadsInfo.java b/cat-client/src/main/java/com/dianping/cat/status/model/entity/ThreadsInfo.java index 230686ba94..ccdff075c0 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/entity/ThreadsInfo.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/entity/ThreadsInfo.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.entity; import com.dianping.cat.status.model.BaseEntity; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/transform/BaseVisitor.java b/cat-client/src/main/java/com/dianping/cat/status/model/transform/BaseVisitor.java index b934dc0c08..8993988693 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/transform/BaseVisitor.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/transform/BaseVisitor.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.transform; import com.dianping.cat.status.model.IVisitor; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultLinker.java b/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultLinker.java index 7f1745e37d..6edb0c97b4 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultLinker.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultLinker.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.transform; import java.util.ArrayList; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultXmlBuilder.java b/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultXmlBuilder.java index 363fbf842b..933975d71d 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultXmlBuilder.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultXmlBuilder.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.transform; import static com.dianping.cat.status.model.Constants.ATTR_ARCH; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultXmlMaker.java b/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultXmlMaker.java index 8543cd4975..b6781a723d 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultXmlMaker.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultXmlMaker.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.transform; import static com.dianping.cat.status.model.Constants.ATTR_ARCH; diff --git a/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultXmlParser.java b/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultXmlParser.java index e7bbb09321..d8f56e9792 100644 --- a/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultXmlParser.java +++ b/cat-client/src/main/java/com/dianping/cat/status/model/transform/DefaultXmlParser.java @@ -1,4 +1,3 @@ -/* THIS FILE WAS AUTO GENERATED BY codegen-maven-plugin, DO NOT EDIT IT */ package com.dianping.cat.status.model.transform; import static com.dianping.cat.status.model.Constants.ELEMENT_DESCRIPTION; diff --git a/cat-consumer/pom.xml b/cat-consumer/pom.xml index 5849db6c6e..3d83e4cd58 100644 --- a/cat-consumer/pom.xml +++ b/cat-consumer/pom.xml @@ -52,39 +52,7 @@ - - - - org.unidal.maven.plugins - codegen-maven-plugin - - - generate report models - generate-sources - - dal-model - - - ${basedir}/src/main/resources/META-INF/dal/model/transaction-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/all-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/event-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/problem-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/heartbeat-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/state-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/top-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/cross-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/matrix-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/dependency-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/storage-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/business-report-manifest.xml, - - - - - - - - + utf-8 diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/BaseEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/BaseEntity.java new file mode 100644 index 0000000000..2275930772 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.consumer.all.config; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.consumer.all.config.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/Constants.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/Constants.java new file mode 100644 index 0000000000..0be1d6a2ac --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/Constants.java @@ -0,0 +1,20 @@ +package com.dianping.cat.consumer.all.config; + +public class Constants { + + public static final String ATTR_ID = "id"; + + public static final String ENTITY_ALL_CONFIG = "all-config"; + + public static final String ENTITY_NAME = "name"; + + public static final String ENTITY_NAMELIST = "nameList"; + + public static final String ENTITY_REPORT = "report"; + + public static final String ENTITY_REPORTS = "reports"; + + public static final String ENTITY_TYPE = "type"; + + public static final String ENTITY_TYPES = "types"; +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/IEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/IEntity.java new file mode 100644 index 0000000000..fc34fca96d --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.consumer.all.config; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/IVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/IVisitor.java new file mode 100644 index 0000000000..5bd15447d5 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/IVisitor.java @@ -0,0 +1,17 @@ +package com.dianping.cat.consumer.all.config; + +import com.dianping.cat.consumer.all.config.entity.AllConfig; +import com.dianping.cat.consumer.all.config.entity.Name; +import com.dianping.cat.consumer.all.config.entity.Report; +import com.dianping.cat.consumer.all.config.entity.Type; + +public interface IVisitor { + + public void visitAllConfig(AllConfig allConfig); + + public void visitName(Name name); + + public void visitReport(Report report); + + public void visitType(Type type); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/AllConfig.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/AllConfig.java new file mode 100644 index 0000000000..8a554d4daf --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/AllConfig.java @@ -0,0 +1,83 @@ +package com.dianping.cat.consumer.all.config.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.all.config.BaseEntity; +import com.dianping.cat.consumer.all.config.IVisitor; + +public class AllConfig extends BaseEntity { + private Map m_reports = new LinkedHashMap(); + + public AllConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitAllConfig(this); + } + + public AllConfig addReport(Report report) { + m_reports.put(report.getId(), report); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AllConfig) { + AllConfig _o = (AllConfig) obj; + + if (!equals(getReports(), _o.getReports())) { + return false; + } + + + return true; + } + + return false; + } + + public Report findReport(String id) { + return m_reports.get(id); + } + + public Report findOrCreateReport(String id) { + Report report = m_reports.get(id); + + if (report == null) { + synchronized (m_reports) { + report = m_reports.get(id); + + if (report == null) { + report = new Report(id); + m_reports.put(id, report); + } + } + } + + return report; + } + + public Map getReports() { + return m_reports; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_reports == null ? 0 : m_reports.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(AllConfig other) { + } + + public Report removeReport(String id) { + return m_reports.remove(id); + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/Name.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/Name.java new file mode 100644 index 0000000000..a7d22b75d4 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/Name.java @@ -0,0 +1,58 @@ +package com.dianping.cat.consumer.all.config.entity; + +import com.dianping.cat.consumer.all.config.BaseEntity; +import com.dianping.cat.consumer.all.config.IVisitor; + +public class Name extends BaseEntity { + private String m_id; + + public Name() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitName(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Name) { + Name _o = (Name) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Name other) { + if (other.getId() != null) { + m_id = other.getId(); + } + } + + public Name setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/Report.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/Report.java new file mode 100644 index 0000000000..fb5fba7151 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/Report.java @@ -0,0 +1,102 @@ +package com.dianping.cat.consumer.all.config.entity; + +import static com.dianping.cat.consumer.all.config.Constants.ATTR_ID; +import static com.dianping.cat.consumer.all.config.Constants.ENTITY_REPORT; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.all.config.BaseEntity; +import com.dianping.cat.consumer.all.config.IVisitor; + +public class Report extends BaseEntity { + private String m_id; + + private Map m_types = new LinkedHashMap(); + + public Report() { + } + + public Report(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitReport(this); + } + + public Report addType(Type type) { + m_types.put(type.getId(), type); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Report) { + Report _o = (Report) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Type findType(String id) { + return m_types.get(id); + } + + public Type findOrCreateType(String id) { + Type type = m_types.get(id); + + if (type == null) { + synchronized (m_types) { + type = m_types.get(id); + + if (type == null) { + type = new Type(id); + m_types.put(id, type); + } + } + } + + return type; + } + + public String getId() { + return m_id; + } + + public Map getTypes() { + return m_types; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Report other) { + assertAttributeEquals(other, ENTITY_REPORT, ATTR_ID, m_id, other.getId()); + + } + + public Type removeType(String id) { + return m_types.remove(id); + } + + public Report setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/Type.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/Type.java new file mode 100644 index 0000000000..ea38397209 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/entity/Type.java @@ -0,0 +1,77 @@ +package com.dianping.cat.consumer.all.config.entity; + +import static com.dianping.cat.consumer.all.config.Constants.ATTR_ID; +import static com.dianping.cat.consumer.all.config.Constants.ENTITY_TYPE; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.consumer.all.config.BaseEntity; +import com.dianping.cat.consumer.all.config.IVisitor; + +public class Type extends BaseEntity { + private String m_id; + + private List m_nameList = new ArrayList(); + + public Type() { + } + + public Type(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitType(this); + } + + public Type addName(Name name) { + m_nameList.add(name); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Type) { + Type _o = (Type) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + public List getNameList() { + return m_nameList; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Type other) { + assertAttributeEquals(other, ENTITY_TYPE, ATTR_ID, m_id, other.getId()); + + } + + public Type setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/BaseVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/BaseVisitor.java new file mode 100644 index 0000000000..ebcc5ccc49 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/BaseVisitor.java @@ -0,0 +1,34 @@ +package com.dianping.cat.consumer.all.config.transform; + +import com.dianping.cat.consumer.all.config.IVisitor; +import com.dianping.cat.consumer.all.config.entity.AllConfig; +import com.dianping.cat.consumer.all.config.entity.Name; +import com.dianping.cat.consumer.all.config.entity.Report; +import com.dianping.cat.consumer.all.config.entity.Type; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitAllConfig(AllConfig allConfig) { + for (Report report : allConfig.getReports().values()) { + visitReport(report); + } + } + + @Override + public void visitName(Name name) { + } + + @Override + public void visitReport(Report report) { + for (Type type : report.getTypes().values()) { + visitType(type); + } + } + + @Override + public void visitType(Type type) { + for (Name name : type.getNameList()) { + visitName(name); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultLinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultLinker.java new file mode 100644 index 0000000000..f2036cd6f7 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultLinker.java @@ -0,0 +1,62 @@ +package com.dianping.cat.consumer.all.config.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.consumer.all.config.entity.AllConfig; +import com.dianping.cat.consumer.all.config.entity.Name; +import com.dianping.cat.consumer.all.config.entity.Report; +import com.dianping.cat.consumer.all.config.entity.Type; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onName(final Type parent, final Name name) { + parent.addName(name); + return true; + } + + @Override + public boolean onReport(final AllConfig parent, final Report report) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addReport(report); + } + }); + } else { + parent.addReport(report); + } + + return true; + } + + @Override + public boolean onType(final Report parent, final Type type) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addType(type); + } + }); + } else { + parent.addType(type); + } + + return true; + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultMerger.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultMerger.java new file mode 100644 index 0000000000..09d26d999d --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultMerger.java @@ -0,0 +1,135 @@ +package com.dianping.cat.consumer.all.config.transform; + +import java.util.Stack; + +import com.dianping.cat.consumer.all.config.IEntity; +import com.dianping.cat.consumer.all.config.IVisitor; +import com.dianping.cat.consumer.all.config.entity.AllConfig; +import com.dianping.cat.consumer.all.config.entity.Name; +import com.dianping.cat.consumer.all.config.entity.Report; +import com.dianping.cat.consumer.all.config.entity.Type; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private AllConfig m_allConfig; + + public DefaultMerger() { + } + + public DefaultMerger(AllConfig allConfig) { + m_allConfig = allConfig; + m_objs.push(allConfig); + } + + public AllConfig getAllConfig() { + return m_allConfig; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeAllConfig(AllConfig to, AllConfig from) { + to.mergeAttributes(from); + } + + protected void mergeName(Name to, Name from) { + to.mergeAttributes(from); + } + + protected void mergeReport(Report to, Report from) { + to.mergeAttributes(from); + } + + protected void mergeType(Type to, Type from) { + to.mergeAttributes(from); + } + + @Override + public void visitAllConfig(AllConfig from) { + AllConfig to = (AllConfig) m_objs.peek(); + + mergeAllConfig(to, from); + visitAllConfigChildren(to, from); + } + + protected void visitAllConfigChildren(AllConfig to, AllConfig from) { + for (Report source : from.getReports().values()) { + Report target = to.findReport(source.getId()); + + if (target == null) { + target = new Report(source.getId()); + to.addReport(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitName(Name from) { + Name to = (Name) m_objs.peek(); + + mergeName(to, from); + visitNameChildren(to, from); + } + + protected void visitNameChildren(Name to, Name from) { + } + + @Override + public void visitReport(Report from) { + Report to = (Report) m_objs.peek(); + + mergeReport(to, from); + visitReportChildren(to, from); + } + + protected void visitReportChildren(Report to, Report from) { + for (Type source : from.getTypes().values()) { + Type target = to.findType(source.getId()); + + if (target == null) { + target = new Type(source.getId()); + to.addType(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitType(Type from) { + Type to = (Type) m_objs.peek(); + + mergeType(to, from); + visitTypeChildren(to, from); + } + + protected void visitTypeChildren(Type to, Type from) { + for (Name source : from.getNameList()) { + Name target = null; + + if (target == null) { + target = new Name(); + to.addName(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultSaxMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..fec57e64de --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultSaxMaker.java @@ -0,0 +1,75 @@ +package com.dianping.cat.consumer.all.config.transform; + +import static com.dianping.cat.consumer.all.config.Constants.ATTR_ID; + +import org.xml.sax.Attributes; + +import com.dianping.cat.consumer.all.config.entity.AllConfig; +import com.dianping.cat.consumer.all.config.entity.Name; +import com.dianping.cat.consumer.all.config.entity.Report; +import com.dianping.cat.consumer.all.config.entity.Type; + +public class DefaultSaxMaker implements IMaker { + + @Override + public AllConfig buildAllConfig(Attributes attributes) { + AllConfig allConfig = new AllConfig(); + + return allConfig; + } + + @Override + public Name buildName(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Name name = new Name(); + + if (id != null) { + name.setId(id); + } + + return name; + } + + @Override + public Report buildReport(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Report report = new Report(id); + + return report; + } + + @Override + public Type buildType(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Type type = new Type(id); + + return type; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultSaxParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..f4b2d70c14 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultSaxParser.java @@ -0,0 +1,273 @@ +package com.dianping.cat.consumer.all.config.transform; + +import static com.dianping.cat.consumer.all.config.Constants.ENTITY_ALL_CONFIG; +import static com.dianping.cat.consumer.all.config.Constants.ENTITY_NAME; +import static com.dianping.cat.consumer.all.config.Constants.ENTITY_REPORT; +import static com.dianping.cat.consumer.all.config.Constants.ENTITY_TYPE; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.consumer.all.config.IEntity; +import com.dianping.cat.consumer.all.config.entity.AllConfig; +import com.dianping.cat.consumer.all.config.entity.Name; +import com.dianping.cat.consumer.all.config.entity.Report; +import com.dianping.cat.consumer.all.config.entity.Type; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static AllConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(AllConfig.class, new InputSource(removeBOM(in))); + } + + public static AllConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(AllConfig.class, new InputSource(removeBOM(reader))); + } + + public static AllConfig parse(String xml) throws SAXException, IOException { + return parseEntity(AllConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForAllConfig(AllConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_REPORT.equals(qName)) { + Report report = m_maker.buildReport(attributes); + + m_linker.onReport(parentObj, report); + m_objs.push(report); + } else { + throw new SAXException(String.format("Element(%s) is not expected under all-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseForName(Name parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForReport(Report parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_TYPE.equals(qName)) { + Type type = m_maker.buildType(attributes); + + m_linker.onType(parentObj, type); + m_objs.push(type); + } else { + throw new SAXException(String.format("Element(%s) is not expected under report!", qName)); + } + + m_tags.push(qName); + } + + private void parseForType(Type parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_NAME.equals(qName)) { + Name name = m_maker.buildName(attributes); + + m_linker.onName(parentObj, name); + m_objs.push(name); + } else { + throw new SAXException(String.format("Element(%s) is not expected under type!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_ALL_CONFIG.equals(qName)) { + AllConfig allConfig = m_maker.buildAllConfig(attributes); + + m_entity = allConfig; + m_objs.push(allConfig); + m_tags.push(qName); + } else if (ENTITY_REPORT.equals(qName)) { + Report report = m_maker.buildReport(attributes); + + m_entity = report; + m_objs.push(report); + m_tags.push(qName); + } else if (ENTITY_TYPE.equals(qName)) { + Type type = m_maker.buildType(attributes); + + m_entity = type; + m_objs.push(type); + m_tags.push(qName); + } else if (ENTITY_NAME.equals(qName)) { + Name name = m_maker.buildName(attributes); + + m_entity = name; + m_objs.push(name); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof AllConfig) { + parseForAllConfig((AllConfig) parent, tag, qName, attributes); + } else if (parent instanceof Report) { + parseForReport((Report) parent, tag, qName, attributes); + } else if (parent instanceof Type) { + parseForType((Type) parent, tag, qName, attributes); + } else if (parent instanceof Name) { + parseForName((Name) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultXmlBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..c267dea041 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/DefaultXmlBuilder.java @@ -0,0 +1,242 @@ +package com.dianping.cat.consumer.all.config.transform; + +import static com.dianping.cat.consumer.all.config.Constants.ATTR_ID; +import static com.dianping.cat.consumer.all.config.Constants.ENTITY_ALL_CONFIG; +import static com.dianping.cat.consumer.all.config.Constants.ENTITY_NAME; +import static com.dianping.cat.consumer.all.config.Constants.ENTITY_REPORT; +import static com.dianping.cat.consumer.all.config.Constants.ENTITY_TYPE; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.consumer.all.config.IEntity; +import com.dianping.cat.consumer.all.config.IVisitor; +import com.dianping.cat.consumer.all.config.entity.AllConfig; +import com.dianping.cat.consumer.all.config.entity.Name; +import com.dianping.cat.consumer.all.config.entity.Report; +import com.dianping.cat.consumer.all.config.entity.Type; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitAllConfig(AllConfig allConfig) { + startTag(ENTITY_ALL_CONFIG, null); + + if (!allConfig.getReports().isEmpty()) { + for (Report report : allConfig.getReports().values()) { + report.accept(m_visitor); + } + } + + endTag(ENTITY_ALL_CONFIG); + } + + @Override + public void visitName(Name name) { + startTag(ENTITY_NAME, true, null, ATTR_ID, name.getId()); + } + + @Override + public void visitReport(Report report) { + startTag(ENTITY_REPORT, null, ATTR_ID, report.getId()); + + if (!report.getTypes().isEmpty()) { + for (Type type : report.getTypes().values()) { + type.accept(m_visitor); + } + } + + endTag(ENTITY_REPORT); + } + + @Override + public void visitType(Type type) { + startTag(ENTITY_TYPE, null, ATTR_ID, type.getId()); + + if (!type.getNameList().isEmpty()) { + for (Name name : type.getNameList()) { + name.accept(m_visitor); + } + } + + endTag(ENTITY_TYPE); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/ILinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/ILinker.java new file mode 100644 index 0000000000..73f49b5aa5 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/ILinker.java @@ -0,0 +1,15 @@ +package com.dianping.cat.consumer.all.config.transform; + +import com.dianping.cat.consumer.all.config.entity.AllConfig; +import com.dianping.cat.consumer.all.config.entity.Name; +import com.dianping.cat.consumer.all.config.entity.Report; +import com.dianping.cat.consumer.all.config.entity.Type; + +public interface ILinker { + + public boolean onName(Type parent, Name name); + + public boolean onReport(AllConfig parent, Report report); + + public boolean onType(Report parent, Type type); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/IMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/IMaker.java new file mode 100644 index 0000000000..0e423f378a --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/IMaker.java @@ -0,0 +1,17 @@ +package com.dianping.cat.consumer.all.config.transform; + +import com.dianping.cat.consumer.all.config.entity.AllConfig; +import com.dianping.cat.consumer.all.config.entity.Name; +import com.dianping.cat.consumer.all.config.entity.Report; +import com.dianping.cat.consumer.all.config.entity.Type; + +public interface IMaker { + + public AllConfig buildAllConfig(T node); + + public Name buildName(T node); + + public Report buildReport(T node); + + public Type buildType(T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/IParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/IParser.java new file mode 100644 index 0000000000..5c4f43fc2f --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/all/config/transform/IParser.java @@ -0,0 +1,16 @@ +package com.dianping.cat.consumer.all.config.transform; + +import com.dianping.cat.consumer.all.config.entity.AllConfig; +import com.dianping.cat.consumer.all.config.entity.Name; +import com.dianping.cat.consumer.all.config.entity.Report; +import com.dianping.cat.consumer.all.config.entity.Type; + +public interface IParser { + public AllConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForName(IMaker maker, ILinker linker, Name parent, T node); + + public void parseForReport(IMaker maker, ILinker linker, Report parent, T node); + + public void parseForType(IMaker maker, ILinker linker, Type parent, T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/BaseEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/BaseEntity.java new file mode 100644 index 0000000000..24ee9b5b06 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.consumer.business.model; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.consumer.business.model.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/Constants.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/Constants.java new file mode 100644 index 0000000000..7a335a0b2f --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/Constants.java @@ -0,0 +1,30 @@ +package com.dianping.cat.consumer.business.model; + +public class Constants { + + public static final String ATTR_AVG = "avg"; + + public static final String ATTR_COUNT = "count"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ATTR_SUM = "sum"; + + public static final String ATTR_TYPE = "type"; + + public static final String ENTITY_BUSINESS_ITEM = "business-item"; + + public static final String ENTITY_BUSINESS_ITEMS = "business-items"; + + public static final String ENTITY_BUSINESS_REPORT = "business-report"; + + public static final String ENTITY_SEGMENT = "segment"; + + public static final String ENTITY_SEGMENTS = "segments"; +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/IEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/IEntity.java new file mode 100644 index 0000000000..57ae3e2c92 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.consumer.business.model; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/IVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/IVisitor.java new file mode 100644 index 0000000000..91b9863510 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.consumer.business.model; + +import com.dianping.cat.consumer.business.model.entity.BusinessItem; +import com.dianping.cat.consumer.business.model.entity.BusinessReport; +import com.dianping.cat.consumer.business.model.entity.Segment; + +public interface IVisitor { + + public void visitBusinessItem(BusinessItem businessItem); + + public void visitBusinessReport(BusinessReport businessReport); + + public void visitSegment(Segment segment); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/entity/BusinessItem.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/entity/BusinessItem.java new file mode 100644 index 0000000000..27abe619ce --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/entity/BusinessItem.java @@ -0,0 +1,116 @@ +package com.dianping.cat.consumer.business.model.entity; + +import static com.dianping.cat.consumer.business.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.business.model.Constants.ENTITY_BUSINESS_ITEM; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.business.model.BaseEntity; +import com.dianping.cat.consumer.business.model.IVisitor; + +public class BusinessItem extends BaseEntity { + private String m_id; + + private String m_type; + + private Map m_segments = new LinkedHashMap(); + + public BusinessItem() { + } + + public BusinessItem(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitBusinessItem(this); + } + + public BusinessItem addSegment(Segment segment) { + m_segments.put(segment.getId(), segment); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof BusinessItem) { + BusinessItem _o = (BusinessItem) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Segment findSegment(Integer id) { + return m_segments.get(id); + } + + public Segment findOrCreateSegment(Integer id) { + Segment segment = m_segments.get(id); + + if (segment == null) { + synchronized (m_segments) { + segment = m_segments.get(id); + + if (segment == null) { + segment = new Segment(id); + m_segments.put(id, segment); + } + } + } + + return segment; + } + + public String getId() { + return m_id; + } + + public Map getSegments() { + return m_segments; + } + + public String getType() { + return m_type; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(BusinessItem other) { + assertAttributeEquals(other, ENTITY_BUSINESS_ITEM, ATTR_ID, m_id, other.getId()); + + if (other.getType() != null) { + m_type = other.getType(); + } + } + + public Segment removeSegment(Integer id) { + return m_segments.remove(id); + } + + public BusinessItem setId(String id) { + m_id = id; + return this; + } + + public BusinessItem setType(String type) { + m_type = type; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/entity/BusinessReport.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/entity/BusinessReport.java new file mode 100644 index 0000000000..e860700f91 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/entity/BusinessReport.java @@ -0,0 +1,131 @@ +package com.dianping.cat.consumer.business.model.entity; + +import static com.dianping.cat.consumer.business.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.business.model.Constants.ENTITY_BUSINESS_REPORT; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.business.model.BaseEntity; +import com.dianping.cat.consumer.business.model.IVisitor; + +public class BusinessReport extends BaseEntity { + private String m_domain; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Map m_businessItems = new LinkedHashMap(); + + public BusinessReport() { + } + + public BusinessReport(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitBusinessReport(this); + } + + public BusinessReport addBusinessItem(BusinessItem businessItem) { + m_businessItems.put(businessItem.getId(), businessItem); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof BusinessReport) { + BusinessReport _o = (BusinessReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public BusinessItem findBusinessItem(String id) { + return m_businessItems.get(id); + } + + public BusinessItem findOrCreateBusinessItem(String id) { + BusinessItem businessItem = m_businessItems.get(id); + + if (businessItem == null) { + synchronized (m_businessItems) { + businessItem = m_businessItems.get(id); + + if (businessItem == null) { + businessItem = new BusinessItem(id); + m_businessItems.put(id, businessItem); + } + } + } + + return businessItem; + } + + public Map getBusinessItems() { + return m_businessItems; + } + + public String getDomain() { + return m_domain; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(BusinessReport other) { + assertAttributeEquals(other, ENTITY_BUSINESS_REPORT, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public BusinessItem removeBusinessItem(String id) { + return m_businessItems.remove(id); + } + + public BusinessReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public BusinessReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public BusinessReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/entity/Segment.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/entity/Segment.java new file mode 100644 index 0000000000..f357d1bcf3 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/entity/Segment.java @@ -0,0 +1,121 @@ +package com.dianping.cat.consumer.business.model.entity; + +import static com.dianping.cat.consumer.business.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.business.model.Constants.ENTITY_SEGMENT; + +import com.dianping.cat.consumer.business.model.BaseEntity; +import com.dianping.cat.consumer.business.model.IVisitor; + +public class Segment extends BaseEntity { + private Integer m_id; + + private int m_count; + + private double m_sum; + + private double m_avg; + + public Segment() { + } + + public Segment(Integer id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitSegment(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Segment) { + Segment _o = (Segment) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public double getAvg() { + return m_avg; + } + + public int getCount() { + return m_count; + } + + public Integer getId() { + return m_id; + } + + public double getSum() { + return m_sum; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public Segment incCount() { + m_count++; + return this; + } + + public Segment incCount(int count) { + m_count += count; + return this; + } + + public Segment incSum() { + m_sum++; + return this; + } + + public Segment incSum(double sum) { + m_sum += sum; + return this; + } + + @Override + public void mergeAttributes(Segment other) { + assertAttributeEquals(other, ENTITY_SEGMENT, ATTR_ID, m_id, other.getId()); + + m_count = other.getCount(); + + m_sum = other.getSum(); + + m_avg = other.getAvg(); + } + + public Segment setAvg(double avg) { + m_avg = avg; + return this; + } + + public Segment setCount(int count) { + m_count = count; + return this; + } + + public Segment setId(Integer id) { + m_id = id; + return this; + } + + public Segment setSum(double sum) { + m_sum = sum; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/BaseVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/BaseVisitor.java new file mode 100644 index 0000000000..05f15bff72 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/BaseVisitor.java @@ -0,0 +1,26 @@ +package com.dianping.cat.consumer.business.model.transform; + +import com.dianping.cat.consumer.business.model.IVisitor; +import com.dianping.cat.consumer.business.model.entity.BusinessItem; +import com.dianping.cat.consumer.business.model.entity.BusinessReport; +import com.dianping.cat.consumer.business.model.entity.Segment; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitBusinessItem(BusinessItem businessItem) { + for (Segment segment : businessItem.getSegments().values()) { + visitSegment(segment); + } + } + + @Override + public void visitBusinessReport(BusinessReport businessReport) { + for (BusinessItem businessItem : businessReport.getBusinessItems().values()) { + visitBusinessItem(businessItem); + } + } + + @Override + public void visitSegment(Segment segment) { + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultLinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultLinker.java new file mode 100644 index 0000000000..282b81946d --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultLinker.java @@ -0,0 +1,55 @@ +package com.dianping.cat.consumer.business.model.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.consumer.business.model.entity.BusinessItem; +import com.dianping.cat.consumer.business.model.entity.BusinessReport; +import com.dianping.cat.consumer.business.model.entity.Segment; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onBusinessItem(final BusinessReport parent, final BusinessItem businessItem) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addBusinessItem(businessItem); + } + }); + } else { + parent.addBusinessItem(businessItem); + } + + return true; + } + + @Override + public boolean onSegment(final BusinessItem parent, final Segment segment) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addSegment(segment); + } + }); + } else { + parent.addSegment(segment); + } + + return true; + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultMerger.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultMerger.java new file mode 100644 index 0000000000..0d0ac2560f --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultMerger.java @@ -0,0 +1,107 @@ +package com.dianping.cat.consumer.business.model.transform; + +import java.util.Stack; + +import com.dianping.cat.consumer.business.model.IEntity; +import com.dianping.cat.consumer.business.model.IVisitor; +import com.dianping.cat.consumer.business.model.entity.BusinessItem; +import com.dianping.cat.consumer.business.model.entity.BusinessReport; +import com.dianping.cat.consumer.business.model.entity.Segment; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private BusinessReport m_businessReport; + + public DefaultMerger() { + } + + public DefaultMerger(BusinessReport businessReport) { + m_businessReport = businessReport; + m_objs.push(businessReport); + } + + public BusinessReport getBusinessReport() { + return m_businessReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeBusinessItem(BusinessItem to, BusinessItem from) { + to.mergeAttributes(from); + } + + protected void mergeBusinessReport(BusinessReport to, BusinessReport from) { + to.mergeAttributes(from); + } + + protected void mergeSegment(Segment to, Segment from) { + to.mergeAttributes(from); + } + + @Override + public void visitBusinessItem(BusinessItem from) { + BusinessItem to = (BusinessItem) m_objs.peek(); + + mergeBusinessItem(to, from); + visitBusinessItemChildren(to, from); + } + + protected void visitBusinessItemChildren(BusinessItem to, BusinessItem from) { + for (Segment source : from.getSegments().values()) { + Segment target = to.findSegment(source.getId()); + + if (target == null) { + target = new Segment(source.getId()); + to.addSegment(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitBusinessReport(BusinessReport from) { + BusinessReport to = (BusinessReport) m_objs.peek(); + + mergeBusinessReport(to, from); + visitBusinessReportChildren(to, from); + } + + protected void visitBusinessReportChildren(BusinessReport to, BusinessReport from) { + for (BusinessItem source : from.getBusinessItems().values()) { + BusinessItem target = to.findBusinessItem(source.getId()); + + if (target == null) { + target = new BusinessItem(source.getId()); + to.addBusinessItem(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitSegment(Segment from) { + Segment to = (Segment) m_objs.peek(); + + mergeSegment(to, from); + visitSegmentChildren(to, from); + } + + protected void visitSegmentChildren(Segment to, Segment from) { + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultNativeBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..46a64e4ba7 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultNativeBuilder.java @@ -0,0 +1,164 @@ +package com.dianping.cat.consumer.business.model.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.consumer.business.model.IVisitor; +import com.dianping.cat.consumer.business.model.entity.BusinessItem; +import com.dianping.cat.consumer.business.model.entity.BusinessReport; +import com.dianping.cat.consumer.business.model.entity.Segment; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(BusinessReport businessReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(businessReport, out); + return out.toByteArray(); + } + + public static void build(BusinessReport businessReport, OutputStream out) { + businessReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitBusinessItem(BusinessItem businessItem) { + if (businessItem.getId() != null) { + writeTag(1, 1); + writeString(businessItem.getId()); + } + + if (businessItem.getType() != null) { + writeTag(2, 1); + writeString(businessItem.getType()); + } + + if (!businessItem.getSegments().isEmpty()) { + writeTag(33, 2); + writeInt(businessItem.getSegments().size()); + + for (Segment segment : businessItem.getSegments().values()) { + segment.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitBusinessReport(BusinessReport businessReport) { + writeTag(63, 0); + + if (businessReport.getDomain() != null) { + writeTag(1, 1); + writeString(businessReport.getDomain()); + } + + if (businessReport.getStartTime() != null) { + writeTag(2, 1); + writeDate(businessReport.getStartTime()); + } + + if (businessReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(businessReport.getEndTime()); + } + + if (!businessReport.getBusinessItems().isEmpty()) { + writeTag(33, 2); + writeInt(businessReport.getBusinessItems().size()); + + for (BusinessItem businessItem : businessReport.getBusinessItems().values()) { + businessItem.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitSegment(Segment segment) { + if (segment.getId() != null) { + writeTag(1, 1); + writeInt(segment.getId()); + } + + writeTag(2, 0); + writeInt(segment.getCount()); + + writeTag(3, 0); + writeDouble(segment.getSum()); + + writeTag(4, 0); + writeDouble(segment.getAvg()); + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeDouble(double value) { + try { + writeVarint(Double.doubleToLongBits(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultNativeParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..399046a516 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultNativeParser.java @@ -0,0 +1,203 @@ +package com.dianping.cat.consumer.business.model.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.consumer.business.model.IVisitor; +import com.dianping.cat.consumer.business.model.entity.BusinessItem; +import com.dianping.cat.consumer.business.model.entity.BusinessReport; +import com.dianping.cat.consumer.business.model.entity.Segment; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static BusinessReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static BusinessReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + BusinessReport businessReport = new BusinessReport(); + + try { + businessReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return businessReport; + } + + @Override + public void visitBusinessItem(BusinessItem businessItem) { + byte tag; + + while ((tag = readTag()) != -1) { + visitBusinessItemChildren(businessItem, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitBusinessItemChildren(BusinessItem businessItem, int _field, int _type) { + switch (_field) { + case 1: + businessItem.setId(readString()); + break; + case 2: + businessItem.setType(readString()); + break; + case 33: + if (_type == 1) { + Segment segment = new Segment(); + + visitSegment(segment); + m_linker.onSegment(businessItem, segment); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Segment segment = new Segment(); + + visitSegment(segment); + m_linker.onSegment(businessItem, segment); + } + } + break; + } + } + + @Override + public void visitBusinessReport(BusinessReport businessReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitBusinessReportChildren(businessReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitBusinessReportChildren(BusinessReport businessReport, int _field, int _type) { + switch (_field) { + case 1: + businessReport.setDomain(readString()); + break; + case 2: + businessReport.setStartTime(readDate()); + break; + case 3: + businessReport.setEndTime(readDate()); + break; + case 33: + if (_type == 1) { + BusinessItem businessItem = new BusinessItem(); + + visitBusinessItem(businessItem); + m_linker.onBusinessItem(businessReport, businessItem); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + BusinessItem businessItem = new BusinessItem(); + + visitBusinessItem(businessItem); + m_linker.onBusinessItem(businessReport, businessItem); + } + } + break; + } + } + + @Override + public void visitSegment(Segment segment) { + byte tag; + + while ((tag = readTag()) != -1) { + visitSegmentChildren(segment, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitSegmentChildren(Segment segment, int _field, int _type) { + switch (_field) { + case 1: + segment.setId(readInt()); + break; + case 2: + segment.setCount(readInt()); + break; + case 3: + segment.setSum(readDouble()); + break; + case 4: + segment.setAvg(readDouble()); + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private double readDouble() { + try { + return Double.longBitsToDouble(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultSaxMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..2b219631ce --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultSaxMaker.java @@ -0,0 +1,112 @@ +package com.dianping.cat.consumer.business.model.transform; + +import static com.dianping.cat.consumer.business.model.Constants.ATTR_AVG; +import static com.dianping.cat.consumer.business.model.Constants.ATTR_COUNT; +import static com.dianping.cat.consumer.business.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.business.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.business.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.business.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.business.model.Constants.ATTR_SUM; +import static com.dianping.cat.consumer.business.model.Constants.ATTR_TYPE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.consumer.business.model.entity.BusinessItem; +import com.dianping.cat.consumer.business.model.entity.BusinessReport; +import com.dianping.cat.consumer.business.model.entity.Segment; + +public class DefaultSaxMaker implements IMaker { + + @Override + public BusinessItem buildBusinessItem(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String type = attributes.getValue(ATTR_TYPE); + BusinessItem businessItem = new BusinessItem(id); + + if (type != null) { + businessItem.setType(type); + } + + return businessItem; + } + + @Override + public BusinessReport buildBusinessReport(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String startTime = attributes.getValue(ATTR_STARTTIME); + String endTime = attributes.getValue(ATTR_ENDTIME); + BusinessReport businessReport = new BusinessReport(domain); + + if (startTime != null) { + businessReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + businessReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return businessReport; + } + + @Override + public Segment buildSegment(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String count = attributes.getValue(ATTR_COUNT); + String sum = attributes.getValue(ATTR_SUM); + String avg = attributes.getValue(ATTR_AVG); + Segment segment = new Segment(id == null ? null : convert(Integer.class, id, null)); + + if (count != null) { + segment.setCount(convert(Integer.class, count, 0)); + } + + if (sum != null) { + segment.setSum(convert(Double.class, sum, 0.0)); + } + + if (avg != null) { + segment.setAvg(convert(Double.class, avg, 0.0)); + } + + return segment; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultSaxParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..ffceee61e0 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultSaxParser.java @@ -0,0 +1,258 @@ +package com.dianping.cat.consumer.business.model.transform; + +import static com.dianping.cat.consumer.business.model.Constants.ENTITY_BUSINESS_ITEM; +import static com.dianping.cat.consumer.business.model.Constants.ENTITY_BUSINESS_REPORT; +import static com.dianping.cat.consumer.business.model.Constants.ENTITY_SEGMENT; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.consumer.business.model.IEntity; +import com.dianping.cat.consumer.business.model.entity.BusinessItem; +import com.dianping.cat.consumer.business.model.entity.BusinessReport; +import com.dianping.cat.consumer.business.model.entity.Segment; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static BusinessReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(BusinessReport.class, new InputSource(removeBOM(in))); + } + + public static BusinessReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(BusinessReport.class, new InputSource(removeBOM(reader))); + } + + public static BusinessReport parse(String xml) throws SAXException, IOException { + return parseEntity(BusinessReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForBusinessItem(BusinessItem parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_SEGMENT.equals(qName)) { + Segment segment = m_maker.buildSegment(attributes); + + m_linker.onSegment(parentObj, segment); + m_objs.push(segment); + } else { + throw new SAXException(String.format("Element(%s) is not expected under business-item!", qName)); + } + + m_tags.push(qName); + } + + private void parseForBusinessReport(BusinessReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_BUSINESS_ITEM.equals(qName)) { + BusinessItem businessItem = m_maker.buildBusinessItem(attributes); + + m_linker.onBusinessItem(parentObj, businessItem); + m_objs.push(businessItem); + } else { + throw new SAXException(String.format("Element(%s) is not expected under business-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseForSegment(Segment parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_BUSINESS_REPORT.equals(qName)) { + BusinessReport businessReport = m_maker.buildBusinessReport(attributes); + + m_entity = businessReport; + m_objs.push(businessReport); + m_tags.push(qName); + } else if (ENTITY_BUSINESS_ITEM.equals(qName)) { + BusinessItem businessItem = m_maker.buildBusinessItem(attributes); + + m_entity = businessItem; + m_objs.push(businessItem); + m_tags.push(qName); + } else if (ENTITY_SEGMENT.equals(qName)) { + Segment segment = m_maker.buildSegment(attributes); + + m_entity = segment; + m_objs.push(segment); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof BusinessReport) { + parseForBusinessReport((BusinessReport) parent, tag, qName, attributes); + } else if (parent instanceof BusinessItem) { + parseForBusinessItem((BusinessItem) parent, tag, qName, attributes); + } else if (parent instanceof Segment) { + parseForSegment((Segment) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultXmlBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..871d0b40cd --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/DefaultXmlBuilder.java @@ -0,0 +1,242 @@ +package com.dianping.cat.consumer.business.model.transform; + +import static com.dianping.cat.consumer.business.model.Constants.ATTR_AVG; +import static com.dianping.cat.consumer.business.model.Constants.ATTR_COUNT; +import static com.dianping.cat.consumer.business.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.business.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.business.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.business.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.business.model.Constants.ATTR_SUM; +import static com.dianping.cat.consumer.business.model.Constants.ATTR_TYPE; +import static com.dianping.cat.consumer.business.model.Constants.ENTITY_BUSINESS_ITEM; +import static com.dianping.cat.consumer.business.model.Constants.ENTITY_BUSINESS_REPORT; +import static com.dianping.cat.consumer.business.model.Constants.ENTITY_SEGMENT; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.consumer.business.model.IEntity; +import com.dianping.cat.consumer.business.model.IVisitor; +import com.dianping.cat.consumer.business.model.entity.BusinessItem; +import com.dianping.cat.consumer.business.model.entity.BusinessReport; +import com.dianping.cat.consumer.business.model.entity.Segment; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + @Override + public void visitBusinessItem(BusinessItem businessItem) { + startTag(ENTITY_BUSINESS_ITEM, null, ATTR_ID, businessItem.getId(), ATTR_TYPE, businessItem.getType()); + + if (!businessItem.getSegments().isEmpty()) { + for (Segment segment : businessItem.getSegments().values()) { + segment.accept(m_visitor); + } + } + + endTag(ENTITY_BUSINESS_ITEM); + } + + @Override + public void visitBusinessReport(BusinessReport businessReport) { + startTag(ENTITY_BUSINESS_REPORT, null, ATTR_DOMAIN, businessReport.getDomain(), ATTR_STARTTIME, toString(businessReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_ENDTIME, toString(businessReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!businessReport.getBusinessItems().isEmpty()) { + for (BusinessItem businessItem : businessReport.getBusinessItems().values()) { + businessItem.accept(m_visitor); + } + } + + endTag(ENTITY_BUSINESS_REPORT); + } + + @Override + public void visitSegment(Segment segment) { + startTag(ENTITY_SEGMENT, true, null, ATTR_ID, segment.getId(), ATTR_COUNT, segment.getCount(), ATTR_SUM, segment.getSum(), ATTR_AVG, segment.getAvg()); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/ILinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/ILinker.java new file mode 100644 index 0000000000..f43bd4aef9 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.consumer.business.model.transform; + +import com.dianping.cat.consumer.business.model.entity.BusinessItem; +import com.dianping.cat.consumer.business.model.entity.BusinessReport; +import com.dianping.cat.consumer.business.model.entity.Segment; + +public interface ILinker { + + public boolean onBusinessItem(BusinessReport parent, BusinessItem businessItem); + + public boolean onSegment(BusinessItem parent, Segment segment); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/IMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/IMaker.java new file mode 100644 index 0000000000..7e9f6c9c4d --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/IMaker.java @@ -0,0 +1,14 @@ +package com.dianping.cat.consumer.business.model.transform; + +import com.dianping.cat.consumer.business.model.entity.BusinessItem; +import com.dianping.cat.consumer.business.model.entity.BusinessReport; +import com.dianping.cat.consumer.business.model.entity.Segment; + +public interface IMaker { + + public BusinessItem buildBusinessItem(T node); + + public BusinessReport buildBusinessReport(T node); + + public Segment buildSegment(T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/IParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/IParser.java new file mode 100644 index 0000000000..a2316d4067 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/business/model/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.consumer.business.model.transform; + +import com.dianping.cat.consumer.business.model.entity.BusinessItem; +import com.dianping.cat.consumer.business.model.entity.BusinessReport; +import com.dianping.cat.consumer.business.model.entity.Segment; + +public interface IParser { + public BusinessReport parse(IMaker maker, ILinker linker, T node); + + public void parseForBusinessItem(IMaker maker, ILinker linker, BusinessItem parent, T node); + + public void parseForSegment(IMaker maker, ILinker linker, Segment parent, T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java index 2d7110b56a..31bbf1a800 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java @@ -24,8 +24,7 @@ import java.util.Map; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; import org.xml.sax.SAXException; import com.dianping.cat.Cat; @@ -37,7 +36,6 @@ import com.dianping.cat.consumer.all.config.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -75,13 +73,13 @@ public synchronized void initialize() { } try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); m_modifyTime = config.getModifyDate().getTime(); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -135,8 +133,8 @@ public boolean insert(String xml) { } } - private void refreshConfig() throws DalException, SAXException, IOException { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + private void refreshConfig() throws SAXException, IOException { + Config config = m_configDao.findByName(CONFIG_NAME); long modifyTime = config.getModifyDate().getTime(); synchronized (this) { @@ -159,7 +157,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); } catch (Exception e) { Cat.logError(e); return false; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/BaseEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/BaseEntity.java new file mode 100644 index 0000000000..2ea5ba9bc0 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.consumer.cross.model; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.consumer.cross.model.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/Constants.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/Constants.java new file mode 100644 index 0000000000..d9477e68a1 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/Constants.java @@ -0,0 +1,54 @@ +package com.dianping.cat.consumer.cross.model; + +public class Constants { + + public static final String ATTR_APP = "app"; + + public static final String ATTR_AVG = "avg"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_FAILCOUNT = "failCount"; + + public static final String ATTR_FAILPERCENT = "failPercent"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_IP = "ip"; + + public static final String ATTR_ROLE = "role"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ATTR_SUM = "sum"; + + public static final String ATTR_TOTALCOUNT = "totalCount"; + + public static final String ATTR_TPS = "tps"; + + public static final String ELEMENT_DOMAIN = "domain"; + + public static final String ELEMENT_DOMAIN_NAMES = "domain-names"; + + public static final String ELEMENT_IP = "ip"; + + public static final String ELEMENT_IPS = "ips"; + + public static final String ENTITY_CROSS_REPORT = "cross-report"; + + public static final String ENTITY_LOCAL = "local"; + + public static final String ENTITY_LOCALS = "locals"; + + public static final String ENTITY_NAME = "name"; + + public static final String ENTITY_NAMES = "names"; + + public static final String ENTITY_REMOTE = "remote"; + + public static final String ENTITY_REMOTES = "remotes"; + + public static final String ENTITY_TYPE = "type"; +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/IEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/IEntity.java new file mode 100644 index 0000000000..2579607e39 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.consumer.cross.model; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/IVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/IVisitor.java new file mode 100644 index 0000000000..fefca117d3 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/IVisitor.java @@ -0,0 +1,20 @@ +package com.dianping.cat.consumer.cross.model; + +import com.dianping.cat.consumer.cross.model.entity.CrossReport; +import com.dianping.cat.consumer.cross.model.entity.Local; +import com.dianping.cat.consumer.cross.model.entity.Name; +import com.dianping.cat.consumer.cross.model.entity.Remote; +import com.dianping.cat.consumer.cross.model.entity.Type; + +public interface IVisitor { + + public void visitCrossReport(CrossReport crossReport); + + public void visitLocal(Local local); + + public void visitName(Name name); + + public void visitRemote(Remote remote); + + public void visitType(Type type); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/CrossReport.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/CrossReport.java new file mode 100644 index 0000000000..6047421ece --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/CrossReport.java @@ -0,0 +1,155 @@ +package com.dianping.cat.consumer.cross.model.entity; + +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.cross.model.Constants.ENTITY_CROSS_REPORT; + +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +import com.dianping.cat.consumer.cross.model.BaseEntity; +import com.dianping.cat.consumer.cross.model.IVisitor; + +public class CrossReport extends BaseEntity { + private String m_domain; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Set m_domainNames = new LinkedHashSet(); + + private Set m_ips = new LinkedHashSet(); + + private Map m_locals = new LinkedHashMap(); + + public CrossReport() { + } + + public CrossReport(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitCrossReport(this); + } + + public CrossReport addDomain(String domain) { + m_domainNames.add(domain); + return this; + } + + public CrossReport addIp(String ip) { + m_ips.add(ip); + return this; + } + + public CrossReport addLocal(Local local) { + m_locals.put(local.getId(), local); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CrossReport) { + CrossReport _o = (CrossReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public Local findLocal(String id) { + return m_locals.get(id); + } + + public Local findOrCreateLocal(String id) { + Local local = m_locals.get(id); + + if (local == null) { + synchronized (m_locals) { + local = m_locals.get(id); + + if (local == null) { + local = new Local(id); + m_locals.put(id, local); + } + } + } + + return local; + } + + public String getDomain() { + return m_domain; + } + + public Set getDomainNames() { + return m_domainNames; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public Set getIps() { + return m_ips; + } + + public Map getLocals() { + return m_locals; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(CrossReport other) { + assertAttributeEquals(other, ENTITY_CROSS_REPORT, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Local removeLocal(String id) { + return m_locals.remove(id); + } + + public CrossReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public CrossReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public CrossReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Local.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Local.java new file mode 100644 index 0000000000..b6ef361bc5 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Local.java @@ -0,0 +1,102 @@ +package com.dianping.cat.consumer.cross.model.entity; + +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.cross.model.Constants.ENTITY_LOCAL; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.cross.model.BaseEntity; +import com.dianping.cat.consumer.cross.model.IVisitor; + +public class Local extends BaseEntity { + private String m_id; + + private Map m_remotes = new LinkedHashMap(); + + public Local() { + } + + public Local(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitLocal(this); + } + + public Local addRemote(Remote remote) { + m_remotes.put(remote.getId(), remote); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Local) { + Local _o = (Local) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Remote findRemote(String id) { + return m_remotes.get(id); + } + + public Remote findOrCreateRemote(String id) { + Remote remote = m_remotes.get(id); + + if (remote == null) { + synchronized (m_remotes) { + remote = m_remotes.get(id); + + if (remote == null) { + remote = new Remote(id); + m_remotes.put(id, remote); + } + } + } + + return remote; + } + + public String getId() { + return m_id; + } + + public Map getRemotes() { + return m_remotes; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Local other) { + assertAttributeEquals(other, ENTITY_LOCAL, ATTR_ID, m_id, other.getId()); + + } + + public Remote removeRemote(String id) { + return m_remotes.remove(id); + } + + public Local setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Name.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Name.java new file mode 100644 index 0000000000..096055d3b0 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Name.java @@ -0,0 +1,160 @@ +package com.dianping.cat.consumer.cross.model.entity; + +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.cross.model.Constants.ENTITY_NAME; + +import com.dianping.cat.consumer.cross.model.BaseEntity; +import com.dianping.cat.consumer.cross.model.IVisitor; + +public class Name extends BaseEntity { + private String m_id; + + private long m_totalCount; + + private int m_failCount; + + private double m_failPercent; + + private double m_avg; + + private double m_sum; + + private double m_tps; + + public Name() { + } + + public Name(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitName(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Name) { + Name _o = (Name) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public double getAvg() { + return m_avg; + } + + public int getFailCount() { + return m_failCount; + } + + public double getFailPercent() { + return m_failPercent; + } + + public String getId() { + return m_id; + } + + public double getSum() { + return m_sum; + } + + public long getTotalCount() { + return m_totalCount; + } + + public double getTps() { + return m_tps; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public Name incFailCount() { + m_failCount++; + return this; + } + + public Name incFailCount(int failCount) { + m_failCount += failCount; + return this; + } + + public Name incTotalCount() { + m_totalCount++; + return this; + } + + public Name incTotalCount(long totalCount) { + m_totalCount += totalCount; + return this; + } + + @Override + public void mergeAttributes(Name other) { + assertAttributeEquals(other, ENTITY_NAME, ATTR_ID, m_id, other.getId()); + + m_totalCount = other.getTotalCount(); + + m_failCount = other.getFailCount(); + + m_failPercent = other.getFailPercent(); + + m_avg = other.getAvg(); + + m_sum = other.getSum(); + + m_tps = other.getTps(); + } + + public Name setAvg(double avg) { + m_avg = avg; + return this; + } + + public Name setFailCount(int failCount) { + m_failCount = failCount; + return this; + } + + public Name setFailPercent(double failPercent) { + m_failPercent = failPercent; + return this; + } + + public Name setId(String id) { + m_id = id; + return this; + } + + public Name setSum(double sum) { + m_sum = sum; + return this; + } + + public Name setTotalCount(long totalCount) { + m_totalCount = totalCount; + return this; + } + + public Name setTps(double tps) { + m_tps = tps; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Remote.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Remote.java new file mode 100644 index 0000000000..d68eaa341a --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Remote.java @@ -0,0 +1,118 @@ +package com.dianping.cat.consumer.cross.model.entity; + +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.cross.model.Constants.ENTITY_REMOTE; + +import com.dianping.cat.consumer.cross.model.BaseEntity; +import com.dianping.cat.consumer.cross.model.IVisitor; + +public class Remote extends BaseEntity { + private String m_id; + + private String m_role; + + private Type m_type; + + private String m_app; + + private String m_ip; + + public Remote() { + } + + public Remote(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitRemote(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Remote) { + Remote _o = (Remote) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getApp() { + return m_app; + } + + public String getId() { + return m_id; + } + + public String getIp() { + return m_ip; + } + + public String getRole() { + return m_role; + } + + public Type getType() { + return m_type; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Remote other) { + assertAttributeEquals(other, ENTITY_REMOTE, ATTR_ID, m_id, other.getId()); + + if (other.getRole() != null) { + m_role = other.getRole(); + } + + if (other.getApp() != null) { + m_app = other.getApp(); + } + + if (other.getIp() != null) { + m_ip = other.getIp(); + } + } + + public Remote setApp(String app) { + m_app = app; + return this; + } + + public Remote setId(String id) { + m_id = id; + return this; + } + + public Remote setIp(String ip) { + m_ip = ip; + return this; + } + + public Remote setRole(String role) { + m_role = role; + return this; + } + + public Remote setType(Type type) { + m_type = type; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Type.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Type.java new file mode 100644 index 0000000000..fb899500a8 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/entity/Type.java @@ -0,0 +1,230 @@ +package com.dianping.cat.consumer.cross.model.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.cross.model.BaseEntity; +import com.dianping.cat.consumer.cross.model.IVisitor; + +public class Type extends BaseEntity { + private String m_id; + + private long m_totalCount; + + private int m_failCount; + + private double m_failPercent; + + private double m_avg; + + private double m_sum; + + private double m_tps; + + private Map m_names = new LinkedHashMap(); + + public Type() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitType(this); + } + + public Type addName(Name name) { + m_names.put(name.getId(), name); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Type) { + Type _o = (Type) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + if (getTotalCount() != _o.getTotalCount()) { + return false; + } + + if (getFailCount() != _o.getFailCount()) { + return false; + } + + if (getFailPercent() != _o.getFailPercent()) { + return false; + } + + if (getAvg() != _o.getAvg()) { + return false; + } + + if (getSum() != _o.getSum()) { + return false; + } + + if (getTps() != _o.getTps()) { + return false; + } + + if (!equals(getNames(), _o.getNames())) { + return false; + } + + + return true; + } + + return false; + } + + public Name findName(String id) { + return m_names.get(id); + } + + public Name findOrCreateName(String id) { + Name name = m_names.get(id); + + if (name == null) { + synchronized (m_names) { + name = m_names.get(id); + + if (name == null) { + name = new Name(id); + m_names.put(id, name); + } + } + } + + return name; + } + + public double getAvg() { + return m_avg; + } + + public int getFailCount() { + return m_failCount; + } + + public double getFailPercent() { + return m_failPercent; + } + + public String getId() { + return m_id; + } + + public Map getNames() { + return m_names; + } + + public double getSum() { + return m_sum; + } + + public long getTotalCount() { + return m_totalCount; + } + + public double getTps() { + return m_tps; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + hash = hash * 31 + (int) (m_totalCount ^ (m_totalCount >>> 32)); + hash = hash * 31 + m_failCount; + hash = hash * 31 + (int) (Double.doubleToLongBits(m_failPercent) ^ (Double.doubleToLongBits(m_failPercent) >>> 32)); + hash = hash * 31 + (int) (Double.doubleToLongBits(m_avg) ^ (Double.doubleToLongBits(m_avg) >>> 32)); + hash = hash * 31 + (int) (Double.doubleToLongBits(m_sum) ^ (Double.doubleToLongBits(m_sum) >>> 32)); + hash = hash * 31 + (int) (Double.doubleToLongBits(m_tps) ^ (Double.doubleToLongBits(m_tps) >>> 32)); + hash = hash * 31 + (m_names == null ? 0 : m_names.hashCode()); + + return hash; + } + + public Type incFailCount() { + m_failCount++; + return this; + } + + public Type incFailCount(int failCount) { + m_failCount += failCount; + return this; + } + + public Type incTotalCount() { + m_totalCount++; + return this; + } + + public Type incTotalCount(long totalCount) { + m_totalCount += totalCount; + return this; + } + + @Override + public void mergeAttributes(Type other) { + if (other.getId() != null) { + m_id = other.getId(); + } + + m_totalCount = other.getTotalCount(); + + m_failCount = other.getFailCount(); + + m_failPercent = other.getFailPercent(); + + m_avg = other.getAvg(); + + m_sum = other.getSum(); + + m_tps = other.getTps(); + } + + public Name removeName(String id) { + return m_names.remove(id); + } + + public Type setAvg(double avg) { + m_avg = avg; + return this; + } + + public Type setFailCount(int failCount) { + m_failCount = failCount; + return this; + } + + public Type setFailPercent(double failPercent) { + m_failPercent = failPercent; + return this; + } + + public Type setId(String id) { + m_id = id; + return this; + } + + public Type setSum(double sum) { + m_sum = sum; + return this; + } + + public Type setTotalCount(long totalCount) { + m_totalCount = totalCount; + return this; + } + + public Type setTps(double tps) { + m_tps = tps; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/BaseVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/BaseVisitor.java new file mode 100644 index 0000000000..466de7245f --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/BaseVisitor.java @@ -0,0 +1,42 @@ +package com.dianping.cat.consumer.cross.model.transform; + +import com.dianping.cat.consumer.cross.model.IVisitor; +import com.dianping.cat.consumer.cross.model.entity.CrossReport; +import com.dianping.cat.consumer.cross.model.entity.Local; +import com.dianping.cat.consumer.cross.model.entity.Name; +import com.dianping.cat.consumer.cross.model.entity.Remote; +import com.dianping.cat.consumer.cross.model.entity.Type; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitCrossReport(CrossReport crossReport) { + for (Local local : crossReport.getLocals().values()) { + visitLocal(local); + } + } + + @Override + public void visitLocal(Local local) { + for (Remote remote : local.getRemotes().values()) { + visitRemote(remote); + } + } + + @Override + public void visitName(Name name) { + } + + @Override + public void visitRemote(Remote remote) { + if (remote.getType() != null) { + visitType(remote.getType()); + } + } + + @Override + public void visitType(Type type) { + for (Name name : type.getNames().values()) { + visitName(name); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultLinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultLinker.java new file mode 100644 index 0000000000..7c7bc44691 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultLinker.java @@ -0,0 +1,79 @@ +package com.dianping.cat.consumer.cross.model.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.consumer.cross.model.entity.CrossReport; +import com.dianping.cat.consumer.cross.model.entity.Local; +import com.dianping.cat.consumer.cross.model.entity.Name; +import com.dianping.cat.consumer.cross.model.entity.Remote; +import com.dianping.cat.consumer.cross.model.entity.Type; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onLocal(final CrossReport parent, final Local local) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addLocal(local); + } + }); + } else { + parent.addLocal(local); + } + + return true; + } + + @Override + public boolean onName(final Type parent, final Name name) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addName(name); + } + }); + } else { + parent.addName(name); + } + + return true; + } + + @Override + public boolean onRemote(final Local parent, final Remote remote) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addRemote(remote); + } + }); + } else { + parent.addRemote(remote); + } + + return true; + } + + @Override + public boolean onType(final Remote parent, final Type type) { + parent.setType(type); + return true; + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultMerger.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultMerger.java new file mode 100644 index 0000000000..7f3a594c1f --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultMerger.java @@ -0,0 +1,165 @@ +package com.dianping.cat.consumer.cross.model.transform; + +import java.util.Stack; + +import com.dianping.cat.consumer.cross.model.IEntity; +import com.dianping.cat.consumer.cross.model.IVisitor; +import com.dianping.cat.consumer.cross.model.entity.CrossReport; +import com.dianping.cat.consumer.cross.model.entity.Local; +import com.dianping.cat.consumer.cross.model.entity.Name; +import com.dianping.cat.consumer.cross.model.entity.Remote; +import com.dianping.cat.consumer.cross.model.entity.Type; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private CrossReport m_crossReport; + + public DefaultMerger() { + } + + public DefaultMerger(CrossReport crossReport) { + m_crossReport = crossReport; + m_objs.push(crossReport); + } + + public CrossReport getCrossReport() { + return m_crossReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeCrossReport(CrossReport to, CrossReport from) { + to.mergeAttributes(from); + to.getDomainNames().addAll(from.getDomainNames()); + to.getIps().addAll(from.getIps()); + } + + protected void mergeLocal(Local to, Local from) { + to.mergeAttributes(from); + } + + protected void mergeName(Name to, Name from) { + to.mergeAttributes(from); + } + + protected void mergeRemote(Remote to, Remote from) { + to.mergeAttributes(from); + } + + protected void mergeType(Type to, Type from) { + to.mergeAttributes(from); + } + + @Override + public void visitCrossReport(CrossReport from) { + CrossReport to = (CrossReport) m_objs.peek(); + + mergeCrossReport(to, from); + visitCrossReportChildren(to, from); + } + + protected void visitCrossReportChildren(CrossReport to, CrossReport from) { + for (Local source : from.getLocals().values()) { + Local target = to.findLocal(source.getId()); + + if (target == null) { + target = new Local(source.getId()); + to.addLocal(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitLocal(Local from) { + Local to = (Local) m_objs.peek(); + + mergeLocal(to, from); + visitLocalChildren(to, from); + } + + protected void visitLocalChildren(Local to, Local from) { + for (Remote source : from.getRemotes().values()) { + Remote target = to.findRemote(source.getId()); + + if (target == null) { + target = new Remote(source.getId()); + to.addRemote(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitName(Name from) { + Name to = (Name) m_objs.peek(); + + mergeName(to, from); + visitNameChildren(to, from); + } + + protected void visitNameChildren(Name to, Name from) { + } + + @Override + public void visitRemote(Remote from) { + Remote to = (Remote) m_objs.peek(); + + mergeRemote(to, from); + visitRemoteChildren(to, from); + } + + protected void visitRemoteChildren(Remote to, Remote from) { + if (from.getType() != null) { + Type target = to.getType(); + + if (target == null) { + target = new Type(); + to.setType(target); + } + + m_objs.push(target); + from.getType().accept(this); + m_objs.pop(); + } + } + + @Override + public void visitType(Type from) { + Type to = (Type) m_objs.peek(); + + mergeType(to, from); + visitTypeChildren(to, from); + } + + protected void visitTypeChildren(Type to, Type from) { + for (Name source : from.getNames().values()) { + Name target = to.findName(source.getId()); + + if (target == null) { + target = new Name(source.getId()); + to.addName(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultNativeBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..63818b6b37 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultNativeBuilder.java @@ -0,0 +1,263 @@ +package com.dianping.cat.consumer.cross.model.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.consumer.cross.model.IVisitor; +import com.dianping.cat.consumer.cross.model.entity.CrossReport; +import com.dianping.cat.consumer.cross.model.entity.Local; +import com.dianping.cat.consumer.cross.model.entity.Name; +import com.dianping.cat.consumer.cross.model.entity.Remote; +import com.dianping.cat.consumer.cross.model.entity.Type; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(CrossReport crossReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(crossReport, out); + return out.toByteArray(); + } + + public static void build(CrossReport crossReport, OutputStream out) { + crossReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitCrossReport(CrossReport crossReport) { + writeTag(63, 0); + + if (crossReport.getDomain() != null) { + writeTag(1, 1); + writeString(crossReport.getDomain()); + } + + if (crossReport.getStartTime() != null) { + writeTag(2, 1); + writeDate(crossReport.getStartTime()); + } + + if (crossReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(crossReport.getEndTime()); + } + + if (crossReport.getDomainNames() != null) { + writeTag(4, 2); + writeInt(crossReport.getDomainNames().size()); + + for (String domain : crossReport.getDomainNames()) { + writeString(domain); + } + } + + if (crossReport.getIps() != null) { + writeTag(5, 2); + writeInt(crossReport.getIps().size()); + + for (String ip : crossReport.getIps()) { + writeString(ip); + } + } + + if (!crossReport.getLocals().isEmpty()) { + writeTag(33, 2); + writeInt(crossReport.getLocals().size()); + + for (Local local : crossReport.getLocals().values()) { + local.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitLocal(Local local) { + if (local.getId() != null) { + writeTag(1, 1); + writeString(local.getId()); + } + + if (!local.getRemotes().isEmpty()) { + writeTag(33, 2); + writeInt(local.getRemotes().size()); + + for (Remote remote : local.getRemotes().values()) { + remote.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitName(Name name) { + if (name.getId() != null) { + writeTag(1, 1); + writeString(name.getId()); + } + + writeTag(2, 0); + writeLong(name.getTotalCount()); + + writeTag(3, 0); + writeInt(name.getFailCount()); + + writeTag(4, 0); + writeDouble(name.getFailPercent()); + + writeTag(5, 0); + writeDouble(name.getAvg()); + + writeTag(6, 0); + writeDouble(name.getSum()); + + writeTag(7, 0); + writeDouble(name.getTps()); + + writeTag(63, 3); + } + + @Override + public void visitRemote(Remote remote) { + if (remote.getId() != null) { + writeTag(1, 1); + writeString(remote.getId()); + } + + if (remote.getRole() != null) { + writeTag(2, 1); + writeString(remote.getRole()); + } + + if (remote.getApp() != null) { + writeTag(3, 1); + writeString(remote.getApp()); + } + + if (remote.getIp() != null) { + writeTag(4, 1); + writeString(remote.getIp()); + } + + if (remote.getType() != null) { + writeTag(33, 1); + remote.getType().accept(m_visitor); + } + + writeTag(63, 3); + } + + @Override + public void visitType(Type type) { + if (type.getId() != null) { + writeTag(1, 1); + writeString(type.getId()); + } + + writeTag(2, 0); + writeLong(type.getTotalCount()); + + writeTag(3, 0); + writeInt(type.getFailCount()); + + writeTag(4, 0); + writeDouble(type.getFailPercent()); + + writeTag(5, 0); + writeDouble(type.getAvg()); + + writeTag(6, 0); + writeDouble(type.getSum()); + + writeTag(7, 0); + writeDouble(type.getTps()); + + if (!type.getNames().isEmpty()) { + writeTag(33, 2); + writeInt(type.getNames().size()); + + for (Name name : type.getNames().values()) { + name.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeDouble(double value) { + try { + writeVarint(Double.doubleToLongBits(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeLong(long value) { + try { + writeVarint(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultNativeParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..406808d44f --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultNativeParser.java @@ -0,0 +1,319 @@ +package com.dianping.cat.consumer.cross.model.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.consumer.cross.model.IVisitor; +import com.dianping.cat.consumer.cross.model.entity.CrossReport; +import com.dianping.cat.consumer.cross.model.entity.Local; +import com.dianping.cat.consumer.cross.model.entity.Name; +import com.dianping.cat.consumer.cross.model.entity.Remote; +import com.dianping.cat.consumer.cross.model.entity.Type; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static CrossReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static CrossReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + CrossReport crossReport = new CrossReport(); + + try { + crossReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return crossReport; + } + + @Override + public void visitCrossReport(CrossReport crossReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitCrossReportChildren(crossReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitCrossReportChildren(CrossReport crossReport, int _field, int _type) { + switch (_field) { + case 1: + crossReport.setDomain(readString()); + break; + case 2: + crossReport.setStartTime(readDate()); + break; + case 3: + crossReport.setEndTime(readDate()); + break; + case 4: + if (_type == 1) { + crossReport.addDomain(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + crossReport.addDomain(readString()); + } + } + break; + case 5: + if (_type == 1) { + crossReport.addIp(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + crossReport.addIp(readString()); + } + } + break; + case 33: + if (_type == 1) { + Local local = new Local(); + + visitLocal(local); + m_linker.onLocal(crossReport, local); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Local local = new Local(); + + visitLocal(local); + m_linker.onLocal(crossReport, local); + } + } + break; + } + } + + @Override + public void visitLocal(Local local) { + byte tag; + + while ((tag = readTag()) != -1) { + visitLocalChildren(local, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitLocalChildren(Local local, int _field, int _type) { + switch (_field) { + case 1: + local.setId(readString()); + break; + case 33: + if (_type == 1) { + Remote remote = new Remote(); + + visitRemote(remote); + m_linker.onRemote(local, remote); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Remote remote = new Remote(); + + visitRemote(remote); + m_linker.onRemote(local, remote); + } + } + break; + } + } + + @Override + public void visitName(Name name) { + byte tag; + + while ((tag = readTag()) != -1) { + visitNameChildren(name, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitNameChildren(Name name, int _field, int _type) { + switch (_field) { + case 1: + name.setId(readString()); + break; + case 2: + name.setTotalCount(readLong()); + break; + case 3: + name.setFailCount(readInt()); + break; + case 4: + name.setFailPercent(readDouble()); + break; + case 5: + name.setAvg(readDouble()); + break; + case 6: + name.setSum(readDouble()); + break; + case 7: + name.setTps(readDouble()); + break; + } + } + + @Override + public void visitRemote(Remote remote) { + byte tag; + + while ((tag = readTag()) != -1) { + visitRemoteChildren(remote, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitRemoteChildren(Remote remote, int _field, int _type) { + switch (_field) { + case 1: + remote.setId(readString()); + break; + case 2: + remote.setRole(readString()); + break; + case 3: + remote.setApp(readString()); + break; + case 4: + remote.setIp(readString()); + break; + case 33: + Type type = new Type(); + + visitType(type); + m_linker.onType(remote, type); + break; + } + } + + @Override + public void visitType(Type type) { + byte tag; + + while ((tag = readTag()) != -1) { + visitTypeChildren(type, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitTypeChildren(Type type, int _field, int _type) { + switch (_field) { + case 1: + type.setId(readString()); + break; + case 2: + type.setTotalCount(readLong()); + break; + case 3: + type.setFailCount(readInt()); + break; + case 4: + type.setFailPercent(readDouble()); + break; + case 5: + type.setAvg(readDouble()); + break; + case 6: + type.setSum(readDouble()); + break; + case 7: + type.setTps(readDouble()); + break; + case 33: + if (_type == 1) { + Name name = new Name(); + + visitName(name); + m_linker.onName(type, name); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Name name = new Name(); + + visitName(name); + m_linker.onName(type, name); + } + } + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private double readDouble() { + try { + return Double.longBitsToDouble(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private long readLong() { + try { + return readVarint(64); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultSaxMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..45ccbae405 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultSaxMaker.java @@ -0,0 +1,216 @@ +package com.dianping.cat.consumer.cross.model.transform; + +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_APP; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_AVG; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_FAILCOUNT; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_FAILPERCENT; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_ROLE; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_SUM; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_TOTALCOUNT; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_TPS; + +import org.xml.sax.Attributes; + +import com.dianping.cat.consumer.cross.model.entity.CrossReport; +import com.dianping.cat.consumer.cross.model.entity.Local; +import com.dianping.cat.consumer.cross.model.entity.Name; +import com.dianping.cat.consumer.cross.model.entity.Remote; +import com.dianping.cat.consumer.cross.model.entity.Type; + +public class DefaultSaxMaker implements IMaker { + + @Override + public CrossReport buildCrossReport(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String startTime = attributes.getValue(ATTR_STARTTIME); + String endTime = attributes.getValue(ATTR_ENDTIME); + CrossReport crossReport = new CrossReport(domain); + + if (startTime != null) { + crossReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + crossReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return crossReport; + } + + @Override + public String buildDomain(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public String buildIp(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Local buildLocal(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Local local = new Local(id); + + return local; + } + + @Override + public Name buildName(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String totalCount = attributes.getValue(ATTR_TOTALCOUNT); + String failCount = attributes.getValue(ATTR_FAILCOUNT); + String failPercent = attributes.getValue(ATTR_FAILPERCENT); + String avg = attributes.getValue(ATTR_AVG); + String sum = attributes.getValue(ATTR_SUM); + String tps = attributes.getValue(ATTR_TPS); + Name name = new Name(id); + + if (totalCount != null) { + name.setTotalCount(convert(Long.class, totalCount, 0L)); + } + + if (failCount != null) { + name.setFailCount(convert(Integer.class, failCount, 0)); + } + + if (failPercent != null) { + name.setFailPercent(toNumber(failPercent, "0.00", 0).doubleValue()); + } + + if (avg != null) { + name.setAvg(toNumber(avg, "0.00", 0).doubleValue()); + } + + if (sum != null) { + name.setSum(toNumber(sum, "0.00", 0).doubleValue()); + } + + if (tps != null) { + name.setTps(toNumber(tps, "0.00", 0).doubleValue()); + } + + return name; + } + + @Override + public Remote buildRemote(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String role = attributes.getValue(ATTR_ROLE); + String app = attributes.getValue(ATTR_APP); + String ip = attributes.getValue(ATTR_IP); + Remote remote = new Remote(id); + + if (role != null) { + remote.setRole(role); + } + + if (app != null) { + remote.setApp(app); + } + + if (ip != null) { + remote.setIp(ip); + } + + return remote; + } + + @Override + public Type buildType(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String totalCount = attributes.getValue(ATTR_TOTALCOUNT); + String failCount = attributes.getValue(ATTR_FAILCOUNT); + String failPercent = attributes.getValue(ATTR_FAILPERCENT); + String avg = attributes.getValue(ATTR_AVG); + String sum = attributes.getValue(ATTR_SUM); + String tps = attributes.getValue(ATTR_TPS); + Type type = new Type(); + + if (id != null) { + type.setId(id); + } + + if (totalCount != null) { + type.setTotalCount(convert(Long.class, totalCount, 0L)); + } + + if (failCount != null) { + type.setFailCount(convert(Integer.class, failCount, 0)); + } + + if (failPercent != null) { + type.setFailPercent(toNumber(failPercent, "0.00", 0).doubleValue()); + } + + if (avg != null) { + type.setAvg(toNumber(avg, "0.00", 0).doubleValue()); + } + + if (sum != null) { + type.setSum(toNumber(sum, "0.00", 0).doubleValue()); + } + + if (tps != null) { + type.setTps(toNumber(tps, "0.00", 0).doubleValue()); + } + + return type; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format, Number defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultSaxParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..cab4741c7d --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultSaxParser.java @@ -0,0 +1,328 @@ +package com.dianping.cat.consumer.cross.model.transform; + +import static com.dianping.cat.consumer.cross.model.Constants.ELEMENT_DOMAIN; +import static com.dianping.cat.consumer.cross.model.Constants.ELEMENT_DOMAIN_NAMES; +import static com.dianping.cat.consumer.cross.model.Constants.ELEMENT_IP; +import static com.dianping.cat.consumer.cross.model.Constants.ELEMENT_IPS; + +import static com.dianping.cat.consumer.cross.model.Constants.ENTITY_CROSS_REPORT; +import static com.dianping.cat.consumer.cross.model.Constants.ENTITY_LOCAL; +import static com.dianping.cat.consumer.cross.model.Constants.ENTITY_NAME; +import static com.dianping.cat.consumer.cross.model.Constants.ENTITY_REMOTE; +import static com.dianping.cat.consumer.cross.model.Constants.ENTITY_TYPE; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.consumer.cross.model.IEntity; +import com.dianping.cat.consumer.cross.model.entity.CrossReport; +import com.dianping.cat.consumer.cross.model.entity.Local; +import com.dianping.cat.consumer.cross.model.entity.Name; +import com.dianping.cat.consumer.cross.model.entity.Remote; +import com.dianping.cat.consumer.cross.model.entity.Type; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static CrossReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(CrossReport.class, new InputSource(removeBOM(in))); + } + + public static CrossReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(CrossReport.class, new InputSource(removeBOM(reader))); + } + + public static CrossReport parse(String xml) throws SAXException, IOException { + return parseEntity(CrossReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof CrossReport) { + CrossReport crossReport = (CrossReport) currentObj; + + if (ELEMENT_DOMAIN.equals(currentTag)) { + crossReport.addDomain(getText()); + } else if (ELEMENT_IP.equals(currentTag)) { + crossReport.addIp(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForCrossReport(CrossReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_DOMAIN_NAMES.equals(qName) || ELEMENT_DOMAIN.equals(qName) || ELEMENT_IPS.equals(qName) || ELEMENT_IP.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_LOCAL.equals(qName)) { + Local local = m_maker.buildLocal(attributes); + + m_linker.onLocal(parentObj, local); + m_objs.push(local); + } else { + throw new SAXException(String.format("Element(%s) is not expected under cross-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseForLocal(Local parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_REMOTE.equals(qName)) { + Remote remote = m_maker.buildRemote(attributes); + + m_linker.onRemote(parentObj, remote); + m_objs.push(remote); + } else { + throw new SAXException(String.format("Element(%s) is not expected under local!", qName)); + } + + m_tags.push(qName); + } + + private void parseForName(Name parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForRemote(Remote parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_TYPE.equals(qName)) { + Type type = m_maker.buildType(attributes); + + m_linker.onType(parentObj, type); + m_objs.push(type); + } else { + throw new SAXException(String.format("Element(%s) is not expected under remote!", qName)); + } + + m_tags.push(qName); + } + + private void parseForType(Type parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_NAME.equals(qName)) { + Name name = m_maker.buildName(attributes); + + m_linker.onName(parentObj, name); + m_objs.push(name); + } else { + throw new SAXException(String.format("Element(%s) is not expected under type!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_CROSS_REPORT.equals(qName)) { + CrossReport crossReport = m_maker.buildCrossReport(attributes); + + m_entity = crossReport; + m_objs.push(crossReport); + m_tags.push(qName); + } else if (ENTITY_LOCAL.equals(qName)) { + Local local = m_maker.buildLocal(attributes); + + m_entity = local; + m_objs.push(local); + m_tags.push(qName); + } else if (ENTITY_REMOTE.equals(qName)) { + Remote remote = m_maker.buildRemote(attributes); + + m_entity = remote; + m_objs.push(remote); + m_tags.push(qName); + } else if (ENTITY_TYPE.equals(qName)) { + Type type = m_maker.buildType(attributes); + + m_entity = type; + m_objs.push(type); + m_tags.push(qName); + } else if (ENTITY_NAME.equals(qName)) { + Name name = m_maker.buildName(attributes); + + m_entity = name; + m_objs.push(name); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof CrossReport) { + parseForCrossReport((CrossReport) parent, tag, qName, attributes); + } else if (parent instanceof Local) { + parseForLocal((Local) parent, tag, qName, attributes); + } else if (parent instanceof Remote) { + parseForRemote((Remote) parent, tag, qName, attributes); + } else if (parent instanceof Type) { + parseForType((Type) parent, tag, qName, attributes); + } else if (parent instanceof Name) { + parseForName((Name) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format) { + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultXmlBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..bf65f1c106 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/DefaultXmlBuilder.java @@ -0,0 +1,340 @@ +package com.dianping.cat.consumer.cross.model.transform; + +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_APP; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_AVG; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_FAILCOUNT; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_FAILPERCENT; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_ROLE; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_SUM; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_TOTALCOUNT; +import static com.dianping.cat.consumer.cross.model.Constants.ATTR_TPS; +import static com.dianping.cat.consumer.cross.model.Constants.ELEMENT_DOMAIN; +import static com.dianping.cat.consumer.cross.model.Constants.ELEMENT_IP; +import static com.dianping.cat.consumer.cross.model.Constants.ENTITY_CROSS_REPORT; +import static com.dianping.cat.consumer.cross.model.Constants.ENTITY_LOCAL; +import static com.dianping.cat.consumer.cross.model.Constants.ENTITY_NAME; +import static com.dianping.cat.consumer.cross.model.Constants.ENTITY_REMOTE; +import static com.dianping.cat.consumer.cross.model.Constants.ENTITY_TYPE; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.consumer.cross.model.IEntity; +import com.dianping.cat.consumer.cross.model.IVisitor; +import com.dianping.cat.consumer.cross.model.entity.CrossReport; +import com.dianping.cat.consumer.cross.model.entity.Local; +import com.dianping.cat.consumer.cross.model.entity.Name; +import com.dianping.cat.consumer.cross.model.entity.Remote; +import com.dianping.cat.consumer.cross.model.entity.Type; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + protected String toString(Number number, String format) { + if (number != null) { + return new java.text.DecimalFormat(format).format(number); + } else { + return null; + } + } + + @Override + public void visitCrossReport(CrossReport crossReport) { + startTag(ENTITY_CROSS_REPORT, null, ATTR_DOMAIN, crossReport.getDomain(), ATTR_STARTTIME, toString(crossReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_ENDTIME, toString(crossReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!crossReport.getDomainNames().isEmpty()) { + for (String domain : crossReport.getDomainNames()) { + tagWithText(ELEMENT_DOMAIN, domain); + } + } + + if (!crossReport.getIps().isEmpty()) { + for (String ip : crossReport.getIps()) { + tagWithText(ELEMENT_IP, ip); + } + } + + if (!crossReport.getLocals().isEmpty()) { + for (Local local : crossReport.getLocals().values()) { + local.accept(m_visitor); + } + } + + endTag(ENTITY_CROSS_REPORT); + } + + @Override + public void visitLocal(Local local) { + startTag(ENTITY_LOCAL, null, ATTR_ID, local.getId()); + + if (!local.getRemotes().isEmpty()) { + for (Remote remote : local.getRemotes().values()) { + remote.accept(m_visitor); + } + } + + endTag(ENTITY_LOCAL); + } + + @Override + public void visitName(Name name) { + startTag(ENTITY_NAME, true, null, ATTR_ID, name.getId(), ATTR_TOTALCOUNT, name.getTotalCount(), ATTR_FAILCOUNT, name.getFailCount(), ATTR_FAILPERCENT, toString(name.getFailPercent(), "0.00"), ATTR_AVG, toString(name.getAvg(), "0.00"), ATTR_SUM, toString(name.getSum(), "0.00"), ATTR_TPS, toString(name.getTps(), "0.00")); + } + + @Override + public void visitRemote(Remote remote) { + startTag(ENTITY_REMOTE, null, ATTR_ID, remote.getId(), ATTR_ROLE, remote.getRole(), ATTR_APP, remote.getApp(), ATTR_IP, remote.getIp()); + + if (remote.getType() != null) { + remote.getType().accept(m_visitor); + } + + endTag(ENTITY_REMOTE); + } + + @Override + public void visitType(Type type) { + startTag(ENTITY_TYPE, null, ATTR_ID, type.getId(), ATTR_TOTALCOUNT, type.getTotalCount(), ATTR_FAILCOUNT, type.getFailCount(), ATTR_FAILPERCENT, toString(type.getFailPercent(), "0.00"), ATTR_AVG, toString(type.getAvg(), "0.00"), ATTR_SUM, toString(type.getSum(), "0.00"), ATTR_TPS, toString(type.getTps(), "0.00")); + + if (!type.getNames().isEmpty()) { + for (Name name : type.getNames().values()) { + name.accept(m_visitor); + } + } + + endTag(ENTITY_TYPE); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/ILinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/ILinker.java new file mode 100644 index 0000000000..d6c624f192 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/ILinker.java @@ -0,0 +1,18 @@ +package com.dianping.cat.consumer.cross.model.transform; + +import com.dianping.cat.consumer.cross.model.entity.CrossReport; +import com.dianping.cat.consumer.cross.model.entity.Local; +import com.dianping.cat.consumer.cross.model.entity.Name; +import com.dianping.cat.consumer.cross.model.entity.Remote; +import com.dianping.cat.consumer.cross.model.entity.Type; + +public interface ILinker { + + public boolean onLocal(CrossReport parent, Local local); + + public boolean onName(Type parent, Name name); + + public boolean onRemote(Local parent, Remote remote); + + public boolean onType(Remote parent, Type type); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/IMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/IMaker.java new file mode 100644 index 0000000000..0a4b86fb33 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/IMaker.java @@ -0,0 +1,24 @@ +package com.dianping.cat.consumer.cross.model.transform; + +import com.dianping.cat.consumer.cross.model.entity.CrossReport; +import com.dianping.cat.consumer.cross.model.entity.Local; +import com.dianping.cat.consumer.cross.model.entity.Name; +import com.dianping.cat.consumer.cross.model.entity.Remote; +import com.dianping.cat.consumer.cross.model.entity.Type; + +public interface IMaker { + + public CrossReport buildCrossReport(T node); + + public String buildDomain(T node); + + public String buildIp(T node); + + public Local buildLocal(T node); + + public Name buildName(T node); + + public Remote buildRemote(T node); + + public Type buildType(T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/IParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/IParser.java new file mode 100644 index 0000000000..311fecbbf2 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/cross/model/transform/IParser.java @@ -0,0 +1,19 @@ +package com.dianping.cat.consumer.cross.model.transform; + +import com.dianping.cat.consumer.cross.model.entity.CrossReport; +import com.dianping.cat.consumer.cross.model.entity.Local; +import com.dianping.cat.consumer.cross.model.entity.Name; +import com.dianping.cat.consumer.cross.model.entity.Remote; +import com.dianping.cat.consumer.cross.model.entity.Type; + +public interface IParser { + public CrossReport parse(IMaker maker, ILinker linker, T node); + + public void parseForLocal(IMaker maker, ILinker linker, Local parent, T node); + + public void parseForName(IMaker maker, ILinker linker, Name parent, T node); + + public void parseForRemote(IMaker maker, ILinker linker, Remote parent, T node); + + public void parseForType(IMaker maker, ILinker linker, Type parent, T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/BaseEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/BaseEntity.java new file mode 100644 index 0000000000..1dc200c32a --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.consumer.dependency.model; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.consumer.dependency.model.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/Constants.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/Constants.java new file mode 100644 index 0000000000..dabbba26b2 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/Constants.java @@ -0,0 +1,48 @@ +package com.dianping.cat.consumer.dependency.model; + +public class Constants { + + public static final String ATTR_AVG = "avg"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_ERROR_COUNT = "error-count"; + + public static final String ATTR_EXCEPTION_COUNT = "exception-count"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_KEY = "key"; + + public static final String ATTR_NAME = "name"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ATTR_SUM = "sum"; + + public static final String ATTR_TARGET = "target"; + + public static final String ATTR_TOTAL_COUNT = "total-count"; + + public static final String ATTR_TYPE = "type"; + + public static final String ELEMENT_DOMAINNAME = "domainName"; + + public static final String ELEMENT_DOMAIN_NAMES = "domain-names"; + + public static final String ENTITY_DEPENDENCY = "dependency"; + + public static final String ENTITY_DEPENDENCIES = "dependencies"; + + public static final String ENTITY_DEPENDENCY_REPORT = "dependency-report"; + + public static final String ENTITY_INDEX = "index"; + + public static final String ENTITY_INDEXS = "indexs"; + + public static final String ENTITY_SEGMENT = "segment"; + + public static final String ENTITY_SEGMENTS = "segments"; +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/IEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/IEntity.java new file mode 100644 index 0000000000..7a7a2c1c86 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.consumer.dependency.model; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/IVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/IVisitor.java new file mode 100644 index 0000000000..e6348098b0 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/IVisitor.java @@ -0,0 +1,17 @@ +package com.dianping.cat.consumer.dependency.model; + +import com.dianping.cat.consumer.dependency.model.entity.Dependency; +import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; +import com.dianping.cat.consumer.dependency.model.entity.Index; +import com.dianping.cat.consumer.dependency.model.entity.Segment; + +public interface IVisitor { + + public void visitDependency(Dependency dependency); + + public void visitDependencyReport(DependencyReport dependencyReport); + + public void visitIndex(Index index); + + public void visitSegment(Segment segment); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/Dependency.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/Dependency.java new file mode 100644 index 0000000000..53aa290717 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/Dependency.java @@ -0,0 +1,164 @@ +package com.dianping.cat.consumer.dependency.model.entity; + +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_KEY; +import static com.dianping.cat.consumer.dependency.model.Constants.ENTITY_DEPENDENCY; + +import com.dianping.cat.consumer.dependency.model.BaseEntity; +import com.dianping.cat.consumer.dependency.model.IVisitor; + +public class Dependency extends BaseEntity { + private String m_type; + + private String m_target; + + private long m_totalCount; + + private double m_avg; + + private long m_errorCount; + + private String m_key; + + private double m_sum; + + public Dependency() { + } + + public Dependency(String key) { + m_key = key; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDependency(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Dependency) { + Dependency _o = (Dependency) obj; + + if (!equals(getKey(), _o.getKey())) { + return false; + } + + return true; + } + + return false; + } + + public double getAvg() { + return m_avg; + } + + public long getErrorCount() { + return m_errorCount; + } + + public String getKey() { + return m_key; + } + + public double getSum() { + return m_sum; + } + + public String getTarget() { + return m_target; + } + + public long getTotalCount() { + return m_totalCount; + } + + public String getType() { + return m_type; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_key == null ? 0 : m_key.hashCode()); + + return hash; + } + + public Dependency incErrorCount() { + m_errorCount++; + return this; + } + + public Dependency incErrorCount(long errorCount) { + m_errorCount += errorCount; + return this; + } + + public Dependency incTotalCount() { + m_totalCount++; + return this; + } + + public Dependency incTotalCount(long totalCount) { + m_totalCount += totalCount; + return this; + } + + @Override + public void mergeAttributes(Dependency other) { + assertAttributeEquals(other, ENTITY_DEPENDENCY, ATTR_KEY, m_key, other.getKey()); + + if (other.getType() != null) { + m_type = other.getType(); + } + + if (other.getTarget() != null) { + m_target = other.getTarget(); + } + + m_totalCount = other.getTotalCount(); + + m_avg = other.getAvg(); + + m_errorCount = other.getErrorCount(); + + m_sum = other.getSum(); + } + + public Dependency setAvg(double avg) { + m_avg = avg; + return this; + } + + public Dependency setErrorCount(long errorCount) { + m_errorCount = errorCount; + return this; + } + + public Dependency setKey(String key) { + m_key = key; + return this; + } + + public Dependency setSum(double sum) { + m_sum = sum; + return this; + } + + public Dependency setTarget(String target) { + m_target = target; + return this; + } + + public Dependency setTotalCount(long totalCount) { + m_totalCount = totalCount; + return this; + } + + public Dependency setType(String type) { + m_type = type; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/DependencyReport.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/DependencyReport.java new file mode 100644 index 0000000000..28941f1a64 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/DependencyReport.java @@ -0,0 +1,144 @@ +package com.dianping.cat.consumer.dependency.model.entity; + +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.dependency.model.Constants.ENTITY_DEPENDENCY_REPORT; + +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +import com.dianping.cat.consumer.dependency.model.BaseEntity; +import com.dianping.cat.consumer.dependency.model.IVisitor; + +public class DependencyReport extends BaseEntity { + private String m_domain; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Map m_segments = new LinkedHashMap(); + + private Set m_domainNames = new LinkedHashSet(); + + public DependencyReport() { + } + + public DependencyReport(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDependencyReport(this); + } + + public DependencyReport addDomainName(String domainName) { + m_domainNames.add(domainName); + return this; + } + + public DependencyReport addSegment(Segment segment) { + m_segments.put(segment.getId(), segment); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DependencyReport) { + DependencyReport _o = (DependencyReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public Segment findSegment(Integer id) { + return m_segments.get(id); + } + + public Segment findOrCreateSegment(Integer id) { + Segment segment = m_segments.get(id); + + if (segment == null) { + synchronized (m_segments) { + segment = m_segments.get(id); + + if (segment == null) { + segment = new Segment(id); + m_segments.put(id, segment); + } + } + } + + return segment; + } + + public String getDomain() { + return m_domain; + } + + public Set getDomainNames() { + return m_domainNames; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public Map getSegments() { + return m_segments; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(DependencyReport other) { + assertAttributeEquals(other, ENTITY_DEPENDENCY_REPORT, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Segment removeSegment(Integer id) { + return m_segments.remove(id); + } + + public DependencyReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public DependencyReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public DependencyReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/Index.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/Index.java new file mode 100644 index 0000000000..4784e4af5c --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/Index.java @@ -0,0 +1,134 @@ +package com.dianping.cat.consumer.dependency.model.entity; + +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.dependency.model.Constants.ENTITY_INDEX; + +import com.dianping.cat.consumer.dependency.model.BaseEntity; +import com.dianping.cat.consumer.dependency.model.IVisitor; + +public class Index extends BaseEntity { + private String m_name; + + private long m_totalCount; + + private long m_errorCount; + + private double m_sum; + + private double m_avg; + + public Index() { + } + + public Index(String name) { + m_name = name; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitIndex(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Index) { + Index _o = (Index) obj; + + if (!equals(getName(), _o.getName())) { + return false; + } + + return true; + } + + return false; + } + + public double getAvg() { + return m_avg; + } + + public long getErrorCount() { + return m_errorCount; + } + + public String getName() { + return m_name; + } + + public double getSum() { + return m_sum; + } + + public long getTotalCount() { + return m_totalCount; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_name == null ? 0 : m_name.hashCode()); + + return hash; + } + + public Index incErrorCount() { + m_errorCount++; + return this; + } + + public Index incErrorCount(long errorCount) { + m_errorCount += errorCount; + return this; + } + + public Index incTotalCount() { + m_totalCount++; + return this; + } + + public Index incTotalCount(long totalCount) { + m_totalCount += totalCount; + return this; + } + + @Override + public void mergeAttributes(Index other) { + assertAttributeEquals(other, ENTITY_INDEX, ATTR_NAME, m_name, other.getName()); + + m_totalCount = other.getTotalCount(); + + m_errorCount = other.getErrorCount(); + + m_sum = other.getSum(); + + m_avg = other.getAvg(); + } + + public Index setAvg(double avg) { + m_avg = avg; + return this; + } + + public Index setErrorCount(long errorCount) { + m_errorCount = errorCount; + return this; + } + + public Index setName(String name) { + m_name = name; + return this; + } + + public Index setSum(double sum) { + m_sum = sum; + return this; + } + + public Index setTotalCount(long totalCount) { + m_totalCount = totalCount; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/Segment.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/Segment.java new file mode 100644 index 0000000000..bc8dd292f8 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/entity/Segment.java @@ -0,0 +1,152 @@ +package com.dianping.cat.consumer.dependency.model.entity; + +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.dependency.model.Constants.ENTITY_SEGMENT; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.dependency.model.BaseEntity; +import com.dianping.cat.consumer.dependency.model.IVisitor; + +public class Segment extends BaseEntity { + private Integer m_id; + + private Integer m_exceptionCount; + + private Map m_indexs = new LinkedHashMap(); + + private Map m_dependencies = new LinkedHashMap(); + + public Segment() { + } + + public Segment(Integer id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitSegment(this); + } + + public Segment addDependency(Dependency dependency) { + m_dependencies.put(dependency.getKey(), dependency); + return this; + } + + public Segment addIndex(Index index) { + m_indexs.put(index.getName(), index); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Segment) { + Segment _o = (Segment) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Dependency findDependency(String key) { + return m_dependencies.get(key); + } + + public Index findIndex(String name) { + return m_indexs.get(name); + } + + public Dependency findOrCreateDependency(String key) { + Dependency dependency = m_dependencies.get(key); + + if (dependency == null) { + synchronized (m_dependencies) { + dependency = m_dependencies.get(key); + + if (dependency == null) { + dependency = new Dependency(key); + m_dependencies.put(key, dependency); + } + } + } + + return dependency; + } + + public Index findOrCreateIndex(String name) { + Index index = m_indexs.get(name); + + if (index == null) { + synchronized (m_indexs) { + index = m_indexs.get(name); + + if (index == null) { + index = new Index(name); + m_indexs.put(name, index); + } + } + } + + return index; + } + + public Map getDependencies() { + return m_dependencies; + } + + public Integer getExceptionCount() { + return m_exceptionCount; + } + + public Integer getId() { + return m_id; + } + + public Map getIndexs() { + return m_indexs; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Segment other) { + assertAttributeEquals(other, ENTITY_SEGMENT, ATTR_ID, m_id, other.getId()); + + if (other.getExceptionCount() != null) { + m_exceptionCount = other.getExceptionCount(); + } + } + + public Dependency removeDependency(String key) { + return m_dependencies.remove(key); + } + + public Index removeIndex(String name) { + return m_indexs.remove(name); + } + + public Segment setExceptionCount(Integer exceptionCount) { + m_exceptionCount = exceptionCount; + return this; + } + + public Segment setId(Integer id) { + m_id = id; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/BaseVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/BaseVisitor.java new file mode 100644 index 0000000000..00b05a9c8c --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/BaseVisitor.java @@ -0,0 +1,35 @@ +package com.dianping.cat.consumer.dependency.model.transform; + +import com.dianping.cat.consumer.dependency.model.IVisitor; +import com.dianping.cat.consumer.dependency.model.entity.Dependency; +import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; +import com.dianping.cat.consumer.dependency.model.entity.Index; +import com.dianping.cat.consumer.dependency.model.entity.Segment; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitDependency(Dependency dependency) { + } + + @Override + public void visitDependencyReport(DependencyReport dependencyReport) { + for (Segment segment : dependencyReport.getSegments().values()) { + visitSegment(segment); + } + } + + @Override + public void visitIndex(Index index) { + } + + @Override + public void visitSegment(Segment segment) { + for (Index index : segment.getIndexs().values()) { + visitIndex(index); + } + + for (Dependency dependency : segment.getDependencies().values()) { + visitDependency(dependency); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultLinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultLinker.java new file mode 100644 index 0000000000..924e12ba18 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultLinker.java @@ -0,0 +1,72 @@ +package com.dianping.cat.consumer.dependency.model.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.consumer.dependency.model.entity.Dependency; +import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; +import com.dianping.cat.consumer.dependency.model.entity.Index; +import com.dianping.cat.consumer.dependency.model.entity.Segment; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDependency(final Segment parent, final Dependency dependency) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDependency(dependency); + } + }); + } else { + parent.addDependency(dependency); + } + + return true; + } + + @Override + public boolean onIndex(final Segment parent, final Index index) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addIndex(index); + } + }); + } else { + parent.addIndex(index); + } + + return true; + } + + @Override + public boolean onSegment(final DependencyReport parent, final Segment segment) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addSegment(segment); + } + }); + } else { + parent.addSegment(segment); + } + + return true; + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultMerger.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultMerger.java new file mode 100644 index 0000000000..6a14aa4116 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultMerger.java @@ -0,0 +1,137 @@ +package com.dianping.cat.consumer.dependency.model.transform; + +import java.util.Stack; + +import com.dianping.cat.consumer.dependency.model.IEntity; +import com.dianping.cat.consumer.dependency.model.IVisitor; +import com.dianping.cat.consumer.dependency.model.entity.Dependency; +import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; +import com.dianping.cat.consumer.dependency.model.entity.Index; +import com.dianping.cat.consumer.dependency.model.entity.Segment; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private DependencyReport m_dependencyReport; + + public DefaultMerger() { + } + + public DefaultMerger(DependencyReport dependencyReport) { + m_dependencyReport = dependencyReport; + m_objs.push(dependencyReport); + } + + public DependencyReport getDependencyReport() { + return m_dependencyReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeDependency(Dependency to, Dependency from) { + to.mergeAttributes(from); + } + + protected void mergeDependencyReport(DependencyReport to, DependencyReport from) { + to.mergeAttributes(from); + to.getDomainNames().addAll(from.getDomainNames()); + } + + protected void mergeIndex(Index to, Index from) { + to.mergeAttributes(from); + } + + protected void mergeSegment(Segment to, Segment from) { + to.mergeAttributes(from); + } + + @Override + public void visitDependency(Dependency from) { + Dependency to = (Dependency) m_objs.peek(); + + mergeDependency(to, from); + visitDependencyChildren(to, from); + } + + protected void visitDependencyChildren(Dependency to, Dependency from) { + } + + @Override + public void visitDependencyReport(DependencyReport from) { + DependencyReport to = (DependencyReport) m_objs.peek(); + + mergeDependencyReport(to, from); + visitDependencyReportChildren(to, from); + } + + protected void visitDependencyReportChildren(DependencyReport to, DependencyReport from) { + for (Segment source : from.getSegments().values()) { + Segment target = to.findSegment(source.getId()); + + if (target == null) { + target = new Segment(source.getId()); + to.addSegment(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitIndex(Index from) { + Index to = (Index) m_objs.peek(); + + mergeIndex(to, from); + visitIndexChildren(to, from); + } + + protected void visitIndexChildren(Index to, Index from) { + } + + @Override + public void visitSegment(Segment from) { + Segment to = (Segment) m_objs.peek(); + + mergeSegment(to, from); + visitSegmentChildren(to, from); + } + + protected void visitSegmentChildren(Segment to, Segment from) { + for (Index source : from.getIndexs().values()) { + Index target = to.findIndex(source.getName()); + + if (target == null) { + target = new Index(source.getName()); + to.addIndex(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Dependency source : from.getDependencies().values()) { + Dependency target = to.findDependency(source.getKey()); + + if (target == null) { + target = new Dependency(source.getKey()); + to.addDependency(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultNativeBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..59b34e46a0 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultNativeBuilder.java @@ -0,0 +1,226 @@ +package com.dianping.cat.consumer.dependency.model.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.consumer.dependency.model.IVisitor; +import com.dianping.cat.consumer.dependency.model.entity.Dependency; +import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; +import com.dianping.cat.consumer.dependency.model.entity.Index; +import com.dianping.cat.consumer.dependency.model.entity.Segment; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(DependencyReport dependencyReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(dependencyReport, out); + return out.toByteArray(); + } + + public static void build(DependencyReport dependencyReport, OutputStream out) { + dependencyReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitDependency(Dependency dependency) { + if (dependency.getType() != null) { + writeTag(1, 1); + writeString(dependency.getType()); + } + + if (dependency.getTarget() != null) { + writeTag(2, 1); + writeString(dependency.getTarget()); + } + + writeTag(3, 0); + writeLong(dependency.getTotalCount()); + + writeTag(4, 0); + writeDouble(dependency.getAvg()); + + writeTag(5, 0); + writeLong(dependency.getErrorCount()); + + if (dependency.getKey() != null) { + writeTag(6, 1); + writeString(dependency.getKey()); + } + + writeTag(7, 0); + writeDouble(dependency.getSum()); + + writeTag(63, 3); + } + + @Override + public void visitDependencyReport(DependencyReport dependencyReport) { + writeTag(63, 0); + + if (dependencyReport.getDomain() != null) { + writeTag(1, 1); + writeString(dependencyReport.getDomain()); + } + + if (dependencyReport.getStartTime() != null) { + writeTag(2, 1); + writeDate(dependencyReport.getStartTime()); + } + + if (dependencyReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(dependencyReport.getEndTime()); + } + + if (dependencyReport.getDomainNames() != null) { + writeTag(4, 2); + writeInt(dependencyReport.getDomainNames().size()); + + for (String domainName : dependencyReport.getDomainNames()) { + writeString(domainName); + } + } + + if (!dependencyReport.getSegments().isEmpty()) { + writeTag(33, 2); + writeInt(dependencyReport.getSegments().size()); + + for (Segment segment : dependencyReport.getSegments().values()) { + segment.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitIndex(Index index) { + if (index.getName() != null) { + writeTag(1, 1); + writeString(index.getName()); + } + + writeTag(2, 0); + writeLong(index.getTotalCount()); + + writeTag(3, 0); + writeLong(index.getErrorCount()); + + writeTag(4, 0); + writeDouble(index.getSum()); + + writeTag(5, 0); + writeDouble(index.getAvg()); + + writeTag(63, 3); + } + + @Override + public void visitSegment(Segment segment) { + if (segment.getId() != null) { + writeTag(1, 1); + writeInt(segment.getId()); + } + + if (segment.getExceptionCount() != null) { + writeTag(2, 1); + writeInt(segment.getExceptionCount()); + } + + if (!segment.getIndexs().isEmpty()) { + writeTag(33, 2); + writeInt(segment.getIndexs().size()); + + for (Index index : segment.getIndexs().values()) { + index.accept(m_visitor); + } + } + + if (!segment.getDependencies().isEmpty()) { + writeTag(34, 2); + writeInt(segment.getDependencies().size()); + + for (Dependency dependency : segment.getDependencies().values()) { + dependency.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeDouble(double value) { + try { + writeVarint(Double.doubleToLongBits(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeLong(long value) { + try { + writeVarint(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultNativeParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..41bd6ee9dd --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultNativeParser.java @@ -0,0 +1,274 @@ +package com.dianping.cat.consumer.dependency.model.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.consumer.dependency.model.IVisitor; +import com.dianping.cat.consumer.dependency.model.entity.Dependency; +import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; +import com.dianping.cat.consumer.dependency.model.entity.Index; +import com.dianping.cat.consumer.dependency.model.entity.Segment; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static DependencyReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static DependencyReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + DependencyReport dependencyReport = new DependencyReport(); + + try { + dependencyReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return dependencyReport; + } + + @Override + public void visitDependency(Dependency dependency) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDependencyChildren(dependency, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDependencyChildren(Dependency dependency, int _field, int _type) { + switch (_field) { + case 1: + dependency.setType(readString()); + break; + case 2: + dependency.setTarget(readString()); + break; + case 3: + dependency.setTotalCount(readLong()); + break; + case 4: + dependency.setAvg(readDouble()); + break; + case 5: + dependency.setErrorCount(readLong()); + break; + case 6: + dependency.setKey(readString()); + break; + case 7: + dependency.setSum(readDouble()); + break; + } + } + + @Override + public void visitDependencyReport(DependencyReport dependencyReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitDependencyReportChildren(dependencyReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDependencyReportChildren(DependencyReport dependencyReport, int _field, int _type) { + switch (_field) { + case 1: + dependencyReport.setDomain(readString()); + break; + case 2: + dependencyReport.setStartTime(readDate()); + break; + case 3: + dependencyReport.setEndTime(readDate()); + break; + case 4: + if (_type == 1) { + dependencyReport.addDomainName(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + dependencyReport.addDomainName(readString()); + } + } + break; + case 33: + if (_type == 1) { + Segment segment = new Segment(); + + visitSegment(segment); + m_linker.onSegment(dependencyReport, segment); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Segment segment = new Segment(); + + visitSegment(segment); + m_linker.onSegment(dependencyReport, segment); + } + } + break; + } + } + + @Override + public void visitIndex(Index index) { + byte tag; + + while ((tag = readTag()) != -1) { + visitIndexChildren(index, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitIndexChildren(Index index, int _field, int _type) { + switch (_field) { + case 1: + index.setName(readString()); + break; + case 2: + index.setTotalCount(readLong()); + break; + case 3: + index.setErrorCount(readLong()); + break; + case 4: + index.setSum(readDouble()); + break; + case 5: + index.setAvg(readDouble()); + break; + } + } + + @Override + public void visitSegment(Segment segment) { + byte tag; + + while ((tag = readTag()) != -1) { + visitSegmentChildren(segment, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitSegmentChildren(Segment segment, int _field, int _type) { + switch (_field) { + case 1: + segment.setId(readInt()); + break; + case 2: + segment.setExceptionCount(readInt()); + break; + case 33: + if (_type == 1) { + Index index = new Index(); + + visitIndex(index); + m_linker.onIndex(segment, index); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Index index = new Index(); + + visitIndex(index); + m_linker.onIndex(segment, index); + } + } + break; + case 34: + if (_type == 1) { + Dependency dependency = new Dependency(); + + visitDependency(dependency); + m_linker.onDependency(segment, dependency); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Dependency dependency = new Dependency(); + + visitDependency(dependency); + m_linker.onDependency(segment, dependency); + } + } + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private double readDouble() { + try { + return Double.longBitsToDouble(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private long readLong() { + try { + return readVarint(64); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultSaxMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..ed1c241a07 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultSaxMaker.java @@ -0,0 +1,178 @@ +package com.dianping.cat.consumer.dependency.model.transform; + +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_AVG; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_ERROR_COUNT; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_EXCEPTION_COUNT; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_KEY; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_SUM; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_TARGET; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_TOTAL_COUNT; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_TYPE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.consumer.dependency.model.entity.Dependency; +import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; +import com.dianping.cat.consumer.dependency.model.entity.Index; +import com.dianping.cat.consumer.dependency.model.entity.Segment; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Dependency buildDependency(Attributes attributes) { + String type = attributes.getValue(ATTR_TYPE); + String target = attributes.getValue(ATTR_TARGET); + String totalCount = attributes.getValue(ATTR_TOTAL_COUNT); + String avg = attributes.getValue(ATTR_AVG); + String errorCount = attributes.getValue(ATTR_ERROR_COUNT); + String key = attributes.getValue(ATTR_KEY); + String sum = attributes.getValue(ATTR_SUM); + Dependency dependency = new Dependency(key); + + if (type != null) { + dependency.setType(type); + } + + if (target != null) { + dependency.setTarget(target); + } + + if (totalCount != null) { + dependency.setTotalCount(convert(Long.class, totalCount, 0L)); + } + + if (avg != null) { + dependency.setAvg(toNumber(avg, "0.00", 0).doubleValue()); + } + + if (errorCount != null) { + dependency.setErrorCount(convert(Long.class, errorCount, 0L)); + } + + if (sum != null) { + dependency.setSum(toNumber(sum, "0.00", 0).doubleValue()); + } + + return dependency; + } + + @Override + public DependencyReport buildDependencyReport(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String startTime = attributes.getValue(ATTR_STARTTIME); + String endTime = attributes.getValue(ATTR_ENDTIME); + DependencyReport dependencyReport = new DependencyReport(domain); + + if (startTime != null) { + dependencyReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + dependencyReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return dependencyReport; + } + + @Override + public String buildDomainName(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Index buildIndex(Attributes attributes) { + String name = attributes.getValue(ATTR_NAME); + String totalCount = attributes.getValue(ATTR_TOTAL_COUNT); + String errorCount = attributes.getValue(ATTR_ERROR_COUNT); + String sum = attributes.getValue(ATTR_SUM); + String avg = attributes.getValue(ATTR_AVG); + Index index = new Index(name); + + if (totalCount != null) { + index.setTotalCount(convert(Long.class, totalCount, 0L)); + } + + if (errorCount != null) { + index.setErrorCount(convert(Long.class, errorCount, 0L)); + } + + if (sum != null) { + index.setSum(toNumber(sum, "0.00", 0).doubleValue()); + } + + if (avg != null) { + index.setAvg(toNumber(avg, "0.00", 0).doubleValue()); + } + + return index; + } + + @Override + public Segment buildSegment(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String exceptionCount = attributes.getValue(ATTR_EXCEPTION_COUNT); + Segment segment = new Segment(id == null ? null : convert(Integer.class, id, null)); + + if (exceptionCount != null) { + segment.setExceptionCount(convert(Integer.class, exceptionCount, null)); + } + + return segment; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format, Number defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultSaxParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..53781c7689 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultSaxParser.java @@ -0,0 +1,298 @@ +package com.dianping.cat.consumer.dependency.model.transform; + +import static com.dianping.cat.consumer.dependency.model.Constants.ELEMENT_DOMAINNAME; +import static com.dianping.cat.consumer.dependency.model.Constants.ELEMENT_DOMAIN_NAMES; + +import static com.dianping.cat.consumer.dependency.model.Constants.ENTITY_DEPENDENCY; +import static com.dianping.cat.consumer.dependency.model.Constants.ENTITY_DEPENDENCY_REPORT; +import static com.dianping.cat.consumer.dependency.model.Constants.ENTITY_INDEX; +import static com.dianping.cat.consumer.dependency.model.Constants.ENTITY_SEGMENT; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.consumer.dependency.model.IEntity; +import com.dianping.cat.consumer.dependency.model.entity.Dependency; +import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; +import com.dianping.cat.consumer.dependency.model.entity.Index; +import com.dianping.cat.consumer.dependency.model.entity.Segment; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static DependencyReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(DependencyReport.class, new InputSource(removeBOM(in))); + } + + public static DependencyReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(DependencyReport.class, new InputSource(removeBOM(reader))); + } + + public static DependencyReport parse(String xml) throws SAXException, IOException { + return parseEntity(DependencyReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof DependencyReport) { + DependencyReport dependencyReport = (DependencyReport) currentObj; + + if (ELEMENT_DOMAINNAME.equals(currentTag)) { + dependencyReport.addDomainName(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForDependency(Dependency parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForDependencyReport(DependencyReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_DOMAIN_NAMES.equals(qName) || ELEMENT_DOMAINNAME.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_SEGMENT.equals(qName)) { + Segment segment = m_maker.buildSegment(attributes); + + m_linker.onSegment(parentObj, segment); + m_objs.push(segment); + } else { + throw new SAXException(String.format("Element(%s) is not expected under dependency-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseForIndex(Index parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForSegment(Segment parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_INDEX.equals(qName)) { + Index index = m_maker.buildIndex(attributes); + + m_linker.onIndex(parentObj, index); + m_objs.push(index); + } else if (ENTITY_DEPENDENCY.equals(qName)) { + Dependency dependency = m_maker.buildDependency(attributes); + + m_linker.onDependency(parentObj, dependency); + m_objs.push(dependency); + } else { + throw new SAXException(String.format("Element(%s) is not expected under segment!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_DEPENDENCY_REPORT.equals(qName)) { + DependencyReport dependencyReport = m_maker.buildDependencyReport(attributes); + + m_entity = dependencyReport; + m_objs.push(dependencyReport); + m_tags.push(qName); + } else if (ENTITY_SEGMENT.equals(qName)) { + Segment segment = m_maker.buildSegment(attributes); + + m_entity = segment; + m_objs.push(segment); + m_tags.push(qName); + } else if (ENTITY_INDEX.equals(qName)) { + Index index = m_maker.buildIndex(attributes); + + m_entity = index; + m_objs.push(index); + m_tags.push(qName); + } else if (ENTITY_DEPENDENCY.equals(qName)) { + Dependency dependency = m_maker.buildDependency(attributes); + + m_entity = dependency; + m_objs.push(dependency); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof DependencyReport) { + parseForDependencyReport((DependencyReport) parent, tag, qName, attributes); + } else if (parent instanceof Segment) { + parseForSegment((Segment) parent, tag, qName, attributes); + } else if (parent instanceof Index) { + parseForIndex((Index) parent, tag, qName, attributes); + } else if (parent instanceof Dependency) { + parseForDependency((Dependency) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format) { + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultXmlBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..79bbd957c8 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/DefaultXmlBuilder.java @@ -0,0 +1,318 @@ +package com.dianping.cat.consumer.dependency.model.transform; + +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_AVG; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_ERROR_COUNT; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_EXCEPTION_COUNT; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_KEY; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_SUM; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_TARGET; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_TOTAL_COUNT; +import static com.dianping.cat.consumer.dependency.model.Constants.ATTR_TYPE; +import static com.dianping.cat.consumer.dependency.model.Constants.ELEMENT_DOMAINNAME; +import static com.dianping.cat.consumer.dependency.model.Constants.ENTITY_DEPENDENCY; +import static com.dianping.cat.consumer.dependency.model.Constants.ENTITY_DEPENDENCY_REPORT; +import static com.dianping.cat.consumer.dependency.model.Constants.ENTITY_INDEX; +import static com.dianping.cat.consumer.dependency.model.Constants.ENTITY_SEGMENT; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.consumer.dependency.model.IEntity; +import com.dianping.cat.consumer.dependency.model.IVisitor; +import com.dianping.cat.consumer.dependency.model.entity.Dependency; +import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; +import com.dianping.cat.consumer.dependency.model.entity.Index; +import com.dianping.cat.consumer.dependency.model.entity.Segment; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + protected String toString(Number number, String format) { + if (number != null) { + return new java.text.DecimalFormat(format).format(number); + } else { + return null; + } + } + + @Override + public void visitDependency(Dependency dependency) { + startTag(ENTITY_DEPENDENCY, true, null, ATTR_TYPE, dependency.getType(), ATTR_TARGET, dependency.getTarget(), ATTR_TOTAL_COUNT, dependency.getTotalCount(), ATTR_AVG, toString(dependency.getAvg(), "0.00"), ATTR_ERROR_COUNT, dependency.getErrorCount(), ATTR_KEY, dependency.getKey(), ATTR_SUM, toString(dependency.getSum(), "0.00")); + } + + @Override + public void visitDependencyReport(DependencyReport dependencyReport) { + startTag(ENTITY_DEPENDENCY_REPORT, null, ATTR_DOMAIN, dependencyReport.getDomain(), ATTR_STARTTIME, toString(dependencyReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_ENDTIME, toString(dependencyReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!dependencyReport.getDomainNames().isEmpty()) { + for (String domainName : dependencyReport.getDomainNames()) { + tagWithText(ELEMENT_DOMAINNAME, domainName); + } + } + + if (!dependencyReport.getSegments().isEmpty()) { + for (Segment segment : dependencyReport.getSegments().values()) { + segment.accept(m_visitor); + } + } + + endTag(ENTITY_DEPENDENCY_REPORT); + } + + @Override + public void visitIndex(Index index) { + startTag(ENTITY_INDEX, true, null, ATTR_NAME, index.getName(), ATTR_TOTAL_COUNT, index.getTotalCount(), ATTR_ERROR_COUNT, index.getErrorCount(), ATTR_SUM, toString(index.getSum(), "0.00"), ATTR_AVG, toString(index.getAvg(), "0.00")); + } + + @Override + public void visitSegment(Segment segment) { + startTag(ENTITY_SEGMENT, null, ATTR_ID, segment.getId(), ATTR_EXCEPTION_COUNT, segment.getExceptionCount()); + + if (!segment.getIndexs().isEmpty()) { + for (Index index : segment.getIndexs().values()) { + index.accept(m_visitor); + } + } + + if (!segment.getDependencies().isEmpty()) { + for (Dependency dependency : segment.getDependencies().values()) { + dependency.accept(m_visitor); + } + } + + endTag(ENTITY_SEGMENT); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/ILinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/ILinker.java new file mode 100644 index 0000000000..8b7ae76278 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/ILinker.java @@ -0,0 +1,15 @@ +package com.dianping.cat.consumer.dependency.model.transform; + +import com.dianping.cat.consumer.dependency.model.entity.Dependency; +import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; +import com.dianping.cat.consumer.dependency.model.entity.Index; +import com.dianping.cat.consumer.dependency.model.entity.Segment; + +public interface ILinker { + + public boolean onDependency(Segment parent, Dependency dependency); + + public boolean onIndex(Segment parent, Index index); + + public boolean onSegment(DependencyReport parent, Segment segment); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/IMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/IMaker.java new file mode 100644 index 0000000000..7106278395 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/IMaker.java @@ -0,0 +1,19 @@ +package com.dianping.cat.consumer.dependency.model.transform; + +import com.dianping.cat.consumer.dependency.model.entity.Dependency; +import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; +import com.dianping.cat.consumer.dependency.model.entity.Index; +import com.dianping.cat.consumer.dependency.model.entity.Segment; + +public interface IMaker { + + public Dependency buildDependency(T node); + + public DependencyReport buildDependencyReport(T node); + + public String buildDomainName(T node); + + public Index buildIndex(T node); + + public Segment buildSegment(T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/IParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/IParser.java new file mode 100644 index 0000000000..0ed909cde2 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/dependency/model/transform/IParser.java @@ -0,0 +1,16 @@ +package com.dianping.cat.consumer.dependency.model.transform; + +import com.dianping.cat.consumer.dependency.model.entity.Dependency; +import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; +import com.dianping.cat.consumer.dependency.model.entity.Index; +import com.dianping.cat.consumer.dependency.model.entity.Segment; + +public interface IParser { + public DependencyReport parse(IMaker maker, ILinker linker, T node); + + public void parseForDependency(IMaker maker, ILinker linker, Dependency parent, T node); + + public void parseForIndex(IMaker maker, ILinker linker, Index parent, T node); + + public void parseForSegment(IMaker maker, ILinker linker, Segment parent, T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/BaseEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/BaseEntity.java new file mode 100644 index 0000000000..2c9b45dd14 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.consumer.event.model; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.consumer.event.model.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/Constants.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/Constants.java new file mode 100644 index 0000000000..7979c5990b --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/Constants.java @@ -0,0 +1,66 @@ +package com.dianping.cat.consumer.event.model; + +public class Constants { + + public static final String ATTR_COUNT = "count"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_DURATION = "duration"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_FAILCOUNT = "failCount"; + + public static final String ATTR_FAILPERCENT = "failPercent"; + + public static final String ATTR_FAILS = "fails"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_IP = "ip"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ATTR_TOTALCOUNT = "totalCount"; + + public static final String ATTR_TPS = "tps"; + + public static final String ATTR_VALUE = "value"; + + public static final String ELEMENT_DOMAIN = "domain"; + + public static final String ELEMENT_DOMAIN_NAMES = "domain-names"; + + public static final String ELEMENT_FAILMESSAGEURL = "failMessageUrl"; + + public static final String ELEMENT_IP = "ip"; + + public static final String ELEMENT_IPS = "ips"; + + public static final String ELEMENT_SUCCESSMESSAGEURL = "successMessageUrl"; + + public static final String ENTITY_EVENT_REPORT = "event-report"; + + public static final String ENTITY_GRAPH_TREND = "graph-trend"; + + public static final String ENTITY_MACHINE = "machine"; + + public static final String ENTITY_MACHINES = "machines"; + + public static final String ENTITY_NAME = "name"; + + public static final String ENTITY_NAMES = "names"; + + public static final String ENTITY_RANGE = "range"; + + public static final String ENTITY_RANGES = "ranges"; + + public static final String ENTITY_STATUSCODE = "statusCode"; + + public static final String ENTITY_STATUSCODES = "statusCodes"; + + public static final String ENTITY_TYPE = "type"; + + public static final String ENTITY_TYPES = "types"; +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/IEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/IEntity.java new file mode 100644 index 0000000000..0dfbbff04e --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.consumer.event.model; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/IVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/IVisitor.java new file mode 100644 index 0000000000..6998990c6a --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/IVisitor.java @@ -0,0 +1,26 @@ +package com.dianping.cat.consumer.event.model; + +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.event.model.entity.EventType; +import com.dianping.cat.consumer.event.model.entity.GraphTrend; +import com.dianping.cat.consumer.event.model.entity.Machine; +import com.dianping.cat.consumer.event.model.entity.Range; +import com.dianping.cat.consumer.event.model.entity.StatusCode; + +public interface IVisitor { + + public void visitEventReport(EventReport eventReport); + + public void visitGraphTrend(GraphTrend graphTrend); + + public void visitMachine(Machine machine); + + public void visitName(EventName name); + + public void visitRange(Range range); + + public void visitStatusCode(StatusCode statusCode); + + public void visitType(EventType type); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/EventName.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/EventName.java new file mode 100644 index 0000000000..706a2f76ac --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/EventName.java @@ -0,0 +1,255 @@ +package com.dianping.cat.consumer.event.model.entity; + +import static com.dianping.cat.consumer.event.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_NAME; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.dianping.cat.consumer.event.model.BaseEntity; +import com.dianping.cat.consumer.event.model.IVisitor; + +public class EventName extends BaseEntity { + private String m_id; + + private long m_totalCount; + + private long m_failCount; + + private double m_failPercent; + + private String m_successMessageUrl; + + private String m_failMessageUrl; + + private Map m_ranges = new ConcurrentHashMap(); + + private double m_tps; + + private transient double m_totalPercent; + + private GraphTrend m_graphTrend; + + private Map m_statusCodes = new ConcurrentHashMap(); + + public EventName() { + } + + public EventName(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitName(this); + } + + public EventName addRange(Range range) { + m_ranges.put(range.getValue(), range); + return this; + } + + public EventName addStatusCode(StatusCode statusCode) { + m_statusCodes.put(statusCode.getId(), statusCode); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof EventName) { + EventName _o = (EventName) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Range findRange(Integer value) { + return m_ranges.get(value); + } + + public StatusCode findStatusCode(String id) { + return m_statusCodes.get(id); + } + + public Range findOrCreateRange(Integer value) { + Range range = m_ranges.get(value); + + if (range == null) { + synchronized (m_ranges) { + range = m_ranges.get(value); + + if (range == null) { + range = new Range(value); + m_ranges.put(value, range); + } + } + } + + return range; + } + + public StatusCode findOrCreateStatusCode(String id) { + StatusCode statusCode = m_statusCodes.get(id); + + if (statusCode == null) { + synchronized (m_statusCodes) { + statusCode = m_statusCodes.get(id); + + if (statusCode == null) { + statusCode = new StatusCode(id); + m_statusCodes.put(id, statusCode); + } + } + } + + return statusCode; + } + + public long getFailCount() { + return m_failCount; + } + + public String getFailMessageUrl() { + return m_failMessageUrl; + } + + public double getFailPercent() { + return m_failPercent; + } + + public GraphTrend getGraphTrend() { + return m_graphTrend; + } + + public String getId() { + return m_id; + } + + public Map getRanges() { + return m_ranges; + } + + public Map getStatusCodes() { + return m_statusCodes; + } + + public String getSuccessMessageUrl() { + return m_successMessageUrl; + } + + public long getTotalCount() { + return m_totalCount; + } + + public double getTotalPercent() { + return m_totalPercent; + } + + public double getTps() { + return m_tps; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public EventName incFailCount() { + m_failCount++; + return this; + } + + public EventName incFailCount(long failCount) { + m_failCount += failCount; + return this; + } + + public EventName incTotalCount() { + m_totalCount++; + return this; + } + + public EventName incTotalCount(long totalCount) { + m_totalCount += totalCount; + return this; + } + + @Override + public void mergeAttributes(EventName other) { + assertAttributeEquals(other, ENTITY_NAME, ATTR_ID, m_id, other.getId()); + + m_totalCount = other.getTotalCount(); + + m_failCount = other.getFailCount(); + + m_failPercent = other.getFailPercent(); + + m_tps = other.getTps(); + + m_totalPercent = other.getTotalPercent(); + } + + public Range removeRange(Integer value) { + return m_ranges.remove(value); + } + + public StatusCode removeStatusCode(String id) { + return m_statusCodes.remove(id); + } + + public EventName setFailCount(long failCount) { + m_failCount = failCount; + return this; + } + + public EventName setFailMessageUrl(String failMessageUrl) { + m_failMessageUrl = failMessageUrl; + return this; + } + + public EventName setFailPercent(double failPercent) { + m_failPercent = failPercent; + return this; + } + + public EventName setGraphTrend(GraphTrend graphTrend) { + m_graphTrend = graphTrend; + return this; + } + + public EventName setId(String id) { + m_id = id; + return this; + } + + public EventName setSuccessMessageUrl(String successMessageUrl) { + m_successMessageUrl = successMessageUrl; + return this; + } + + public EventName setTotalCount(long totalCount) { + m_totalCount = totalCount; + return this; + } + + public EventName setTotalPercent(double totalPercent) { + m_totalPercent = totalPercent; + return this; + } + + public EventName setTps(double tps) { + m_tps = tps; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/EventReport.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/EventReport.java new file mode 100644 index 0000000000..ed3c733f19 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/EventReport.java @@ -0,0 +1,155 @@ +package com.dianping.cat.consumer.event.model.entity; + +import static com.dianping.cat.consumer.event.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_EVENT_REPORT; + +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import com.dianping.cat.consumer.event.model.BaseEntity; +import com.dianping.cat.consumer.event.model.IVisitor; + +public class EventReport extends BaseEntity { + private String m_domain; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Set m_domainNames = new LinkedHashSet(); + + private Map m_machines = new ConcurrentHashMap(); + + private Set m_ips = new LinkedHashSet(); + + public EventReport() { + } + + public EventReport(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitEventReport(this); + } + + public EventReport addDomain(String domain) { + m_domainNames.add(domain); + return this; + } + + public EventReport addIp(String ip) { + m_ips.add(ip); + return this; + } + + public EventReport addMachine(Machine machine) { + m_machines.put(machine.getIp(), machine); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof EventReport) { + EventReport _o = (EventReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public Machine findMachine(String ip) { + return m_machines.get(ip); + } + + public Machine findOrCreateMachine(String ip) { + Machine machine = m_machines.get(ip); + + if (machine == null) { + synchronized (m_machines) { + machine = m_machines.get(ip); + + if (machine == null) { + machine = new Machine(ip); + m_machines.put(ip, machine); + } + } + } + + return machine; + } + + public String getDomain() { + return m_domain; + } + + public Set getDomainNames() { + return m_domainNames; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public Set getIps() { + return m_ips; + } + + public Map getMachines() { + return m_machines; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(EventReport other) { + assertAttributeEquals(other, ENTITY_EVENT_REPORT, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Machine removeMachine(String ip) { + return m_machines.remove(ip); + } + + public EventReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public EventReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public EventReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/EventType.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/EventType.java new file mode 100644 index 0000000000..0ed661f7b0 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/EventType.java @@ -0,0 +1,206 @@ +package com.dianping.cat.consumer.event.model.entity; + +import static com.dianping.cat.consumer.event.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_TYPE; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.dianping.cat.consumer.event.model.BaseEntity; +import com.dianping.cat.consumer.event.model.IVisitor; + +public class EventType extends BaseEntity { + private String m_id; + + private long m_totalCount; + + private long m_failCount; + + private double m_failPercent; + + private String m_successMessageUrl; + + private String m_failMessageUrl; + + private Map m_names = new ConcurrentHashMap(); + + private double m_tps; + + private GraphTrend m_graphTrend; + + public EventType() { + } + + public EventType(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitType(this); + } + + public EventType addName(EventName name) { + m_names.put(name.getId(), name); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof EventType) { + EventType _o = (EventType) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public EventName findName(String id) { + return m_names.get(id); + } + + public EventName findOrCreateName(String id) { + EventName name = m_names.get(id); + + if (name == null) { + synchronized (m_names) { + name = m_names.get(id); + + if (name == null) { + name = new EventName(id); + m_names.put(id, name); + } + } + } + + return name; + } + + public long getFailCount() { + return m_failCount; + } + + public String getFailMessageUrl() { + return m_failMessageUrl; + } + + public double getFailPercent() { + return m_failPercent; + } + + public GraphTrend getGraphTrend() { + return m_graphTrend; + } + + public String getId() { + return m_id; + } + + public Map getNames() { + return m_names; + } + + public String getSuccessMessageUrl() { + return m_successMessageUrl; + } + + public long getTotalCount() { + return m_totalCount; + } + + public double getTps() { + return m_tps; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public EventType incFailCount() { + m_failCount++; + return this; + } + + public EventType incFailCount(long failCount) { + m_failCount += failCount; + return this; + } + + public EventType incTotalCount() { + m_totalCount++; + return this; + } + + public EventType incTotalCount(long totalCount) { + m_totalCount += totalCount; + return this; + } + + @Override + public void mergeAttributes(EventType other) { + assertAttributeEquals(other, ENTITY_TYPE, ATTR_ID, m_id, other.getId()); + + m_totalCount = other.getTotalCount(); + + m_failCount = other.getFailCount(); + + m_failPercent = other.getFailPercent(); + + m_tps = other.getTps(); + } + + public EventName removeName(String id) { + return m_names.remove(id); + } + + public EventType setFailCount(long failCount) { + m_failCount = failCount; + return this; + } + + public EventType setFailMessageUrl(String failMessageUrl) { + m_failMessageUrl = failMessageUrl; + return this; + } + + public EventType setFailPercent(double failPercent) { + m_failPercent = failPercent; + return this; + } + + public EventType setGraphTrend(GraphTrend graphTrend) { + m_graphTrend = graphTrend; + return this; + } + + public EventType setId(String id) { + m_id = id; + return this; + } + + public EventType setSuccessMessageUrl(String successMessageUrl) { + m_successMessageUrl = successMessageUrl; + return this; + } + + public EventType setTotalCount(long totalCount) { + m_totalCount = totalCount; + return this; + } + + public EventType setTps(double tps) { + m_tps = tps; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/GraphTrend.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/GraphTrend.java new file mode 100644 index 0000000000..4c39b64ead --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/GraphTrend.java @@ -0,0 +1,88 @@ +package com.dianping.cat.consumer.event.model.entity; + +import static com.dianping.cat.consumer.event.model.Constants.ATTR_DURATION; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_GRAPH_TREND; + +import com.dianping.cat.consumer.event.model.BaseEntity; +import com.dianping.cat.consumer.event.model.IVisitor; + +public class GraphTrend extends BaseEntity { + private int m_duration; + + private String m_count = ""; + + private String m_fails = ""; + + public GraphTrend() { + } + + public GraphTrend(int duration) { + m_duration = duration; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitGraphTrend(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof GraphTrend) { + GraphTrend _o = (GraphTrend) obj; + + if (getDuration() != _o.getDuration()) { + return false; + } + + return true; + } + + return false; + } + + public String getCount() { + return m_count; + } + + public int getDuration() { + return m_duration; + } + + public String getFails() { + return m_fails; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + m_duration; + + return hash; + } + + @Override + public void mergeAttributes(GraphTrend other) { + assertAttributeEquals(other, ENTITY_GRAPH_TREND, ATTR_DURATION, m_duration, other.getDuration()); + + m_count = other.getCount(); + + m_fails = other.getFails(); + } + + public GraphTrend setCount(String count) { + m_count = count; + return this; + } + + public GraphTrend setDuration(int duration) { + m_duration = duration; + return this; + } + + public GraphTrend setFails(String fails) { + m_fails = fails; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/Machine.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/Machine.java new file mode 100644 index 0000000000..4d0cbf7918 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/Machine.java @@ -0,0 +1,102 @@ +package com.dianping.cat.consumer.event.model.entity; + +import static com.dianping.cat.consumer.event.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_MACHINE; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.dianping.cat.consumer.event.model.BaseEntity; +import com.dianping.cat.consumer.event.model.IVisitor; + +public class Machine extends BaseEntity { + private String m_ip; + + private Map m_types = new ConcurrentHashMap(); + + public Machine() { + } + + public Machine(String ip) { + m_ip = ip; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMachine(this); + } + + public Machine addType(EventType type) { + m_types.put(type.getId(), type); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Machine) { + Machine _o = (Machine) obj; + + if (!equals(getIp(), _o.getIp())) { + return false; + } + + return true; + } + + return false; + } + + public EventType findType(String id) { + return m_types.get(id); + } + + public EventType findOrCreateType(String id) { + EventType type = m_types.get(id); + + if (type == null) { + synchronized (m_types) { + type = m_types.get(id); + + if (type == null) { + type = new EventType(id); + m_types.put(id, type); + } + } + } + + return type; + } + + public String getIp() { + return m_ip; + } + + public Map getTypes() { + return m_types; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_ip == null ? 0 : m_ip.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Machine other) { + assertAttributeEquals(other, ENTITY_MACHINE, ATTR_IP, m_ip, other.getIp()); + + } + + public EventType removeType(String id) { + return m_types.remove(id); + } + + public Machine setIp(String ip) { + m_ip = ip; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/Range.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/Range.java new file mode 100644 index 0000000000..428236f74e --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/Range.java @@ -0,0 +1,108 @@ +package com.dianping.cat.consumer.event.model.entity; + +import static com.dianping.cat.consumer.event.model.Constants.ATTR_VALUE; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_RANGE; + +import com.dianping.cat.consumer.event.model.BaseEntity; +import com.dianping.cat.consumer.event.model.IVisitor; + +public class Range extends BaseEntity { + private Integer m_value; + + private int m_count; + + private int m_fails; + + public Range() { + } + + public Range(Integer value) { + m_value = value; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitRange(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Range) { + Range _o = (Range) obj; + + if (!equals(getValue(), _o.getValue())) { + return false; + } + + return true; + } + + return false; + } + + public int getCount() { + return m_count; + } + + public int getFails() { + return m_fails; + } + + public Integer getValue() { + return m_value; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_value == null ? 0 : m_value.hashCode()); + + return hash; + } + + public Range incCount() { + m_count++; + return this; + } + + public Range incCount(int count) { + m_count += count; + return this; + } + + public Range incFails() { + m_fails++; + return this; + } + + public Range incFails(int fails) { + m_fails += fails; + return this; + } + + @Override + public void mergeAttributes(Range other) { + assertAttributeEquals(other, ENTITY_RANGE, ATTR_VALUE, m_value, other.getValue()); + + m_count = other.getCount(); + + m_fails = other.getFails(); + } + + public Range setCount(int count) { + m_count = count; + return this; + } + + public Range setFails(int fails) { + m_fails = fails; + return this; + } + + public Range setValue(Integer value) { + m_value = value; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/StatusCode.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/StatusCode.java new file mode 100644 index 0000000000..c5f34369ec --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/entity/StatusCode.java @@ -0,0 +1,85 @@ +package com.dianping.cat.consumer.event.model.entity; + +import static com.dianping.cat.consumer.event.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_STATUSCODE; + +import com.dianping.cat.consumer.event.model.BaseEntity; +import com.dianping.cat.consumer.event.model.IVisitor; + +public class StatusCode extends BaseEntity { + private String m_id; + + private long m_count; + + public StatusCode() { + } + + public StatusCode(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitStatusCode(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StatusCode) { + StatusCode _o = (StatusCode) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public long getCount() { + return m_count; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public StatusCode incCount() { + m_count++; + return this; + } + + public StatusCode incCount(long count) { + m_count += count; + return this; + } + + @Override + public void mergeAttributes(StatusCode other) { + assertAttributeEquals(other, ENTITY_STATUSCODE, ATTR_ID, m_id, other.getId()); + + m_count = other.getCount(); + } + + public StatusCode setCount(long count) { + m_count = count; + return this; + } + + public StatusCode setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/BaseVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/BaseVisitor.java new file mode 100644 index 0000000000..d53cf8e53c --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/BaseVisitor.java @@ -0,0 +1,64 @@ +package com.dianping.cat.consumer.event.model.transform; + +import com.dianping.cat.consumer.event.model.IVisitor; +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.event.model.entity.EventType; +import com.dianping.cat.consumer.event.model.entity.GraphTrend; +import com.dianping.cat.consumer.event.model.entity.Machine; +import com.dianping.cat.consumer.event.model.entity.Range; +import com.dianping.cat.consumer.event.model.entity.StatusCode; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitEventReport(EventReport eventReport) { + for (Machine machine : eventReport.getMachines().values()) { + visitMachine(machine); + } + } + + @Override + public void visitGraphTrend(GraphTrend graphTrend) { + } + + @Override + public void visitMachine(Machine machine) { + for (EventType type : machine.getTypes().values()) { + visitType(type); + } + } + + @Override + public void visitName(EventName name) { + for (Range range : name.getRanges().values()) { + visitRange(range); + } + + if (name.getGraphTrend() != null) { + visitGraphTrend(name.getGraphTrend()); + } + + for (StatusCode statusCode : name.getStatusCodes().values()) { + visitStatusCode(statusCode); + } + } + + @Override + public void visitRange(Range range) { + } + + @Override + public void visitStatusCode(StatusCode statusCode) { + } + + @Override + public void visitType(EventType type) { + for (EventName name : type.getNames().values()) { + visitName(name); + } + + if (type.getGraphTrend() != null) { + visitGraphTrend(type.getGraphTrend()); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultLinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultLinker.java new file mode 100644 index 0000000000..76045d20ea --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultLinker.java @@ -0,0 +1,119 @@ +package com.dianping.cat.consumer.event.model.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.event.model.entity.EventType; +import com.dianping.cat.consumer.event.model.entity.GraphTrend; +import com.dianping.cat.consumer.event.model.entity.Machine; +import com.dianping.cat.consumer.event.model.entity.Range; +import com.dianping.cat.consumer.event.model.entity.StatusCode; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onGraphTrend(final EventType parent, final GraphTrend graphTrend) { + parent.setGraphTrend(graphTrend); + return true; + } + + @Override + public boolean onGraphTrend(final EventName parent, final GraphTrend graphTrend) { + parent.setGraphTrend(graphTrend); + return true; + } + + @Override + public boolean onMachine(final EventReport parent, final Machine machine) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addMachine(machine); + } + }); + } else { + parent.addMachine(machine); + } + + return true; + } + + @Override + public boolean onName(final EventType parent, final EventName name) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addName(name); + } + }); + } else { + parent.addName(name); + } + + return true; + } + + @Override + public boolean onRange(final EventName parent, final Range range) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addRange(range); + } + }); + } else { + parent.addRange(range); + } + + return true; + } + + @Override + public boolean onStatusCode(final EventName parent, final StatusCode statusCode) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addStatusCode(statusCode); + } + }); + } else { + parent.addStatusCode(statusCode); + } + + return true; + } + + @Override + public boolean onType(final Machine parent, final EventType type) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addType(type); + } + }); + } else { + parent.addType(type); + } + + return true; + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultMerger.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultMerger.java new file mode 100644 index 0000000000..e77b6232e3 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultMerger.java @@ -0,0 +1,244 @@ +package com.dianping.cat.consumer.event.model.transform; + +import java.util.Stack; + +import com.dianping.cat.consumer.event.model.IEntity; +import com.dianping.cat.consumer.event.model.IVisitor; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.event.model.entity.GraphTrend; +import com.dianping.cat.consumer.event.model.entity.Machine; +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.Range; +import com.dianping.cat.consumer.event.model.entity.StatusCode; +import com.dianping.cat.consumer.event.model.entity.EventType; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private EventReport m_eventReport; + + public DefaultMerger() { + } + + public DefaultMerger(EventReport eventReport) { + m_eventReport = eventReport; + m_objs.push(eventReport); + } + + public EventReport getEventReport() { + return m_eventReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeEventReport(EventReport to, EventReport from) { + to.mergeAttributes(from); + to.getDomainNames().addAll(from.getDomainNames()); + to.getIps().addAll(from.getIps()); + } + + protected void mergeGraphTrend(GraphTrend to, GraphTrend from) { + to.mergeAttributes(from); + } + + protected void mergeMachine(Machine to, Machine from) { + to.mergeAttributes(from); + } + + protected void mergeName(EventName to, EventName from) { + to.mergeAttributes(from); + to.setSuccessMessageUrl(from.getSuccessMessageUrl()); + to.setFailMessageUrl(from.getFailMessageUrl()); + } + + protected void mergeRange(Range to, Range from) { + to.mergeAttributes(from); + } + + protected void mergeStatusCode(StatusCode to, StatusCode from) { + to.mergeAttributes(from); + } + + protected void mergeType(EventType to, EventType from) { + to.mergeAttributes(from); + to.setSuccessMessageUrl(from.getSuccessMessageUrl()); + to.setFailMessageUrl(from.getFailMessageUrl()); + } + + @Override + public void visitEventReport(EventReport from) { + EventReport to = (EventReport) m_objs.peek(); + + mergeEventReport(to, from); + visitEventReportChildren(to, from); + } + + protected void visitEventReportChildren(EventReport to, EventReport from) { + for (Machine source : from.getMachines().values()) { + Machine target = to.findMachine(source.getIp()); + + if (target == null) { + target = new Machine(source.getIp()); + to.addMachine(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitGraphTrend(GraphTrend from) { + GraphTrend to = (GraphTrend) m_objs.peek(); + + mergeGraphTrend(to, from); + visitGraphTrendChildren(to, from); + } + + protected void visitGraphTrendChildren(GraphTrend to, GraphTrend from) { + } + + @Override + public void visitMachine(Machine from) { + Machine to = (Machine) m_objs.peek(); + + mergeMachine(to, from); + visitMachineChildren(to, from); + } + + protected void visitMachineChildren(Machine to, Machine from) { + for (EventType source : from.getTypes().values()) { + EventType target = to.findType(source.getId()); + + if (target == null) { + target = new EventType(source.getId()); + to.addType(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitName(EventName from) { + EventName to = (EventName) m_objs.peek(); + + mergeName(to, from); + visitNameChildren(to, from); + } + + protected void visitNameChildren(EventName to, EventName from) { + for (Range source : from.getRanges().values()) { + Range target = to.findRange(source.getValue()); + + if (target == null) { + target = new Range(source.getValue()); + to.addRange(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + if (from.getGraphTrend() != null) { + GraphTrend target = to.getGraphTrend(); + + if (target == null) { + GraphTrend source = from.getGraphTrend(); + + target = new GraphTrend(source.getDuration()); + to.setGraphTrend(target); + } + + m_objs.push(target); + from.getGraphTrend().accept(this); + m_objs.pop(); + } + + for (StatusCode source : from.getStatusCodes().values()) { + StatusCode target = to.findStatusCode(source.getId()); + + if (target == null) { + target = new StatusCode(source.getId()); + to.addStatusCode(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitRange(Range from) { + Range to = (Range) m_objs.peek(); + + mergeRange(to, from); + visitRangeChildren(to, from); + } + + protected void visitRangeChildren(Range to, Range from) { + } + + @Override + public void visitStatusCode(StatusCode from) { + StatusCode to = (StatusCode) m_objs.peek(); + + mergeStatusCode(to, from); + visitStatusCodeChildren(to, from); + } + + protected void visitStatusCodeChildren(StatusCode to, StatusCode from) { + } + + @Override + public void visitType(EventType from) { + EventType to = (EventType) m_objs.peek(); + + mergeType(to, from); + visitTypeChildren(to, from); + } + + protected void visitTypeChildren(EventType to, EventType from) { + for (EventName source : from.getNames().values()) { + EventName target = to.findName(source.getId()); + + if (target == null) { + target = new EventName(source.getId()); + to.addName(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + if (from.getGraphTrend() != null) { + GraphTrend target = to.getGraphTrend(); + + if (target == null) { + GraphTrend source = from.getGraphTrend(); + + target = new GraphTrend(source.getDuration()); + to.setGraphTrend(target); + } + + m_objs.push(target); + from.getGraphTrend().accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultNativeBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..9452d906b3 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultNativeBuilder.java @@ -0,0 +1,314 @@ +package com.dianping.cat.consumer.event.model.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.consumer.event.model.IVisitor; +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.event.model.entity.EventType; +import com.dianping.cat.consumer.event.model.entity.GraphTrend; +import com.dianping.cat.consumer.event.model.entity.Machine; +import com.dianping.cat.consumer.event.model.entity.Range; +import com.dianping.cat.consumer.event.model.entity.StatusCode; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(EventReport eventReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(eventReport, out); + return out.toByteArray(); + } + + public static void build(EventReport eventReport, OutputStream out) { + eventReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitEventReport(EventReport eventReport) { + writeTag(63, 0); + + if (eventReport.getDomain() != null) { + writeTag(1, 1); + writeString(eventReport.getDomain()); + } + + if (eventReport.getStartTime() != null) { + writeTag(2, 1); + writeDate(eventReport.getStartTime()); + } + + if (eventReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(eventReport.getEndTime()); + } + + if (eventReport.getDomainNames() != null) { + writeTag(4, 2); + writeInt(eventReport.getDomainNames().size()); + + for (String domain : eventReport.getDomainNames()) { + writeString(domain); + } + } + + if (eventReport.getIps() != null) { + writeTag(5, 2); + writeInt(eventReport.getIps().size()); + + for (String ip : eventReport.getIps()) { + writeString(ip); + } + } + + if (!eventReport.getMachines().isEmpty()) { + writeTag(33, 2); + writeInt(eventReport.getMachines().size()); + + for (Machine machine : eventReport.getMachines().values()) { + machine.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitGraphTrend(GraphTrend graphTrend) { + writeTag(1, 0); + writeInt(graphTrend.getDuration()); + + writeTag(2, 0); + writeString(graphTrend.getCount()); + + writeTag(3, 0); + writeString(graphTrend.getFails()); + + writeTag(63, 3); + } + + @Override + public void visitMachine(Machine machine) { + if (machine.getIp() != null) { + writeTag(1, 1); + writeString(machine.getIp()); + } + + if (!machine.getTypes().isEmpty()) { + writeTag(33, 2); + writeInt(machine.getTypes().size()); + + for (EventType type : machine.getTypes().values()) { + type.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitName(EventName name) { + if (name.getId() != null) { + writeTag(1, 1); + writeString(name.getId()); + } + + writeTag(2, 0); + writeLong(name.getTotalCount()); + + writeTag(3, 0); + writeLong(name.getFailCount()); + + writeTag(4, 0); + writeDouble(name.getFailPercent()); + + if (name.getSuccessMessageUrl() != null) { + writeTag(5, 1); + writeString(name.getSuccessMessageUrl()); + } + + if (name.getFailMessageUrl() != null) { + writeTag(6, 1); + writeString(name.getFailMessageUrl()); + } + + writeTag(7, 0); + writeDouble(name.getTps()); + + if (!name.getRanges().isEmpty()) { + writeTag(33, 2); + writeInt(name.getRanges().size()); + + for (Range range : name.getRanges().values()) { + range.accept(m_visitor); + } + } + + if (name.getGraphTrend() != null) { + writeTag(34, 1); + name.getGraphTrend().accept(m_visitor); + } + + if (!name.getStatusCodes().isEmpty()) { + writeTag(35, 2); + writeInt(name.getStatusCodes().size()); + + for (StatusCode statusCode : name.getStatusCodes().values()) { + statusCode.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitRange(Range range) { + if (range.getValue() != null) { + writeTag(1, 1); + writeInt(range.getValue()); + } + + writeTag(2, 0); + writeInt(range.getCount()); + + writeTag(3, 0); + writeInt(range.getFails()); + + writeTag(63, 3); + } + + @Override + public void visitStatusCode(StatusCode statusCode) { + if (statusCode.getId() != null) { + writeTag(1, 1); + writeString(statusCode.getId()); + } + + writeTag(2, 0); + writeLong(statusCode.getCount()); + + writeTag(63, 3); + } + + @Override + public void visitType(EventType type) { + if (type.getId() != null) { + writeTag(1, 1); + writeString(type.getId()); + } + + writeTag(2, 0); + writeLong(type.getTotalCount()); + + writeTag(3, 0); + writeLong(type.getFailCount()); + + writeTag(4, 0); + writeDouble(type.getFailPercent()); + + if (type.getSuccessMessageUrl() != null) { + writeTag(5, 1); + writeString(type.getSuccessMessageUrl()); + } + + if (type.getFailMessageUrl() != null) { + writeTag(6, 1); + writeString(type.getFailMessageUrl()); + } + + writeTag(7, 0); + writeDouble(type.getTps()); + + if (!type.getNames().isEmpty()) { + writeTag(33, 2); + writeInt(type.getNames().size()); + + for (EventName name : type.getNames().values()) { + name.accept(m_visitor); + } + } + + if (type.getGraphTrend() != null) { + writeTag(34, 1); + type.getGraphTrend().accept(m_visitor); + } + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeDouble(double value) { + try { + writeVarint(Double.doubleToLongBits(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeLong(long value) { + try { + writeVarint(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultNativeParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..a45bbd47bc --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultNativeParser.java @@ -0,0 +1,397 @@ +package com.dianping.cat.consumer.event.model.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.consumer.event.model.IVisitor; +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.event.model.entity.EventType; +import com.dianping.cat.consumer.event.model.entity.GraphTrend; +import com.dianping.cat.consumer.event.model.entity.Machine; +import com.dianping.cat.consumer.event.model.entity.Range; +import com.dianping.cat.consumer.event.model.entity.StatusCode; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static EventReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static EventReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + EventReport eventReport = new EventReport(); + + try { + eventReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return eventReport; + } + + @Override + public void visitEventReport(EventReport eventReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitEventReportChildren(eventReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitEventReportChildren(EventReport eventReport, int _field, int _type) { + switch (_field) { + case 1: + eventReport.setDomain(readString()); + break; + case 2: + eventReport.setStartTime(readDate()); + break; + case 3: + eventReport.setEndTime(readDate()); + break; + case 4: + if (_type == 1) { + eventReport.addDomain(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + eventReport.addDomain(readString()); + } + } + break; + case 5: + if (_type == 1) { + eventReport.addIp(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + eventReport.addIp(readString()); + } + } + break; + case 33: + if (_type == 1) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(eventReport, machine); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(eventReport, machine); + } + } + break; + } + } + + @Override + public void visitGraphTrend(GraphTrend graphTrend) { + byte tag; + + while ((tag = readTag()) != -1) { + visitGraphTrendChildren(graphTrend, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitGraphTrendChildren(GraphTrend graphTrend, int _field, int _type) { + switch (_field) { + case 1: + graphTrend.setDuration(readInt()); + break; + case 2: + graphTrend.setCount(readString()); + break; + case 3: + graphTrend.setFails(readString()); + break; + } + } + + @Override + public void visitMachine(Machine machine) { + byte tag; + + while ((tag = readTag()) != -1) { + visitMachineChildren(machine, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitMachineChildren(Machine machine, int _field, int _type) { + switch (_field) { + case 1: + machine.setIp(readString()); + break; + case 33: + if (_type == 1) { + EventType type = new EventType(); + + visitType(type); + m_linker.onType(machine, type); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + EventType type = new EventType(); + + visitType(type); + m_linker.onType(machine, type); + } + } + break; + } + } + + @Override + public void visitName(EventName name) { + byte tag; + + while ((tag = readTag()) != -1) { + visitNameChildren(name, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitNameChildren(EventName name, int _field, int _type) { + switch (_field) { + case 1: + name.setId(readString()); + break; + case 2: + name.setTotalCount(readLong()); + break; + case 3: + name.setFailCount(readLong()); + break; + case 4: + name.setFailPercent(readDouble()); + break; + case 5: + name.setSuccessMessageUrl(readString()); + break; + case 6: + name.setFailMessageUrl(readString()); + break; + case 7: + name.setTps(readDouble()); + break; + case 33: + if (_type == 1) { + Range range = new Range(); + + visitRange(range); + m_linker.onRange(name, range); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Range range = new Range(); + + visitRange(range); + m_linker.onRange(name, range); + } + } + break; + case 34: + GraphTrend graphTrend = new GraphTrend(); + + visitGraphTrend(graphTrend); + m_linker.onGraphTrend(name, graphTrend); + break; + case 35: + if (_type == 1) { + StatusCode statusCode = new StatusCode(); + + visitStatusCode(statusCode); + m_linker.onStatusCode(name, statusCode); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + StatusCode statusCode = new StatusCode(); + + visitStatusCode(statusCode); + m_linker.onStatusCode(name, statusCode); + } + } + break; + } + } + + @Override + public void visitRange(Range range) { + byte tag; + + while ((tag = readTag()) != -1) { + visitRangeChildren(range, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitRangeChildren(Range range, int _field, int _type) { + switch (_field) { + case 1: + range.setValue(readInt()); + break; + case 2: + range.setCount(readInt()); + break; + case 3: + range.setFails(readInt()); + break; + } + } + + @Override + public void visitStatusCode(StatusCode statusCode) { + byte tag; + + while ((tag = readTag()) != -1) { + visitStatusCodeChildren(statusCode, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitStatusCodeChildren(StatusCode statusCode, int _field, int _type) { + switch (_field) { + case 1: + statusCode.setId(readString()); + break; + case 2: + statusCode.setCount(readLong()); + break; + } + } + + @Override + public void visitType(EventType type) { + byte tag; + + while ((tag = readTag()) != -1) { + visitTypeChildren(type, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitTypeChildren(EventType type, int _field, int _type) { + switch (_field) { + case 1: + type.setId(readString()); + break; + case 2: + type.setTotalCount(readLong()); + break; + case 3: + type.setFailCount(readLong()); + break; + case 4: + type.setFailPercent(readDouble()); + break; + case 5: + type.setSuccessMessageUrl(readString()); + break; + case 6: + type.setFailMessageUrl(readString()); + break; + case 7: + type.setTps(readDouble()); + break; + case 33: + if (_type == 1) { + EventName name = new EventName(); + + visitName(name); + m_linker.onName(type, name); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + EventName name = new EventName(); + + visitName(name); + m_linker.onName(type, name); + } + } + break; + case 34: + GraphTrend graphTrend = new GraphTrend(); + + visitGraphTrend(graphTrend); + m_linker.onGraphTrend(type, graphTrend); + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private double readDouble() { + try { + return Double.longBitsToDouble(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private long readLong() { + try { + return readVarint(64); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultSaxMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..f64e6eb6ea --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultSaxMaker.java @@ -0,0 +1,220 @@ +package com.dianping.cat.consumer.event.model.transform; + +import static com.dianping.cat.consumer.event.model.Constants.ATTR_COUNT; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_DURATION; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_FAILCOUNT; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_FAILPERCENT; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_FAILS; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_TOTALCOUNT; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_TPS; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_VALUE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.event.model.entity.EventType; +import com.dianping.cat.consumer.event.model.entity.GraphTrend; +import com.dianping.cat.consumer.event.model.entity.Machine; +import com.dianping.cat.consumer.event.model.entity.Range; +import com.dianping.cat.consumer.event.model.entity.StatusCode; + +public class DefaultSaxMaker implements IMaker { + + @Override + public String buildDomain(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public EventReport buildEventReport(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String startTime = attributes.getValue(ATTR_STARTTIME); + String endTime = attributes.getValue(ATTR_ENDTIME); + EventReport eventReport = new EventReport(domain); + + if (startTime != null) { + eventReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + eventReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return eventReport; + } + + @Override + public GraphTrend buildGraphTrend(Attributes attributes) { + String duration = attributes.getValue(ATTR_DURATION); + String count = attributes.getValue(ATTR_COUNT); + String fails = attributes.getValue(ATTR_FAILS); + GraphTrend graphTrend = new GraphTrend(duration == null ? 0 : convert(Integer.class, duration, 0)); + + if (count != null) { + graphTrend.setCount(count); + } + + if (fails != null) { + graphTrend.setFails(fails); + } + + return graphTrend; + } + + @Override + public String buildIp(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Machine buildMachine(Attributes attributes) { + String ip = attributes.getValue(ATTR_IP); + Machine machine = new Machine(ip); + + return machine; + } + + @Override + public EventName buildName(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String totalCount = attributes.getValue(ATTR_TOTALCOUNT); + String failCount = attributes.getValue(ATTR_FAILCOUNT); + String failPercent = attributes.getValue(ATTR_FAILPERCENT); + String tps = attributes.getValue(ATTR_TPS); + EventName name = new EventName(id); + + if (totalCount != null) { + name.setTotalCount(convert(Long.class, totalCount, 0L)); + } + + if (failCount != null) { + name.setFailCount(convert(Long.class, failCount, 0L)); + } + + if (failPercent != null) { + name.setFailPercent(toNumber(failPercent, "0.00", 0).doubleValue()); + } + + if (tps != null) { + name.setTps(toNumber(tps, "0.00", 0).doubleValue()); + } + + return name; + } + + @Override + public Range buildRange(Attributes attributes) { + String value = attributes.getValue(ATTR_VALUE); + String count = attributes.getValue(ATTR_COUNT); + String fails = attributes.getValue(ATTR_FAILS); + Range range = new Range(value == null ? null : convert(Integer.class, value, null)); + + if (count != null) { + range.setCount(convert(Integer.class, count, 0)); + } + + if (fails != null) { + range.setFails(convert(Integer.class, fails, 0)); + } + + return range; + } + + @Override + public StatusCode buildStatusCode(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String count = attributes.getValue(ATTR_COUNT); + StatusCode statusCode = new StatusCode(id); + + if (count != null) { + statusCode.setCount(convert(Long.class, count, 0L)); + } + + return statusCode; + } + + @Override + public EventType buildType(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String totalCount = attributes.getValue(ATTR_TOTALCOUNT); + String failCount = attributes.getValue(ATTR_FAILCOUNT); + String failPercent = attributes.getValue(ATTR_FAILPERCENT); + String tps = attributes.getValue(ATTR_TPS); + EventType type = new EventType(id); + + if (totalCount != null) { + type.setTotalCount(convert(Long.class, totalCount, 0L)); + } + + if (failCount != null) { + type.setFailCount(convert(Long.class, failCount, 0L)); + } + + if (failPercent != null) { + type.setFailPercent(toNumber(failPercent, "0.00", 0).doubleValue()); + } + + if (tps != null) { + type.setTps(toNumber(tps, "0.00", 0).doubleValue()); + } + + return type; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format, Number defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultSaxParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..cb365a6649 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultSaxParser.java @@ -0,0 +1,395 @@ +package com.dianping.cat.consumer.event.model.transform; + +import static com.dianping.cat.consumer.event.model.Constants.ELEMENT_DOMAIN; +import static com.dianping.cat.consumer.event.model.Constants.ELEMENT_DOMAIN_NAMES; +import static com.dianping.cat.consumer.event.model.Constants.ELEMENT_FAILMESSAGEURL; +import static com.dianping.cat.consumer.event.model.Constants.ELEMENT_IP; +import static com.dianping.cat.consumer.event.model.Constants.ELEMENT_IPS; +import static com.dianping.cat.consumer.event.model.Constants.ELEMENT_SUCCESSMESSAGEURL; + +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_EVENT_REPORT; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_GRAPH_TREND; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_MACHINE; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_NAME; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_RANGE; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_STATUSCODE; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_TYPE; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.consumer.event.model.IEntity; +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.event.model.entity.EventType; +import com.dianping.cat.consumer.event.model.entity.GraphTrend; +import com.dianping.cat.consumer.event.model.entity.Machine; +import com.dianping.cat.consumer.event.model.entity.Range; +import com.dianping.cat.consumer.event.model.entity.StatusCode; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static EventReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(EventReport.class, new InputSource(removeBOM(in))); + } + + public static EventReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(EventReport.class, new InputSource(removeBOM(reader))); + } + + public static EventReport parse(String xml) throws SAXException, IOException { + return parseEntity(EventReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof EventReport) { + EventReport eventReport = (EventReport) currentObj; + + if (ELEMENT_DOMAIN.equals(currentTag)) { + eventReport.addDomain(getText()); + } else if (ELEMENT_IP.equals(currentTag)) { + eventReport.addIp(getText()); + } + } else if (currentObj instanceof EventType) { + EventType type = (EventType) currentObj; + + if (ELEMENT_SUCCESSMESSAGEURL.equals(currentTag)) { + type.setSuccessMessageUrl(getText()); + } else if (ELEMENT_FAILMESSAGEURL.equals(currentTag)) { + type.setFailMessageUrl(getText()); + } + } else if (currentObj instanceof EventName) { + EventName name = (EventName) currentObj; + + if (ELEMENT_SUCCESSMESSAGEURL.equals(currentTag)) { + name.setSuccessMessageUrl(getText()); + } else if (ELEMENT_FAILMESSAGEURL.equals(currentTag)) { + name.setFailMessageUrl(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForEventReport(EventReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_DOMAIN_NAMES.equals(qName) || ELEMENT_DOMAIN.equals(qName) || ELEMENT_IPS.equals(qName) || ELEMENT_IP.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_linker.onMachine(parentObj, machine); + m_objs.push(machine); + } else { + throw new SAXException(String.format("Element(%s) is not expected under event-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseForGraphTrend(GraphTrend parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForMachine(Machine parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_TYPE.equals(qName)) { + EventType type = m_maker.buildType(attributes); + + m_linker.onType(parentObj, type); + m_objs.push(type); + } else { + throw new SAXException(String.format("Element(%s) is not expected under machine!", qName)); + } + + m_tags.push(qName); + } + + private void parseForName(EventName parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_SUCCESSMESSAGEURL.equals(qName) || ELEMENT_FAILMESSAGEURL.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_RANGE.equals(qName)) { + Range range = m_maker.buildRange(attributes); + + m_linker.onRange(parentObj, range); + m_objs.push(range); + } else if (ENTITY_GRAPH_TREND.equals(qName)) { + GraphTrend graphTrend = m_maker.buildGraphTrend(attributes); + + m_linker.onGraphTrend(parentObj, graphTrend); + m_objs.push(graphTrend); + } else if (ENTITY_STATUSCODE.equals(qName)) { + StatusCode statusCode = m_maker.buildStatusCode(attributes); + + m_linker.onStatusCode(parentObj, statusCode); + m_objs.push(statusCode); + } else { + throw new SAXException(String.format("Element(%s) is not expected under name!", qName)); + } + + m_tags.push(qName); + } + + private void parseForRange(Range parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForStatusCode(StatusCode parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForType(EventType parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_SUCCESSMESSAGEURL.equals(qName) || ELEMENT_FAILMESSAGEURL.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_NAME.equals(qName)) { + EventName name = m_maker.buildName(attributes); + + m_linker.onName(parentObj, name); + m_objs.push(name); + } else if (ENTITY_GRAPH_TREND.equals(qName)) { + GraphTrend graphTrend = m_maker.buildGraphTrend(attributes); + + m_linker.onGraphTrend(parentObj, graphTrend); + m_objs.push(graphTrend); + } else { + throw new SAXException(String.format("Element(%s) is not expected under type!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_EVENT_REPORT.equals(qName)) { + EventReport eventReport = m_maker.buildEventReport(attributes); + + m_entity = eventReport; + m_objs.push(eventReport); + m_tags.push(qName); + } else if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_entity = machine; + m_objs.push(machine); + m_tags.push(qName); + } else if (ENTITY_TYPE.equals(qName)) { + EventType type = m_maker.buildType(attributes); + + m_entity = type; + m_objs.push(type); + m_tags.push(qName); + } else if (ENTITY_NAME.equals(qName)) { + EventName name = m_maker.buildName(attributes); + + m_entity = name; + m_objs.push(name); + m_tags.push(qName); + } else if (ENTITY_RANGE.equals(qName)) { + Range range = m_maker.buildRange(attributes); + + m_entity = range; + m_objs.push(range); + m_tags.push(qName); + } else if (ENTITY_GRAPH_TREND.equals(qName)) { + GraphTrend graphTrend = m_maker.buildGraphTrend(attributes); + + m_entity = graphTrend; + m_objs.push(graphTrend); + m_tags.push(qName); + } else if (ENTITY_STATUSCODE.equals(qName)) { + StatusCode statusCode = m_maker.buildStatusCode(attributes); + + m_entity = statusCode; + m_objs.push(statusCode); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof EventReport) { + parseForEventReport((EventReport) parent, tag, qName, attributes); + } else if (parent instanceof Machine) { + parseForMachine((Machine) parent, tag, qName, attributes); + } else if (parent instanceof EventType) { + parseForType((EventType) parent, tag, qName, attributes); + } else if (parent instanceof EventName) { + parseForName((EventName) parent, tag, qName, attributes); + } else if (parent instanceof Range) { + parseForRange((Range) parent, tag, qName, attributes); + } else if (parent instanceof GraphTrend) { + parseForGraphTrend((GraphTrend) parent, tag, qName, attributes); + } else if (parent instanceof StatusCode) { + parseForStatusCode((StatusCode) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format) { + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultXmlBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..a74e98f3c8 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/DefaultXmlBuilder.java @@ -0,0 +1,380 @@ +package com.dianping.cat.consumer.event.model.transform; + +import static com.dianping.cat.consumer.event.model.Constants.ATTR_COUNT; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_DURATION; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_FAILCOUNT; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_FAILPERCENT; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_FAILS; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_TOTALCOUNT; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_TPS; +import static com.dianping.cat.consumer.event.model.Constants.ATTR_VALUE; +import static com.dianping.cat.consumer.event.model.Constants.ELEMENT_DOMAIN; +import static com.dianping.cat.consumer.event.model.Constants.ELEMENT_FAILMESSAGEURL; +import static com.dianping.cat.consumer.event.model.Constants.ELEMENT_IP; +import static com.dianping.cat.consumer.event.model.Constants.ELEMENT_SUCCESSMESSAGEURL; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_EVENT_REPORT; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_GRAPH_TREND; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_MACHINE; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_NAME; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_RANGE; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_STATUSCODE; +import static com.dianping.cat.consumer.event.model.Constants.ENTITY_TYPE; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.consumer.event.model.IEntity; +import com.dianping.cat.consumer.event.model.IVisitor; +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.event.model.entity.EventType; +import com.dianping.cat.consumer.event.model.entity.GraphTrend; +import com.dianping.cat.consumer.event.model.entity.Machine; +import com.dianping.cat.consumer.event.model.entity.Range; +import com.dianping.cat.consumer.event.model.entity.StatusCode; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + protected String toString(Number number, String format) { + if (number != null) { + return new java.text.DecimalFormat(format).format(number); + } else { + return null; + } + } + + @Override + public void visitEventReport(EventReport eventReport) { + startTag(ENTITY_EVENT_REPORT, null, ATTR_DOMAIN, eventReport.getDomain(), ATTR_STARTTIME, toString(eventReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_ENDTIME, toString(eventReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!eventReport.getDomainNames().isEmpty()) { + for (String domain : eventReport.getDomainNames()) { + tagWithText(ELEMENT_DOMAIN, domain); + } + } + + if (!eventReport.getIps().isEmpty()) { + for (String ip : eventReport.getIps()) { + tagWithText(ELEMENT_IP, ip); + } + } + + if (!eventReport.getMachines().isEmpty()) { + for (Machine machine : eventReport.getMachines().values()) { + machine.accept(m_visitor); + } + } + + endTag(ENTITY_EVENT_REPORT); + } + + @Override + public void visitGraphTrend(GraphTrend graphTrend) { + startTag(ENTITY_GRAPH_TREND, true, null, ATTR_DURATION, graphTrend.getDuration(), ATTR_COUNT, graphTrend.getCount(), ATTR_FAILS, graphTrend.getFails()); + } + + @Override + public void visitMachine(Machine machine) { + startTag(ENTITY_MACHINE, null, ATTR_IP, machine.getIp()); + + if (!machine.getTypes().isEmpty()) { + for (EventType type : machine.getTypes().values()) { + type.accept(m_visitor); + } + } + + endTag(ENTITY_MACHINE); + } + + @Override + public void visitName(EventName name) { + startTag(ENTITY_NAME, null, ATTR_ID, name.getId(), ATTR_TOTALCOUNT, name.getTotalCount(), ATTR_FAILCOUNT, name.getFailCount(), ATTR_FAILPERCENT, toString(name.getFailPercent(), "0.00"), ATTR_TPS, toString(name.getTps(), "0.00")); + + element(ELEMENT_SUCCESSMESSAGEURL, name.getSuccessMessageUrl(), null, true); + + element(ELEMENT_FAILMESSAGEURL, name.getFailMessageUrl(), null, true); + + if (!name.getRanges().isEmpty()) { + for (Range range : name.getRanges().values()) { + range.accept(m_visitor); + } + } + + if (name.getGraphTrend() != null) { + name.getGraphTrend().accept(m_visitor); + } + + if (!name.getStatusCodes().isEmpty()) { + for (StatusCode statusCode : name.getStatusCodes().values()) { + statusCode.accept(m_visitor); + } + } + + endTag(ENTITY_NAME); + } + + @Override + public void visitRange(Range range) { + startTag(ENTITY_RANGE, true, null, ATTR_VALUE, range.getValue(), ATTR_COUNT, range.getCount(), ATTR_FAILS, range.getFails()); + } + + @Override + public void visitStatusCode(StatusCode statusCode) { + startTag(ENTITY_STATUSCODE, true, null, ATTR_ID, statusCode.getId(), ATTR_COUNT, statusCode.getCount()); + } + + @Override + public void visitType(EventType type) { + startTag(ENTITY_TYPE, null, ATTR_ID, type.getId(), ATTR_TOTALCOUNT, type.getTotalCount(), ATTR_FAILCOUNT, type.getFailCount(), ATTR_FAILPERCENT, toString(type.getFailPercent(), "0.00"), ATTR_TPS, toString(type.getTps(), "0.00")); + + element(ELEMENT_SUCCESSMESSAGEURL, type.getSuccessMessageUrl(), null, true); + + element(ELEMENT_FAILMESSAGEURL, type.getFailMessageUrl(), null, true); + + if (!type.getNames().isEmpty()) { + for (EventName name : type.getNames().values()) { + name.accept(m_visitor); + } + } + + if (type.getGraphTrend() != null) { + type.getGraphTrend().accept(m_visitor); + } + + endTag(ENTITY_TYPE); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/ILinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/ILinker.java new file mode 100644 index 0000000000..59484884a1 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/ILinker.java @@ -0,0 +1,26 @@ +package com.dianping.cat.consumer.event.model.transform; + +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.event.model.entity.EventType; +import com.dianping.cat.consumer.event.model.entity.GraphTrend; +import com.dianping.cat.consumer.event.model.entity.Machine; +import com.dianping.cat.consumer.event.model.entity.Range; +import com.dianping.cat.consumer.event.model.entity.StatusCode; + +public interface ILinker { + + public boolean onGraphTrend(EventType parent, GraphTrend graphTrend); + + public boolean onGraphTrend(EventName parent, GraphTrend graphTrend); + + public boolean onMachine(EventReport parent, Machine machine); + + public boolean onName(EventType parent, EventName name); + + public boolean onRange(EventName parent, Range range); + + public boolean onStatusCode(EventName parent, StatusCode statusCode); + + public boolean onType(Machine parent, EventType type); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/IMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/IMaker.java new file mode 100644 index 0000000000..eb18afc481 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/IMaker.java @@ -0,0 +1,30 @@ +package com.dianping.cat.consumer.event.model.transform; + +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.event.model.entity.EventType; +import com.dianping.cat.consumer.event.model.entity.GraphTrend; +import com.dianping.cat.consumer.event.model.entity.Machine; +import com.dianping.cat.consumer.event.model.entity.Range; +import com.dianping.cat.consumer.event.model.entity.StatusCode; + +public interface IMaker { + + public String buildDomain(T node); + + public EventReport buildEventReport(T node); + + public GraphTrend buildGraphTrend(T node); + + public String buildIp(T node); + + public Machine buildMachine(T node); + + public EventName buildName(T node); + + public Range buildRange(T node); + + public StatusCode buildStatusCode(T node); + + public EventType buildType(T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/IParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/IParser.java new file mode 100644 index 0000000000..5c1f604b21 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/event/model/transform/IParser.java @@ -0,0 +1,25 @@ +package com.dianping.cat.consumer.event.model.transform; + +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.event.model.entity.EventType; +import com.dianping.cat.consumer.event.model.entity.GraphTrend; +import com.dianping.cat.consumer.event.model.entity.Machine; +import com.dianping.cat.consumer.event.model.entity.Range; +import com.dianping.cat.consumer.event.model.entity.StatusCode; + +public interface IParser { + public EventReport parse(IMaker maker, ILinker linker, T node); + + public void parseForGraphTrend(IMaker maker, ILinker linker, GraphTrend parent, T node); + + public void parseForMachine(IMaker maker, ILinker linker, Machine parent, T node); + + public void parseForEventName(IMaker maker, ILinker linker, EventName parent, T node); + + public void parseForRange(IMaker maker, ILinker linker, Range parent, T node); + + public void parseForStatusCode(IMaker maker, ILinker linker, StatusCode parent, T node); + + public void parseForEventType(IMaker maker, ILinker linker, EventType parent, T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/BaseEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/BaseEntity.java new file mode 100644 index 0000000000..d3a65cc7f8 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.consumer.heartbeat.model; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.consumer.heartbeat.model.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/Constants.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/Constants.java new file mode 100644 index 0000000000..87c25420a6 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/Constants.java @@ -0,0 +1,88 @@ +package com.dianping.cat.consumer.heartbeat.model; + +public class Constants { + + public static final String ATTR_CAT_MESSAGE_OVERFLOW = "cat-message-overflow"; + + public static final String ATTR_CAT_MESSAGE_PRODUCED = "cat-message-produced"; + + public static final String ATTR_CAT_MESSAGE_SIZE = "cat-message-size"; + + public static final String ATTR_CAT_THREAD_COUNT = "cat-thread-count"; + + public static final String ATTR_CLASSPATH = "classpath"; + + public static final String ATTR_DAEMON_COUNT = "daemon-count"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_FREE = "free"; + + public static final String ATTR_HEAP_USAGE = "heap-usage"; + + public static final String ATTR_HTTP_THREAD_COUNT = "http-thread-count"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_IP = "ip"; + + public static final String ATTR_MEMORY_FREE = "memory-free"; + + public static final String ATTR_MINUTE = "minute"; + + public static final String ATTR_NEW_GC_COUNT = "new-gc-count"; + + public static final String ATTR_NONE_HEAP_USAGE = "none-heap-usage"; + + public static final String ATTR_OLD_GC_COUNT = "old-gc-count"; + + public static final String ATTR_PATH = "path"; + + public static final String ATTR_PIGEON_THREAD_COUNT = "pigeon-thread-count"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ATTR_SYSTEM_LOAD_AVERAGE = "system-load-average"; + + public static final String ATTR_THREAD_COUNT = "thread-count"; + + public static final String ATTR_TOTAL = "total"; + + public static final String ATTR_TOTAL_STARTED_COUNT = "total-started-count"; + + public static final String ATTR_USABLE = "usable"; + + public static final String ATTR_VALUE = "value"; + + public static final String ELEMENT_DOMAIN = "domain"; + + public static final String ELEMENT_DOMAIN_NAMES = "domain-names"; + + public static final String ELEMENT_IP = "ip"; + + public static final String ELEMENT_IPS = "ips"; + + public static final String ENTITY_DETAIL = "detail"; + + public static final String ENTITY_DETAILS = "details"; + + public static final String ENTITY_DISK = "disk"; + + public static final String ENTITY_DISKS = "disks"; + + public static final String ENTITY_EXTENSION = "extension"; + + public static final String ENTITY_EXTENSIONS = "extensions"; + + public static final String ENTITY_HEARTBEAT_REPORT = "heartbeat-report"; + + public static final String ENTITY_MACHINE = "machine"; + + public static final String ENTITY_MACHINES = "machines"; + + public static final String ENTITY_PERIOD = "period"; + + public static final String ENTITY_PERIODS = "periods"; +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/IEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/IEntity.java new file mode 100644 index 0000000000..0a8fec8c87 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.consumer.heartbeat.model; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/IVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/IVisitor.java new file mode 100644 index 0000000000..596f857206 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/IVisitor.java @@ -0,0 +1,23 @@ +package com.dianping.cat.consumer.heartbeat.model; + +import com.dianping.cat.consumer.heartbeat.model.entity.Detail; +import com.dianping.cat.consumer.heartbeat.model.entity.Disk; +import com.dianping.cat.consumer.heartbeat.model.entity.Extension; +import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; +import com.dianping.cat.consumer.heartbeat.model.entity.Machine; +import com.dianping.cat.consumer.heartbeat.model.entity.Period; + +public interface IVisitor { + + public void visitDetail(Detail detail); + + public void visitDisk(Disk disk); + + public void visitExtension(Extension extension); + + public void visitHeartbeatReport(HeartbeatReport heartbeatReport); + + public void visitMachine(Machine machine); + + public void visitPeriod(Period period); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Detail.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Detail.java new file mode 100644 index 0000000000..7cf07c0f45 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Detail.java @@ -0,0 +1,75 @@ +package com.dianping.cat.consumer.heartbeat.model.entity; + +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_DETAIL; + +import com.dianping.cat.consumer.heartbeat.model.BaseEntity; +import com.dianping.cat.consumer.heartbeat.model.IVisitor; + +public class Detail extends BaseEntity { + private String m_id; + + private double m_value; + + public Detail() { + } + + public Detail(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDetail(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Detail) { + Detail _o = (Detail) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + public double getValue() { + return m_value; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Detail other) { + assertAttributeEquals(other, ENTITY_DETAIL, ATTR_ID, m_id, other.getId()); + + m_value = other.getValue(); + } + + public Detail setId(String id) { + m_id = id; + return this; + } + + public Detail setValue(double value) { + m_value = value; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Disk.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Disk.java new file mode 100644 index 0000000000..750b6a7836 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Disk.java @@ -0,0 +1,101 @@ +package com.dianping.cat.consumer.heartbeat.model.entity; + +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_PATH; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_DISK; + +import com.dianping.cat.consumer.heartbeat.model.BaseEntity; +import com.dianping.cat.consumer.heartbeat.model.IVisitor; + +public class Disk extends BaseEntity { + private String m_path; + + private long m_total; + + private long m_free; + + private long m_usable; + + public Disk() { + } + + public Disk(String path) { + m_path = path; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDisk(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Disk) { + Disk _o = (Disk) obj; + + if (!equals(getPath(), _o.getPath())) { + return false; + } + + return true; + } + + return false; + } + + public long getFree() { + return m_free; + } + + public String getPath() { + return m_path; + } + + public long getTotal() { + return m_total; + } + + public long getUsable() { + return m_usable; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_path == null ? 0 : m_path.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Disk other) { + assertAttributeEquals(other, ENTITY_DISK, ATTR_PATH, m_path, other.getPath()); + + m_total = other.getTotal(); + + m_free = other.getFree(); + + m_usable = other.getUsable(); + } + + public Disk setFree(long free) { + m_free = free; + return this; + } + + public Disk setPath(String path) { + m_path = path; + return this; + } + + public Disk setTotal(long total) { + m_total = total; + return this; + } + + public Disk setUsable(long usable) { + m_usable = usable; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Extension.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Extension.java new file mode 100644 index 0000000000..f2510a752b --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Extension.java @@ -0,0 +1,102 @@ +package com.dianping.cat.consumer.heartbeat.model.entity; + +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_EXTENSION; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.heartbeat.model.BaseEntity; +import com.dianping.cat.consumer.heartbeat.model.IVisitor; + +public class Extension extends BaseEntity { + private String m_id; + + private Map m_details = new LinkedHashMap(); + + public Extension() { + } + + public Extension(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitExtension(this); + } + + public Extension addDetail(Detail detail) { + m_details.put(detail.getId(), detail); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Extension) { + Extension _o = (Extension) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Detail findDetail(String id) { + return m_details.get(id); + } + + public Detail findOrCreateDetail(String id) { + Detail detail = m_details.get(id); + + if (detail == null) { + synchronized (m_details) { + detail = m_details.get(id); + + if (detail == null) { + detail = new Detail(id); + m_details.put(id, detail); + } + } + } + + return detail; + } + + public Map getDetails() { + return m_details; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Extension other) { + assertAttributeEquals(other, ENTITY_EXTENSION, ATTR_ID, m_id, other.getId()); + + } + + public Detail removeDetail(String id) { + return m_details.remove(id); + } + + public Extension setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/HeartbeatReport.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/HeartbeatReport.java new file mode 100644 index 0000000000..5acf7595d2 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/HeartbeatReport.java @@ -0,0 +1,155 @@ +package com.dianping.cat.consumer.heartbeat.model.entity; + +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_HEARTBEAT_REPORT; + +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +import com.dianping.cat.consumer.heartbeat.model.BaseEntity; +import com.dianping.cat.consumer.heartbeat.model.IVisitor; + +public class HeartbeatReport extends BaseEntity { + private String m_domain; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Map m_machines = new LinkedHashMap(); + + private Set m_domainNames = new LinkedHashSet(); + + private Set m_ips = new LinkedHashSet(); + + public HeartbeatReport() { + } + + public HeartbeatReport(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitHeartbeatReport(this); + } + + public HeartbeatReport addDomain(String domain) { + m_domainNames.add(domain); + return this; + } + + public HeartbeatReport addIp(String ip) { + m_ips.add(ip); + return this; + } + + public HeartbeatReport addMachine(Machine machine) { + m_machines.put(machine.getIp(), machine); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof HeartbeatReport) { + HeartbeatReport _o = (HeartbeatReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public Machine findMachine(String ip) { + return m_machines.get(ip); + } + + public Machine findOrCreateMachine(String ip) { + Machine machine = m_machines.get(ip); + + if (machine == null) { + synchronized (m_machines) { + machine = m_machines.get(ip); + + if (machine == null) { + machine = new Machine(ip); + m_machines.put(ip, machine); + } + } + } + + return machine; + } + + public String getDomain() { + return m_domain; + } + + public Set getDomainNames() { + return m_domainNames; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public Set getIps() { + return m_ips; + } + + public Map getMachines() { + return m_machines; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(HeartbeatReport other) { + assertAttributeEquals(other, ENTITY_HEARTBEAT_REPORT, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Machine removeMachine(String ip) { + return m_machines.remove(ip); + } + + public HeartbeatReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public HeartbeatReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public HeartbeatReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Machine.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Machine.java new file mode 100644 index 0000000000..e9ed779e99 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Machine.java @@ -0,0 +1,119 @@ +package com.dianping.cat.consumer.heartbeat.model.entity; + +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_MACHINE; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.consumer.heartbeat.model.BaseEntity; +import com.dianping.cat.consumer.heartbeat.model.IVisitor; + +public class Machine extends BaseEntity { + private String m_ip; + + private List m_periods = new ArrayList(); + + private String m_classpath; + + public Machine() { + } + + public Machine(String ip) { + m_ip = ip; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMachine(this); + } + + public Machine addPeriod(Period period) { + m_periods.add(period); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Machine) { + Machine _o = (Machine) obj; + + if (!equals(getIp(), _o.getIp())) { + return false; + } + + return true; + } + + return false; + } + + public Period findPeriod(int minute) { + for (Period period : m_periods) { + if (period.getMinute() != minute) { + continue; + } + + return period; + } + + return null; + } + + public String getClasspath() { + return m_classpath; + } + + public String getIp() { + return m_ip; + } + + public List getPeriods() { + return m_periods; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_ip == null ? 0 : m_ip.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Machine other) { + assertAttributeEquals(other, ENTITY_MACHINE, ATTR_IP, m_ip, other.getIp()); + + if (other.getClasspath() != null) { + m_classpath = other.getClasspath(); + } + } + + public Period removePeriod(int minute) { + int len = m_periods.size(); + + for (int i = 0; i < len; i++) { + Period period = m_periods.get(i); + + if (period.getMinute() != minute) { + continue; + } + + return m_periods.remove(i); + } + + return null; + } + + public Machine setClasspath(String classpath) { + m_classpath = classpath; + return this; + } + + public Machine setIp(String ip) { + m_ip = ip; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Period.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Period.java new file mode 100644 index 0000000000..54a2f8054f --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/entity/Period.java @@ -0,0 +1,355 @@ +package com.dianping.cat.consumer.heartbeat.model.entity; + +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_MINUTE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_PERIOD; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import com.dianping.cat.consumer.heartbeat.model.BaseEntity; +import com.dianping.cat.consumer.heartbeat.model.IVisitor; + +public class Period extends BaseEntity { + private int m_minute; + + private int m_threadCount; + + private int m_daemonCount; + + private int m_totalStartedCount; + + private int m_catThreadCount; + + private int m_pigeonThreadCount; + + private int m_httpThreadCount; + + private long m_newGcCount; + + private long m_oldGcCount; + + private long m_memoryFree; + + private long m_heapUsage; + + private long m_noneHeapUsage; + + private double m_systemLoadAverage; + + private long m_catMessageProduced; + + private long m_catMessageOverflow; + + private double m_catMessageSize; + + private List m_disks = new ArrayList(); + + private Map m_extensions = new LinkedHashMap(); + + private Map m_dynamicAttributes = new LinkedHashMap(); + + public Period() { + } + + public Period(int minute) { + m_minute = minute; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitPeriod(this); + } + + public Period addDisk(Disk disk) { + m_disks.add(disk); + return this; + } + + public Period addExtension(Extension extension) { + m_extensions.put(extension.getId(), extension); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Period) { + Period _o = (Period) obj; + + if (getMinute() != _o.getMinute()) { + return false; + } + + return true; + } + + return false; + } + + public Disk findDisk(String path) { + for (Disk disk : m_disks) { + if (!equals(disk.getPath(), path)) { + continue; + } + + return disk; + } + + return null; + } + + public Extension findExtension(String id) { + return m_extensions.get(id); + } + + public Extension findOrCreateExtension(String id) { + Extension extension = m_extensions.get(id); + + if (extension == null) { + synchronized (m_extensions) { + extension = m_extensions.get(id); + + if (extension == null) { + extension = new Extension(id); + m_extensions.put(id, extension); + } + } + } + + return extension; + } + + public String getDynamicAttribute(String name) { + return m_dynamicAttributes.get(name); + } + + public Map getDynamicAttributes() { + return m_dynamicAttributes; + } + + public long getCatMessageOverflow() { + return m_catMessageOverflow; + } + + public long getCatMessageProduced() { + return m_catMessageProduced; + } + + public double getCatMessageSize() { + return m_catMessageSize; + } + + public int getCatThreadCount() { + return m_catThreadCount; + } + + public int getDaemonCount() { + return m_daemonCount; + } + + public List getDisks() { + return m_disks; + } + + public Map getExtensions() { + return m_extensions; + } + + public long getHeapUsage() { + return m_heapUsage; + } + + public int getHttpThreadCount() { + return m_httpThreadCount; + } + + public long getMemoryFree() { + return m_memoryFree; + } + + public int getMinute() { + return m_minute; + } + + public long getNewGcCount() { + return m_newGcCount; + } + + public long getNoneHeapUsage() { + return m_noneHeapUsage; + } + + public long getOldGcCount() { + return m_oldGcCount; + } + + public int getPigeonThreadCount() { + return m_pigeonThreadCount; + } + + public double getSystemLoadAverage() { + return m_systemLoadAverage; + } + + public int getThreadCount() { + return m_threadCount; + } + + public int getTotalStartedCount() { + return m_totalStartedCount; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + m_minute; + + return hash; + } + + @Override + public void mergeAttributes(Period other) { + assertAttributeEquals(other, ENTITY_PERIOD, ATTR_MINUTE, m_minute, other.getMinute()); + + for (Map.Entry e : other.getDynamicAttributes().entrySet()) { + m_dynamicAttributes.put(e.getKey(), e.getValue()); + } + + m_threadCount = other.getThreadCount(); + + m_daemonCount = other.getDaemonCount(); + + m_totalStartedCount = other.getTotalStartedCount(); + + m_catThreadCount = other.getCatThreadCount(); + + m_pigeonThreadCount = other.getPigeonThreadCount(); + + m_httpThreadCount = other.getHttpThreadCount(); + + m_newGcCount = other.getNewGcCount(); + + m_oldGcCount = other.getOldGcCount(); + + m_memoryFree = other.getMemoryFree(); + + m_heapUsage = other.getHeapUsage(); + + m_noneHeapUsage = other.getNoneHeapUsage(); + + m_systemLoadAverage = other.getSystemLoadAverage(); + + m_catMessageProduced = other.getCatMessageProduced(); + + m_catMessageOverflow = other.getCatMessageOverflow(); + + m_catMessageSize = other.getCatMessageSize(); + } + + public Disk removeDisk(String path) { + int len = m_disks.size(); + + for (int i = 0; i < len; i++) { + Disk disk = m_disks.get(i); + + if (!equals(disk.getPath(), path)) { + continue; + } + + return m_disks.remove(i); + } + + return null; + } + + public Extension removeExtension(String id) { + return m_extensions.remove(id); + } + + public void setDynamicAttribute(String name, String value) { + m_dynamicAttributes.put(name, value); + } + + public Period setCatMessageOverflow(long catMessageOverflow) { + m_catMessageOverflow = catMessageOverflow; + return this; + } + + public Period setCatMessageProduced(long catMessageProduced) { + m_catMessageProduced = catMessageProduced; + return this; + } + + public Period setCatMessageSize(double catMessageSize) { + m_catMessageSize = catMessageSize; + return this; + } + + public Period setCatThreadCount(int catThreadCount) { + m_catThreadCount = catThreadCount; + return this; + } + + public Period setDaemonCount(int daemonCount) { + m_daemonCount = daemonCount; + return this; + } + + public Period setHeapUsage(long heapUsage) { + m_heapUsage = heapUsage; + return this; + } + + public Period setHttpThreadCount(int httpThreadCount) { + m_httpThreadCount = httpThreadCount; + return this; + } + + public Period setMemoryFree(long memoryFree) { + m_memoryFree = memoryFree; + return this; + } + + public Period setMinute(int minute) { + m_minute = minute; + return this; + } + + public Period setNewGcCount(long newGcCount) { + m_newGcCount = newGcCount; + return this; + } + + public Period setNoneHeapUsage(long noneHeapUsage) { + m_noneHeapUsage = noneHeapUsage; + return this; + } + + public Period setOldGcCount(long oldGcCount) { + m_oldGcCount = oldGcCount; + return this; + } + + public Period setPigeonThreadCount(int pigeonThreadCount) { + m_pigeonThreadCount = pigeonThreadCount; + return this; + } + + public Period setSystemLoadAverage(double systemLoadAverage) { + m_systemLoadAverage = systemLoadAverage; + return this; + } + + public Period setThreadCount(int threadCount) { + m_threadCount = threadCount; + return this; + } + + public Period setTotalStartedCount(int totalStartedCount) { + m_totalStartedCount = totalStartedCount; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/BaseVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/BaseVisitor.java new file mode 100644 index 0000000000..06b3cb9eb0 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/BaseVisitor.java @@ -0,0 +1,51 @@ +package com.dianping.cat.consumer.heartbeat.model.transform; + +import com.dianping.cat.consumer.heartbeat.model.IVisitor; +import com.dianping.cat.consumer.heartbeat.model.entity.Detail; +import com.dianping.cat.consumer.heartbeat.model.entity.Disk; +import com.dianping.cat.consumer.heartbeat.model.entity.Extension; +import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; +import com.dianping.cat.consumer.heartbeat.model.entity.Machine; +import com.dianping.cat.consumer.heartbeat.model.entity.Period; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitDetail(Detail detail) { + } + + @Override + public void visitDisk(Disk disk) { + } + + @Override + public void visitExtension(Extension extension) { + for (Detail detail : extension.getDetails().values()) { + visitDetail(detail); + } + } + + @Override + public void visitHeartbeatReport(HeartbeatReport heartbeatReport) { + for (Machine machine : heartbeatReport.getMachines().values()) { + visitMachine(machine); + } + } + + @Override + public void visitMachine(Machine machine) { + for (Period period : machine.getPeriods()) { + visitPeriod(period); + } + } + + @Override + public void visitPeriod(Period period) { + for (Disk disk : period.getDisks()) { + visitDisk(disk); + } + + for (Extension extension : period.getExtensions().values()) { + visitExtension(extension); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultLinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultLinker.java new file mode 100644 index 0000000000..bd296cc3f4 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultLinker.java @@ -0,0 +1,86 @@ +package com.dianping.cat.consumer.heartbeat.model.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.consumer.heartbeat.model.entity.Detail; +import com.dianping.cat.consumer.heartbeat.model.entity.Disk; +import com.dianping.cat.consumer.heartbeat.model.entity.Extension; +import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; +import com.dianping.cat.consumer.heartbeat.model.entity.Machine; +import com.dianping.cat.consumer.heartbeat.model.entity.Period; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDetail(final Extension parent, final Detail detail) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDetail(detail); + } + }); + } else { + parent.addDetail(detail); + } + + return true; + } + + @Override + public boolean onDisk(final Period parent, final Disk disk) { + parent.addDisk(disk); + return true; + } + + @Override + public boolean onExtension(final Period parent, final Extension extension) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addExtension(extension); + } + }); + } else { + parent.addExtension(extension); + } + + return true; + } + + @Override + public boolean onMachine(final HeartbeatReport parent, final Machine machine) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addMachine(machine); + } + }); + } else { + parent.addMachine(machine); + } + + return true; + } + + @Override + public boolean onPeriod(final Machine parent, final Period period) { + parent.addPeriod(period); + return true; + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultMerger.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultMerger.java new file mode 100644 index 0000000000..4621b72f39 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultMerger.java @@ -0,0 +1,194 @@ +package com.dianping.cat.consumer.heartbeat.model.transform; + +import java.util.Stack; + +import com.dianping.cat.consumer.heartbeat.model.IEntity; +import com.dianping.cat.consumer.heartbeat.model.IVisitor; +import com.dianping.cat.consumer.heartbeat.model.entity.Detail; +import com.dianping.cat.consumer.heartbeat.model.entity.Disk; +import com.dianping.cat.consumer.heartbeat.model.entity.Extension; +import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; +import com.dianping.cat.consumer.heartbeat.model.entity.Machine; +import com.dianping.cat.consumer.heartbeat.model.entity.Period; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private HeartbeatReport m_heartbeatReport; + + public DefaultMerger() { + } + + public DefaultMerger(HeartbeatReport heartbeatReport) { + m_heartbeatReport = heartbeatReport; + m_objs.push(heartbeatReport); + } + + public HeartbeatReport getHeartbeatReport() { + return m_heartbeatReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeDetail(Detail to, Detail from) { + to.mergeAttributes(from); + } + + protected void mergeDisk(Disk to, Disk from) { + to.mergeAttributes(from); + } + + protected void mergeExtension(Extension to, Extension from) { + to.mergeAttributes(from); + } + + protected void mergeHeartbeatReport(HeartbeatReport to, HeartbeatReport from) { + to.mergeAttributes(from); + to.getDomainNames().addAll(from.getDomainNames()); + to.getIps().addAll(from.getIps()); + } + + protected void mergeMachine(Machine to, Machine from) { + to.mergeAttributes(from); + } + + protected void mergePeriod(Period to, Period from) { + to.mergeAttributes(from); + } + + @Override + public void visitDetail(Detail from) { + Detail to = (Detail) m_objs.peek(); + + mergeDetail(to, from); + visitDetailChildren(to, from); + } + + protected void visitDetailChildren(Detail to, Detail from) { + } + + @Override + public void visitDisk(Disk from) { + Disk to = (Disk) m_objs.peek(); + + mergeDisk(to, from); + visitDiskChildren(to, from); + } + + protected void visitDiskChildren(Disk to, Disk from) { + } + + @Override + public void visitExtension(Extension from) { + Extension to = (Extension) m_objs.peek(); + + mergeExtension(to, from); + visitExtensionChildren(to, from); + } + + protected void visitExtensionChildren(Extension to, Extension from) { + for (Detail source : from.getDetails().values()) { + Detail target = to.findDetail(source.getId()); + + if (target == null) { + target = new Detail(source.getId()); + to.addDetail(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitHeartbeatReport(HeartbeatReport from) { + HeartbeatReport to = (HeartbeatReport) m_objs.peek(); + + mergeHeartbeatReport(to, from); + visitHeartbeatReportChildren(to, from); + } + + protected void visitHeartbeatReportChildren(HeartbeatReport to, HeartbeatReport from) { + for (Machine source : from.getMachines().values()) { + Machine target = to.findMachine(source.getIp()); + + if (target == null) { + target = new Machine(source.getIp()); + to.addMachine(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitMachine(Machine from) { + Machine to = (Machine) m_objs.peek(); + + mergeMachine(to, from); + visitMachineChildren(to, from); + } + + protected void visitMachineChildren(Machine to, Machine from) { + for (Period source : from.getPeriods()) { + Period target = to.findPeriod(source.getMinute()); + + if (target == null) { + target = new Period(source.getMinute()); + to.addPeriod(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitPeriod(Period from) { + Period to = (Period) m_objs.peek(); + + mergePeriod(to, from); + visitPeriodChildren(to, from); + } + + protected void visitPeriodChildren(Period to, Period from) { + for (Disk source : from.getDisks()) { + Disk target = to.findDisk(source.getPath()); + + if (target == null) { + target = new Disk(source.getPath()); + to.addDisk(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Extension source : from.getExtensions().values()) { + Extension target = to.findExtension(source.getId()); + + if (target == null) { + target = new Extension(source.getId()); + to.addExtension(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultNativeBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..75bbc326da --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultNativeBuilder.java @@ -0,0 +1,308 @@ +package com.dianping.cat.consumer.heartbeat.model.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import java.util.Map; + +import com.dianping.cat.consumer.heartbeat.model.IVisitor; +import com.dianping.cat.consumer.heartbeat.model.entity.Detail; +import com.dianping.cat.consumer.heartbeat.model.entity.Disk; +import com.dianping.cat.consumer.heartbeat.model.entity.Extension; +import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; +import com.dianping.cat.consumer.heartbeat.model.entity.Machine; +import com.dianping.cat.consumer.heartbeat.model.entity.Period; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(HeartbeatReport heartbeatReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(heartbeatReport, out); + return out.toByteArray(); + } + + public static void build(HeartbeatReport heartbeatReport, OutputStream out) { + heartbeatReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitDetail(Detail detail) { + if (detail.getId() != null) { + writeTag(1, 1); + writeString(detail.getId()); + } + + writeTag(2, 0); + writeDouble(detail.getValue()); + + writeTag(63, 3); + } + + @Override + public void visitDisk(Disk disk) { + if (disk.getPath() != null) { + writeTag(1, 1); + writeString(disk.getPath()); + } + + writeTag(2, 0); + writeLong(disk.getTotal()); + + writeTag(3, 0); + writeLong(disk.getFree()); + + writeTag(4, 0); + writeLong(disk.getUsable()); + + writeTag(63, 3); + } + + @Override + public void visitExtension(Extension extension) { + if (extension.getId() != null) { + writeTag(1, 1); + writeString(extension.getId()); + } + + if (!extension.getDetails().isEmpty()) { + writeTag(33, 2); + writeInt(extension.getDetails().size()); + + for (Detail detail : extension.getDetails().values()) { + detail.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitHeartbeatReport(HeartbeatReport heartbeatReport) { + writeTag(63, 0); + + if (heartbeatReport.getDomain() != null) { + writeTag(1, 1); + writeString(heartbeatReport.getDomain()); + } + + if (heartbeatReport.getStartTime() != null) { + writeTag(2, 1); + writeDate(heartbeatReport.getStartTime()); + } + + if (heartbeatReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(heartbeatReport.getEndTime()); + } + + if (heartbeatReport.getDomainNames() != null) { + writeTag(4, 2); + writeInt(heartbeatReport.getDomainNames().size()); + + for (String domain : heartbeatReport.getDomainNames()) { + writeString(domain); + } + } + + if (heartbeatReport.getIps() != null) { + writeTag(5, 2); + writeInt(heartbeatReport.getIps().size()); + + for (String ip : heartbeatReport.getIps()) { + writeString(ip); + } + } + + if (!heartbeatReport.getMachines().isEmpty()) { + writeTag(33, 2); + writeInt(heartbeatReport.getMachines().size()); + + for (Machine machine : heartbeatReport.getMachines().values()) { + machine.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitMachine(Machine machine) { + if (machine.getIp() != null) { + writeTag(1, 1); + writeString(machine.getIp()); + } + + if (machine.getClasspath() != null) { + writeTag(2, 1); + writeString(machine.getClasspath()); + } + + if (!machine.getPeriods().isEmpty()) { + writeTag(33, 2); + writeInt(machine.getPeriods().size()); + + for (Period period : machine.getPeriods()) { + period.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitPeriod(Period period) { + writeTag(1, 0); + writeInt(period.getMinute()); + + writeTag(2, 0); + writeInt(period.getThreadCount()); + + writeTag(3, 0); + writeInt(period.getDaemonCount()); + + writeTag(4, 0); + writeInt(period.getTotalStartedCount()); + + writeTag(5, 0); + writeInt(period.getCatThreadCount()); + + writeTag(6, 0); + writeInt(period.getPigeonThreadCount()); + + writeTag(7, 0); + writeInt(period.getHttpThreadCount()); + + writeTag(8, 0); + writeLong(period.getNewGcCount()); + + writeTag(9, 0); + writeLong(period.getOldGcCount()); + + writeTag(10, 0); + writeLong(period.getMemoryFree()); + + writeTag(11, 0); + writeLong(period.getHeapUsage()); + + writeTag(12, 0); + writeLong(period.getNoneHeapUsage()); + + writeTag(13, 0); + writeDouble(period.getSystemLoadAverage()); + + writeTag(14, 0); + writeLong(period.getCatMessageProduced()); + + writeTag(15, 0); + writeLong(period.getCatMessageOverflow()); + + writeTag(16, 0); + writeDouble(period.getCatMessageSize()); + + if (!period.getDisks().isEmpty()) { + writeTag(33, 2); + writeInt(period.getDisks().size()); + + for (Disk disk : period.getDisks()) { + disk.accept(m_visitor); + } + } + + if (!period.getExtensions().isEmpty()) { + writeTag(34, 2); + writeInt(period.getExtensions().size()); + + for (Extension extension : period.getExtensions().values()) { + extension.accept(m_visitor); + } + } + + if (!period.getDynamicAttributes().isEmpty()) { + writeTag(63, 2); + writeInt(period.getDynamicAttributes().size()); + + for (Map.Entry dynamicAttribute : period.getDynamicAttributes().entrySet()) { + writeString(dynamicAttribute.getKey()); + writeString(dynamicAttribute.getValue()); + } + } + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeDouble(double value) { + try { + writeVarint(Double.doubleToLongBits(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeLong(long value) { + try { + writeVarint(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultNativeParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..8d37a46752 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultNativeParser.java @@ -0,0 +1,388 @@ +package com.dianping.cat.consumer.heartbeat.model.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import java.util.Map; + +import com.dianping.cat.consumer.heartbeat.model.IVisitor; +import com.dianping.cat.consumer.heartbeat.model.entity.Detail; +import com.dianping.cat.consumer.heartbeat.model.entity.Disk; +import com.dianping.cat.consumer.heartbeat.model.entity.Extension; +import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; +import com.dianping.cat.consumer.heartbeat.model.entity.Machine; +import com.dianping.cat.consumer.heartbeat.model.entity.Period; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static HeartbeatReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static HeartbeatReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + HeartbeatReport heartbeatReport = new HeartbeatReport(); + + try { + heartbeatReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return heartbeatReport; + } + + @Override + public void visitDetail(Detail detail) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDetailChildren(detail, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDetailChildren(Detail detail, int _field, int _type) { + switch (_field) { + case 1: + detail.setId(readString()); + break; + case 2: + detail.setValue(readDouble()); + break; + } + } + + @Override + public void visitDisk(Disk disk) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDiskChildren(disk, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDiskChildren(Disk disk, int _field, int _type) { + switch (_field) { + case 1: + disk.setPath(readString()); + break; + case 2: + disk.setTotal(readLong()); + break; + case 3: + disk.setFree(readLong()); + break; + case 4: + disk.setUsable(readLong()); + break; + } + } + + @Override + public void visitExtension(Extension extension) { + byte tag; + + while ((tag = readTag()) != -1) { + visitExtensionChildren(extension, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitExtensionChildren(Extension extension, int _field, int _type) { + switch (_field) { + case 1: + extension.setId(readString()); + break; + case 33: + if (_type == 1) { + Detail detail = new Detail(); + + visitDetail(detail); + m_linker.onDetail(extension, detail); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Detail detail = new Detail(); + + visitDetail(detail); + m_linker.onDetail(extension, detail); + } + } + break; + } + } + + @Override + public void visitHeartbeatReport(HeartbeatReport heartbeatReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitHeartbeatReportChildren(heartbeatReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitHeartbeatReportChildren(HeartbeatReport heartbeatReport, int _field, int _type) { + switch (_field) { + case 1: + heartbeatReport.setDomain(readString()); + break; + case 2: + heartbeatReport.setStartTime(readDate()); + break; + case 3: + heartbeatReport.setEndTime(readDate()); + break; + case 4: + if (_type == 1) { + heartbeatReport.addDomain(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + heartbeatReport.addDomain(readString()); + } + } + break; + case 5: + if (_type == 1) { + heartbeatReport.addIp(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + heartbeatReport.addIp(readString()); + } + } + break; + case 33: + if (_type == 1) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(heartbeatReport, machine); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(heartbeatReport, machine); + } + } + break; + } + } + + @Override + public void visitMachine(Machine machine) { + byte tag; + + while ((tag = readTag()) != -1) { + visitMachineChildren(machine, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitMachineChildren(Machine machine, int _field, int _type) { + switch (_field) { + case 1: + machine.setIp(readString()); + break; + case 2: + machine.setClasspath(readString()); + break; + case 33: + if (_type == 1) { + Period period = new Period(); + + visitPeriod(period); + m_linker.onPeriod(machine, period); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Period period = new Period(); + + visitPeriod(period); + m_linker.onPeriod(machine, period); + } + } + break; + } + } + + @Override + public void visitPeriod(Period period) { + byte tag; + + while ((tag = readTag()) != -1) { + visitPeriodChildren(period, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitPeriodChildren(Period period, int _field, int _type) { + switch (_field) { + case 1: + period.setMinute(readInt()); + break; + case 2: + period.setThreadCount(readInt()); + break; + case 3: + period.setDaemonCount(readInt()); + break; + case 4: + period.setTotalStartedCount(readInt()); + break; + case 5: + period.setCatThreadCount(readInt()); + break; + case 6: + period.setPigeonThreadCount(readInt()); + break; + case 7: + period.setHttpThreadCount(readInt()); + break; + case 8: + period.setNewGcCount(readLong()); + break; + case 9: + period.setOldGcCount(readLong()); + break; + case 10: + period.setMemoryFree(readLong()); + break; + case 11: + period.setHeapUsage(readLong()); + break; + case 12: + period.setNoneHeapUsage(readLong()); + break; + case 13: + period.setSystemLoadAverage(readDouble()); + break; + case 14: + period.setCatMessageProduced(readLong()); + break; + case 15: + period.setCatMessageOverflow(readLong()); + break; + case 16: + period.setCatMessageSize(readDouble()); + break; + case 33: + if (_type == 1) { + Disk disk = new Disk(); + + visitDisk(disk); + m_linker.onDisk(period, disk); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Disk disk = new Disk(); + + visitDisk(disk); + m_linker.onDisk(period, disk); + } + } + break; + case 34: + if (_type == 1) { + Extension extension = new Extension(); + + visitExtension(extension); + m_linker.onExtension(period, extension); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Extension extension = new Extension(); + + visitExtension(extension); + m_linker.onExtension(period, extension); + } + } + break; + case 63: + Map dynamicAttribute = period.getDynamicAttributes(); + + for (int i = readInt(); i > 0; i--) { + String key = readString(); + String value = readString(); + + dynamicAttribute.put(key, value); + } + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private double readDouble() { + try { + return Double.longBitsToDouble(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private long readLong() { + try { + return readVarint(64); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultSaxMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..38ac5bba9b --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultSaxMaker.java @@ -0,0 +1,288 @@ +package com.dianping.cat.consumer.heartbeat.model.transform; + +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_CAT_MESSAGE_OVERFLOW; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_CAT_MESSAGE_PRODUCED; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_CAT_MESSAGE_SIZE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_CAT_THREAD_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_CLASSPATH; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_DAEMON_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_FREE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_HEAP_USAGE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_HTTP_THREAD_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_MEMORY_FREE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_MINUTE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_NEW_GC_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_NONE_HEAP_USAGE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_OLD_GC_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_PATH; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_PIGEON_THREAD_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_SYSTEM_LOAD_AVERAGE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_THREAD_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_TOTAL; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_TOTAL_STARTED_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_USABLE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_VALUE; + +import java.util.Map; +import org.xml.sax.Attributes; + +import com.dianping.cat.consumer.heartbeat.model.entity.Detail; +import com.dianping.cat.consumer.heartbeat.model.entity.Disk; +import com.dianping.cat.consumer.heartbeat.model.entity.Extension; +import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; +import com.dianping.cat.consumer.heartbeat.model.entity.Machine; +import com.dianping.cat.consumer.heartbeat.model.entity.Period; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Detail buildDetail(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String value = attributes.getValue(ATTR_VALUE); + Detail detail = new Detail(id); + + if (value != null) { + detail.setValue(convert(Double.class, value, 0.0)); + } + + return detail; + } + + @Override + public Disk buildDisk(Attributes attributes) { + String path = attributes.getValue(ATTR_PATH); + String total = attributes.getValue(ATTR_TOTAL); + String free = attributes.getValue(ATTR_FREE); + String usable = attributes.getValue(ATTR_USABLE); + Disk disk = new Disk(path); + + if (total != null) { + disk.setTotal(convert(Long.class, total, 0L)); + } + + if (free != null) { + disk.setFree(convert(Long.class, free, 0L)); + } + + if (usable != null) { + disk.setUsable(convert(Long.class, usable, 0L)); + } + + return disk; + } + + @Override + public String buildDomain(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Extension buildExtension(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Extension extension = new Extension(id); + + return extension; + } + + @Override + public HeartbeatReport buildHeartbeatReport(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String startTime = attributes.getValue(ATTR_STARTTIME); + String endTime = attributes.getValue(ATTR_ENDTIME); + HeartbeatReport heartbeatReport = new HeartbeatReport(domain); + + if (startTime != null) { + heartbeatReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + heartbeatReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return heartbeatReport; + } + + @Override + public String buildIp(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Machine buildMachine(Attributes attributes) { + String ip = attributes.getValue(ATTR_IP); + String classpath = attributes.getValue(ATTR_CLASSPATH); + Machine machine = new Machine(ip); + + if (classpath != null) { + machine.setClasspath(classpath); + } + + return machine; + } + + @Override + public Period buildPeriod(Attributes attributes) { + String minute = attributes.getValue(ATTR_MINUTE); + String threadCount = attributes.getValue(ATTR_THREAD_COUNT); + String daemonCount = attributes.getValue(ATTR_DAEMON_COUNT); + String totalStartedCount = attributes.getValue(ATTR_TOTAL_STARTED_COUNT); + String catThreadCount = attributes.getValue(ATTR_CAT_THREAD_COUNT); + String pigeonThreadCount = attributes.getValue(ATTR_PIGEON_THREAD_COUNT); + String httpThreadCount = attributes.getValue(ATTR_HTTP_THREAD_COUNT); + String newGcCount = attributes.getValue(ATTR_NEW_GC_COUNT); + String oldGcCount = attributes.getValue(ATTR_OLD_GC_COUNT); + String memoryFree = attributes.getValue(ATTR_MEMORY_FREE); + String heapUsage = attributes.getValue(ATTR_HEAP_USAGE); + String noneHeapUsage = attributes.getValue(ATTR_NONE_HEAP_USAGE); + String systemLoadAverage = attributes.getValue(ATTR_SYSTEM_LOAD_AVERAGE); + String catMessageProduced = attributes.getValue(ATTR_CAT_MESSAGE_PRODUCED); + String catMessageOverflow = attributes.getValue(ATTR_CAT_MESSAGE_OVERFLOW); + String catMessageSize = attributes.getValue(ATTR_CAT_MESSAGE_SIZE); + Period period = new Period(minute == null ? 0 : convert(Integer.class, minute, 0)); + + if (threadCount != null) { + period.setThreadCount(convert(Integer.class, threadCount, 0)); + } + + if (daemonCount != null) { + period.setDaemonCount(convert(Integer.class, daemonCount, 0)); + } + + if (totalStartedCount != null) { + period.setTotalStartedCount(convert(Integer.class, totalStartedCount, 0)); + } + + if (catThreadCount != null) { + period.setCatThreadCount(convert(Integer.class, catThreadCount, 0)); + } + + if (pigeonThreadCount != null) { + period.setPigeonThreadCount(convert(Integer.class, pigeonThreadCount, 0)); + } + + if (httpThreadCount != null) { + period.setHttpThreadCount(convert(Integer.class, httpThreadCount, 0)); + } + + if (newGcCount != null) { + period.setNewGcCount(convert(Long.class, newGcCount, 0L)); + } + + if (oldGcCount != null) { + period.setOldGcCount(convert(Long.class, oldGcCount, 0L)); + } + + if (memoryFree != null) { + period.setMemoryFree(convert(Long.class, memoryFree, 0L)); + } + + if (heapUsage != null) { + period.setHeapUsage(convert(Long.class, heapUsage, 0L)); + } + + if (noneHeapUsage != null) { + period.setNoneHeapUsage(convert(Long.class, noneHeapUsage, 0L)); + } + + if (systemLoadAverage != null) { + period.setSystemLoadAverage(toNumber(systemLoadAverage, "0.00", 0).doubleValue()); + } + + if (catMessageProduced != null) { + period.setCatMessageProduced(convert(Long.class, catMessageProduced, 0L)); + } + + if (catMessageOverflow != null) { + period.setCatMessageOverflow(convert(Long.class, catMessageOverflow, 0L)); + } + + if (catMessageSize != null) { + period.setCatMessageSize(toNumber(catMessageSize, "0.00", 0).doubleValue()); + } + + Map dynamicAttributes = period.getDynamicAttributes(); + int _length = attributes == null ? 0 : attributes.getLength(); + + for (int i = 0; i < _length; i++) { + String _name = attributes.getQName(i); + String _value = attributes.getValue(i); + + dynamicAttributes.put(_name, _value); + } + + dynamicAttributes.remove(ATTR_MINUTE); + dynamicAttributes.remove(ATTR_THREAD_COUNT); + dynamicAttributes.remove(ATTR_DAEMON_COUNT); + dynamicAttributes.remove(ATTR_TOTAL_STARTED_COUNT); + dynamicAttributes.remove(ATTR_CAT_THREAD_COUNT); + dynamicAttributes.remove(ATTR_PIGEON_THREAD_COUNT); + dynamicAttributes.remove(ATTR_HTTP_THREAD_COUNT); + dynamicAttributes.remove(ATTR_NEW_GC_COUNT); + dynamicAttributes.remove(ATTR_OLD_GC_COUNT); + dynamicAttributes.remove(ATTR_MEMORY_FREE); + dynamicAttributes.remove(ATTR_HEAP_USAGE); + dynamicAttributes.remove(ATTR_NONE_HEAP_USAGE); + dynamicAttributes.remove(ATTR_SYSTEM_LOAD_AVERAGE); + dynamicAttributes.remove(ATTR_CAT_MESSAGE_PRODUCED); + dynamicAttributes.remove(ATTR_CAT_MESSAGE_OVERFLOW); + dynamicAttributes.remove(ATTR_CAT_MESSAGE_SIZE); + + return period; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format, Number defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultSaxParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..5d5e4fb0f4 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultSaxParser.java @@ -0,0 +1,348 @@ +package com.dianping.cat.consumer.heartbeat.model.transform; + +import static com.dianping.cat.consumer.heartbeat.model.Constants.ELEMENT_DOMAIN; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ELEMENT_DOMAIN_NAMES; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ELEMENT_IP; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ELEMENT_IPS; + +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_DETAIL; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_DISK; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_EXTENSION; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_HEARTBEAT_REPORT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_MACHINE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_PERIOD; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.consumer.heartbeat.model.IEntity; +import com.dianping.cat.consumer.heartbeat.model.entity.Detail; +import com.dianping.cat.consumer.heartbeat.model.entity.Disk; +import com.dianping.cat.consumer.heartbeat.model.entity.Extension; +import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; +import com.dianping.cat.consumer.heartbeat.model.entity.Machine; +import com.dianping.cat.consumer.heartbeat.model.entity.Period; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static HeartbeatReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(HeartbeatReport.class, new InputSource(removeBOM(in))); + } + + public static HeartbeatReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(HeartbeatReport.class, new InputSource(removeBOM(reader))); + } + + public static HeartbeatReport parse(String xml) throws SAXException, IOException { + return parseEntity(HeartbeatReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof HeartbeatReport) { + HeartbeatReport heartbeatReport = (HeartbeatReport) currentObj; + + if (ELEMENT_DOMAIN.equals(currentTag)) { + heartbeatReport.addDomain(getText()); + } else if (ELEMENT_IP.equals(currentTag)) { + heartbeatReport.addIp(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForDetail(Detail parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForDisk(Disk parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForExtension(Extension parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DETAIL.equals(qName)) { + Detail detail = m_maker.buildDetail(attributes); + + m_linker.onDetail(parentObj, detail); + m_objs.push(detail); + } else { + throw new SAXException(String.format("Element(%s) is not expected under extension!", qName)); + } + + m_tags.push(qName); + } + + private void parseForHeartbeatReport(HeartbeatReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_DOMAIN_NAMES.equals(qName) || ELEMENT_DOMAIN.equals(qName) || ELEMENT_IPS.equals(qName) || ELEMENT_IP.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_linker.onMachine(parentObj, machine); + m_objs.push(machine); + } else { + throw new SAXException(String.format("Element(%s) is not expected under heartbeat-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseForMachine(Machine parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_PERIOD.equals(qName)) { + Period period = m_maker.buildPeriod(attributes); + + m_linker.onPeriod(parentObj, period); + m_objs.push(period); + } else { + throw new SAXException(String.format("Element(%s) is not expected under machine!", qName)); + } + + m_tags.push(qName); + } + + private void parseForPeriod(Period parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DISK.equals(qName)) { + Disk disk = m_maker.buildDisk(attributes); + + m_linker.onDisk(parentObj, disk); + m_objs.push(disk); + } else if (ENTITY_EXTENSION.equals(qName)) { + Extension extension = m_maker.buildExtension(attributes); + + m_linker.onExtension(parentObj, extension); + m_objs.push(extension); + } else { + throw new SAXException(String.format("Element(%s) is not expected under period!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_HEARTBEAT_REPORT.equals(qName)) { + HeartbeatReport heartbeatReport = m_maker.buildHeartbeatReport(attributes); + + m_entity = heartbeatReport; + m_objs.push(heartbeatReport); + m_tags.push(qName); + } else if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_entity = machine; + m_objs.push(machine); + m_tags.push(qName); + } else if (ENTITY_PERIOD.equals(qName)) { + Period period = m_maker.buildPeriod(attributes); + + m_entity = period; + m_objs.push(period); + m_tags.push(qName); + } else if (ENTITY_DISK.equals(qName)) { + Disk disk = m_maker.buildDisk(attributes); + + m_entity = disk; + m_objs.push(disk); + m_tags.push(qName); + } else if (ENTITY_EXTENSION.equals(qName)) { + Extension extension = m_maker.buildExtension(attributes); + + m_entity = extension; + m_objs.push(extension); + m_tags.push(qName); + } else if (ENTITY_DETAIL.equals(qName)) { + Detail detail = m_maker.buildDetail(attributes); + + m_entity = detail; + m_objs.push(detail); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof HeartbeatReport) { + parseForHeartbeatReport((HeartbeatReport) parent, tag, qName, attributes); + } else if (parent instanceof Machine) { + parseForMachine((Machine) parent, tag, qName, attributes); + } else if (parent instanceof Period) { + parseForPeriod((Period) parent, tag, qName, attributes); + } else if (parent instanceof Disk) { + parseForDisk((Disk) parent, tag, qName, attributes); + } else if (parent instanceof Extension) { + parseForExtension((Extension) parent, tag, qName, attributes); + } else if (parent instanceof Detail) { + parseForDetail((Detail) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format) { + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultXmlBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..4528628988 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/DefaultXmlBuilder.java @@ -0,0 +1,369 @@ +package com.dianping.cat.consumer.heartbeat.model.transform; + +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_CAT_MESSAGE_OVERFLOW; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_CAT_MESSAGE_PRODUCED; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_CAT_MESSAGE_SIZE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_CAT_THREAD_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_CLASSPATH; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_DAEMON_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_FREE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_HEAP_USAGE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_HTTP_THREAD_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_MEMORY_FREE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_MINUTE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_NEW_GC_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_NONE_HEAP_USAGE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_OLD_GC_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_PATH; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_PIGEON_THREAD_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_SYSTEM_LOAD_AVERAGE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_THREAD_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_TOTAL; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_TOTAL_STARTED_COUNT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_USABLE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ATTR_VALUE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ELEMENT_DOMAIN; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ELEMENT_IP; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_DETAIL; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_DISK; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_EXTENSION; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_HEARTBEAT_REPORT; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_MACHINE; +import static com.dianping.cat.consumer.heartbeat.model.Constants.ENTITY_PERIOD; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.consumer.heartbeat.model.IEntity; +import com.dianping.cat.consumer.heartbeat.model.IVisitor; +import com.dianping.cat.consumer.heartbeat.model.entity.Detail; +import com.dianping.cat.consumer.heartbeat.model.entity.Disk; +import com.dianping.cat.consumer.heartbeat.model.entity.Extension; +import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; +import com.dianping.cat.consumer.heartbeat.model.entity.Machine; +import com.dianping.cat.consumer.heartbeat.model.entity.Period; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + protected String toString(Number number, String format) { + if (number != null) { + return new java.text.DecimalFormat(format).format(number); + } else { + return null; + } + } + + @Override + public void visitDetail(Detail detail) { + startTag(ENTITY_DETAIL, true, null, ATTR_ID, detail.getId(), ATTR_VALUE, detail.getValue()); + } + + @Override + public void visitDisk(Disk disk) { + startTag(ENTITY_DISK, true, null, ATTR_PATH, disk.getPath(), ATTR_TOTAL, disk.getTotal(), ATTR_FREE, disk.getFree(), ATTR_USABLE, disk.getUsable()); + } + + @Override + public void visitExtension(Extension extension) { + startTag(ENTITY_EXTENSION, null, ATTR_ID, extension.getId()); + + if (!extension.getDetails().isEmpty()) { + for (Detail detail : extension.getDetails().values()) { + detail.accept(m_visitor); + } + } + + endTag(ENTITY_EXTENSION); + } + + @Override + public void visitHeartbeatReport(HeartbeatReport heartbeatReport) { + startTag(ENTITY_HEARTBEAT_REPORT, null, ATTR_DOMAIN, heartbeatReport.getDomain(), ATTR_STARTTIME, toString(heartbeatReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_ENDTIME, toString(heartbeatReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!heartbeatReport.getDomainNames().isEmpty()) { + for (String domain : heartbeatReport.getDomainNames()) { + tagWithText(ELEMENT_DOMAIN, domain); + } + } + + if (!heartbeatReport.getIps().isEmpty()) { + for (String ip : heartbeatReport.getIps()) { + tagWithText(ELEMENT_IP, ip); + } + } + + if (!heartbeatReport.getMachines().isEmpty()) { + for (Machine machine : heartbeatReport.getMachines().values()) { + machine.accept(m_visitor); + } + } + + endTag(ENTITY_HEARTBEAT_REPORT); + } + + @Override + public void visitMachine(Machine machine) { + startTag(ENTITY_MACHINE, null, ATTR_IP, machine.getIp(), ATTR_CLASSPATH, machine.getClasspath()); + + if (!machine.getPeriods().isEmpty()) { + for (Period period : machine.getPeriods()) { + period.accept(m_visitor); + } + } + + endTag(ENTITY_MACHINE); + } + + @Override + public void visitPeriod(Period period) { + startTag(ENTITY_PERIOD, period.getDynamicAttributes(), ATTR_MINUTE, period.getMinute(), ATTR_THREAD_COUNT, period.getThreadCount(), ATTR_DAEMON_COUNT, period.getDaemonCount(), ATTR_TOTAL_STARTED_COUNT, period.getTotalStartedCount(), ATTR_CAT_THREAD_COUNT, period.getCatThreadCount(), ATTR_PIGEON_THREAD_COUNT, period.getPigeonThreadCount(), ATTR_HTTP_THREAD_COUNT, period.getHttpThreadCount(), ATTR_NEW_GC_COUNT, period.getNewGcCount(), ATTR_OLD_GC_COUNT, period.getOldGcCount(), ATTR_MEMORY_FREE, period.getMemoryFree(), ATTR_HEAP_USAGE, period.getHeapUsage(), ATTR_NONE_HEAP_USAGE, period.getNoneHeapUsage(), ATTR_SYSTEM_LOAD_AVERAGE, toString(period.getSystemLoadAverage(), "0.00"), ATTR_CAT_MESSAGE_PRODUCED, period.getCatMessageProduced(), ATTR_CAT_MESSAGE_OVERFLOW, period.getCatMessageOverflow(), ATTR_CAT_MESSAGE_SIZE, toString(period.getCatMessageSize(), "0.00")); + + if (!period.getDisks().isEmpty()) { + for (Disk disk : period.getDisks()) { + disk.accept(m_visitor); + } + } + + if (!period.getExtensions().isEmpty()) { + for (Extension extension : period.getExtensions().values()) { + extension.accept(m_visitor); + } + } + + endTag(ENTITY_PERIOD); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/ILinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/ILinker.java new file mode 100644 index 0000000000..a12bc72130 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/ILinker.java @@ -0,0 +1,21 @@ +package com.dianping.cat.consumer.heartbeat.model.transform; + +import com.dianping.cat.consumer.heartbeat.model.entity.Detail; +import com.dianping.cat.consumer.heartbeat.model.entity.Disk; +import com.dianping.cat.consumer.heartbeat.model.entity.Extension; +import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; +import com.dianping.cat.consumer.heartbeat.model.entity.Machine; +import com.dianping.cat.consumer.heartbeat.model.entity.Period; + +public interface ILinker { + + public boolean onDetail(Extension parent, Detail detail); + + public boolean onDisk(Period parent, Disk disk); + + public boolean onExtension(Period parent, Extension extension); + + public boolean onMachine(HeartbeatReport parent, Machine machine); + + public boolean onPeriod(Machine parent, Period period); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/IMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/IMaker.java new file mode 100644 index 0000000000..c5a56fabc3 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/IMaker.java @@ -0,0 +1,27 @@ +package com.dianping.cat.consumer.heartbeat.model.transform; + +import com.dianping.cat.consumer.heartbeat.model.entity.Detail; +import com.dianping.cat.consumer.heartbeat.model.entity.Disk; +import com.dianping.cat.consumer.heartbeat.model.entity.Extension; +import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; +import com.dianping.cat.consumer.heartbeat.model.entity.Machine; +import com.dianping.cat.consumer.heartbeat.model.entity.Period; + +public interface IMaker { + + public Detail buildDetail(T node); + + public Disk buildDisk(T node); + + public String buildDomain(T node); + + public Extension buildExtension(T node); + + public HeartbeatReport buildHeartbeatReport(T node); + + public String buildIp(T node); + + public Machine buildMachine(T node); + + public Period buildPeriod(T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/IParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/IParser.java new file mode 100644 index 0000000000..54bd0789f8 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/model/transform/IParser.java @@ -0,0 +1,22 @@ +package com.dianping.cat.consumer.heartbeat.model.transform; + +import com.dianping.cat.consumer.heartbeat.model.entity.Detail; +import com.dianping.cat.consumer.heartbeat.model.entity.Disk; +import com.dianping.cat.consumer.heartbeat.model.entity.Extension; +import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; +import com.dianping.cat.consumer.heartbeat.model.entity.Machine; +import com.dianping.cat.consumer.heartbeat.model.entity.Period; + +public interface IParser { + public HeartbeatReport parse(IMaker maker, ILinker linker, T node); + + public void parseForDetail(IMaker maker, ILinker linker, Detail parent, T node); + + public void parseForDisk(IMaker maker, ILinker linker, Disk parent, T node); + + public void parseForExtension(IMaker maker, ILinker linker, Extension parent, T node); + + public void parseForMachine(IMaker maker, ILinker linker, Machine parent, T node); + + public void parseForPeriod(IMaker maker, ILinker linker, Period parent, T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/BaseEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/BaseEntity.java new file mode 100644 index 0000000000..65dd7ba822 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.consumer.matrix.model; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.consumer.matrix.model.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/Constants.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/Constants.java new file mode 100644 index 0000000000..5814256dd1 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/Constants.java @@ -0,0 +1,40 @@ +package com.dianping.cat.consumer.matrix.model; + +public class Constants { + + public static final String ATTR_COUNT = "count"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_MAX = "max"; + + public static final String ATTR_MIN = "min"; + + public static final String ATTR_NAME = "name"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ATTR_TOTALCOUNT = "totalCount"; + + public static final String ATTR_TOTALTIME = "totalTime"; + + public static final String ATTR_TYPE = "type"; + + public static final String ATTR_URL = "url"; + + public static final String ELEMENT_DOMAIN = "domain"; + + public static final String ELEMENT_DOMAIN_NAMES = "domain-names"; + + public static final String ENTITY_MATRIX = "matrix"; + + public static final String ENTITY_MATRIXS = "matrixs"; + + public static final String ENTITY_MATRIX_REPORT = "matrix-report"; + + public static final String ENTITY_RATIO = "ratio"; + + public static final String ENTITY_RATIOS = "ratios"; +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/IEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/IEntity.java new file mode 100644 index 0000000000..79096cf41b --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.consumer.matrix.model; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/IVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/IVisitor.java new file mode 100644 index 0000000000..3116c7bcc8 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.consumer.matrix.model; + +import com.dianping.cat.consumer.matrix.model.entity.Matrix; +import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; +import com.dianping.cat.consumer.matrix.model.entity.Ratio; + +public interface IVisitor { + + public void visitMatrix(Matrix matrix); + + public void visitMatrixReport(MatrixReport matrixReport); + + public void visitRatio(Ratio ratio); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/entity/Matrix.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/entity/Matrix.java new file mode 100644 index 0000000000..651c4cd35f --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/entity/Matrix.java @@ -0,0 +1,167 @@ +package com.dianping.cat.consumer.matrix.model.entity; + +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.matrix.model.Constants.ENTITY_MATRIX; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.matrix.model.BaseEntity; +import com.dianping.cat.consumer.matrix.model.IVisitor; + +public class Matrix extends BaseEntity { + private String m_type; + + private String m_name; + + private int m_count; + + private long m_totalTime; + + private String m_url; + + private Map m_ratios = new LinkedHashMap(); + + public Matrix() { + } + + public Matrix(String name) { + m_name = name; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMatrix(this); + } + + public Matrix addRatio(Ratio ratio) { + m_ratios.put(ratio.getType(), ratio); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Matrix) { + Matrix _o = (Matrix) obj; + + if (!equals(getName(), _o.getName())) { + return false; + } + + return true; + } + + return false; + } + + public Ratio findRatio(String type) { + return m_ratios.get(type); + } + + public Ratio findOrCreateRatio(String type) { + Ratio ratio = m_ratios.get(type); + + if (ratio == null) { + synchronized (m_ratios) { + ratio = m_ratios.get(type); + + if (ratio == null) { + ratio = new Ratio(type); + m_ratios.put(type, ratio); + } + } + } + + return ratio; + } + + public int getCount() { + return m_count; + } + + public String getName() { + return m_name; + } + + public Map getRatios() { + return m_ratios; + } + + public long getTotalTime() { + return m_totalTime; + } + + public String getType() { + return m_type; + } + + public String getUrl() { + return m_url; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_name == null ? 0 : m_name.hashCode()); + + return hash; + } + + public Matrix incCount() { + m_count++; + return this; + } + + public Matrix incCount(int count) { + m_count += count; + return this; + } + + @Override + public void mergeAttributes(Matrix other) { + assertAttributeEquals(other, ENTITY_MATRIX, ATTR_NAME, m_name, other.getName()); + + if (other.getType() != null) { + m_type = other.getType(); + } + + m_count = other.getCount(); + + m_totalTime = other.getTotalTime(); + + if (other.getUrl() != null) { + m_url = other.getUrl(); + } + } + + public Ratio removeRatio(String type) { + return m_ratios.remove(type); + } + + public Matrix setCount(int count) { + m_count = count; + return this; + } + + public Matrix setName(String name) { + m_name = name; + return this; + } + + public Matrix setTotalTime(long totalTime) { + m_totalTime = totalTime; + return this; + } + + public Matrix setType(String type) { + m_type = type; + return this; + } + + public Matrix setUrl(String url) { + m_url = url; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/entity/MatrixReport.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/entity/MatrixReport.java new file mode 100644 index 0000000000..28d31d8ca2 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/entity/MatrixReport.java @@ -0,0 +1,144 @@ +package com.dianping.cat.consumer.matrix.model.entity; + +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.matrix.model.Constants.ENTITY_MATRIX_REPORT; + +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +import com.dianping.cat.consumer.matrix.model.BaseEntity; +import com.dianping.cat.consumer.matrix.model.IVisitor; + +public class MatrixReport extends BaseEntity { + private String m_domain; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Set m_domainNames = new LinkedHashSet(); + + private Map m_matrixs = new LinkedHashMap(); + + public MatrixReport() { + } + + public MatrixReport(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMatrixReport(this); + } + + public MatrixReport addDomain(String domain) { + m_domainNames.add(domain); + return this; + } + + public MatrixReport addMatrix(Matrix matrix) { + m_matrixs.put(matrix.getName(), matrix); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof MatrixReport) { + MatrixReport _o = (MatrixReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public Matrix findMatrix(String name) { + return m_matrixs.get(name); + } + + public Matrix findOrCreateMatrix(String name) { + Matrix matrix = m_matrixs.get(name); + + if (matrix == null) { + synchronized (m_matrixs) { + matrix = m_matrixs.get(name); + + if (matrix == null) { + matrix = new Matrix(name); + m_matrixs.put(name, matrix); + } + } + } + + return matrix; + } + + public String getDomain() { + return m_domain; + } + + public Set getDomainNames() { + return m_domainNames; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public Map getMatrixs() { + return m_matrixs; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(MatrixReport other) { + assertAttributeEquals(other, ENTITY_MATRIX_REPORT, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Matrix removeMatrix(String name) { + return m_matrixs.remove(name); + } + + public MatrixReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public MatrixReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public MatrixReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/entity/Ratio.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/entity/Ratio.java new file mode 100644 index 0000000000..737fd0f15a --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/entity/Ratio.java @@ -0,0 +1,139 @@ +package com.dianping.cat.consumer.matrix.model.entity; + +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_TYPE; +import static com.dianping.cat.consumer.matrix.model.Constants.ENTITY_RATIO; + +import com.dianping.cat.consumer.matrix.model.BaseEntity; +import com.dianping.cat.consumer.matrix.model.IVisitor; + +public class Ratio extends BaseEntity { + private String m_type; + + private int m_min; + + private int m_max; + + private int m_totalCount; + + private long m_totalTime; + + private String m_url; + + public Ratio() { + } + + public Ratio(String type) { + m_type = type; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitRatio(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Ratio) { + Ratio _o = (Ratio) obj; + + if (!equals(getType(), _o.getType())) { + return false; + } + + return true; + } + + return false; + } + + public int getMax() { + return m_max; + } + + public int getMin() { + return m_min; + } + + public int getTotalCount() { + return m_totalCount; + } + + public long getTotalTime() { + return m_totalTime; + } + + public String getType() { + return m_type; + } + + public String getUrl() { + return m_url; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_type == null ? 0 : m_type.hashCode()); + + return hash; + } + + public Ratio incTotalCount() { + m_totalCount++; + return this; + } + + public Ratio incTotalCount(int totalCount) { + m_totalCount += totalCount; + return this; + } + + @Override + public void mergeAttributes(Ratio other) { + assertAttributeEquals(other, ENTITY_RATIO, ATTR_TYPE, m_type, other.getType()); + + m_min = other.getMin(); + + m_max = other.getMax(); + + m_totalCount = other.getTotalCount(); + + m_totalTime = other.getTotalTime(); + + if (other.getUrl() != null) { + m_url = other.getUrl(); + } + } + + public Ratio setMax(int max) { + m_max = max; + return this; + } + + public Ratio setMin(int min) { + m_min = min; + return this; + } + + public Ratio setTotalCount(int totalCount) { + m_totalCount = totalCount; + return this; + } + + public Ratio setTotalTime(long totalTime) { + m_totalTime = totalTime; + return this; + } + + public Ratio setType(String type) { + m_type = type; + return this; + } + + public Ratio setUrl(String url) { + m_url = url; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/BaseVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/BaseVisitor.java new file mode 100644 index 0000000000..389663182f --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/BaseVisitor.java @@ -0,0 +1,26 @@ +package com.dianping.cat.consumer.matrix.model.transform; + +import com.dianping.cat.consumer.matrix.model.IVisitor; +import com.dianping.cat.consumer.matrix.model.entity.Matrix; +import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; +import com.dianping.cat.consumer.matrix.model.entity.Ratio; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitMatrix(Matrix matrix) { + for (Ratio ratio : matrix.getRatios().values()) { + visitRatio(ratio); + } + } + + @Override + public void visitMatrixReport(MatrixReport matrixReport) { + for (Matrix matrix : matrixReport.getMatrixs().values()) { + visitMatrix(matrix); + } + } + + @Override + public void visitRatio(Ratio ratio) { + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultLinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultLinker.java new file mode 100644 index 0000000000..334fb44d89 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultLinker.java @@ -0,0 +1,55 @@ +package com.dianping.cat.consumer.matrix.model.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.consumer.matrix.model.entity.Matrix; +import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; +import com.dianping.cat.consumer.matrix.model.entity.Ratio; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onMatrix(final MatrixReport parent, final Matrix matrix) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addMatrix(matrix); + } + }); + } else { + parent.addMatrix(matrix); + } + + return true; + } + + @Override + public boolean onRatio(final Matrix parent, final Ratio ratio) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addRatio(ratio); + } + }); + } else { + parent.addRatio(ratio); + } + + return true; + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultMerger.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultMerger.java new file mode 100644 index 0000000000..12303798cf --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultMerger.java @@ -0,0 +1,108 @@ +package com.dianping.cat.consumer.matrix.model.transform; + +import java.util.Stack; + +import com.dianping.cat.consumer.matrix.model.IEntity; +import com.dianping.cat.consumer.matrix.model.IVisitor; +import com.dianping.cat.consumer.matrix.model.entity.Matrix; +import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; +import com.dianping.cat.consumer.matrix.model.entity.Ratio; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private MatrixReport m_matrixReport; + + public DefaultMerger() { + } + + public DefaultMerger(MatrixReport matrixReport) { + m_matrixReport = matrixReport; + m_objs.push(matrixReport); + } + + public MatrixReport getMatrixReport() { + return m_matrixReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeMatrix(Matrix to, Matrix from) { + to.mergeAttributes(from); + } + + protected void mergeMatrixReport(MatrixReport to, MatrixReport from) { + to.mergeAttributes(from); + to.getDomainNames().addAll(from.getDomainNames()); + } + + protected void mergeRatio(Ratio to, Ratio from) { + to.mergeAttributes(from); + } + + @Override + public void visitMatrix(Matrix from) { + Matrix to = (Matrix) m_objs.peek(); + + mergeMatrix(to, from); + visitMatrixChildren(to, from); + } + + protected void visitMatrixChildren(Matrix to, Matrix from) { + for (Ratio source : from.getRatios().values()) { + Ratio target = to.findRatio(source.getType()); + + if (target == null) { + target = new Ratio(source.getType()); + to.addRatio(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitMatrixReport(MatrixReport from) { + MatrixReport to = (MatrixReport) m_objs.peek(); + + mergeMatrixReport(to, from); + visitMatrixReportChildren(to, from); + } + + protected void visitMatrixReportChildren(MatrixReport to, MatrixReport from) { + for (Matrix source : from.getMatrixs().values()) { + Matrix target = to.findMatrix(source.getName()); + + if (target == null) { + target = new Matrix(source.getName()); + to.addMatrix(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitRatio(Ratio from) { + Ratio to = (Ratio) m_objs.peek(); + + mergeRatio(to, from); + visitRatioChildren(to, from); + } + + protected void visitRatioChildren(Ratio to, Ratio from) { + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultNativeBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..27d82b949f --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultNativeBuilder.java @@ -0,0 +1,192 @@ +package com.dianping.cat.consumer.matrix.model.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.consumer.matrix.model.IVisitor; +import com.dianping.cat.consumer.matrix.model.entity.Matrix; +import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; +import com.dianping.cat.consumer.matrix.model.entity.Ratio; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(MatrixReport matrixReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(matrixReport, out); + return out.toByteArray(); + } + + public static void build(MatrixReport matrixReport, OutputStream out) { + matrixReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitMatrix(Matrix matrix) { + if (matrix.getType() != null) { + writeTag(1, 1); + writeString(matrix.getType()); + } + + if (matrix.getName() != null) { + writeTag(2, 1); + writeString(matrix.getName()); + } + + writeTag(3, 0); + writeInt(matrix.getCount()); + + writeTag(4, 0); + writeLong(matrix.getTotalTime()); + + if (matrix.getUrl() != null) { + writeTag(5, 1); + writeString(matrix.getUrl()); + } + + if (!matrix.getRatios().isEmpty()) { + writeTag(33, 2); + writeInt(matrix.getRatios().size()); + + for (Ratio ratio : matrix.getRatios().values()) { + ratio.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitMatrixReport(MatrixReport matrixReport) { + writeTag(63, 0); + + if (matrixReport.getDomain() != null) { + writeTag(1, 1); + writeString(matrixReport.getDomain()); + } + + if (matrixReport.getStartTime() != null) { + writeTag(2, 1); + writeDate(matrixReport.getStartTime()); + } + + if (matrixReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(matrixReport.getEndTime()); + } + + if (matrixReport.getDomainNames() != null) { + writeTag(4, 2); + writeInt(matrixReport.getDomainNames().size()); + + for (String domain : matrixReport.getDomainNames()) { + writeString(domain); + } + } + + if (!matrixReport.getMatrixs().isEmpty()) { + writeTag(33, 2); + writeInt(matrixReport.getMatrixs().size()); + + for (Matrix matrix : matrixReport.getMatrixs().values()) { + matrix.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitRatio(Ratio ratio) { + if (ratio.getType() != null) { + writeTag(1, 1); + writeString(ratio.getType()); + } + + writeTag(2, 0); + writeInt(ratio.getMin()); + + writeTag(3, 0); + writeInt(ratio.getMax()); + + writeTag(4, 0); + writeInt(ratio.getTotalCount()); + + writeTag(5, 0); + writeLong(ratio.getTotalTime()); + + if (ratio.getUrl() != null) { + writeTag(6, 1); + writeString(ratio.getUrl()); + } + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeLong(long value) { + try { + writeVarint(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultNativeParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..00ceab1763 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultNativeParser.java @@ -0,0 +1,227 @@ +package com.dianping.cat.consumer.matrix.model.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.consumer.matrix.model.IVisitor; +import com.dianping.cat.consumer.matrix.model.entity.Matrix; +import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; +import com.dianping.cat.consumer.matrix.model.entity.Ratio; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static MatrixReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static MatrixReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + MatrixReport matrixReport = new MatrixReport(); + + try { + matrixReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return matrixReport; + } + + @Override + public void visitMatrix(Matrix matrix) { + byte tag; + + while ((tag = readTag()) != -1) { + visitMatrixChildren(matrix, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitMatrixChildren(Matrix matrix, int _field, int _type) { + switch (_field) { + case 1: + matrix.setType(readString()); + break; + case 2: + matrix.setName(readString()); + break; + case 3: + matrix.setCount(readInt()); + break; + case 4: + matrix.setTotalTime(readLong()); + break; + case 5: + matrix.setUrl(readString()); + break; + case 33: + if (_type == 1) { + Ratio ratio = new Ratio(); + + visitRatio(ratio); + m_linker.onRatio(matrix, ratio); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Ratio ratio = new Ratio(); + + visitRatio(ratio); + m_linker.onRatio(matrix, ratio); + } + } + break; + } + } + + @Override + public void visitMatrixReport(MatrixReport matrixReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitMatrixReportChildren(matrixReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitMatrixReportChildren(MatrixReport matrixReport, int _field, int _type) { + switch (_field) { + case 1: + matrixReport.setDomain(readString()); + break; + case 2: + matrixReport.setStartTime(readDate()); + break; + case 3: + matrixReport.setEndTime(readDate()); + break; + case 4: + if (_type == 1) { + matrixReport.addDomain(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + matrixReport.addDomain(readString()); + } + } + break; + case 33: + if (_type == 1) { + Matrix matrix = new Matrix(); + + visitMatrix(matrix); + m_linker.onMatrix(matrixReport, matrix); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Matrix matrix = new Matrix(); + + visitMatrix(matrix); + m_linker.onMatrix(matrixReport, matrix); + } + } + break; + } + } + + @Override + public void visitRatio(Ratio ratio) { + byte tag; + + while ((tag = readTag()) != -1) { + visitRatioChildren(ratio, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitRatioChildren(Ratio ratio, int _field, int _type) { + switch (_field) { + case 1: + ratio.setType(readString()); + break; + case 2: + ratio.setMin(readInt()); + break; + case 3: + ratio.setMax(readInt()); + break; + case 4: + ratio.setTotalCount(readInt()); + break; + case 5: + ratio.setTotalTime(readLong()); + break; + case 6: + ratio.setUrl(readString()); + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private long readLong() { + try { + return readVarint(64); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultSaxMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..3c536161b4 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultSaxMaker.java @@ -0,0 +1,145 @@ +package com.dianping.cat.consumer.matrix.model.transform; + +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_COUNT; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_MAX; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_MIN; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_TOTALCOUNT; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_TOTALTIME; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_TYPE; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_URL; + +import org.xml.sax.Attributes; + +import com.dianping.cat.consumer.matrix.model.entity.Matrix; +import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; +import com.dianping.cat.consumer.matrix.model.entity.Ratio; + +public class DefaultSaxMaker implements IMaker { + + @Override + public String buildDomain(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Matrix buildMatrix(Attributes attributes) { + String type = attributes.getValue(ATTR_TYPE); + String name = attributes.getValue(ATTR_NAME); + String count = attributes.getValue(ATTR_COUNT); + String totalTime = attributes.getValue(ATTR_TOTALTIME); + String url = attributes.getValue(ATTR_URL); + Matrix matrix = new Matrix(name); + + if (type != null) { + matrix.setType(type); + } + + if (count != null) { + matrix.setCount(convert(Integer.class, count, 0)); + } + + if (totalTime != null) { + matrix.setTotalTime(convert(Long.class, totalTime, 0L)); + } + + if (url != null) { + matrix.setUrl(url); + } + + return matrix; + } + + @Override + public MatrixReport buildMatrixReport(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String startTime = attributes.getValue(ATTR_STARTTIME); + String endTime = attributes.getValue(ATTR_ENDTIME); + MatrixReport matrixReport = new MatrixReport(domain); + + if (startTime != null) { + matrixReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + matrixReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return matrixReport; + } + + @Override + public Ratio buildRatio(Attributes attributes) { + String type = attributes.getValue(ATTR_TYPE); + String min = attributes.getValue(ATTR_MIN); + String max = attributes.getValue(ATTR_MAX); + String totalCount = attributes.getValue(ATTR_TOTALCOUNT); + String totalTime = attributes.getValue(ATTR_TOTALTIME); + String url = attributes.getValue(ATTR_URL); + Ratio ratio = new Ratio(type); + + if (min != null) { + ratio.setMin(convert(Integer.class, min, 0)); + } + + if (max != null) { + ratio.setMax(convert(Integer.class, max, 0)); + } + + if (totalCount != null) { + ratio.setTotalCount(convert(Integer.class, totalCount, 0)); + } + + if (totalTime != null) { + ratio.setTotalTime(convert(Long.class, totalTime, 0L)); + } + + if (url != null) { + ratio.setUrl(url); + } + + return ratio; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultSaxParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..05af4f41e1 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultSaxParser.java @@ -0,0 +1,270 @@ +package com.dianping.cat.consumer.matrix.model.transform; + +import static com.dianping.cat.consumer.matrix.model.Constants.ELEMENT_DOMAIN; +import static com.dianping.cat.consumer.matrix.model.Constants.ELEMENT_DOMAIN_NAMES; + +import static com.dianping.cat.consumer.matrix.model.Constants.ENTITY_MATRIX; +import static com.dianping.cat.consumer.matrix.model.Constants.ENTITY_MATRIX_REPORT; +import static com.dianping.cat.consumer.matrix.model.Constants.ENTITY_RATIO; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.consumer.matrix.model.IEntity; +import com.dianping.cat.consumer.matrix.model.entity.Matrix; +import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; +import com.dianping.cat.consumer.matrix.model.entity.Ratio; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static MatrixReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(MatrixReport.class, new InputSource(removeBOM(in))); + } + + public static MatrixReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(MatrixReport.class, new InputSource(removeBOM(reader))); + } + + public static MatrixReport parse(String xml) throws SAXException, IOException { + return parseEntity(MatrixReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof MatrixReport) { + MatrixReport matrixReport = (MatrixReport) currentObj; + + if (ELEMENT_DOMAIN.equals(currentTag)) { + matrixReport.addDomain(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForMatrix(Matrix parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_RATIO.equals(qName)) { + Ratio ratio = m_maker.buildRatio(attributes); + + m_linker.onRatio(parentObj, ratio); + m_objs.push(ratio); + } else { + throw new SAXException(String.format("Element(%s) is not expected under matrix!", qName)); + } + + m_tags.push(qName); + } + + private void parseForMatrixReport(MatrixReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_DOMAIN_NAMES.equals(qName) || ELEMENT_DOMAIN.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_MATRIX.equals(qName)) { + Matrix matrix = m_maker.buildMatrix(attributes); + + m_linker.onMatrix(parentObj, matrix); + m_objs.push(matrix); + } else { + throw new SAXException(String.format("Element(%s) is not expected under matrix-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseForRatio(Ratio parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_MATRIX_REPORT.equals(qName)) { + MatrixReport matrixReport = m_maker.buildMatrixReport(attributes); + + m_entity = matrixReport; + m_objs.push(matrixReport); + m_tags.push(qName); + } else if (ENTITY_MATRIX.equals(qName)) { + Matrix matrix = m_maker.buildMatrix(attributes); + + m_entity = matrix; + m_objs.push(matrix); + m_tags.push(qName); + } else if (ENTITY_RATIO.equals(qName)) { + Ratio ratio = m_maker.buildRatio(attributes); + + m_entity = ratio; + m_objs.push(ratio); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof MatrixReport) { + parseForMatrixReport((MatrixReport) parent, tag, qName, attributes); + } else if (parent instanceof Matrix) { + parseForMatrix((Matrix) parent, tag, qName, attributes); + } else if (parent instanceof Ratio) { + parseForRatio((Ratio) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultXmlBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..978044612b --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/DefaultXmlBuilder.java @@ -0,0 +1,295 @@ +package com.dianping.cat.consumer.matrix.model.transform; + +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_COUNT; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_MAX; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_MIN; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_TOTALCOUNT; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_TOTALTIME; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_TYPE; +import static com.dianping.cat.consumer.matrix.model.Constants.ATTR_URL; +import static com.dianping.cat.consumer.matrix.model.Constants.ELEMENT_DOMAIN; +import static com.dianping.cat.consumer.matrix.model.Constants.ENTITY_MATRIX; +import static com.dianping.cat.consumer.matrix.model.Constants.ENTITY_MATRIX_REPORT; +import static com.dianping.cat.consumer.matrix.model.Constants.ENTITY_RATIO; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.consumer.matrix.model.IEntity; +import com.dianping.cat.consumer.matrix.model.IVisitor; +import com.dianping.cat.consumer.matrix.model.entity.Matrix; +import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; +import com.dianping.cat.consumer.matrix.model.entity.Ratio; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + @Override + public void visitMatrix(Matrix matrix) { + startTag(ENTITY_MATRIX, null, ATTR_TYPE, matrix.getType(), ATTR_NAME, matrix.getName(), ATTR_COUNT, matrix.getCount(), ATTR_TOTALTIME, matrix.getTotalTime(), ATTR_URL, matrix.getUrl()); + + if (!matrix.getRatios().isEmpty()) { + for (Ratio ratio : matrix.getRatios().values()) { + ratio.accept(m_visitor); + } + } + + endTag(ENTITY_MATRIX); + } + + @Override + public void visitMatrixReport(MatrixReport matrixReport) { + startTag(ENTITY_MATRIX_REPORT, null, ATTR_DOMAIN, matrixReport.getDomain(), ATTR_STARTTIME, toString(matrixReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_ENDTIME, toString(matrixReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!matrixReport.getDomainNames().isEmpty()) { + for (String domain : matrixReport.getDomainNames()) { + tagWithText(ELEMENT_DOMAIN, domain); + } + } + + if (!matrixReport.getMatrixs().isEmpty()) { + for (Matrix matrix : matrixReport.getMatrixs().values()) { + matrix.accept(m_visitor); + } + } + + endTag(ENTITY_MATRIX_REPORT); + } + + @Override + public void visitRatio(Ratio ratio) { + startTag(ENTITY_RATIO, true, null, ATTR_TYPE, ratio.getType(), ATTR_MIN, ratio.getMin(), ATTR_MAX, ratio.getMax(), ATTR_TOTALCOUNT, ratio.getTotalCount(), ATTR_TOTALTIME, ratio.getTotalTime(), ATTR_URL, ratio.getUrl()); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/ILinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/ILinker.java new file mode 100644 index 0000000000..a065652e71 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.consumer.matrix.model.transform; + +import com.dianping.cat.consumer.matrix.model.entity.Matrix; +import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; +import com.dianping.cat.consumer.matrix.model.entity.Ratio; + +public interface ILinker { + + public boolean onMatrix(MatrixReport parent, Matrix matrix); + + public boolean onRatio(Matrix parent, Ratio ratio); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/IMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/IMaker.java new file mode 100644 index 0000000000..7950c9d8da --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/IMaker.java @@ -0,0 +1,16 @@ +package com.dianping.cat.consumer.matrix.model.transform; + +import com.dianping.cat.consumer.matrix.model.entity.Matrix; +import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; +import com.dianping.cat.consumer.matrix.model.entity.Ratio; + +public interface IMaker { + + public String buildDomain(T node); + + public Matrix buildMatrix(T node); + + public MatrixReport buildMatrixReport(T node); + + public Ratio buildRatio(T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/IParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/IParser.java new file mode 100644 index 0000000000..97c8adfdf5 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/matrix/model/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.consumer.matrix.model.transform; + +import com.dianping.cat.consumer.matrix.model.entity.Matrix; +import com.dianping.cat.consumer.matrix.model.entity.MatrixReport; +import com.dianping.cat.consumer.matrix.model.entity.Ratio; + +public interface IParser { + public MatrixReport parse(IMaker maker, ILinker linker, T node); + + public void parseForMatrix(IMaker maker, ILinker linker, Matrix parent, T node); + + public void parseForRatio(IMaker maker, ILinker linker, Ratio parent, T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/BaseEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/BaseEntity.java new file mode 100644 index 0000000000..f920984290 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.consumer.problem.model; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.consumer.problem.model.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/Constants.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/Constants.java new file mode 100644 index 0000000000..eb65ce04e3 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/Constants.java @@ -0,0 +1,70 @@ +package com.dianping.cat.consumer.problem.model; + +public class Constants { + + public static final String ATTR_COUNT = "count"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_DURATION = "duration"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_FAILS = "fails"; + + public static final String ATTR_GROUP_NAME = "group-name"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_IP = "ip"; + + public static final String ATTR_NAME = "name"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ATTR_STATUS = "status"; + + public static final String ATTR_TYPE = "type"; + + public static final String ATTR_VALUE = "value"; + + public static final String ELEMENT_DOMAIN = "domain"; + + public static final String ELEMENT_DOMAIN_NAMES = "domain-names"; + + public static final String ELEMENT_IP = "ip"; + + public static final String ELEMENT_IPS = "ips"; + + public static final String ELEMENT_MESSAGE = "message"; + + public static final String ELEMENT_MESSAGES = "messages"; + + public static final String ENTITY_DURATION = "duration"; + + public static final String ENTITY_DURATIONS = "durations"; + + public static final String ENTITY_ENTITY = "entity"; + + public static final String ENTITY_ENTITIES = "entities"; + + public static final String ENTITY_ENTRY = "entry"; + + public static final String ENTITY_ENTRIES = "entries"; + + public static final String ENTITY_GRAPH_TREND = "graph-trend"; + + public static final String ENTITY_MACHINE = "machine"; + + public static final String ENTITY_MACHINES = "machines"; + + public static final String ENTITY_PROBLEM_REPORT = "problem-report"; + + public static final String ENTITY_SEGMENT = "segment"; + + public static final String ENTITY_SEGMENTS = "segments"; + + public static final String ENTITY_THREAD = "thread"; + + public static final String ENTITY_THREADS = "threads"; +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/IEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/IEntity.java new file mode 100644 index 0000000000..3086fb30d5 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.consumer.problem.model; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/IVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/IVisitor.java new file mode 100644 index 0000000000..5ea090500a --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/IVisitor.java @@ -0,0 +1,29 @@ +package com.dianping.cat.consumer.problem.model; + +import com.dianping.cat.consumer.problem.model.entity.Duration; +import com.dianping.cat.consumer.problem.model.entity.Entity; +import com.dianping.cat.consumer.problem.model.entity.Entry; +import com.dianping.cat.consumer.problem.model.entity.GraphTrend; +import com.dianping.cat.consumer.problem.model.entity.JavaThread; +import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.problem.model.entity.Segment; + +public interface IVisitor { + + public void visitDuration(Duration duration); + + public void visitEntity(Entity entity); + + public void visitEntry(Entry entry); + + public void visitGraphTrend(GraphTrend graphTrend); + + public void visitMachine(Machine machine); + + public void visitProblemReport(ProblemReport problemReport); + + public void visitSegment(Segment segment); + + public void visitThread(JavaThread thread); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Duration.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Duration.java new file mode 100644 index 0000000000..972df15a62 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Duration.java @@ -0,0 +1,99 @@ +package com.dianping.cat.consumer.problem.model.entity; + +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_VALUE; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_DURATION; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.consumer.problem.model.BaseEntity; +import com.dianping.cat.consumer.problem.model.IVisitor; + +public class Duration extends BaseEntity { + private int m_value; + + private int m_count; + + private List m_messages = new ArrayList(); + + public Duration() { + } + + public Duration(int value) { + m_value = value; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDuration(this); + } + + public Duration addMessage(String message) { + m_messages.add(message); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Duration) { + Duration _o = (Duration) obj; + + if (getValue() != _o.getValue()) { + return false; + } + + return true; + } + + return false; + } + + public int getCount() { + return m_count; + } + + public List getMessages() { + return m_messages; + } + + public int getValue() { + return m_value; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + m_value; + + return hash; + } + + public Duration incCount() { + m_count++; + return this; + } + + public Duration incCount(int count) { + m_count += count; + return this; + } + + @Override + public void mergeAttributes(Duration other) { + assertAttributeEquals(other, ENTITY_DURATION, ATTR_VALUE, m_value, other.getValue()); + + m_count = other.getCount(); + } + + public Duration setCount(int count) { + m_count = count; + return this; + } + + public Duration setValue(int value) { + m_value = value; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Entity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Entity.java new file mode 100644 index 0000000000..eaba08c008 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Entity.java @@ -0,0 +1,178 @@ +package com.dianping.cat.consumer.problem.model.entity; + +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_ENTITY; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.problem.model.BaseEntity; +import com.dianping.cat.consumer.problem.model.IVisitor; + +public class Entity extends BaseEntity { + private String m_id; + + private String m_type; + + private String m_status; + + private Map m_threads = new LinkedHashMap(); + + private Map m_durations = new LinkedHashMap(); + + private GraphTrend m_graphTrend; + + public Entity() { + } + + public Entity(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitEntity(this); + } + + public Entity addDuration(Duration duration) { + m_durations.put(duration.getValue(), duration); + return this; + } + + public Entity addThread(JavaThread thread) { + m_threads.put(thread.getId(), thread); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Entity) { + Entity _o = (Entity) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Duration findDuration(int value) { + return m_durations.get(value); + } + + public JavaThread findThread(String id) { + return m_threads.get(id); + } + + public Duration findOrCreateDuration(int value) { + Duration duration = m_durations.get(value); + + if (duration == null) { + synchronized (m_durations) { + duration = m_durations.get(value); + + if (duration == null) { + duration = new Duration(value); + m_durations.put(value, duration); + } + } + } + + return duration; + } + + public JavaThread findOrCreateThread(String id) { + JavaThread thread = m_threads.get(id); + + if (thread == null) { + synchronized (m_threads) { + thread = m_threads.get(id); + + if (thread == null) { + thread = new JavaThread(id); + m_threads.put(id, thread); + } + } + } + + return thread; + } + + public Map getDurations() { + return m_durations; + } + + public GraphTrend getGraphTrend() { + return m_graphTrend; + } + + public String getId() { + return m_id; + } + + public String getStatus() { + return m_status; + } + + public Map getThreads() { + return m_threads; + } + + public String getType() { + return m_type; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Entity other) { + assertAttributeEquals(other, ENTITY_ENTITY, ATTR_ID, m_id, other.getId()); + + if (other.getType() != null) { + m_type = other.getType(); + } + + if (other.getStatus() != null) { + m_status = other.getStatus(); + } + } + + public Duration removeDuration(int value) { + return m_durations.remove(value); + } + + public JavaThread removeThread(String id) { + return m_threads.remove(id); + } + + public Entity setGraphTrend(GraphTrend graphTrend) { + m_graphTrend = graphTrend; + return this; + } + + public Entity setId(String id) { + m_id = id; + return this; + } + + public Entity setStatus(String status) { + m_status = status; + return this; + } + + public Entity setType(String type) { + m_type = type; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Entry.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Entry.java new file mode 100644 index 0000000000..d9521b8a57 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Entry.java @@ -0,0 +1,163 @@ +package com.dianping.cat.consumer.problem.model.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.problem.model.BaseEntity; +import com.dianping.cat.consumer.problem.model.IVisitor; + +public class Entry extends BaseEntity { + private String m_type; + + private String m_status; + + private Map m_durations = new LinkedHashMap(); + + private Map m_threads = new LinkedHashMap(); + + public Entry() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitEntry(this); + } + + public Entry addDuration(Duration duration) { + m_durations.put(duration.getValue(), duration); + return this; + } + + public Entry addThread(JavaThread thread) { + m_threads.put(thread.getId(), thread); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Entry) { + Entry _o = (Entry) obj; + + if (!equals(getType(), _o.getType())) { + return false; + } + + if (!equals(getStatus(), _o.getStatus())) { + return false; + } + + if (!equals(getDurations(), _o.getDurations())) { + return false; + } + + if (!equals(getThreads(), _o.getThreads())) { + return false; + } + + + return true; + } + + return false; + } + + public Duration findDuration(int value) { + return m_durations.get(value); + } + + public JavaThread findThread(String id) { + return m_threads.get(id); + } + + public Duration findOrCreateDuration(int value) { + Duration duration = m_durations.get(value); + + if (duration == null) { + synchronized (m_durations) { + duration = m_durations.get(value); + + if (duration == null) { + duration = new Duration(value); + m_durations.put(value, duration); + } + } + } + + return duration; + } + + public JavaThread findOrCreateThread(String id) { + JavaThread thread = m_threads.get(id); + + if (thread == null) { + synchronized (m_threads) { + thread = m_threads.get(id); + + if (thread == null) { + thread = new JavaThread(id); + m_threads.put(id, thread); + } + } + } + + return thread; + } + + public Map getDurations() { + return m_durations; + } + + public String getStatus() { + return m_status; + } + + public Map getThreads() { + return m_threads; + } + + public String getType() { + return m_type; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_type == null ? 0 : m_type.hashCode()); + hash = hash * 31 + (m_status == null ? 0 : m_status.hashCode()); + hash = hash * 31 + (m_durations == null ? 0 : m_durations.hashCode()); + hash = hash * 31 + (m_threads == null ? 0 : m_threads.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Entry other) { + if (other.getType() != null) { + m_type = other.getType(); + } + + if (other.getStatus() != null) { + m_status = other.getStatus(); + } + } + + public Duration removeDuration(int value) { + return m_durations.remove(value); + } + + public JavaThread removeThread(String id) { + return m_threads.remove(id); + } + + public Entry setStatus(String status) { + m_status = status; + return this; + } + + public Entry setType(String type) { + m_type = type; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/GraphTrend.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/GraphTrend.java new file mode 100644 index 0000000000..dcd6de047d --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/GraphTrend.java @@ -0,0 +1,75 @@ +package com.dianping.cat.consumer.problem.model.entity; + +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_DURATION; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_GRAPH_TREND; + +import com.dianping.cat.consumer.problem.model.BaseEntity; +import com.dianping.cat.consumer.problem.model.IVisitor; + +public class GraphTrend extends BaseEntity { + private int m_duration; + + private String m_fails; + + public GraphTrend() { + } + + public GraphTrend(int duration) { + m_duration = duration; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitGraphTrend(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof GraphTrend) { + GraphTrend _o = (GraphTrend) obj; + + if (getDuration() != _o.getDuration()) { + return false; + } + + return true; + } + + return false; + } + + public int getDuration() { + return m_duration; + } + + public String getFails() { + return m_fails; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + m_duration; + + return hash; + } + + @Override + public void mergeAttributes(GraphTrend other) { + assertAttributeEquals(other, ENTITY_GRAPH_TREND, ATTR_DURATION, m_duration, other.getDuration()); + + m_fails = other.getFails(); + } + + public GraphTrend setDuration(int duration) { + m_duration = duration; + return this; + } + + public GraphTrend setFails(String fails) { + m_fails = fails; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/JavaThread.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/JavaThread.java new file mode 100644 index 0000000000..02b13e7a3e --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/JavaThread.java @@ -0,0 +1,131 @@ +package com.dianping.cat.consumer.problem.model.entity; + +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_THREAD; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.problem.model.BaseEntity; +import com.dianping.cat.consumer.problem.model.IVisitor; + +public class JavaThread extends BaseEntity { + private String m_groupName; + + private String m_name; + + private String m_id; + + private Map m_segments = new LinkedHashMap(); + + public JavaThread() { + } + + public JavaThread(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitThread(this); + } + + public JavaThread addSegment(Segment segment) { + m_segments.put(segment.getId(), segment); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof JavaThread) { + JavaThread _o = (JavaThread) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Segment findSegment(Integer id) { + return m_segments.get(id); + } + + public Segment findOrCreateSegment(Integer id) { + Segment segment = m_segments.get(id); + + if (segment == null) { + synchronized (m_segments) { + segment = m_segments.get(id); + + if (segment == null) { + segment = new Segment(id); + m_segments.put(id, segment); + } + } + } + + return segment; + } + + public String getGroupName() { + return m_groupName; + } + + public String getId() { + return m_id; + } + + public String getName() { + return m_name; + } + + public Map getSegments() { + return m_segments; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(JavaThread other) { + assertAttributeEquals(other, ENTITY_THREAD, ATTR_ID, m_id, other.getId()); + + if (other.getGroupName() != null) { + m_groupName = other.getGroupName(); + } + + if (other.getName() != null) { + m_name = other.getName(); + } + } + + public Segment removeSegment(Integer id) { + return m_segments.remove(id); + } + + public JavaThread setGroupName(String groupName) { + m_groupName = groupName; + return this; + } + + public JavaThread setId(String id) { + m_id = id; + return this; + } + + public JavaThread setName(String name) { + m_name = name; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Machine.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Machine.java new file mode 100644 index 0000000000..87e7853099 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Machine.java @@ -0,0 +1,115 @@ +package com.dianping.cat.consumer.problem.model.entity; + +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_MACHINE; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import com.dianping.cat.consumer.problem.model.BaseEntity; +import com.dianping.cat.consumer.problem.model.IVisitor; + +public class Machine extends BaseEntity { + private String m_ip; + + private List m_entries = new ArrayList(); + + private Map m_entities = new LinkedHashMap(); + + public Machine() { + } + + public Machine(String ip) { + m_ip = ip; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMachine(this); + } + + public Machine addEntity(Entity entity) { + m_entities.put(entity.getId(), entity); + return this; + } + + public Machine addEntry(Entry entry) { + m_entries.add(entry); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Machine) { + Machine _o = (Machine) obj; + + if (!equals(getIp(), _o.getIp())) { + return false; + } + + return true; + } + + return false; + } + + public Entity findEntity(String id) { + return m_entities.get(id); + } + + public Entity findOrCreateEntity(String id) { + Entity entity = m_entities.get(id); + + if (entity == null) { + synchronized (m_entities) { + entity = m_entities.get(id); + + if (entity == null) { + entity = new Entity(id); + m_entities.put(id, entity); + } + } + } + + return entity; + } + + public Map getEntities() { + return m_entities; + } + + public List getEntries() { + return m_entries; + } + + public String getIp() { + return m_ip; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_ip == null ? 0 : m_ip.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Machine other) { + assertAttributeEquals(other, ENTITY_MACHINE, ATTR_IP, m_ip, other.getIp()); + + } + + public Entity removeEntity(String id) { + return m_entities.remove(id); + } + + public Machine setIp(String ip) { + m_ip = ip; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/ProblemReport.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/ProblemReport.java new file mode 100644 index 0000000000..f6f00fee8d --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/ProblemReport.java @@ -0,0 +1,155 @@ +package com.dianping.cat.consumer.problem.model.entity; + +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_PROBLEM_REPORT; + +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +import com.dianping.cat.consumer.problem.model.BaseEntity; +import com.dianping.cat.consumer.problem.model.IVisitor; + +public class ProblemReport extends BaseEntity { + private String m_domain; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Map m_machines = new LinkedHashMap(); + + private Set m_domainNames = new LinkedHashSet(); + + private Set m_ips = new LinkedHashSet(); + + public ProblemReport() { + } + + public ProblemReport(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitProblemReport(this); + } + + public ProblemReport addDomain(String domain) { + m_domainNames.add(domain); + return this; + } + + public ProblemReport addIp(String ip) { + m_ips.add(ip); + return this; + } + + public ProblemReport addMachine(Machine machine) { + m_machines.put(machine.getIp(), machine); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ProblemReport) { + ProblemReport _o = (ProblemReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public Machine findMachine(String ip) { + return m_machines.get(ip); + } + + public Machine findOrCreateMachine(String ip) { + Machine machine = m_machines.get(ip); + + if (machine == null) { + synchronized (m_machines) { + machine = m_machines.get(ip); + + if (machine == null) { + machine = new Machine(ip); + m_machines.put(ip, machine); + } + } + } + + return machine; + } + + public String getDomain() { + return m_domain; + } + + public Set getDomainNames() { + return m_domainNames; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public Set getIps() { + return m_ips; + } + + public Map getMachines() { + return m_machines; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ProblemReport other) { + assertAttributeEquals(other, ENTITY_PROBLEM_REPORT, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Machine removeMachine(String ip) { + return m_machines.remove(ip); + } + + public ProblemReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public ProblemReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public ProblemReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Segment.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Segment.java new file mode 100644 index 0000000000..b4f625116f --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/entity/Segment.java @@ -0,0 +1,99 @@ +package com.dianping.cat.consumer.problem.model.entity; + +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_SEGMENT; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.consumer.problem.model.BaseEntity; +import com.dianping.cat.consumer.problem.model.IVisitor; + +public class Segment extends BaseEntity { + private Integer m_id; + + private int m_count; + + private List m_messages = new ArrayList(); + + public Segment() { + } + + public Segment(Integer id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitSegment(this); + } + + public Segment addMessage(String message) { + m_messages.add(message); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Segment) { + Segment _o = (Segment) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public int getCount() { + return m_count; + } + + public Integer getId() { + return m_id; + } + + public List getMessages() { + return m_messages; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public Segment incCount() { + m_count++; + return this; + } + + public Segment incCount(int count) { + m_count += count; + return this; + } + + @Override + public void mergeAttributes(Segment other) { + assertAttributeEquals(other, ENTITY_SEGMENT, ATTR_ID, m_id, other.getId()); + + m_count = other.getCount(); + } + + public Segment setCount(int count) { + m_count = count; + return this; + } + + public Segment setId(Integer id) { + m_id = id; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/BaseVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/BaseVisitor.java new file mode 100644 index 0000000000..df5b3cb799 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/BaseVisitor.java @@ -0,0 +1,76 @@ +package com.dianping.cat.consumer.problem.model.transform; + +import com.dianping.cat.consumer.problem.model.IVisitor; +import com.dianping.cat.consumer.problem.model.entity.Duration; +import com.dianping.cat.consumer.problem.model.entity.Entity; +import com.dianping.cat.consumer.problem.model.entity.Entry; +import com.dianping.cat.consumer.problem.model.entity.GraphTrend; +import com.dianping.cat.consumer.problem.model.entity.JavaThread; +import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.problem.model.entity.Segment; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitDuration(Duration duration) { + } + + @Override + public void visitEntity(Entity entity) { + for (JavaThread thread : entity.getThreads().values()) { + visitThread(thread); + } + + for (Duration duration : entity.getDurations().values()) { + visitDuration(duration); + } + + if (entity.getGraphTrend() != null) { + visitGraphTrend(entity.getGraphTrend()); + } + } + + @Override + public void visitEntry(Entry entry) { + for (Duration duration : entry.getDurations().values()) { + visitDuration(duration); + } + + for (JavaThread thread : entry.getThreads().values()) { + visitThread(thread); + } + } + + @Override + public void visitGraphTrend(GraphTrend graphTrend) { + } + + @Override + public void visitMachine(Machine machine) { + for (Entry entry : machine.getEntries()) { + visitEntry(entry); + } + + for (Entity entity : machine.getEntities().values()) { + visitEntity(entity); + } + } + + @Override + public void visitProblemReport(ProblemReport problemReport) { + for (Machine machine : problemReport.getMachines().values()) { + visitMachine(machine); + } + } + + @Override + public void visitSegment(Segment segment) { + } + + @Override + public void visitThread(JavaThread thread) { + for (Segment segment : thread.getSegments().values()) { + visitSegment(segment); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultLinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultLinker.java new file mode 100644 index 0000000000..1987dcac9a --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultLinker.java @@ -0,0 +1,152 @@ +package com.dianping.cat.consumer.problem.model.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.consumer.problem.model.entity.Duration; +import com.dianping.cat.consumer.problem.model.entity.Entity; +import com.dianping.cat.consumer.problem.model.entity.Entry; +import com.dianping.cat.consumer.problem.model.entity.GraphTrend; +import com.dianping.cat.consumer.problem.model.entity.JavaThread; +import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.problem.model.entity.Segment; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDuration(final Entry parent, final Duration duration) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDuration(duration); + } + }); + } else { + parent.addDuration(duration); + } + + return true; + } + + @Override + public boolean onDuration(final Entity parent, final Duration duration) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDuration(duration); + } + }); + } else { + parent.addDuration(duration); + } + + return true; + } + + @Override + public boolean onEntity(final Machine parent, final Entity entity) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addEntity(entity); + } + }); + } else { + parent.addEntity(entity); + } + + return true; + } + + @Override + public boolean onEntry(final Machine parent, final Entry entry) { + parent.addEntry(entry); + return true; + } + + @Override + public boolean onGraphTrend(final Entity parent, final GraphTrend graphTrend) { + parent.setGraphTrend(graphTrend); + return true; + } + + @Override + public boolean onMachine(final ProblemReport parent, final Machine machine) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addMachine(machine); + } + }); + } else { + parent.addMachine(machine); + } + + return true; + } + + @Override + public boolean onSegment(final JavaThread parent, final Segment segment) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addSegment(segment); + } + }); + } else { + parent.addSegment(segment); + } + + return true; + } + + @Override + public boolean onThread(final Entry parent, final JavaThread thread) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addThread(thread); + } + }); + } else { + parent.addThread(thread); + } + + return true; + } + + @Override + public boolean onThread(final Entity parent, final JavaThread thread) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addThread(thread); + } + }); + } else { + parent.addThread(thread); + } + + return true; + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultMerger.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultMerger.java new file mode 100644 index 0000000000..b37b24991a --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultMerger.java @@ -0,0 +1,281 @@ +package com.dianping.cat.consumer.problem.model.transform; + +import java.util.Stack; + +import com.dianping.cat.consumer.problem.model.IEntity; +import com.dianping.cat.consumer.problem.model.IVisitor; +import com.dianping.cat.consumer.problem.model.entity.Duration; +import com.dianping.cat.consumer.problem.model.entity.Entity; +import com.dianping.cat.consumer.problem.model.entity.Entry; +import com.dianping.cat.consumer.problem.model.entity.GraphTrend; +import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.problem.model.entity.Segment; +import com.dianping.cat.consumer.problem.model.entity.JavaThread; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private ProblemReport m_problemReport; + + public DefaultMerger() { + } + + public DefaultMerger(ProblemReport problemReport) { + m_problemReport = problemReport; + m_objs.push(problemReport); + } + + public ProblemReport getProblemReport() { + return m_problemReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeDuration(Duration to, Duration from) { + to.mergeAttributes(from); + to.getMessages().addAll(from.getMessages()); + } + + protected void mergeEntity(Entity to, Entity from) { + to.mergeAttributes(from); + } + + protected void mergeEntry(Entry to, Entry from) { + to.mergeAttributes(from); + } + + protected void mergeGraphTrend(GraphTrend to, GraphTrend from) { + to.mergeAttributes(from); + } + + protected void mergeMachine(Machine to, Machine from) { + to.mergeAttributes(from); + } + + protected void mergeProblemReport(ProblemReport to, ProblemReport from) { + to.mergeAttributes(from); + to.getDomainNames().addAll(from.getDomainNames()); + to.getIps().addAll(from.getIps()); + } + + protected void mergeSegment(Segment to, Segment from) { + to.mergeAttributes(from); + to.getMessages().addAll(from.getMessages()); + } + + protected void mergeThread(JavaThread to, JavaThread from) { + to.mergeAttributes(from); + } + + @Override + public void visitDuration(Duration from) { + Duration to = (Duration) m_objs.peek(); + + mergeDuration(to, from); + visitDurationChildren(to, from); + } + + protected void visitDurationChildren(Duration to, Duration from) { + } + + @Override + public void visitEntity(Entity from) { + Entity to = (Entity) m_objs.peek(); + + mergeEntity(to, from); + visitEntityChildren(to, from); + } + + protected void visitEntityChildren(Entity to, Entity from) { + for (JavaThread source : from.getThreads().values()) { + JavaThread target = to.findThread(source.getId()); + + if (target == null) { + target = new JavaThread(source.getId()); + to.addThread(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Duration source : from.getDurations().values()) { + Duration target = to.findDuration(source.getValue()); + + if (target == null) { + target = new Duration(source.getValue()); + to.addDuration(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + if (from.getGraphTrend() != null) { + GraphTrend target = to.getGraphTrend(); + + if (target == null) { + GraphTrend source = from.getGraphTrend(); + + target = new GraphTrend(source.getDuration()); + to.setGraphTrend(target); + } + + m_objs.push(target); + from.getGraphTrend().accept(this); + m_objs.pop(); + } + } + + @Override + public void visitEntry(Entry from) { + Entry to = (Entry) m_objs.peek(); + + mergeEntry(to, from); + visitEntryChildren(to, from); + } + + protected void visitEntryChildren(Entry to, Entry from) { + for (Duration source : from.getDurations().values()) { + Duration target = to.findDuration(source.getValue()); + + if (target == null) { + target = new Duration(source.getValue()); + to.addDuration(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (JavaThread source : from.getThreads().values()) { + JavaThread target = to.findThread(source.getId()); + + if (target == null) { + target = new JavaThread(source.getId()); + to.addThread(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitGraphTrend(GraphTrend from) { + GraphTrend to = (GraphTrend) m_objs.peek(); + + mergeGraphTrend(to, from); + visitGraphTrendChildren(to, from); + } + + protected void visitGraphTrendChildren(GraphTrend to, GraphTrend from) { + } + + @Override + public void visitMachine(Machine from) { + Machine to = (Machine) m_objs.peek(); + + mergeMachine(to, from); + visitMachineChildren(to, from); + } + + protected void visitMachineChildren(Machine to, Machine from) { + for (Entry source : from.getEntries()) { + Entry target = null; + + if (target == null) { + target = new Entry(); + to.addEntry(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Entity source : from.getEntities().values()) { + Entity target = to.findEntity(source.getId()); + + if (target == null) { + target = new Entity(source.getId()); + to.addEntity(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitProblemReport(ProblemReport from) { + ProblemReport to = (ProblemReport) m_objs.peek(); + + mergeProblemReport(to, from); + visitProblemReportChildren(to, from); + } + + protected void visitProblemReportChildren(ProblemReport to, ProblemReport from) { + for (Machine source : from.getMachines().values()) { + Machine target = to.findMachine(source.getIp()); + + if (target == null) { + target = new Machine(source.getIp()); + to.addMachine(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitSegment(Segment from) { + Segment to = (Segment) m_objs.peek(); + + mergeSegment(to, from); + visitSegmentChildren(to, from); + } + + protected void visitSegmentChildren(Segment to, Segment from) { + } + + @Override + public void visitThread(JavaThread from) { + JavaThread to = (JavaThread) m_objs.peek(); + + mergeThread(to, from); + visitThreadChildren(to, from); + } + + protected void visitThreadChildren(JavaThread to, JavaThread from) { + for (Segment source : from.getSegments().values()) { + Segment target = to.findSegment(source.getId()); + + if (target == null) { + target = new Segment(source.getId()); + to.addSegment(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultNativeBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..de7f6f0706 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultNativeBuilder.java @@ -0,0 +1,322 @@ +package com.dianping.cat.consumer.problem.model.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.consumer.problem.model.IVisitor; +import com.dianping.cat.consumer.problem.model.entity.Duration; +import com.dianping.cat.consumer.problem.model.entity.Entity; +import com.dianping.cat.consumer.problem.model.entity.Entry; +import com.dianping.cat.consumer.problem.model.entity.GraphTrend; +import com.dianping.cat.consumer.problem.model.entity.JavaThread; +import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.problem.model.entity.Segment; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(ProblemReport problemReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(problemReport, out); + return out.toByteArray(); + } + + public static void build(ProblemReport problemReport, OutputStream out) { + problemReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitDuration(Duration duration) { + writeTag(1, 0); + writeInt(duration.getValue()); + + writeTag(2, 0); + writeInt(duration.getCount()); + + if (duration.getMessages() != null) { + writeTag(3, 2); + writeInt(duration.getMessages().size()); + + for (String message : duration.getMessages()) { + writeString(message); + } + } + + writeTag(63, 3); + } + + @Override + public void visitEntity(Entity entity) { + if (entity.getId() != null) { + writeTag(1, 1); + writeString(entity.getId()); + } + + if (entity.getType() != null) { + writeTag(2, 1); + writeString(entity.getType()); + } + + if (entity.getStatus() != null) { + writeTag(3, 1); + writeString(entity.getStatus()); + } + + if (!entity.getThreads().isEmpty()) { + writeTag(33, 2); + writeInt(entity.getThreads().size()); + + for (JavaThread thread : entity.getThreads().values()) { + thread.accept(m_visitor); + } + } + + if (!entity.getDurations().isEmpty()) { + writeTag(34, 2); + writeInt(entity.getDurations().size()); + + for (Duration duration : entity.getDurations().values()) { + duration.accept(m_visitor); + } + } + + if (entity.getGraphTrend() != null) { + writeTag(35, 1); + entity.getGraphTrend().accept(m_visitor); + } + + writeTag(63, 3); + } + + @Override + public void visitEntry(Entry entry) { + if (entry.getType() != null) { + writeTag(1, 1); + writeString(entry.getType()); + } + + if (entry.getStatus() != null) { + writeTag(2, 1); + writeString(entry.getStatus()); + } + + if (!entry.getDurations().isEmpty()) { + writeTag(33, 2); + writeInt(entry.getDurations().size()); + + for (Duration duration : entry.getDurations().values()) { + duration.accept(m_visitor); + } + } + + if (!entry.getThreads().isEmpty()) { + writeTag(34, 2); + writeInt(entry.getThreads().size()); + + for (JavaThread thread : entry.getThreads().values()) { + thread.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitGraphTrend(GraphTrend graphTrend) { + writeTag(1, 0); + writeInt(graphTrend.getDuration()); + + writeTag(2, 0); + writeString(graphTrend.getFails()); + + writeTag(63, 3); + } + + @Override + public void visitMachine(Machine machine) { + if (machine.getIp() != null) { + writeTag(1, 1); + writeString(machine.getIp()); + } + + if (!machine.getEntries().isEmpty()) { + writeTag(33, 2); + writeInt(machine.getEntries().size()); + + for (Entry entry : machine.getEntries()) { + entry.accept(m_visitor); + } + } + + if (!machine.getEntities().isEmpty()) { + writeTag(34, 2); + writeInt(machine.getEntities().size()); + + for (Entity entity : machine.getEntities().values()) { + entity.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitProblemReport(ProblemReport problemReport) { + writeTag(63, 0); + + if (problemReport.getDomain() != null) { + writeTag(1, 1); + writeString(problemReport.getDomain()); + } + + if (problemReport.getStartTime() != null) { + writeTag(2, 1); + writeDate(problemReport.getStartTime()); + } + + if (problemReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(problemReport.getEndTime()); + } + + if (problemReport.getDomainNames() != null) { + writeTag(4, 2); + writeInt(problemReport.getDomainNames().size()); + + for (String domain : problemReport.getDomainNames()) { + writeString(domain); + } + } + + if (problemReport.getIps() != null) { + writeTag(5, 2); + writeInt(problemReport.getIps().size()); + + for (String ip : problemReport.getIps()) { + writeString(ip); + } + } + + if (!problemReport.getMachines().isEmpty()) { + writeTag(33, 2); + writeInt(problemReport.getMachines().size()); + + for (Machine machine : problemReport.getMachines().values()) { + machine.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitSegment(Segment segment) { + if (segment.getId() != null) { + writeTag(1, 1); + writeInt(segment.getId()); + } + + writeTag(2, 0); + writeInt(segment.getCount()); + + if (segment.getMessages() != null) { + writeTag(3, 2); + writeInt(segment.getMessages().size()); + + for (String message : segment.getMessages()) { + writeString(message); + } + } + + writeTag(63, 3); + } + + @Override + public void visitThread(JavaThread thread) { + if (thread.getGroupName() != null) { + writeTag(1, 1); + writeString(thread.getGroupName()); + } + + if (thread.getName() != null) { + writeTag(2, 1); + writeString(thread.getName()); + } + + if (thread.getId() != null) { + writeTag(3, 1); + writeString(thread.getId()); + } + + if (!thread.getSegments().isEmpty()) { + writeTag(33, 2); + writeInt(thread.getSegments().size()); + + for (Segment segment : thread.getSegments().values()) { + segment.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultNativeParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..fa82064593 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultNativeParser.java @@ -0,0 +1,429 @@ +package com.dianping.cat.consumer.problem.model.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.consumer.problem.model.IVisitor; +import com.dianping.cat.consumer.problem.model.entity.Duration; +import com.dianping.cat.consumer.problem.model.entity.Entity; +import com.dianping.cat.consumer.problem.model.entity.Entry; +import com.dianping.cat.consumer.problem.model.entity.GraphTrend; +import com.dianping.cat.consumer.problem.model.entity.JavaThread; +import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.problem.model.entity.Segment; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static ProblemReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static ProblemReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + ProblemReport problemReport = new ProblemReport(); + + try { + problemReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return problemReport; + } + + @Override + public void visitDuration(Duration duration) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDurationChildren(duration, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDurationChildren(Duration duration, int _field, int _type) { + switch (_field) { + case 1: + duration.setValue(readInt()); + break; + case 2: + duration.setCount(readInt()); + break; + case 3: + if (_type == 1) { + duration.addMessage(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + duration.addMessage(readString()); + } + } + break; + } + } + + @Override + public void visitEntity(Entity entity) { + byte tag; + + while ((tag = readTag()) != -1) { + visitEntityChildren(entity, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitEntityChildren(Entity entity, int _field, int _type) { + switch (_field) { + case 1: + entity.setId(readString()); + break; + case 2: + entity.setType(readString()); + break; + case 3: + entity.setStatus(readString()); + break; + case 33: + if (_type == 1) { + JavaThread thread = new JavaThread(); + + visitThread(thread); + m_linker.onThread(entity, thread); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + JavaThread thread = new JavaThread(); + + visitThread(thread); + m_linker.onThread(entity, thread); + } + } + break; + case 34: + if (_type == 1) { + Duration duration = new Duration(); + + visitDuration(duration); + m_linker.onDuration(entity, duration); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Duration duration = new Duration(); + + visitDuration(duration); + m_linker.onDuration(entity, duration); + } + } + break; + case 35: + GraphTrend graphTrend = new GraphTrend(); + + visitGraphTrend(graphTrend); + m_linker.onGraphTrend(entity, graphTrend); + break; + } + } + + @Override + public void visitEntry(Entry entry) { + byte tag; + + while ((tag = readTag()) != -1) { + visitEntryChildren(entry, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitEntryChildren(Entry entry, int _field, int _type) { + switch (_field) { + case 1: + entry.setType(readString()); + break; + case 2: + entry.setStatus(readString()); + break; + case 33: + if (_type == 1) { + Duration duration = new Duration(); + + visitDuration(duration); + m_linker.onDuration(entry, duration); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Duration duration = new Duration(); + + visitDuration(duration); + m_linker.onDuration(entry, duration); + } + } + break; + case 34: + if (_type == 1) { + JavaThread thread = new JavaThread(); + + visitThread(thread); + m_linker.onThread(entry, thread); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + JavaThread thread = new JavaThread(); + + visitThread(thread); + m_linker.onThread(entry, thread); + } + } + break; + } + } + + @Override + public void visitGraphTrend(GraphTrend graphTrend) { + byte tag; + + while ((tag = readTag()) != -1) { + visitGraphTrendChildren(graphTrend, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitGraphTrendChildren(GraphTrend graphTrend, int _field, int _type) { + switch (_field) { + case 1: + graphTrend.setDuration(readInt()); + break; + case 2: + graphTrend.setFails(readString()); + break; + } + } + + @Override + public void visitMachine(Machine machine) { + byte tag; + + while ((tag = readTag()) != -1) { + visitMachineChildren(machine, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitMachineChildren(Machine machine, int _field, int _type) { + switch (_field) { + case 1: + machine.setIp(readString()); + break; + case 33: + if (_type == 1) { + Entry entry = new Entry(); + + visitEntry(entry); + m_linker.onEntry(machine, entry); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Entry entry = new Entry(); + + visitEntry(entry); + m_linker.onEntry(machine, entry); + } + } + break; + case 34: + if (_type == 1) { + Entity entity = new Entity(); + + visitEntity(entity); + m_linker.onEntity(machine, entity); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Entity entity = new Entity(); + + visitEntity(entity); + m_linker.onEntity(machine, entity); + } + } + break; + } + } + + @Override + public void visitProblemReport(ProblemReport problemReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitProblemReportChildren(problemReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitProblemReportChildren(ProblemReport problemReport, int _field, int _type) { + switch (_field) { + case 1: + problemReport.setDomain(readString()); + break; + case 2: + problemReport.setStartTime(readDate()); + break; + case 3: + problemReport.setEndTime(readDate()); + break; + case 4: + if (_type == 1) { + problemReport.addDomain(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + problemReport.addDomain(readString()); + } + } + break; + case 5: + if (_type == 1) { + problemReport.addIp(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + problemReport.addIp(readString()); + } + } + break; + case 33: + if (_type == 1) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(problemReport, machine); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(problemReport, machine); + } + } + break; + } + } + + @Override + public void visitSegment(Segment segment) { + byte tag; + + while ((tag = readTag()) != -1) { + visitSegmentChildren(segment, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitSegmentChildren(Segment segment, int _field, int _type) { + switch (_field) { + case 1: + segment.setId(readInt()); + break; + case 2: + segment.setCount(readInt()); + break; + case 3: + if (_type == 1) { + segment.addMessage(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + segment.addMessage(readString()); + } + } + break; + } + } + + @Override + public void visitThread(JavaThread thread) { + byte tag; + + while ((tag = readTag()) != -1) { + visitThreadChildren(thread, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitThreadChildren(JavaThread thread, int _field, int _type) { + switch (_field) { + case 1: + thread.setGroupName(readString()); + break; + case 2: + thread.setName(readString()); + break; + case 3: + thread.setId(readString()); + break; + case 33: + if (_type == 1) { + Segment segment = new Segment(); + + visitSegment(segment); + m_linker.onSegment(thread, segment); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Segment segment = new Segment(); + + visitSegment(segment); + m_linker.onSegment(thread, segment); + } + } + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultSaxMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..fcc8ea1566 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultSaxMaker.java @@ -0,0 +1,201 @@ +package com.dianping.cat.consumer.problem.model.transform; + +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_COUNT; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_DURATION; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_FAILS; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_GROUP_NAME; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_STATUS; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_TYPE; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_VALUE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.consumer.problem.model.entity.Duration; +import com.dianping.cat.consumer.problem.model.entity.Entity; +import com.dianping.cat.consumer.problem.model.entity.Entry; +import com.dianping.cat.consumer.problem.model.entity.GraphTrend; +import com.dianping.cat.consumer.problem.model.entity.JavaThread; +import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.problem.model.entity.Segment; + +public class DefaultSaxMaker implements IMaker { + + @Override + public String buildDomain(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Duration buildDuration(Attributes attributes) { + String value = attributes.getValue(ATTR_VALUE); + String count = attributes.getValue(ATTR_COUNT); + Duration duration = new Duration(value == null ? 0 : convert(Integer.class, value, 0)); + + if (count != null) { + duration.setCount(convert(Integer.class, count, 0)); + } + + return duration; + } + + @Override + public Entity buildEntity(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String type = attributes.getValue(ATTR_TYPE); + String status = attributes.getValue(ATTR_STATUS); + Entity entity = new Entity(id); + + if (type != null) { + entity.setType(type); + } + + if (status != null) { + entity.setStatus(status); + } + + return entity; + } + + @Override + public Entry buildEntry(Attributes attributes) { + String type = attributes.getValue(ATTR_TYPE); + String status = attributes.getValue(ATTR_STATUS); + Entry entry = new Entry(); + + if (type != null) { + entry.setType(type); + } + + if (status != null) { + entry.setStatus(status); + } + + return entry; + } + + @Override + public GraphTrend buildGraphTrend(Attributes attributes) { + String duration = attributes.getValue(ATTR_DURATION); + String fails = attributes.getValue(ATTR_FAILS); + GraphTrend graphTrend = new GraphTrend(duration == null ? 0 : convert(Integer.class, duration, 0)); + + if (fails != null) { + graphTrend.setFails(fails); + } + + return graphTrend; + } + + @Override + public String buildIp(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Machine buildMachine(Attributes attributes) { + String ip = attributes.getValue(ATTR_IP); + Machine machine = new Machine(ip); + + return machine; + } + + @Override + public String buildMessage(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public ProblemReport buildProblemReport(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String startTime = attributes.getValue(ATTR_STARTTIME); + String endTime = attributes.getValue(ATTR_ENDTIME); + ProblemReport problemReport = new ProblemReport(domain); + + if (startTime != null) { + problemReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + problemReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return problemReport; + } + + @Override + public Segment buildSegment(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String count = attributes.getValue(ATTR_COUNT); + Segment segment = new Segment(id == null ? null : convert(Integer.class, id, null)); + + if (count != null) { + segment.setCount(convert(Integer.class, count, 0)); + } + + return segment; + } + + @Override + public JavaThread buildThread(Attributes attributes) { + String groupName = attributes.getValue(ATTR_GROUP_NAME); + String name = attributes.getValue(ATTR_NAME); + String id = attributes.getValue(ATTR_ID); + JavaThread thread = new JavaThread(id); + + if (groupName != null) { + thread.setGroupName(groupName); + } + + if (name != null) { + thread.setName(name); + } + + return thread; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultSaxParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..6ddbf39f8c --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultSaxParser.java @@ -0,0 +1,417 @@ +package com.dianping.cat.consumer.problem.model.transform; + +import static com.dianping.cat.consumer.problem.model.Constants.ELEMENT_DOMAIN; +import static com.dianping.cat.consumer.problem.model.Constants.ELEMENT_DOMAIN_NAMES; +import static com.dianping.cat.consumer.problem.model.Constants.ELEMENT_IP; +import static com.dianping.cat.consumer.problem.model.Constants.ELEMENT_IPS; +import static com.dianping.cat.consumer.problem.model.Constants.ELEMENT_MESSAGE; +import static com.dianping.cat.consumer.problem.model.Constants.ELEMENT_MESSAGES; + +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_DURATION; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_ENTITY; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_ENTRY; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_GRAPH_TREND; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_MACHINE; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_PROBLEM_REPORT; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_SEGMENT; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_THREAD; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.consumer.problem.model.IEntity; +import com.dianping.cat.consumer.problem.model.entity.Duration; +import com.dianping.cat.consumer.problem.model.entity.Entity; +import com.dianping.cat.consumer.problem.model.entity.Entry; +import com.dianping.cat.consumer.problem.model.entity.GraphTrend; +import com.dianping.cat.consumer.problem.model.entity.JavaThread; +import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.problem.model.entity.Segment; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static ProblemReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(ProblemReport.class, new InputSource(removeBOM(in))); + } + + public static ProblemReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(ProblemReport.class, new InputSource(removeBOM(reader))); + } + + public static ProblemReport parse(String xml) throws SAXException, IOException { + return parseEntity(ProblemReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof ProblemReport) { + ProblemReport problemReport = (ProblemReport) currentObj; + + if (ELEMENT_DOMAIN.equals(currentTag)) { + problemReport.addDomain(getText()); + } else if (ELEMENT_IP.equals(currentTag)) { + problemReport.addIp(getText()); + } + } else if (currentObj instanceof Segment) { + Segment segment = (Segment) currentObj; + + if (ELEMENT_MESSAGE.equals(currentTag)) { + segment.addMessage(getText()); + } + } else if (currentObj instanceof Duration) { + Duration duration = (Duration) currentObj; + + if (ELEMENT_MESSAGE.equals(currentTag)) { + duration.addMessage(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForDuration(Duration parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_MESSAGES.equals(qName) || ELEMENT_MESSAGE.equals(qName)) { + m_objs.push(parentObj); + } else { + throw new SAXException(String.format("Element(%s) is not expected under duration!", qName)); + } + + m_tags.push(qName); + } + + private void parseForEntity(Entity parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_THREAD.equals(qName)) { + JavaThread thread = m_maker.buildThread(attributes); + + m_linker.onThread(parentObj, thread); + m_objs.push(thread); + } else if (ENTITY_DURATION.equals(qName)) { + Duration duration = m_maker.buildDuration(attributes); + + m_linker.onDuration(parentObj, duration); + m_objs.push(duration); + } else if (ENTITY_GRAPH_TREND.equals(qName)) { + GraphTrend graphTrend = m_maker.buildGraphTrend(attributes); + + m_linker.onGraphTrend(parentObj, graphTrend); + m_objs.push(graphTrend); + } else { + throw new SAXException(String.format("Element(%s) is not expected under entity!", qName)); + } + + m_tags.push(qName); + } + + private void parseForEntry(Entry parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DURATION.equals(qName)) { + Duration duration = m_maker.buildDuration(attributes); + + m_linker.onDuration(parentObj, duration); + m_objs.push(duration); + } else if (ENTITY_THREAD.equals(qName)) { + JavaThread thread = m_maker.buildThread(attributes); + + m_linker.onThread(parentObj, thread); + m_objs.push(thread); + } else { + throw new SAXException(String.format("Element(%s) is not expected under entry!", qName)); + } + + m_tags.push(qName); + } + + private void parseForGraphTrend(GraphTrend parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForMachine(Machine parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_ENTRY.equals(qName)) { + Entry entry = m_maker.buildEntry(attributes); + + m_linker.onEntry(parentObj, entry); + m_objs.push(entry); + } else if (ENTITY_ENTITY.equals(qName)) { + Entity entity = m_maker.buildEntity(attributes); + + m_linker.onEntity(parentObj, entity); + m_objs.push(entity); + } else { + throw new SAXException(String.format("Element(%s) is not expected under machine!", qName)); + } + + m_tags.push(qName); + } + + private void parseForProblemReport(ProblemReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_DOMAIN_NAMES.equals(qName) || ELEMENT_DOMAIN.equals(qName) || ELEMENT_IPS.equals(qName) || ELEMENT_IP.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_linker.onMachine(parentObj, machine); + m_objs.push(machine); + } else { + throw new SAXException(String.format("Element(%s) is not expected under problem-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseForSegment(Segment parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_MESSAGES.equals(qName) || ELEMENT_MESSAGE.equals(qName)) { + m_objs.push(parentObj); + } else { + throw new SAXException(String.format("Element(%s) is not expected under segment!", qName)); + } + + m_tags.push(qName); + } + + private void parseForThread(JavaThread parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_SEGMENT.equals(qName)) { + Segment segment = m_maker.buildSegment(attributes); + + m_linker.onSegment(parentObj, segment); + m_objs.push(segment); + } else { + throw new SAXException(String.format("Element(%s) is not expected under thread!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_PROBLEM_REPORT.equals(qName)) { + ProblemReport problemReport = m_maker.buildProblemReport(attributes); + + m_entity = problemReport; + m_objs.push(problemReport); + m_tags.push(qName); + } else if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_entity = machine; + m_objs.push(machine); + m_tags.push(qName); + } else if (ENTITY_ENTRY.equals(qName)) { + Entry entry = m_maker.buildEntry(attributes); + + m_entity = entry; + m_objs.push(entry); + m_tags.push(qName); + } else if (ENTITY_THREAD.equals(qName)) { + JavaThread thread = m_maker.buildThread(attributes); + + m_entity = thread; + m_objs.push(thread); + m_tags.push(qName); + } else if (ENTITY_SEGMENT.equals(qName)) { + Segment segment = m_maker.buildSegment(attributes); + + m_entity = segment; + m_objs.push(segment); + m_tags.push(qName); + } else if (ENTITY_DURATION.equals(qName)) { + Duration duration = m_maker.buildDuration(attributes); + + m_entity = duration; + m_objs.push(duration); + m_tags.push(qName); + } else if (ENTITY_ENTITY.equals(qName)) { + Entity entity = m_maker.buildEntity(attributes); + + m_entity = entity; + m_objs.push(entity); + m_tags.push(qName); + } else if (ENTITY_GRAPH_TREND.equals(qName)) { + GraphTrend graphTrend = m_maker.buildGraphTrend(attributes); + + m_entity = graphTrend; + m_objs.push(graphTrend); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof ProblemReport) { + parseForProblemReport((ProblemReport) parent, tag, qName, attributes); + } else if (parent instanceof Machine) { + parseForMachine((Machine) parent, tag, qName, attributes); + } else if (parent instanceof Entry) { + parseForEntry((Entry) parent, tag, qName, attributes); + } else if (parent instanceof JavaThread) { + parseForThread((JavaThread) parent, tag, qName, attributes); + } else if (parent instanceof Segment) { + parseForSegment((Segment) parent, tag, qName, attributes); + } else if (parent instanceof Duration) { + parseForDuration((Duration) parent, tag, qName, attributes); + } else if (parent instanceof Entity) { + parseForEntity((Entity) parent, tag, qName, attributes); + } else if (parent instanceof GraphTrend) { + parseForGraphTrend((GraphTrend) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultXmlBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..91412e4335 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/DefaultXmlBuilder.java @@ -0,0 +1,402 @@ +package com.dianping.cat.consumer.problem.model.transform; + +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_COUNT; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_DURATION; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_FAILS; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_GROUP_NAME; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_STATUS; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_TYPE; +import static com.dianping.cat.consumer.problem.model.Constants.ATTR_VALUE; +import static com.dianping.cat.consumer.problem.model.Constants.ELEMENT_DOMAIN; +import static com.dianping.cat.consumer.problem.model.Constants.ELEMENT_IP; +import static com.dianping.cat.consumer.problem.model.Constants.ELEMENT_MESSAGE; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_DURATION; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_ENTITY; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_ENTRY; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_GRAPH_TREND; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_MACHINE; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_PROBLEM_REPORT; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_SEGMENT; +import static com.dianping.cat.consumer.problem.model.Constants.ENTITY_THREAD; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.consumer.problem.model.IEntity; +import com.dianping.cat.consumer.problem.model.IVisitor; +import com.dianping.cat.consumer.problem.model.entity.Duration; +import com.dianping.cat.consumer.problem.model.entity.Entity; +import com.dianping.cat.consumer.problem.model.entity.Entry; +import com.dianping.cat.consumer.problem.model.entity.GraphTrend; +import com.dianping.cat.consumer.problem.model.entity.JavaThread; +import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.problem.model.entity.Segment; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + @Override + public void visitDuration(Duration duration) { + startTag(ENTITY_DURATION, null, ATTR_VALUE, duration.getValue(), ATTR_COUNT, duration.getCount()); + + if (!duration.getMessages().isEmpty()) { + for (String message : duration.getMessages()) { + tagWithText(ELEMENT_MESSAGE, message); + } + } + + endTag(ENTITY_DURATION); + } + + @Override + public void visitEntity(Entity entity) { + startTag(ENTITY_ENTITY, null, ATTR_ID, entity.getId(), ATTR_TYPE, entity.getType(), ATTR_STATUS, entity.getStatus()); + + if (!entity.getThreads().isEmpty()) { + for (JavaThread thread : entity.getThreads().values()) { + thread.accept(m_visitor); + } + } + + if (!entity.getDurations().isEmpty()) { + for (Duration duration : entity.getDurations().values()) { + duration.accept(m_visitor); + } + } + + if (entity.getGraphTrend() != null) { + entity.getGraphTrend().accept(m_visitor); + } + + endTag(ENTITY_ENTITY); + } + + @Override + public void visitEntry(Entry entry) { + startTag(ENTITY_ENTRY, null, ATTR_TYPE, entry.getType(), ATTR_STATUS, entry.getStatus()); + + if (!entry.getDurations().isEmpty()) { + for (Duration duration : entry.getDurations().values()) { + duration.accept(m_visitor); + } + } + + if (!entry.getThreads().isEmpty()) { + for (JavaThread thread : entry.getThreads().values()) { + thread.accept(m_visitor); + } + } + + endTag(ENTITY_ENTRY); + } + + @Override + public void visitGraphTrend(GraphTrend graphTrend) { + startTag(ENTITY_GRAPH_TREND, true, null, ATTR_DURATION, graphTrend.getDuration(), ATTR_FAILS, graphTrend.getFails()); + } + + @Override + public void visitMachine(Machine machine) { + startTag(ENTITY_MACHINE, null, ATTR_IP, machine.getIp()); + + if (!machine.getEntries().isEmpty()) { + for (Entry entry : machine.getEntries()) { + entry.accept(m_visitor); + } + } + + if (!machine.getEntities().isEmpty()) { + for (Entity entity : machine.getEntities().values()) { + entity.accept(m_visitor); + } + } + + endTag(ENTITY_MACHINE); + } + + @Override + public void visitProblemReport(ProblemReport problemReport) { + startTag(ENTITY_PROBLEM_REPORT, null, ATTR_DOMAIN, problemReport.getDomain(), ATTR_STARTTIME, toString(problemReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_ENDTIME, toString(problemReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!problemReport.getDomainNames().isEmpty()) { + for (String domain : problemReport.getDomainNames()) { + tagWithText(ELEMENT_DOMAIN, domain); + } + } + + if (!problemReport.getIps().isEmpty()) { + for (String ip : problemReport.getIps()) { + tagWithText(ELEMENT_IP, ip); + } + } + + if (!problemReport.getMachines().isEmpty()) { + for (Machine machine : problemReport.getMachines().values()) { + machine.accept(m_visitor); + } + } + + endTag(ENTITY_PROBLEM_REPORT); + } + + @Override + public void visitSegment(Segment segment) { + startTag(ENTITY_SEGMENT, null, ATTR_ID, segment.getId(), ATTR_COUNT, segment.getCount()); + + if (!segment.getMessages().isEmpty()) { + for (String message : segment.getMessages()) { + tagWithText(ELEMENT_MESSAGE, message); + } + } + + endTag(ENTITY_SEGMENT); + } + + @Override + public void visitThread(JavaThread thread) { + startTag(ENTITY_THREAD, null, ATTR_GROUP_NAME, thread.getGroupName(), ATTR_NAME, thread.getName(), ATTR_ID, thread.getId()); + + if (!thread.getSegments().isEmpty()) { + for (Segment segment : thread.getSegments().values()) { + segment.accept(m_visitor); + } + } + + endTag(ENTITY_THREAD); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/ILinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/ILinker.java new file mode 100644 index 0000000000..a0dfe1cb42 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/ILinker.java @@ -0,0 +1,31 @@ +package com.dianping.cat.consumer.problem.model.transform; + +import com.dianping.cat.consumer.problem.model.entity.Duration; +import com.dianping.cat.consumer.problem.model.entity.Entity; +import com.dianping.cat.consumer.problem.model.entity.Entry; +import com.dianping.cat.consumer.problem.model.entity.GraphTrend; +import com.dianping.cat.consumer.problem.model.entity.JavaThread; +import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.problem.model.entity.Segment; + +public interface ILinker { + + public boolean onDuration(Entry parent, Duration duration); + + public boolean onDuration(Entity parent, Duration duration); + + public boolean onEntity(Machine parent, Entity entity); + + public boolean onEntry(Machine parent, Entry entry); + + public boolean onGraphTrend(Entity parent, GraphTrend graphTrend); + + public boolean onMachine(ProblemReport parent, Machine machine); + + public boolean onSegment(JavaThread parent, Segment segment); + + public boolean onThread(Entry parent, JavaThread thread); + + public boolean onThread(Entity parent, JavaThread thread); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/IMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/IMaker.java new file mode 100644 index 0000000000..d3ff8efaaf --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/IMaker.java @@ -0,0 +1,35 @@ +package com.dianping.cat.consumer.problem.model.transform; + +import com.dianping.cat.consumer.problem.model.entity.Duration; +import com.dianping.cat.consumer.problem.model.entity.Entity; +import com.dianping.cat.consumer.problem.model.entity.Entry; +import com.dianping.cat.consumer.problem.model.entity.GraphTrend; +import com.dianping.cat.consumer.problem.model.entity.JavaThread; +import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.problem.model.entity.Segment; + +public interface IMaker { + + public String buildDomain(T node); + + public Duration buildDuration(T node); + + public Entity buildEntity(T node); + + public Entry buildEntry(T node); + + public GraphTrend buildGraphTrend(T node); + + public String buildIp(T node); + + public Machine buildMachine(T node); + + public String buildMessage(T node); + + public ProblemReport buildProblemReport(T node); + + public Segment buildSegment(T node); + + public JavaThread buildThread(T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/IParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/IParser.java new file mode 100644 index 0000000000..8a3fe9c044 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/problem/model/transform/IParser.java @@ -0,0 +1,28 @@ +package com.dianping.cat.consumer.problem.model.transform; + +import com.dianping.cat.consumer.problem.model.entity.Duration; +import com.dianping.cat.consumer.problem.model.entity.Entity; +import com.dianping.cat.consumer.problem.model.entity.Entry; +import com.dianping.cat.consumer.problem.model.entity.GraphTrend; +import com.dianping.cat.consumer.problem.model.entity.JavaThread; +import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.consumer.problem.model.entity.Segment; + +public interface IParser { + public ProblemReport parse(IMaker maker, ILinker linker, T node); + + public void parseForDuration(IMaker maker, ILinker linker, Duration parent, T node); + + public void parseForEntity(IMaker maker, ILinker linker, Entity parent, T node); + + public void parseForEntry(IMaker maker, ILinker linker, Entry parent, T node); + + public void parseForGraphTrend(IMaker maker, ILinker linker, GraphTrend parent, T node); + + public void parseForMachine(IMaker maker, ILinker linker, Machine parent, T node); + + public void parseForSegment(IMaker maker, ILinker linker, Segment parent, T node); + + public void parseForJavaThread(IMaker maker, ILinker linker, JavaThread parent, T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/BaseEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/BaseEntity.java new file mode 100644 index 0000000000..27e5972241 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.consumer.state.model; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.consumer.state.model.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/Constants.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/Constants.java new file mode 100644 index 0000000000..a46da71e96 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/Constants.java @@ -0,0 +1,72 @@ +package com.dianping.cat.consumer.state.model; + +public class Constants { + + public static final String ATTR_AVG = "avg"; + + public static final String ATTR_AVGTPS = "avgTps"; + + public static final String ATTR_BLOCKLOSS = "blockLoss"; + + public static final String ATTR_BLOCKTIME = "blockTime"; + + public static final String ATTR_BLOCKTOTAL = "blockTotal"; + + public static final String ATTR_DELAYAVG = "delayAvg"; + + public static final String ATTR_DELAYCOUNT = "delayCount"; + + public static final String ATTR_DELAYSUM = "delaySum"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_DUMP = "dump"; + + public static final String ATTR_DUMPLOSS = "dumpLoss"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_IP = "ip"; + + public static final String ATTR_MAXTPS = "maxTps"; + + public static final String ATTR_NAME = "name"; + + public static final String ATTR_NETWORKTIMEERROR = "networkTimeError"; + + public static final String ATTR_PIGEONTIMEERROR = "pigeonTimeError"; + + public static final String ATTR_SIZE = "size"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ATTR_TIME = "time"; + + public static final String ATTR_TOTAL = "total"; + + public static final String ATTR_TOTALLOSS = "totalLoss"; + + public static final String ELEMENT_IP = "ip"; + + public static final String ELEMENT_IPS = "ips"; + + public static final String ENTITY_DETAIL = "detail"; + + public static final String ENTITY_DETAILS = "details"; + + public static final String ENTITY_MACHINE = "machine"; + + public static final String ENTITY_MACHINES = "machines"; + + public static final String ENTITY_MESSAGE = "message"; + + public static final String ENTITY_MESSAGES = "messages"; + + public static final String ENTITY_PROCESSDOMAIN = "processDomain"; + + public static final String ENTITY_PROCESSDOMAINS = "processDomains"; + + public static final String ENTITY_STATE_REPORT = "state-report"; +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/IEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/IEntity.java new file mode 100644 index 0000000000..eae419a0e5 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.consumer.state.model; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/IVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/IVisitor.java new file mode 100644 index 0000000000..4222225422 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/IVisitor.java @@ -0,0 +1,20 @@ +package com.dianping.cat.consumer.state.model; + +import com.dianping.cat.consumer.state.model.entity.Detail; +import com.dianping.cat.consumer.state.model.entity.Machine; +import com.dianping.cat.consumer.state.model.entity.Message; +import com.dianping.cat.consumer.state.model.entity.ProcessDomain; +import com.dianping.cat.consumer.state.model.entity.StateReport; + +public interface IVisitor { + + public void visitDetail(Detail detail); + + public void visitMachine(Machine machine); + + public void visitMessage(Message message); + + public void visitProcessDomain(ProcessDomain processDomain); + + public void visitStateReport(StateReport stateReport); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/Detail.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/Detail.java new file mode 100644 index 0000000000..dccc390d29 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/Detail.java @@ -0,0 +1,101 @@ +package com.dianping.cat.consumer.state.model.entity; + +import static com.dianping.cat.consumer.state.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_DETAIL; + +import com.dianping.cat.consumer.state.model.BaseEntity; +import com.dianping.cat.consumer.state.model.IVisitor; + +public class Detail extends BaseEntity { + private Long m_id; + + private long m_total; + + private double m_size; + + private long m_totalLoss; + + public Detail() { + } + + public Detail(Long id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDetail(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Detail) { + Detail _o = (Detail) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Long getId() { + return m_id; + } + + public double getSize() { + return m_size; + } + + public long getTotal() { + return m_total; + } + + public long getTotalLoss() { + return m_totalLoss; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Detail other) { + assertAttributeEquals(other, ENTITY_DETAIL, ATTR_ID, m_id, other.getId()); + + m_total = other.getTotal(); + + m_size = other.getSize(); + + m_totalLoss = other.getTotalLoss(); + } + + public Detail setId(Long id) { + m_id = id; + return this; + } + + public Detail setSize(double size) { + m_size = size; + return this; + } + + public Detail setTotal(long total) { + m_total = total; + return this; + } + + public Detail setTotalLoss(long totalLoss) { + m_totalLoss = totalLoss; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/Machine.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/Machine.java new file mode 100644 index 0000000000..28d0c34a3c --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/Machine.java @@ -0,0 +1,332 @@ +package com.dianping.cat.consumer.state.model.entity; + +import static com.dianping.cat.consumer.state.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_MACHINE; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.state.model.BaseEntity; +import com.dianping.cat.consumer.state.model.IVisitor; + +public class Machine extends BaseEntity { + private String m_ip; + + private Map m_processDomains = new LinkedHashMap(); + + private Map m_messages = new LinkedHashMap(); + + private long m_total; + + private long m_totalLoss; + + private double m_maxTps; + + private double m_avgTps; + + private long m_blockTotal; + + private long m_blockLoss; + + private long m_blockTime; + + private long m_pigeonTimeError; + + private long m_networkTimeError; + + private long m_dump; + + private long m_dumpLoss; + + private double m_size; + + private double m_delaySum; + + private double m_delayAvg; + + private int m_delayCount; + + public Machine() { + } + + public Machine(String ip) { + m_ip = ip; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMachine(this); + } + + public Machine addMessage(Message message) { + m_messages.put(message.getId(), message); + return this; + } + + public Machine addProcessDomain(ProcessDomain processDomain) { + m_processDomains.put(processDomain.getName(), processDomain); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Machine) { + Machine _o = (Machine) obj; + + if (!equals(getIp(), _o.getIp())) { + return false; + } + + return true; + } + + return false; + } + + public Message findMessage(Long id) { + return m_messages.get(id); + } + + public ProcessDomain findProcessDomain(String name) { + return m_processDomains.get(name); + } + + public Message findOrCreateMessage(Long id) { + Message message = m_messages.get(id); + + if (message == null) { + synchronized (m_messages) { + message = m_messages.get(id); + + if (message == null) { + message = new Message(id); + m_messages.put(id, message); + } + } + } + + return message; + } + + public ProcessDomain findOrCreateProcessDomain(String name) { + ProcessDomain processDomain = m_processDomains.get(name); + + if (processDomain == null) { + synchronized (m_processDomains) { + processDomain = m_processDomains.get(name); + + if (processDomain == null) { + processDomain = new ProcessDomain(name); + m_processDomains.put(name, processDomain); + } + } + } + + return processDomain; + } + + public double getAvgTps() { + return m_avgTps; + } + + public long getBlockLoss() { + return m_blockLoss; + } + + public long getBlockTime() { + return m_blockTime; + } + + public long getBlockTotal() { + return m_blockTotal; + } + + public double getDelayAvg() { + return m_delayAvg; + } + + public int getDelayCount() { + return m_delayCount; + } + + public double getDelaySum() { + return m_delaySum; + } + + public long getDump() { + return m_dump; + } + + public long getDumpLoss() { + return m_dumpLoss; + } + + public String getIp() { + return m_ip; + } + + public double getMaxTps() { + return m_maxTps; + } + + public Map getMessages() { + return m_messages; + } + + public long getNetworkTimeError() { + return m_networkTimeError; + } + + public long getPigeonTimeError() { + return m_pigeonTimeError; + } + + public Map getProcessDomains() { + return m_processDomains; + } + + public double getSize() { + return m_size; + } + + public long getTotal() { + return m_total; + } + + public long getTotalLoss() { + return m_totalLoss; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_ip == null ? 0 : m_ip.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Machine other) { + assertAttributeEquals(other, ENTITY_MACHINE, ATTR_IP, m_ip, other.getIp()); + + m_total = other.getTotal(); + + m_totalLoss = other.getTotalLoss(); + + m_maxTps = other.getMaxTps(); + + m_avgTps = other.getAvgTps(); + + m_blockTotal = other.getBlockTotal(); + + m_blockLoss = other.getBlockLoss(); + + m_blockTime = other.getBlockTime(); + + m_pigeonTimeError = other.getPigeonTimeError(); + + m_networkTimeError = other.getNetworkTimeError(); + + m_dump = other.getDump(); + + m_dumpLoss = other.getDumpLoss(); + + m_size = other.getSize(); + + m_delaySum = other.getDelaySum(); + + m_delayAvg = other.getDelayAvg(); + + m_delayCount = other.getDelayCount(); + } + + public Message removeMessage(Long id) { + return m_messages.remove(id); + } + + public ProcessDomain removeProcessDomain(String name) { + return m_processDomains.remove(name); + } + + public Machine setAvgTps(double avgTps) { + m_avgTps = avgTps; + return this; + } + + public Machine setBlockLoss(long blockLoss) { + m_blockLoss = blockLoss; + return this; + } + + public Machine setBlockTime(long blockTime) { + m_blockTime = blockTime; + return this; + } + + public Machine setBlockTotal(long blockTotal) { + m_blockTotal = blockTotal; + return this; + } + + public Machine setDelayAvg(double delayAvg) { + m_delayAvg = delayAvg; + return this; + } + + public Machine setDelayCount(int delayCount) { + m_delayCount = delayCount; + return this; + } + + public Machine setDelaySum(double delaySum) { + m_delaySum = delaySum; + return this; + } + + public Machine setDump(long dump) { + m_dump = dump; + return this; + } + + public Machine setDumpLoss(long dumpLoss) { + m_dumpLoss = dumpLoss; + return this; + } + + public Machine setIp(String ip) { + m_ip = ip; + return this; + } + + public Machine setMaxTps(double maxTps) { + m_maxTps = maxTps; + return this; + } + + public Machine setNetworkTimeError(long networkTimeError) { + m_networkTimeError = networkTimeError; + return this; + } + + public Machine setPigeonTimeError(long pigeonTimeError) { + m_pigeonTimeError = pigeonTimeError; + return this; + } + + public Machine setSize(double size) { + m_size = size; + return this; + } + + public Machine setTotal(long total) { + m_total = total; + return this; + } + + public Machine setTotalLoss(long totalLoss) { + m_totalLoss = totalLoss; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/Message.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/Message.java new file mode 100644 index 0000000000..2cabe13958 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/Message.java @@ -0,0 +1,233 @@ +package com.dianping.cat.consumer.state.model.entity; + +import static com.dianping.cat.consumer.state.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_MESSAGE; + +import com.dianping.cat.consumer.state.model.BaseEntity; +import com.dianping.cat.consumer.state.model.IVisitor; + +public class Message extends BaseEntity { + private Long m_id; + + private java.util.Date m_time; + + private long m_total; + + private long m_totalLoss; + + private long m_dump; + + private long m_dumpLoss; + + private double m_size; + + private double m_delaySum; + + private int m_delayCount; + + private long m_pigeonTimeError; + + private long m_networkTimeError; + + private long m_blockTotal; + + private long m_blockLoss; + + private long m_blockTime; + + public Message() { + } + + public Message(Long id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMessage(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Message) { + Message _o = (Message) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public long getBlockLoss() { + return m_blockLoss; + } + + public long getBlockTime() { + return m_blockTime; + } + + public long getBlockTotal() { + return m_blockTotal; + } + + public int getDelayCount() { + return m_delayCount; + } + + public double getDelaySum() { + return m_delaySum; + } + + public long getDump() { + return m_dump; + } + + public long getDumpLoss() { + return m_dumpLoss; + } + + public Long getId() { + return m_id; + } + + public long getNetworkTimeError() { + return m_networkTimeError; + } + + public long getPigeonTimeError() { + return m_pigeonTimeError; + } + + public double getSize() { + return m_size; + } + + public java.util.Date getTime() { + return m_time; + } + + public long getTotal() { + return m_total; + } + + public long getTotalLoss() { + return m_totalLoss; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Message other) { + assertAttributeEquals(other, ENTITY_MESSAGE, ATTR_ID, m_id, other.getId()); + + if (other.getTime() != null) { + m_time = other.getTime(); + } + + m_total = other.getTotal(); + + m_totalLoss = other.getTotalLoss(); + + m_dump = other.getDump(); + + m_dumpLoss = other.getDumpLoss(); + + m_size = other.getSize(); + + m_delaySum = other.getDelaySum(); + + m_delayCount = other.getDelayCount(); + + m_pigeonTimeError = other.getPigeonTimeError(); + + m_networkTimeError = other.getNetworkTimeError(); + + m_blockTotal = other.getBlockTotal(); + + m_blockLoss = other.getBlockLoss(); + + m_blockTime = other.getBlockTime(); + } + + public Message setBlockLoss(long blockLoss) { + m_blockLoss = blockLoss; + return this; + } + + public Message setBlockTime(long blockTime) { + m_blockTime = blockTime; + return this; + } + + public Message setBlockTotal(long blockTotal) { + m_blockTotal = blockTotal; + return this; + } + + public Message setDelayCount(int delayCount) { + m_delayCount = delayCount; + return this; + } + + public Message setDelaySum(double delaySum) { + m_delaySum = delaySum; + return this; + } + + public Message setDump(long dump) { + m_dump = dump; + return this; + } + + public Message setDumpLoss(long dumpLoss) { + m_dumpLoss = dumpLoss; + return this; + } + + public Message setId(Long id) { + m_id = id; + return this; + } + + public Message setNetworkTimeError(long networkTimeError) { + m_networkTimeError = networkTimeError; + return this; + } + + public Message setPigeonTimeError(long pigeonTimeError) { + m_pigeonTimeError = pigeonTimeError; + return this; + } + + public Message setSize(double size) { + m_size = size; + return this; + } + + public Message setTime(java.util.Date time) { + m_time = time; + return this; + } + + public Message setTotal(long total) { + m_total = total; + return this; + } + + public Message setTotalLoss(long totalLoss) { + m_totalLoss = totalLoss; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/ProcessDomain.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/ProcessDomain.java new file mode 100644 index 0000000000..75481c2612 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/ProcessDomain.java @@ -0,0 +1,166 @@ +package com.dianping.cat.consumer.state.model.entity; + +import static com.dianping.cat.consumer.state.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_PROCESSDOMAIN; + +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +import com.dianping.cat.consumer.state.model.BaseEntity; +import com.dianping.cat.consumer.state.model.IVisitor; + +public class ProcessDomain extends BaseEntity { + private String m_name; + + private Set m_ips = new LinkedHashSet(); + + private long m_total; + + private long m_totalLoss; + + private double m_size; + + private double m_avg; + + private Map m_details = new LinkedHashMap(); + + public ProcessDomain() { + } + + public ProcessDomain(String name) { + m_name = name; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitProcessDomain(this); + } + + public ProcessDomain addDetail(Detail detail) { + m_details.put(detail.getId(), detail); + return this; + } + + public ProcessDomain addIp(String ip) { + m_ips.add(ip); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ProcessDomain) { + ProcessDomain _o = (ProcessDomain) obj; + + if (!equals(getName(), _o.getName())) { + return false; + } + + return true; + } + + return false; + } + + public Detail findDetail(Long id) { + return m_details.get(id); + } + + public Detail findOrCreateDetail(Long id) { + Detail detail = m_details.get(id); + + if (detail == null) { + synchronized (m_details) { + detail = m_details.get(id); + + if (detail == null) { + detail = new Detail(id); + m_details.put(id, detail); + } + } + } + + return detail; + } + + public double getAvg() { + return m_avg; + } + + public Map getDetails() { + return m_details; + } + + public Set getIps() { + return m_ips; + } + + public String getName() { + return m_name; + } + + public double getSize() { + return m_size; + } + + public long getTotal() { + return m_total; + } + + public long getTotalLoss() { + return m_totalLoss; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_name == null ? 0 : m_name.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ProcessDomain other) { + assertAttributeEquals(other, ENTITY_PROCESSDOMAIN, ATTR_NAME, m_name, other.getName()); + + m_total = other.getTotal(); + + m_totalLoss = other.getTotalLoss(); + + m_size = other.getSize(); + + m_avg = other.getAvg(); + } + + public Detail removeDetail(Long id) { + return m_details.remove(id); + } + + public ProcessDomain setAvg(double avg) { + m_avg = avg; + return this; + } + + public ProcessDomain setName(String name) { + m_name = name; + return this; + } + + public ProcessDomain setSize(double size) { + m_size = size; + return this; + } + + public ProcessDomain setTotal(long total) { + m_total = total; + return this; + } + + public ProcessDomain setTotalLoss(long totalLoss) { + m_totalLoss = totalLoss; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/StateReport.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/StateReport.java new file mode 100644 index 0000000000..f0f442a864 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/entity/StateReport.java @@ -0,0 +1,131 @@ +package com.dianping.cat.consumer.state.model.entity; + +import static com.dianping.cat.consumer.state.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_STATE_REPORT; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.state.model.BaseEntity; +import com.dianping.cat.consumer.state.model.IVisitor; + +public class StateReport extends BaseEntity { + private String m_domain; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Map m_machines = new LinkedHashMap(); + + public StateReport() { + } + + public StateReport(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitStateReport(this); + } + + public StateReport addMachine(Machine machine) { + m_machines.put(machine.getIp(), machine); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StateReport) { + StateReport _o = (StateReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public Machine findMachine(String ip) { + return m_machines.get(ip); + } + + public Machine findOrCreateMachine(String ip) { + Machine machine = m_machines.get(ip); + + if (machine == null) { + synchronized (m_machines) { + machine = m_machines.get(ip); + + if (machine == null) { + machine = new Machine(ip); + m_machines.put(ip, machine); + } + } + } + + return machine; + } + + public String getDomain() { + return m_domain; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public Map getMachines() { + return m_machines; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(StateReport other) { + assertAttributeEquals(other, ENTITY_STATE_REPORT, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Machine removeMachine(String ip) { + return m_machines.remove(ip); + } + + public StateReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public StateReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public StateReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/BaseVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/BaseVisitor.java new file mode 100644 index 0000000000..0f0810f004 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/BaseVisitor.java @@ -0,0 +1,43 @@ +package com.dianping.cat.consumer.state.model.transform; + +import com.dianping.cat.consumer.state.model.IVisitor; +import com.dianping.cat.consumer.state.model.entity.Detail; +import com.dianping.cat.consumer.state.model.entity.Machine; +import com.dianping.cat.consumer.state.model.entity.Message; +import com.dianping.cat.consumer.state.model.entity.ProcessDomain; +import com.dianping.cat.consumer.state.model.entity.StateReport; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitDetail(Detail detail) { + } + + @Override + public void visitMachine(Machine machine) { + for (ProcessDomain processDomain : machine.getProcessDomains().values()) { + visitProcessDomain(processDomain); + } + + for (Message message : machine.getMessages().values()) { + visitMessage(message); + } + } + + @Override + public void visitMessage(Message message) { + } + + @Override + public void visitProcessDomain(ProcessDomain processDomain) { + for (Detail detail : processDomain.getDetails().values()) { + visitDetail(detail); + } + } + + @Override + public void visitStateReport(StateReport stateReport) { + for (Machine machine : stateReport.getMachines().values()) { + visitMachine(machine); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultLinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultLinker.java new file mode 100644 index 0000000000..b3602a7aa1 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultLinker.java @@ -0,0 +1,89 @@ +package com.dianping.cat.consumer.state.model.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.consumer.state.model.entity.Detail; +import com.dianping.cat.consumer.state.model.entity.Machine; +import com.dianping.cat.consumer.state.model.entity.Message; +import com.dianping.cat.consumer.state.model.entity.ProcessDomain; +import com.dianping.cat.consumer.state.model.entity.StateReport; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDetail(final ProcessDomain parent, final Detail detail) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDetail(detail); + } + }); + } else { + parent.addDetail(detail); + } + + return true; + } + + @Override + public boolean onMachine(final StateReport parent, final Machine machine) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addMachine(machine); + } + }); + } else { + parent.addMachine(machine); + } + + return true; + } + + @Override + public boolean onMessage(final Machine parent, final Message message) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addMessage(message); + } + }); + } else { + parent.addMessage(message); + } + + return true; + } + + @Override + public boolean onProcessDomain(final Machine parent, final ProcessDomain processDomain) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addProcessDomain(processDomain); + } + }); + } else { + parent.addProcessDomain(processDomain); + } + + return true; + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultMerger.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultMerger.java new file mode 100644 index 0000000000..d07f792c2e --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultMerger.java @@ -0,0 +1,165 @@ +package com.dianping.cat.consumer.state.model.transform; + +import java.util.Stack; + +import com.dianping.cat.consumer.state.model.IEntity; +import com.dianping.cat.consumer.state.model.IVisitor; +import com.dianping.cat.consumer.state.model.entity.Detail; +import com.dianping.cat.consumer.state.model.entity.Machine; +import com.dianping.cat.consumer.state.model.entity.Message; +import com.dianping.cat.consumer.state.model.entity.ProcessDomain; +import com.dianping.cat.consumer.state.model.entity.StateReport; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private StateReport m_stateReport; + + public DefaultMerger() { + } + + public DefaultMerger(StateReport stateReport) { + m_stateReport = stateReport; + m_objs.push(stateReport); + } + + public StateReport getStateReport() { + return m_stateReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeDetail(Detail to, Detail from) { + to.mergeAttributes(from); + } + + protected void mergeMachine(Machine to, Machine from) { + to.mergeAttributes(from); + } + + protected void mergeMessage(Message to, Message from) { + to.mergeAttributes(from); + } + + protected void mergeProcessDomain(ProcessDomain to, ProcessDomain from) { + to.mergeAttributes(from); + to.getIps().addAll(from.getIps()); + } + + protected void mergeStateReport(StateReport to, StateReport from) { + to.mergeAttributes(from); + } + + @Override + public void visitDetail(Detail from) { + Detail to = (Detail) m_objs.peek(); + + mergeDetail(to, from); + visitDetailChildren(to, from); + } + + protected void visitDetailChildren(Detail to, Detail from) { + } + + @Override + public void visitMachine(Machine from) { + Machine to = (Machine) m_objs.peek(); + + mergeMachine(to, from); + visitMachineChildren(to, from); + } + + protected void visitMachineChildren(Machine to, Machine from) { + for (ProcessDomain source : from.getProcessDomains().values()) { + ProcessDomain target = to.findProcessDomain(source.getName()); + + if (target == null) { + target = new ProcessDomain(source.getName()); + to.addProcessDomain(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Message source : from.getMessages().values()) { + Message target = to.findMessage(source.getId()); + + if (target == null) { + target = new Message(source.getId()); + to.addMessage(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitMessage(Message from) { + Message to = (Message) m_objs.peek(); + + mergeMessage(to, from); + visitMessageChildren(to, from); + } + + protected void visitMessageChildren(Message to, Message from) { + } + + @Override + public void visitProcessDomain(ProcessDomain from) { + ProcessDomain to = (ProcessDomain) m_objs.peek(); + + mergeProcessDomain(to, from); + visitProcessDomainChildren(to, from); + } + + protected void visitProcessDomainChildren(ProcessDomain to, ProcessDomain from) { + for (Detail source : from.getDetails().values()) { + Detail target = to.findDetail(source.getId()); + + if (target == null) { + target = new Detail(source.getId()); + to.addDetail(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitStateReport(StateReport from) { + StateReport to = (StateReport) m_objs.peek(); + + mergeStateReport(to, from); + visitStateReportChildren(to, from); + } + + protected void visitStateReportChildren(StateReport to, StateReport from) { + for (Machine source : from.getMachines().values()) { + Machine target = to.findMachine(source.getIp()); + + if (target == null) { + target = new Machine(source.getIp()); + to.addMachine(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultNativeBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..f2403e6799 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultNativeBuilder.java @@ -0,0 +1,314 @@ +package com.dianping.cat.consumer.state.model.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.consumer.state.model.IVisitor; +import com.dianping.cat.consumer.state.model.entity.Detail; +import com.dianping.cat.consumer.state.model.entity.Machine; +import com.dianping.cat.consumer.state.model.entity.Message; +import com.dianping.cat.consumer.state.model.entity.ProcessDomain; +import com.dianping.cat.consumer.state.model.entity.StateReport; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(StateReport stateReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(stateReport, out); + return out.toByteArray(); + } + + public static void build(StateReport stateReport, OutputStream out) { + stateReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitDetail(Detail detail) { + if (detail.getId() != null) { + writeTag(1, 1); + writeLong(detail.getId()); + } + + writeTag(2, 0); + writeLong(detail.getTotal()); + + writeTag(3, 0); + writeDouble(detail.getSize()); + + writeTag(4, 0); + writeLong(detail.getTotalLoss()); + + writeTag(63, 3); + } + + @Override + public void visitMachine(Machine machine) { + if (machine.getIp() != null) { + writeTag(1, 1); + writeString(machine.getIp()); + } + + writeTag(2, 0); + writeLong(machine.getTotal()); + + writeTag(3, 0); + writeLong(machine.getTotalLoss()); + + writeTag(4, 0); + writeDouble(machine.getMaxTps()); + + writeTag(5, 0); + writeDouble(machine.getAvgTps()); + + writeTag(6, 0); + writeLong(machine.getBlockTotal()); + + writeTag(7, 0); + writeLong(machine.getBlockLoss()); + + writeTag(8, 0); + writeLong(machine.getBlockTime()); + + writeTag(9, 0); + writeLong(machine.getPigeonTimeError()); + + writeTag(10, 0); + writeLong(machine.getNetworkTimeError()); + + writeTag(11, 0); + writeLong(machine.getDump()); + + writeTag(12, 0); + writeLong(machine.getDumpLoss()); + + writeTag(13, 0); + writeDouble(machine.getSize()); + + writeTag(14, 0); + writeDouble(machine.getDelaySum()); + + writeTag(15, 0); + writeDouble(machine.getDelayAvg()); + + writeTag(16, 0); + writeInt(machine.getDelayCount()); + + if (!machine.getProcessDomains().isEmpty()) { + writeTag(33, 2); + writeInt(machine.getProcessDomains().size()); + + for (ProcessDomain processDomain : machine.getProcessDomains().values()) { + processDomain.accept(m_visitor); + } + } + + if (!machine.getMessages().isEmpty()) { + writeTag(34, 2); + writeInt(machine.getMessages().size()); + + for (Message message : machine.getMessages().values()) { + message.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitMessage(Message message) { + if (message.getId() != null) { + writeTag(1, 1); + writeLong(message.getId()); + } + + if (message.getTime() != null) { + writeTag(2, 1); + writeDate(message.getTime()); + } + + writeTag(3, 0); + writeLong(message.getTotal()); + + writeTag(4, 0); + writeLong(message.getTotalLoss()); + + writeTag(5, 0); + writeLong(message.getDump()); + + writeTag(6, 0); + writeLong(message.getDumpLoss()); + + writeTag(7, 0); + writeDouble(message.getSize()); + + writeTag(8, 0); + writeDouble(message.getDelaySum()); + + writeTag(9, 0); + writeInt(message.getDelayCount()); + + writeTag(10, 0); + writeLong(message.getPigeonTimeError()); + + writeTag(11, 0); + writeLong(message.getNetworkTimeError()); + + writeTag(12, 0); + writeLong(message.getBlockTotal()); + + writeTag(13, 0); + writeLong(message.getBlockLoss()); + + writeTag(14, 0); + writeLong(message.getBlockTime()); + + writeTag(63, 3); + } + + @Override + public void visitProcessDomain(ProcessDomain processDomain) { + if (processDomain.getName() != null) { + writeTag(1, 1); + writeString(processDomain.getName()); + } + + if (processDomain.getIps() != null) { + writeTag(2, 2); + writeInt(processDomain.getIps().size()); + + for (String ip : processDomain.getIps()) { + writeString(ip); + } + } + + writeTag(3, 0); + writeLong(processDomain.getTotal()); + + writeTag(4, 0); + writeLong(processDomain.getTotalLoss()); + + writeTag(5, 0); + writeDouble(processDomain.getSize()); + + writeTag(6, 0); + writeDouble(processDomain.getAvg()); + + if (!processDomain.getDetails().isEmpty()) { + writeTag(33, 2); + writeInt(processDomain.getDetails().size()); + + for (Detail detail : processDomain.getDetails().values()) { + detail.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitStateReport(StateReport stateReport) { + writeTag(63, 0); + + if (stateReport.getDomain() != null) { + writeTag(1, 1); + writeString(stateReport.getDomain()); + } + + if (stateReport.getStartTime() != null) { + writeTag(2, 1); + writeDate(stateReport.getStartTime()); + } + + if (stateReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(stateReport.getEndTime()); + } + + if (!stateReport.getMachines().isEmpty()) { + writeTag(33, 2); + writeInt(stateReport.getMachines().size()); + + for (Machine machine : stateReport.getMachines().values()) { + machine.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeDouble(double value) { + try { + writeVarint(Double.doubleToLongBits(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeLong(long value) { + try { + writeVarint(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultNativeParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..18a2824e70 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultNativeParser.java @@ -0,0 +1,379 @@ +package com.dianping.cat.consumer.state.model.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.consumer.state.model.IVisitor; +import com.dianping.cat.consumer.state.model.entity.Detail; +import com.dianping.cat.consumer.state.model.entity.Machine; +import com.dianping.cat.consumer.state.model.entity.Message; +import com.dianping.cat.consumer.state.model.entity.ProcessDomain; +import com.dianping.cat.consumer.state.model.entity.StateReport; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static StateReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static StateReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + StateReport stateReport = new StateReport(); + + try { + stateReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return stateReport; + } + + @Override + public void visitDetail(Detail detail) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDetailChildren(detail, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDetailChildren(Detail detail, int _field, int _type) { + switch (_field) { + case 1: + detail.setId(readLong()); + break; + case 2: + detail.setTotal(readLong()); + break; + case 3: + detail.setSize(readDouble()); + break; + case 4: + detail.setTotalLoss(readLong()); + break; + } + } + + @Override + public void visitMachine(Machine machine) { + byte tag; + + while ((tag = readTag()) != -1) { + visitMachineChildren(machine, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitMachineChildren(Machine machine, int _field, int _type) { + switch (_field) { + case 1: + machine.setIp(readString()); + break; + case 2: + machine.setTotal(readLong()); + break; + case 3: + machine.setTotalLoss(readLong()); + break; + case 4: + machine.setMaxTps(readDouble()); + break; + case 5: + machine.setAvgTps(readDouble()); + break; + case 6: + machine.setBlockTotal(readLong()); + break; + case 7: + machine.setBlockLoss(readLong()); + break; + case 8: + machine.setBlockTime(readLong()); + break; + case 9: + machine.setPigeonTimeError(readLong()); + break; + case 10: + machine.setNetworkTimeError(readLong()); + break; + case 11: + machine.setDump(readLong()); + break; + case 12: + machine.setDumpLoss(readLong()); + break; + case 13: + machine.setSize(readDouble()); + break; + case 14: + machine.setDelaySum(readDouble()); + break; + case 15: + machine.setDelayAvg(readDouble()); + break; + case 16: + machine.setDelayCount(readInt()); + break; + case 33: + if (_type == 1) { + ProcessDomain processDomain = new ProcessDomain(); + + visitProcessDomain(processDomain); + m_linker.onProcessDomain(machine, processDomain); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + ProcessDomain processDomain = new ProcessDomain(); + + visitProcessDomain(processDomain); + m_linker.onProcessDomain(machine, processDomain); + } + } + break; + case 34: + if (_type == 1) { + Message message = new Message(); + + visitMessage(message); + m_linker.onMessage(machine, message); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Message message = new Message(); + + visitMessage(message); + m_linker.onMessage(machine, message); + } + } + break; + } + } + + @Override + public void visitMessage(Message message) { + byte tag; + + while ((tag = readTag()) != -1) { + visitMessageChildren(message, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitMessageChildren(Message message, int _field, int _type) { + switch (_field) { + case 1: + message.setId(readLong()); + break; + case 2: + message.setTime(readDate()); + break; + case 3: + message.setTotal(readLong()); + break; + case 4: + message.setTotalLoss(readLong()); + break; + case 5: + message.setDump(readLong()); + break; + case 6: + message.setDumpLoss(readLong()); + break; + case 7: + message.setSize(readDouble()); + break; + case 8: + message.setDelaySum(readDouble()); + break; + case 9: + message.setDelayCount(readInt()); + break; + case 10: + message.setPigeonTimeError(readLong()); + break; + case 11: + message.setNetworkTimeError(readLong()); + break; + case 12: + message.setBlockTotal(readLong()); + break; + case 13: + message.setBlockLoss(readLong()); + break; + case 14: + message.setBlockTime(readLong()); + break; + } + } + + @Override + public void visitProcessDomain(ProcessDomain processDomain) { + byte tag; + + while ((tag = readTag()) != -1) { + visitProcessDomainChildren(processDomain, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitProcessDomainChildren(ProcessDomain processDomain, int _field, int _type) { + switch (_field) { + case 1: + processDomain.setName(readString()); + break; + case 2: + if (_type == 1) { + processDomain.addIp(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + processDomain.addIp(readString()); + } + } + break; + case 3: + processDomain.setTotal(readLong()); + break; + case 4: + processDomain.setTotalLoss(readLong()); + break; + case 5: + processDomain.setSize(readDouble()); + break; + case 6: + processDomain.setAvg(readDouble()); + break; + case 33: + if (_type == 1) { + Detail detail = new Detail(); + + visitDetail(detail); + m_linker.onDetail(processDomain, detail); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Detail detail = new Detail(); + + visitDetail(detail); + m_linker.onDetail(processDomain, detail); + } + } + break; + } + } + + @Override + public void visitStateReport(StateReport stateReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitStateReportChildren(stateReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitStateReportChildren(StateReport stateReport, int _field, int _type) { + switch (_field) { + case 1: + stateReport.setDomain(readString()); + break; + case 2: + stateReport.setStartTime(readDate()); + break; + case 3: + stateReport.setEndTime(readDate()); + break; + case 33: + if (_type == 1) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(stateReport, machine); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(stateReport, machine); + } + } + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private double readDouble() { + try { + return Double.longBitsToDouble(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private long readLong() { + try { + return readVarint(64); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultSaxMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..70012ed890 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultSaxMaker.java @@ -0,0 +1,317 @@ +package com.dianping.cat.consumer.state.model.transform; + +import static com.dianping.cat.consumer.state.model.Constants.ATTR_AVG; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_AVGTPS; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_BLOCKLOSS; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_BLOCKTIME; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_BLOCKTOTAL; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_DELAYAVG; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_DELAYCOUNT; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_DELAYSUM; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_DUMP; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_DUMPLOSS; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_MAXTPS; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_NETWORKTIMEERROR; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_PIGEONTIMEERROR; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_SIZE; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_TIME; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_TOTAL; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_TOTALLOSS; + +import org.xml.sax.Attributes; + +import com.dianping.cat.consumer.state.model.entity.Detail; +import com.dianping.cat.consumer.state.model.entity.Machine; +import com.dianping.cat.consumer.state.model.entity.Message; +import com.dianping.cat.consumer.state.model.entity.ProcessDomain; +import com.dianping.cat.consumer.state.model.entity.StateReport; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Detail buildDetail(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String total = attributes.getValue(ATTR_TOTAL); + String size = attributes.getValue(ATTR_SIZE); + String totalLoss = attributes.getValue(ATTR_TOTALLOSS); + Detail detail = new Detail(id == null ? null : convert(Long.class, id, null)); + + if (total != null) { + detail.setTotal(convert(Long.class, total, 0L)); + } + + if (size != null) { + detail.setSize(toNumber(size, "0.0", 0).doubleValue()); + } + + if (totalLoss != null) { + detail.setTotalLoss(convert(Long.class, totalLoss, 0L)); + } + + return detail; + } + + @Override + public String buildIp(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Machine buildMachine(Attributes attributes) { + String ip = attributes.getValue(ATTR_IP); + String total = attributes.getValue(ATTR_TOTAL); + String totalLoss = attributes.getValue(ATTR_TOTALLOSS); + String maxTps = attributes.getValue(ATTR_MAXTPS); + String avgTps = attributes.getValue(ATTR_AVGTPS); + String blockTotal = attributes.getValue(ATTR_BLOCKTOTAL); + String blockLoss = attributes.getValue(ATTR_BLOCKLOSS); + String blockTime = attributes.getValue(ATTR_BLOCKTIME); + String pigeonTimeError = attributes.getValue(ATTR_PIGEONTIMEERROR); + String networkTimeError = attributes.getValue(ATTR_NETWORKTIMEERROR); + String dump = attributes.getValue(ATTR_DUMP); + String dumpLoss = attributes.getValue(ATTR_DUMPLOSS); + String size = attributes.getValue(ATTR_SIZE); + String delaySum = attributes.getValue(ATTR_DELAYSUM); + String delayAvg = attributes.getValue(ATTR_DELAYAVG); + String delayCount = attributes.getValue(ATTR_DELAYCOUNT); + Machine machine = new Machine(ip); + + if (total != null) { + machine.setTotal(convert(Long.class, total, 0L)); + } + + if (totalLoss != null) { + machine.setTotalLoss(convert(Long.class, totalLoss, 0L)); + } + + if (maxTps != null) { + machine.setMaxTps(toNumber(maxTps, "0.0", 0).doubleValue()); + } + + if (avgTps != null) { + machine.setAvgTps(toNumber(avgTps, "0.0", 0).doubleValue()); + } + + if (blockTotal != null) { + machine.setBlockTotal(convert(Long.class, blockTotal, 0L)); + } + + if (blockLoss != null) { + machine.setBlockLoss(convert(Long.class, blockLoss, 0L)); + } + + if (blockTime != null) { + machine.setBlockTime(convert(Long.class, blockTime, 0L)); + } + + if (pigeonTimeError != null) { + machine.setPigeonTimeError(convert(Long.class, pigeonTimeError, 0L)); + } + + if (networkTimeError != null) { + machine.setNetworkTimeError(convert(Long.class, networkTimeError, 0L)); + } + + if (dump != null) { + machine.setDump(convert(Long.class, dump, 0L)); + } + + if (dumpLoss != null) { + machine.setDumpLoss(convert(Long.class, dumpLoss, 0L)); + } + + if (size != null) { + machine.setSize(toNumber(size, "0.0", 0).doubleValue()); + } + + if (delaySum != null) { + machine.setDelaySum(toNumber(delaySum, "0.0", 0).doubleValue()); + } + + if (delayAvg != null) { + machine.setDelayAvg(toNumber(delayAvg, "0.0", 0).doubleValue()); + } + + if (delayCount != null) { + machine.setDelayCount(convert(Integer.class, delayCount, 0)); + } + + return machine; + } + + @Override + public Message buildMessage(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String time = attributes.getValue(ATTR_TIME); + String total = attributes.getValue(ATTR_TOTAL); + String totalLoss = attributes.getValue(ATTR_TOTALLOSS); + String dump = attributes.getValue(ATTR_DUMP); + String dumpLoss = attributes.getValue(ATTR_DUMPLOSS); + String size = attributes.getValue(ATTR_SIZE); + String delaySum = attributes.getValue(ATTR_DELAYSUM); + String delayCount = attributes.getValue(ATTR_DELAYCOUNT); + String pigeonTimeError = attributes.getValue(ATTR_PIGEONTIMEERROR); + String networkTimeError = attributes.getValue(ATTR_NETWORKTIMEERROR); + String blockTotal = attributes.getValue(ATTR_BLOCKTOTAL); + String blockLoss = attributes.getValue(ATTR_BLOCKLOSS); + String blockTime = attributes.getValue(ATTR_BLOCKTIME); + Message message = new Message(id == null ? null : convert(Long.class, id, null)); + + if (time != null) { + message.setTime(toDate(time, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (total != null) { + message.setTotal(convert(Long.class, total, 0L)); + } + + if (totalLoss != null) { + message.setTotalLoss(convert(Long.class, totalLoss, 0L)); + } + + if (dump != null) { + message.setDump(convert(Long.class, dump, 0L)); + } + + if (dumpLoss != null) { + message.setDumpLoss(convert(Long.class, dumpLoss, 0L)); + } + + if (size != null) { + message.setSize(toNumber(size, "0.0", 0).doubleValue()); + } + + if (delaySum != null) { + message.setDelaySum(toNumber(delaySum, "0.0", 0).doubleValue()); + } + + if (delayCount != null) { + message.setDelayCount(convert(Integer.class, delayCount, 0)); + } + + if (pigeonTimeError != null) { + message.setPigeonTimeError(convert(Long.class, pigeonTimeError, 0L)); + } + + if (networkTimeError != null) { + message.setNetworkTimeError(convert(Long.class, networkTimeError, 0L)); + } + + if (blockTotal != null) { + message.setBlockTotal(convert(Long.class, blockTotal, 0L)); + } + + if (blockLoss != null) { + message.setBlockLoss(convert(Long.class, blockLoss, 0L)); + } + + if (blockTime != null) { + message.setBlockTime(convert(Long.class, blockTime, 0L)); + } + + return message; + } + + @Override + public ProcessDomain buildProcessDomain(Attributes attributes) { + String name = attributes.getValue(ATTR_NAME); + String total = attributes.getValue(ATTR_TOTAL); + String totalLoss = attributes.getValue(ATTR_TOTALLOSS); + String size = attributes.getValue(ATTR_SIZE); + String avg = attributes.getValue(ATTR_AVG); + ProcessDomain processDomain = new ProcessDomain(name); + + if (total != null) { + processDomain.setTotal(convert(Long.class, total, 0L)); + } + + if (totalLoss != null) { + processDomain.setTotalLoss(convert(Long.class, totalLoss, 0L)); + } + + if (size != null) { + processDomain.setSize(toNumber(size, "0.0", 0).doubleValue()); + } + + if (avg != null) { + processDomain.setAvg(toNumber(avg, "0.0", 0).doubleValue()); + } + + return processDomain; + } + + @Override + public StateReport buildStateReport(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String startTime = attributes.getValue(ATTR_STARTTIME); + String endTime = attributes.getValue(ATTR_ENDTIME); + StateReport stateReport = new StateReport(domain); + + if (startTime != null) { + stateReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + stateReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return stateReport; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format, Number defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultSaxParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..894e08efe4 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultSaxParser.java @@ -0,0 +1,324 @@ +package com.dianping.cat.consumer.state.model.transform; + +import static com.dianping.cat.consumer.state.model.Constants.ELEMENT_IP; +import static com.dianping.cat.consumer.state.model.Constants.ELEMENT_IPS; + +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_DETAIL; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_MACHINE; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_MESSAGE; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_PROCESSDOMAIN; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_STATE_REPORT; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_PROCESSDOMAINS; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.consumer.state.model.IEntity; +import com.dianping.cat.consumer.state.model.entity.Detail; +import com.dianping.cat.consumer.state.model.entity.Machine; +import com.dianping.cat.consumer.state.model.entity.Message; +import com.dianping.cat.consumer.state.model.entity.ProcessDomain; +import com.dianping.cat.consumer.state.model.entity.StateReport; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static StateReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(StateReport.class, new InputSource(removeBOM(in))); + } + + public static StateReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(StateReport.class, new InputSource(removeBOM(reader))); + } + + public static StateReport parse(String xml) throws SAXException, IOException { + return parseEntity(StateReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof ProcessDomain) { + ProcessDomain processDomain = (ProcessDomain) currentObj; + + if (ELEMENT_IP.equals(currentTag)) { + processDomain.addIp(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForDetail(Detail parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForMachine(Machine parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_PROCESSDOMAINS.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_PROCESSDOMAIN.equals(qName)) { + ProcessDomain processDomain = m_maker.buildProcessDomain(attributes); + + m_linker.onProcessDomain(parentObj, processDomain); + m_objs.push(processDomain); + } else if (ENTITY_MESSAGE.equals(qName)) { + Message message = m_maker.buildMessage(attributes); + + m_linker.onMessage(parentObj, message); + m_objs.push(message); + } else { + throw new SAXException(String.format("Element(%s) is not expected under machine!", qName)); + } + + m_tags.push(qName); + } + + private void parseForMessage(Message parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForProcessDomain(ProcessDomain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_IPS.equals(qName) || ELEMENT_IP.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_DETAIL.equals(qName)) { + Detail detail = m_maker.buildDetail(attributes); + + m_linker.onDetail(parentObj, detail); + m_objs.push(detail); + } else { + throw new SAXException(String.format("Element(%s) is not expected under processDomain!", qName)); + } + + m_tags.push(qName); + } + + private void parseForStateReport(StateReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_linker.onMachine(parentObj, machine); + m_objs.push(machine); + } else { + throw new SAXException(String.format("Element(%s) is not expected under state-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_STATE_REPORT.equals(qName)) { + StateReport stateReport = m_maker.buildStateReport(attributes); + + m_entity = stateReport; + m_objs.push(stateReport); + m_tags.push(qName); + } else if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_entity = machine; + m_objs.push(machine); + m_tags.push(qName); + } else if (ENTITY_PROCESSDOMAIN.equals(qName)) { + ProcessDomain processDomain = m_maker.buildProcessDomain(attributes); + + m_entity = processDomain; + m_objs.push(processDomain); + m_tags.push(qName); + } else if (ENTITY_MESSAGE.equals(qName)) { + Message message = m_maker.buildMessage(attributes); + + m_entity = message; + m_objs.push(message); + m_tags.push(qName); + } else if (ENTITY_DETAIL.equals(qName)) { + Detail detail = m_maker.buildDetail(attributes); + + m_entity = detail; + m_objs.push(detail); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof StateReport) { + parseForStateReport((StateReport) parent, tag, qName, attributes); + } else if (parent instanceof Machine) { + parseForMachine((Machine) parent, tag, qName, attributes); + } else if (parent instanceof ProcessDomain) { + parseForProcessDomain((ProcessDomain) parent, tag, qName, attributes); + } else if (parent instanceof Message) { + parseForMessage((Message) parent, tag, qName, attributes); + } else if (parent instanceof Detail) { + parseForDetail((Detail) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format) { + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultXmlBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..30ad981e4f --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/DefaultXmlBuilder.java @@ -0,0 +1,348 @@ +package com.dianping.cat.consumer.state.model.transform; + +import static com.dianping.cat.consumer.state.model.Constants.ATTR_AVG; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_AVGTPS; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_BLOCKLOSS; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_BLOCKTIME; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_BLOCKTOTAL; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_DELAYAVG; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_DELAYCOUNT; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_DELAYSUM; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_DUMP; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_DUMPLOSS; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_MAXTPS; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_NETWORKTIMEERROR; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_PIGEONTIMEERROR; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_SIZE; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_TIME; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_TOTAL; +import static com.dianping.cat.consumer.state.model.Constants.ATTR_TOTALLOSS; +import static com.dianping.cat.consumer.state.model.Constants.ELEMENT_IP; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_DETAIL; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_MACHINE; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_MESSAGE; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_PROCESSDOMAIN; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_PROCESSDOMAINS; +import static com.dianping.cat.consumer.state.model.Constants.ENTITY_STATE_REPORT; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.consumer.state.model.IEntity; +import com.dianping.cat.consumer.state.model.IVisitor; +import com.dianping.cat.consumer.state.model.entity.Detail; +import com.dianping.cat.consumer.state.model.entity.Machine; +import com.dianping.cat.consumer.state.model.entity.Message; +import com.dianping.cat.consumer.state.model.entity.ProcessDomain; +import com.dianping.cat.consumer.state.model.entity.StateReport; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + protected String toString(Number number, String format) { + if (number != null) { + return new java.text.DecimalFormat(format).format(number); + } else { + return null; + } + } + + @Override + public void visitDetail(Detail detail) { + startTag(ENTITY_DETAIL, true, null, ATTR_ID, detail.getId(), ATTR_TOTAL, detail.getTotal(), ATTR_SIZE, toString(detail.getSize(), "0.0"), ATTR_TOTALLOSS, detail.getTotalLoss()); + } + + @Override + public void visitMachine(Machine machine) { + startTag(ENTITY_MACHINE, null, ATTR_IP, machine.getIp(), ATTR_TOTAL, machine.getTotal(), ATTR_TOTALLOSS, machine.getTotalLoss(), ATTR_MAXTPS, toString(machine.getMaxTps(), "0.0"), ATTR_AVGTPS, toString(machine.getAvgTps(), "0.0"), ATTR_BLOCKTOTAL, machine.getBlockTotal(), ATTR_BLOCKLOSS, machine.getBlockLoss(), ATTR_BLOCKTIME, machine.getBlockTime(), ATTR_PIGEONTIMEERROR, machine.getPigeonTimeError(), ATTR_NETWORKTIMEERROR, machine.getNetworkTimeError(), ATTR_DUMP, machine.getDump(), ATTR_DUMPLOSS, machine.getDumpLoss(), ATTR_SIZE, toString(machine.getSize(), "0.0"), ATTR_DELAYSUM, toString(machine.getDelaySum(), "0.0"), ATTR_DELAYAVG, toString(machine.getDelayAvg(), "0.0"), ATTR_DELAYCOUNT, machine.getDelayCount()); + + if (!machine.getProcessDomains().isEmpty()) { + startTag(ENTITY_PROCESSDOMAINS); + + for (ProcessDomain processDomain : machine.getProcessDomains().values()) { + processDomain.accept(m_visitor); + } + + endTag(ENTITY_PROCESSDOMAINS); + } + + if (!machine.getMessages().isEmpty()) { + for (Message message : machine.getMessages().values()) { + message.accept(m_visitor); + } + } + + endTag(ENTITY_MACHINE); + } + + @Override + public void visitMessage(Message message) { + startTag(ENTITY_MESSAGE, true, null, ATTR_ID, message.getId(), ATTR_TIME, toString(message.getTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_TOTAL, message.getTotal(), ATTR_TOTALLOSS, message.getTotalLoss(), ATTR_DUMP, message.getDump(), ATTR_DUMPLOSS, message.getDumpLoss(), ATTR_SIZE, toString(message.getSize(), "0.0"), ATTR_DELAYSUM, toString(message.getDelaySum(), "0.0"), ATTR_DELAYCOUNT, message.getDelayCount(), ATTR_PIGEONTIMEERROR, message.getPigeonTimeError(), ATTR_NETWORKTIMEERROR, message.getNetworkTimeError(), ATTR_BLOCKTOTAL, message.getBlockTotal(), ATTR_BLOCKLOSS, message.getBlockLoss(), ATTR_BLOCKTIME, message.getBlockTime()); + } + + @Override + public void visitProcessDomain(ProcessDomain processDomain) { + startTag(ENTITY_PROCESSDOMAIN, null, ATTR_NAME, processDomain.getName(), ATTR_TOTAL, processDomain.getTotal(), ATTR_TOTALLOSS, processDomain.getTotalLoss(), ATTR_SIZE, toString(processDomain.getSize(), "0.0"), ATTR_AVG, toString(processDomain.getAvg(), "0.0")); + + if (!processDomain.getIps().isEmpty()) { + for (String ip : processDomain.getIps()) { + tagWithText(ELEMENT_IP, ip); + } + } + + if (!processDomain.getDetails().isEmpty()) { + for (Detail detail : processDomain.getDetails().values()) { + detail.accept(m_visitor); + } + } + + endTag(ENTITY_PROCESSDOMAIN); + } + + @Override + public void visitStateReport(StateReport stateReport) { + startTag(ENTITY_STATE_REPORT, null, ATTR_DOMAIN, stateReport.getDomain(), ATTR_STARTTIME, toString(stateReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_ENDTIME, toString(stateReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!stateReport.getMachines().isEmpty()) { + for (Machine machine : stateReport.getMachines().values()) { + machine.accept(m_visitor); + } + } + + endTag(ENTITY_STATE_REPORT); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/ILinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/ILinker.java new file mode 100644 index 0000000000..1d190257fc --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/ILinker.java @@ -0,0 +1,18 @@ +package com.dianping.cat.consumer.state.model.transform; + +import com.dianping.cat.consumer.state.model.entity.Detail; +import com.dianping.cat.consumer.state.model.entity.Machine; +import com.dianping.cat.consumer.state.model.entity.Message; +import com.dianping.cat.consumer.state.model.entity.ProcessDomain; +import com.dianping.cat.consumer.state.model.entity.StateReport; + +public interface ILinker { + + public boolean onDetail(ProcessDomain parent, Detail detail); + + public boolean onMachine(StateReport parent, Machine machine); + + public boolean onMessage(Machine parent, Message message); + + public boolean onProcessDomain(Machine parent, ProcessDomain processDomain); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/IMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/IMaker.java new file mode 100644 index 0000000000..2832fce034 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/IMaker.java @@ -0,0 +1,22 @@ +package com.dianping.cat.consumer.state.model.transform; + +import com.dianping.cat.consumer.state.model.entity.Detail; +import com.dianping.cat.consumer.state.model.entity.Machine; +import com.dianping.cat.consumer.state.model.entity.Message; +import com.dianping.cat.consumer.state.model.entity.ProcessDomain; +import com.dianping.cat.consumer.state.model.entity.StateReport; + +public interface IMaker { + + public Detail buildDetail(T node); + + public String buildIp(T node); + + public Machine buildMachine(T node); + + public Message buildMessage(T node); + + public ProcessDomain buildProcessDomain(T node); + + public StateReport buildStateReport(T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/IParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/IParser.java new file mode 100644 index 0000000000..3ebd392876 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/state/model/transform/IParser.java @@ -0,0 +1,19 @@ +package com.dianping.cat.consumer.state.model.transform; + +import com.dianping.cat.consumer.state.model.entity.Detail; +import com.dianping.cat.consumer.state.model.entity.Machine; +import com.dianping.cat.consumer.state.model.entity.Message; +import com.dianping.cat.consumer.state.model.entity.ProcessDomain; +import com.dianping.cat.consumer.state.model.entity.StateReport; + +public interface IParser { + public StateReport parse(IMaker maker, ILinker linker, T node); + + public void parseForDetail(IMaker maker, ILinker linker, Detail parent, T node); + + public void parseForMachine(IMaker maker, ILinker linker, Machine parent, T node); + + public void parseForMessage(IMaker maker, ILinker linker, Message parent, T node); + + public void parseForProcessDomain(IMaker maker, ILinker linker, ProcessDomain parent, T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/BaseEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/BaseEntity.java new file mode 100644 index 0000000000..b97fb0376b --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.consumer.storage.model; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.consumer.storage.model.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/Constants.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/Constants.java new file mode 100644 index 0000000000..bc114d1716 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/Constants.java @@ -0,0 +1,60 @@ +package com.dianping.cat.consumer.storage.model; + +public class Constants { + + public static final String ATTR_AVG = "avg"; + + public static final String ATTR_COUNT = "count"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_ERROR = "error"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_LONG_COUNT = "long-count"; + + public static final String ATTR_NAME = "name"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ATTR_STATEMENT = "statement"; + + public static final String ATTR_SUM = "sum"; + + public static final String ATTR_TYPE = "type"; + + public static final String ELEMENT_ID = "id"; + + public static final String ELEMENT_IDS = "ids"; + + public static final String ELEMENT_IP = "ip"; + + public static final String ELEMENT_IPS = "ips"; + + public static final String ELEMENT_OP = "op"; + + public static final String ELEMENT_OPS = "ops"; + + public static final String ENTITY_DOMAIN = "domain"; + + public static final String ENTITY_DOMAINS = "domains"; + + public static final String ENTITY_MACHINE = "machine"; + + public static final String ENTITY_MACHINES = "machines"; + + public static final String ENTITY_OPERATION = "operation"; + + public static final String ENTITY_OPERATIONS = "operations"; + + public static final String ENTITY_SEGMENT = "segment"; + + public static final String ENTITY_SEGMENTS = "segments"; + + public static final String ENTITY_SQL = "sql"; + + public static final String ENTITY_SQLS = "sqls"; + + public static final String ENTITY_STORAGE_REPORT = "storage-report"; +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/IEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/IEntity.java new file mode 100644 index 0000000000..4c18caba04 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.consumer.storage.model; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/IVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/IVisitor.java new file mode 100644 index 0000000000..7a6ee80844 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/IVisitor.java @@ -0,0 +1,23 @@ +package com.dianping.cat.consumer.storage.model; + +import com.dianping.cat.consumer.storage.model.entity.Domain; +import com.dianping.cat.consumer.storage.model.entity.Machine; +import com.dianping.cat.consumer.storage.model.entity.Operation; +import com.dianping.cat.consumer.storage.model.entity.Segment; +import com.dianping.cat.consumer.storage.model.entity.Sql; +import com.dianping.cat.consumer.storage.model.entity.StorageReport; + +public interface IVisitor { + + public void visitDomain(Domain domain); + + public void visitMachine(Machine machine); + + public void visitOperation(Operation operation); + + public void visitSegment(Segment segment); + + public void visitSql(Sql sql); + + public void visitStorageReport(StorageReport storageReport); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Domain.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Domain.java new file mode 100644 index 0000000000..b5af3a3bff --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Domain.java @@ -0,0 +1,138 @@ +package com.dianping.cat.consumer.storage.model.entity; + +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_DOMAIN; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.storage.model.BaseEntity; +import com.dianping.cat.consumer.storage.model.IVisitor; + +public class Domain extends BaseEntity { + private String m_id; + + private Map m_operations = new LinkedHashMap(); + + private Map m_sqls = new LinkedHashMap(); + + public Domain() { + } + + public Domain(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomain(this); + } + + public Domain addOperation(Operation operation) { + m_operations.put(operation.getId(), operation); + return this; + } + + public Domain addSql(Sql sql) { + m_sqls.put(sql.getId(), sql); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Domain) { + Domain _o = (Domain) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Operation findOperation(String id) { + return m_operations.get(id); + } + + public Sql findSql(String id) { + return m_sqls.get(id); + } + + public Operation findOrCreateOperation(String id) { + Operation operation = m_operations.get(id); + + if (operation == null) { + synchronized (m_operations) { + operation = m_operations.get(id); + + if (operation == null) { + operation = new Operation(id); + m_operations.put(id, operation); + } + } + } + + return operation; + } + + public Sql findOrCreateSql(String id) { + Sql sql = m_sqls.get(id); + + if (sql == null) { + synchronized (m_sqls) { + sql = m_sqls.get(id); + + if (sql == null) { + sql = new Sql(id); + m_sqls.put(id, sql); + } + } + } + + return sql; + } + + public String getId() { + return m_id; + } + + public Map getOperations() { + return m_operations; + } + + public Map getSqls() { + return m_sqls; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Domain other) { + assertAttributeEquals(other, ENTITY_DOMAIN, ATTR_ID, m_id, other.getId()); + + } + + public Operation removeOperation(String id) { + return m_operations.remove(id); + } + + public Sql removeSql(String id) { + return m_sqls.remove(id); + } + + public Domain setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Machine.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Machine.java new file mode 100644 index 0000000000..1edee8722b --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Machine.java @@ -0,0 +1,102 @@ +package com.dianping.cat.consumer.storage.model.entity; + +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_MACHINE; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.storage.model.BaseEntity; +import com.dianping.cat.consumer.storage.model.IVisitor; + +public class Machine extends BaseEntity { + private String m_id; + + private Map m_domains = new LinkedHashMap(); + + public Machine() { + } + + public Machine(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMachine(this); + } + + public Machine addDomain(Domain domain) { + m_domains.put(domain.getId(), domain); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Machine) { + Machine _o = (Machine) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Domain findDomain(String id) { + return m_domains.get(id); + } + + public Domain findOrCreateDomain(String id) { + Domain domain = m_domains.get(id); + + if (domain == null) { + synchronized (m_domains) { + domain = m_domains.get(id); + + if (domain == null) { + domain = new Domain(id); + m_domains.put(id, domain); + } + } + } + + return domain; + } + + public Map getDomains() { + return m_domains; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Machine other) { + assertAttributeEquals(other, ENTITY_MACHINE, ATTR_ID, m_id, other.getId()); + + } + + public Domain removeDomain(String id) { + return m_domains.remove(id); + } + + public Machine setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Operation.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Operation.java new file mode 100644 index 0000000000..b4e62724d9 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Operation.java @@ -0,0 +1,206 @@ +package com.dianping.cat.consumer.storage.model.entity; + +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_OPERATION; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.storage.model.BaseEntity; +import com.dianping.cat.consumer.storage.model.IVisitor; + +public class Operation extends BaseEntity { + private String m_id; + + private long m_count; + + private double m_avg; + + private double m_sum; + + private long m_error; + + private long m_longCount; + + private Map m_segments = new LinkedHashMap(); + + public Operation() { + } + + public Operation(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitOperation(this); + } + + public Operation addSegment(Segment segment) { + m_segments.put(segment.getId(), segment); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Operation) { + Operation _o = (Operation) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Segment findSegment(int id) { + return m_segments.get(id); + } + + public Segment findOrCreateSegment(int id) { + Segment segment = m_segments.get(id); + + if (segment == null) { + synchronized (m_segments) { + segment = m_segments.get(id); + + if (segment == null) { + segment = new Segment(id); + m_segments.put(id, segment); + } + } + } + + return segment; + } + + public double getAvg() { + return m_avg; + } + + public long getCount() { + return m_count; + } + + public long getError() { + return m_error; + } + + public String getId() { + return m_id; + } + + public long getLongCount() { + return m_longCount; + } + + public Map getSegments() { + return m_segments; + } + + public double getSum() { + return m_sum; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public Operation incCount() { + m_count++; + return this; + } + + public Operation incCount(long count) { + m_count += count; + return this; + } + + public Operation incError() { + m_error++; + return this; + } + + public Operation incError(long error) { + m_error += error; + return this; + } + + public Operation incLongCount() { + m_longCount++; + return this; + } + + public Operation incLongCount(long longCount) { + m_longCount += longCount; + return this; + } + + public Operation incSum() { + m_sum++; + return this; + } + + public Operation incSum(double sum) { + m_sum += sum; + return this; + } + + @Override + public void mergeAttributes(Operation other) { + assertAttributeEquals(other, ENTITY_OPERATION, ATTR_ID, m_id, other.getId()); + + m_count = other.getCount(); + + m_avg = other.getAvg(); + + m_sum = other.getSum(); + + m_error = other.getError(); + + m_longCount = other.getLongCount(); + } + + public Segment removeSegment(int id) { + return m_segments.remove(id); + } + + public Operation setAvg(double avg) { + m_avg = avg; + return this; + } + + public Operation setCount(long count) { + m_count = count; + return this; + } + + public Operation setError(long error) { + m_error = error; + return this; + } + + public Operation setId(String id) { + m_id = id; + return this; + } + + public Operation setLongCount(long longCount) { + m_longCount = longCount; + return this; + } + + public Operation setSum(double sum) { + m_sum = sum; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Segment.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Segment.java new file mode 100644 index 0000000000..c082c6575d --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Segment.java @@ -0,0 +1,167 @@ +package com.dianping.cat.consumer.storage.model.entity; + +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_SEGMENT; + +import com.dianping.cat.consumer.storage.model.BaseEntity; +import com.dianping.cat.consumer.storage.model.IVisitor; + +public class Segment extends BaseEntity { + private int m_id; + + private long m_count; + + private double m_avg; + + private double m_sum; + + private long m_error; + + private long m_longCount; + + public Segment() { + } + + public Segment(int id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitSegment(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Segment) { + Segment _o = (Segment) obj; + + if (getId() != _o.getId()) { + return false; + } + + return true; + } + + return false; + } + + public double getAvg() { + return m_avg; + } + + public long getCount() { + return m_count; + } + + public long getError() { + return m_error; + } + + public int getId() { + return m_id; + } + + public long getLongCount() { + return m_longCount; + } + + public double getSum() { + return m_sum; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + m_id; + + return hash; + } + + public Segment incCount() { + m_count++; + return this; + } + + public Segment incCount(long count) { + m_count += count; + return this; + } + + public Segment incError() { + m_error++; + return this; + } + + public Segment incError(long error) { + m_error += error; + return this; + } + + public Segment incLongCount() { + m_longCount++; + return this; + } + + public Segment incLongCount(long longCount) { + m_longCount += longCount; + return this; + } + + public Segment incSum() { + m_sum++; + return this; + } + + public Segment incSum(double sum) { + m_sum += sum; + return this; + } + + @Override + public void mergeAttributes(Segment other) { + assertAttributeEquals(other, ENTITY_SEGMENT, ATTR_ID, m_id, other.getId()); + + m_count = other.getCount(); + + m_avg = other.getAvg(); + + m_sum = other.getSum(); + + m_error = other.getError(); + + m_longCount = other.getLongCount(); + } + + public Segment setAvg(double avg) { + m_avg = avg; + return this; + } + + public Segment setCount(long count) { + m_count = count; + return this; + } + + public Segment setError(long error) { + m_error = error; + return this; + } + + public Segment setId(int id) { + m_id = id; + return this; + } + + public Segment setLongCount(long longCount) { + m_longCount = longCount; + return this; + } + + public Segment setSum(double sum) { + m_sum = sum; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Sql.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Sql.java new file mode 100644 index 0000000000..bae8aef584 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/Sql.java @@ -0,0 +1,100 @@ +package com.dianping.cat.consumer.storage.model.entity; + +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_SQL; + +import com.dianping.cat.consumer.storage.model.BaseEntity; +import com.dianping.cat.consumer.storage.model.IVisitor; + +public class Sql extends BaseEntity { + private String m_id; + + private String m_statement; + + private int m_count; + + public Sql() { + } + + public Sql(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitSql(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Sql) { + Sql _o = (Sql) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public int getCount() { + return m_count; + } + + public String getId() { + return m_id; + } + + public String getStatement() { + return m_statement; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public Sql incCount() { + m_count++; + return this; + } + + public Sql incCount(int count) { + m_count += count; + return this; + } + + @Override + public void mergeAttributes(Sql other) { + assertAttributeEquals(other, ENTITY_SQL, ATTR_ID, m_id, other.getId()); + + if (other.getStatement() != null) { + m_statement = other.getStatement(); + } + + m_count = other.getCount(); + } + + public Sql setCount(int count) { + m_count = count; + return this; + } + + public Sql setId(String id) { + m_id = id; + return this; + } + + public Sql setStatement(String statement) { + m_statement = statement; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/StorageReport.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/StorageReport.java new file mode 100644 index 0000000000..ace8ceecec --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/entity/StorageReport.java @@ -0,0 +1,196 @@ +package com.dianping.cat.consumer.storage.model.entity; + +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_STORAGE_REPORT; + +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +import com.dianping.cat.consumer.storage.model.BaseEntity; +import com.dianping.cat.consumer.storage.model.IVisitor; + +public class StorageReport extends BaseEntity { + private String m_id; + + private String m_name; + + private String m_type; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Set m_ids = new LinkedHashSet(); + + private Set m_ips = new LinkedHashSet(); + + private Set m_ops = new LinkedHashSet(); + + private Map m_machines = new LinkedHashMap(); + + public StorageReport() { + } + + public StorageReport(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitStorageReport(this); + } + + public StorageReport addId(String id) { + m_ids.add(id); + return this; + } + + public StorageReport addIp(String ip) { + m_ips.add(ip); + return this; + } + + public StorageReport addMachine(Machine machine) { + m_machines.put(machine.getId(), machine); + return this; + } + + public StorageReport addOp(String op) { + m_ops.add(op); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StorageReport) { + StorageReport _o = (StorageReport) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Machine findMachine(String id) { + return m_machines.get(id); + } + + public Machine findOrCreateMachine(String id) { + Machine machine = m_machines.get(id); + + if (machine == null) { + synchronized (m_machines) { + machine = m_machines.get(id); + + if (machine == null) { + machine = new Machine(id); + m_machines.put(id, machine); + } + } + } + + return machine; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public String getId() { + return m_id; + } + + public Set getIds() { + return m_ids; + } + + public Set getIps() { + return m_ips; + } + + public Map getMachines() { + return m_machines; + } + + public String getName() { + return m_name; + } + + public Set getOps() { + return m_ops; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + public String getType() { + return m_type; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(StorageReport other) { + assertAttributeEquals(other, ENTITY_STORAGE_REPORT, ATTR_ID, m_id, other.getId()); + + if (other.getName() != null) { + m_name = other.getName(); + } + + if (other.getType() != null) { + m_type = other.getType(); + } + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Machine removeMachine(String id) { + return m_machines.remove(id); + } + + public StorageReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public StorageReport setId(String id) { + m_id = id; + return this; + } + + public StorageReport setName(String name) { + m_name = name; + return this; + } + + public StorageReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + + public StorageReport setType(String type) { + m_type = type; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/BaseVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/BaseVisitor.java new file mode 100644 index 0000000000..35cb0882e4 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/BaseVisitor.java @@ -0,0 +1,51 @@ +package com.dianping.cat.consumer.storage.model.transform; + +import com.dianping.cat.consumer.storage.model.IVisitor; +import com.dianping.cat.consumer.storage.model.entity.Domain; +import com.dianping.cat.consumer.storage.model.entity.Machine; +import com.dianping.cat.consumer.storage.model.entity.Operation; +import com.dianping.cat.consumer.storage.model.entity.Segment; +import com.dianping.cat.consumer.storage.model.entity.Sql; +import com.dianping.cat.consumer.storage.model.entity.StorageReport; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitDomain(Domain domain) { + for (Operation operation : domain.getOperations().values()) { + visitOperation(operation); + } + + for (Sql sql : domain.getSqls().values()) { + visitSql(sql); + } + } + + @Override + public void visitMachine(Machine machine) { + for (Domain domain : machine.getDomains().values()) { + visitDomain(domain); + } + } + + @Override + public void visitOperation(Operation operation) { + for (Segment segment : operation.getSegments().values()) { + visitSegment(segment); + } + } + + @Override + public void visitSegment(Segment segment) { + } + + @Override + public void visitSql(Sql sql) { + } + + @Override + public void visitStorageReport(StorageReport storageReport) { + for (Machine machine : storageReport.getMachines().values()) { + visitMachine(machine); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultLinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultLinker.java new file mode 100644 index 0000000000..7b7dcb5c96 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultLinker.java @@ -0,0 +1,106 @@ +package com.dianping.cat.consumer.storage.model.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.consumer.storage.model.entity.Domain; +import com.dianping.cat.consumer.storage.model.entity.Machine; +import com.dianping.cat.consumer.storage.model.entity.Operation; +import com.dianping.cat.consumer.storage.model.entity.Segment; +import com.dianping.cat.consumer.storage.model.entity.Sql; +import com.dianping.cat.consumer.storage.model.entity.StorageReport; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDomain(final Machine parent, final Domain domain) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDomain(domain); + } + }); + } else { + parent.addDomain(domain); + } + + return true; + } + + @Override + public boolean onMachine(final StorageReport parent, final Machine machine) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addMachine(machine); + } + }); + } else { + parent.addMachine(machine); + } + + return true; + } + + @Override + public boolean onOperation(final Domain parent, final Operation operation) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addOperation(operation); + } + }); + } else { + parent.addOperation(operation); + } + + return true; + } + + @Override + public boolean onSegment(final Operation parent, final Segment segment) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addSegment(segment); + } + }); + } else { + parent.addSegment(segment); + } + + return true; + } + + @Override + public boolean onSql(final Domain parent, final Sql sql) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addSql(sql); + } + }); + } else { + parent.addSql(sql); + } + + return true; + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultMerger.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultMerger.java new file mode 100644 index 0000000000..7b784ef8f5 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultMerger.java @@ -0,0 +1,195 @@ +package com.dianping.cat.consumer.storage.model.transform; + +import java.util.Stack; + +import com.dianping.cat.consumer.storage.model.IEntity; +import com.dianping.cat.consumer.storage.model.IVisitor; +import com.dianping.cat.consumer.storage.model.entity.Domain; +import com.dianping.cat.consumer.storage.model.entity.Machine; +import com.dianping.cat.consumer.storage.model.entity.Operation; +import com.dianping.cat.consumer.storage.model.entity.Segment; +import com.dianping.cat.consumer.storage.model.entity.Sql; +import com.dianping.cat.consumer.storage.model.entity.StorageReport; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private StorageReport m_storageReport; + + public DefaultMerger() { + } + + public DefaultMerger(StorageReport storageReport) { + m_storageReport = storageReport; + m_objs.push(storageReport); + } + + public StorageReport getStorageReport() { + return m_storageReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeDomain(Domain to, Domain from) { + to.mergeAttributes(from); + } + + protected void mergeMachine(Machine to, Machine from) { + to.mergeAttributes(from); + } + + protected void mergeOperation(Operation to, Operation from) { + to.mergeAttributes(from); + } + + protected void mergeSegment(Segment to, Segment from) { + to.mergeAttributes(from); + } + + protected void mergeSql(Sql to, Sql from) { + to.mergeAttributes(from); + } + + protected void mergeStorageReport(StorageReport to, StorageReport from) { + to.mergeAttributes(from); + to.getIds().addAll(from.getIds()); + to.getIps().addAll(from.getIps()); + to.getOps().addAll(from.getOps()); + } + + @Override + public void visitDomain(Domain from) { + Domain to = (Domain) m_objs.peek(); + + mergeDomain(to, from); + visitDomainChildren(to, from); + } + + protected void visitDomainChildren(Domain to, Domain from) { + for (Operation source : from.getOperations().values()) { + Operation target = to.findOperation(source.getId()); + + if (target == null) { + target = new Operation(source.getId()); + to.addOperation(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Sql source : from.getSqls().values()) { + Sql target = to.findSql(source.getId()); + + if (target == null) { + target = new Sql(source.getId()); + to.addSql(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitMachine(Machine from) { + Machine to = (Machine) m_objs.peek(); + + mergeMachine(to, from); + visitMachineChildren(to, from); + } + + protected void visitMachineChildren(Machine to, Machine from) { + for (Domain source : from.getDomains().values()) { + Domain target = to.findDomain(source.getId()); + + if (target == null) { + target = new Domain(source.getId()); + to.addDomain(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitOperation(Operation from) { + Operation to = (Operation) m_objs.peek(); + + mergeOperation(to, from); + visitOperationChildren(to, from); + } + + protected void visitOperationChildren(Operation to, Operation from) { + for (Segment source : from.getSegments().values()) { + Segment target = to.findSegment(source.getId()); + + if (target == null) { + target = new Segment(source.getId()); + to.addSegment(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitSegment(Segment from) { + Segment to = (Segment) m_objs.peek(); + + mergeSegment(to, from); + visitSegmentChildren(to, from); + } + + protected void visitSegmentChildren(Segment to, Segment from) { + } + + @Override + public void visitSql(Sql from) { + Sql to = (Sql) m_objs.peek(); + + mergeSql(to, from); + visitSqlChildren(to, from); + } + + protected void visitSqlChildren(Sql to, Sql from) { + } + + @Override + public void visitStorageReport(StorageReport from) { + StorageReport to = (StorageReport) m_objs.peek(); + + mergeStorageReport(to, from); + visitStorageReportChildren(to, from); + } + + protected void visitStorageReportChildren(StorageReport to, StorageReport from) { + for (Machine source : from.getMachines().values()) { + Machine target = to.findMachine(source.getId()); + + if (target == null) { + target = new Machine(source.getId()); + to.addMachine(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultNativeBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..40cc918796 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultNativeBuilder.java @@ -0,0 +1,291 @@ +package com.dianping.cat.consumer.storage.model.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.consumer.storage.model.IVisitor; +import com.dianping.cat.consumer.storage.model.entity.Domain; +import com.dianping.cat.consumer.storage.model.entity.Machine; +import com.dianping.cat.consumer.storage.model.entity.Operation; +import com.dianping.cat.consumer.storage.model.entity.Segment; +import com.dianping.cat.consumer.storage.model.entity.Sql; +import com.dianping.cat.consumer.storage.model.entity.StorageReport; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(StorageReport storageReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(storageReport, out); + return out.toByteArray(); + } + + public static void build(StorageReport storageReport, OutputStream out) { + storageReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitDomain(Domain domain) { + if (domain.getId() != null) { + writeTag(1, 1); + writeString(domain.getId()); + } + + if (!domain.getOperations().isEmpty()) { + writeTag(33, 2); + writeInt(domain.getOperations().size()); + + for (Operation operation : domain.getOperations().values()) { + operation.accept(m_visitor); + } + } + + if (!domain.getSqls().isEmpty()) { + writeTag(34, 2); + writeInt(domain.getSqls().size()); + + for (Sql sql : domain.getSqls().values()) { + sql.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitMachine(Machine machine) { + if (machine.getId() != null) { + writeTag(1, 1); + writeString(machine.getId()); + } + + if (!machine.getDomains().isEmpty()) { + writeTag(33, 2); + writeInt(machine.getDomains().size()); + + for (Domain domain : machine.getDomains().values()) { + domain.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitOperation(Operation operation) { + if (operation.getId() != null) { + writeTag(1, 1); + writeString(operation.getId()); + } + + writeTag(2, 0); + writeLong(operation.getCount()); + + writeTag(3, 0); + writeDouble(operation.getAvg()); + + writeTag(4, 0); + writeDouble(operation.getSum()); + + writeTag(5, 0); + writeLong(operation.getError()); + + writeTag(6, 0); + writeLong(operation.getLongCount()); + + if (!operation.getSegments().isEmpty()) { + writeTag(33, 2); + writeInt(operation.getSegments().size()); + + for (Segment segment : operation.getSegments().values()) { + segment.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitSegment(Segment segment) { + writeTag(1, 0); + writeInt(segment.getId()); + + writeTag(2, 0); + writeLong(segment.getCount()); + + writeTag(3, 0); + writeDouble(segment.getAvg()); + + writeTag(4, 0); + writeDouble(segment.getSum()); + + writeTag(5, 0); + writeLong(segment.getError()); + + writeTag(6, 0); + writeLong(segment.getLongCount()); + + writeTag(63, 3); + } + + @Override + public void visitSql(Sql sql) { + if (sql.getId() != null) { + writeTag(1, 1); + writeString(sql.getId()); + } + + if (sql.getStatement() != null) { + writeTag(2, 1); + writeString(sql.getStatement()); + } + + writeTag(3, 0); + writeInt(sql.getCount()); + + writeTag(63, 3); + } + + @Override + public void visitStorageReport(StorageReport storageReport) { + writeTag(63, 0); + + if (storageReport.getId() != null) { + writeTag(1, 1); + writeString(storageReport.getId()); + } + + if (storageReport.getName() != null) { + writeTag(2, 1); + writeString(storageReport.getName()); + } + + if (storageReport.getType() != null) { + writeTag(3, 1); + writeString(storageReport.getType()); + } + + if (storageReport.getStartTime() != null) { + writeTag(4, 1); + writeDate(storageReport.getStartTime()); + } + + if (storageReport.getEndTime() != null) { + writeTag(5, 1); + writeDate(storageReport.getEndTime()); + } + + if (storageReport.getIds() != null) { + writeTag(6, 2); + writeInt(storageReport.getIds().size()); + + for (String id : storageReport.getIds()) { + writeString(id); + } + } + + if (storageReport.getIps() != null) { + writeTag(7, 2); + writeInt(storageReport.getIps().size()); + + for (String ip : storageReport.getIps()) { + writeString(ip); + } + } + + if (storageReport.getOps() != null) { + writeTag(8, 2); + writeInt(storageReport.getOps().size()); + + for (String op : storageReport.getOps()) { + writeString(op); + } + } + + if (!storageReport.getMachines().isEmpty()) { + writeTag(33, 2); + writeInt(storageReport.getMachines().size()); + + for (Machine machine : storageReport.getMachines().values()) { + machine.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeDouble(double value) { + try { + writeVarint(Double.doubleToLongBits(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeLong(long value) { + try { + writeVarint(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultNativeParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..97120dd3a4 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultNativeParser.java @@ -0,0 +1,367 @@ +package com.dianping.cat.consumer.storage.model.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.consumer.storage.model.IVisitor; +import com.dianping.cat.consumer.storage.model.entity.Domain; +import com.dianping.cat.consumer.storage.model.entity.Machine; +import com.dianping.cat.consumer.storage.model.entity.Operation; +import com.dianping.cat.consumer.storage.model.entity.Segment; +import com.dianping.cat.consumer.storage.model.entity.Sql; +import com.dianping.cat.consumer.storage.model.entity.StorageReport; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static StorageReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static StorageReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + StorageReport storageReport = new StorageReport(); + + try { + storageReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return storageReport; + } + + @Override + public void visitDomain(Domain domain) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDomainChildren(domain, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDomainChildren(Domain domain, int _field, int _type) { + switch (_field) { + case 1: + domain.setId(readString()); + break; + case 33: + if (_type == 1) { + Operation operation = new Operation(); + + visitOperation(operation); + m_linker.onOperation(domain, operation); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Operation operation = new Operation(); + + visitOperation(operation); + m_linker.onOperation(domain, operation); + } + } + break; + case 34: + if (_type == 1) { + Sql sql = new Sql(); + + visitSql(sql); + m_linker.onSql(domain, sql); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Sql sql = new Sql(); + + visitSql(sql); + m_linker.onSql(domain, sql); + } + } + break; + } + } + + @Override + public void visitMachine(Machine machine) { + byte tag; + + while ((tag = readTag()) != -1) { + visitMachineChildren(machine, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitMachineChildren(Machine machine, int _field, int _type) { + switch (_field) { + case 1: + machine.setId(readString()); + break; + case 33: + if (_type == 1) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(machine, domain); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(machine, domain); + } + } + break; + } + } + + @Override + public void visitOperation(Operation operation) { + byte tag; + + while ((tag = readTag()) != -1) { + visitOperationChildren(operation, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitOperationChildren(Operation operation, int _field, int _type) { + switch (_field) { + case 1: + operation.setId(readString()); + break; + case 2: + operation.setCount(readLong()); + break; + case 3: + operation.setAvg(readDouble()); + break; + case 4: + operation.setSum(readDouble()); + break; + case 5: + operation.setError(readLong()); + break; + case 6: + operation.setLongCount(readLong()); + break; + case 33: + if (_type == 1) { + Segment segment = new Segment(); + + visitSegment(segment); + m_linker.onSegment(operation, segment); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Segment segment = new Segment(); + + visitSegment(segment); + m_linker.onSegment(operation, segment); + } + } + break; + } + } + + @Override + public void visitSegment(Segment segment) { + byte tag; + + while ((tag = readTag()) != -1) { + visitSegmentChildren(segment, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitSegmentChildren(Segment segment, int _field, int _type) { + switch (_field) { + case 1: + segment.setId(readInt()); + break; + case 2: + segment.setCount(readLong()); + break; + case 3: + segment.setAvg(readDouble()); + break; + case 4: + segment.setSum(readDouble()); + break; + case 5: + segment.setError(readLong()); + break; + case 6: + segment.setLongCount(readLong()); + break; + } + } + + @Override + public void visitSql(Sql sql) { + byte tag; + + while ((tag = readTag()) != -1) { + visitSqlChildren(sql, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitSqlChildren(Sql sql, int _field, int _type) { + switch (_field) { + case 1: + sql.setId(readString()); + break; + case 2: + sql.setStatement(readString()); + break; + case 3: + sql.setCount(readInt()); + break; + } + } + + @Override + public void visitStorageReport(StorageReport storageReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitStorageReportChildren(storageReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitStorageReportChildren(StorageReport storageReport, int _field, int _type) { + switch (_field) { + case 1: + storageReport.setId(readString()); + break; + case 2: + storageReport.setName(readString()); + break; + case 3: + storageReport.setType(readString()); + break; + case 4: + storageReport.setStartTime(readDate()); + break; + case 5: + storageReport.setEndTime(readDate()); + break; + case 6: + if (_type == 1) { + storageReport.addId(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + storageReport.addId(readString()); + } + } + break; + case 7: + if (_type == 1) { + storageReport.addIp(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + storageReport.addIp(readString()); + } + } + break; + case 8: + if (_type == 1) { + storageReport.addOp(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + storageReport.addOp(readString()); + } + } + break; + case 33: + if (_type == 1) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(storageReport, machine); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(storageReport, machine); + } + } + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private double readDouble() { + try { + return Double.longBitsToDouble(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private long readLong() { + try { + return readVarint(64); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultSaxMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..44ed3115e1 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultSaxMaker.java @@ -0,0 +1,219 @@ +package com.dianping.cat.consumer.storage.model.transform; + +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_AVG; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_COUNT; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_ERROR; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_LONG_COUNT; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_STATEMENT; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_SUM; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_TYPE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.consumer.storage.model.entity.Domain; +import com.dianping.cat.consumer.storage.model.entity.Machine; +import com.dianping.cat.consumer.storage.model.entity.Operation; +import com.dianping.cat.consumer.storage.model.entity.Segment; +import com.dianping.cat.consumer.storage.model.entity.Sql; +import com.dianping.cat.consumer.storage.model.entity.StorageReport; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Domain buildDomain(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Domain domain = new Domain(id); + + return domain; + } + + @Override + public String buildId(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public String buildIp(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Machine buildMachine(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Machine machine = new Machine(id); + + return machine; + } + + @Override + public String buildOp(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Operation buildOperation(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String count = attributes.getValue(ATTR_COUNT); + String avg = attributes.getValue(ATTR_AVG); + String sum = attributes.getValue(ATTR_SUM); + String error = attributes.getValue(ATTR_ERROR); + String longCount = attributes.getValue(ATTR_LONG_COUNT); + Operation operation = new Operation(id); + + if (count != null) { + operation.setCount(convert(Long.class, count, 0L)); + } + + if (avg != null) { + operation.setAvg(toNumber(avg, "0.0", 0).doubleValue()); + } + + if (sum != null) { + operation.setSum(toNumber(sum, "0.0", 0).doubleValue()); + } + + if (error != null) { + operation.setError(convert(Long.class, error, 0L)); + } + + if (longCount != null) { + operation.setLongCount(convert(Long.class, longCount, 0L)); + } + + return operation; + } + + @Override + public Segment buildSegment(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String count = attributes.getValue(ATTR_COUNT); + String avg = attributes.getValue(ATTR_AVG); + String sum = attributes.getValue(ATTR_SUM); + String error = attributes.getValue(ATTR_ERROR); + String longCount = attributes.getValue(ATTR_LONG_COUNT); + Segment segment = new Segment(id == null ? 0 : convert(Integer.class, id, 0)); + + if (count != null) { + segment.setCount(convert(Long.class, count, 0L)); + } + + if (avg != null) { + segment.setAvg(toNumber(avg, "0.0", 0).doubleValue()); + } + + if (sum != null) { + segment.setSum(toNumber(sum, "0.0", 0).doubleValue()); + } + + if (error != null) { + segment.setError(convert(Long.class, error, 0L)); + } + + if (longCount != null) { + segment.setLongCount(convert(Long.class, longCount, 0L)); + } + + return segment; + } + + @Override + public Sql buildSql(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String statement = attributes.getValue(ATTR_STATEMENT); + String count = attributes.getValue(ATTR_COUNT); + Sql sql = new Sql(id); + + if (statement != null) { + sql.setStatement(statement); + } + + if (count != null) { + sql.setCount(convert(Integer.class, count, 0)); + } + + return sql; + } + + @Override + public StorageReport buildStorageReport(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String name = attributes.getValue(ATTR_NAME); + String type = attributes.getValue(ATTR_TYPE); + String startTime = attributes.getValue(ATTR_STARTTIME); + String endTime = attributes.getValue(ATTR_ENDTIME); + StorageReport storageReport = new StorageReport(id); + + if (name != null) { + storageReport.setName(name); + } + + if (type != null) { + storageReport.setType(type); + } + + if (startTime != null) { + storageReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + storageReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return storageReport; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format, Number defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultSaxParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..2b76baea02 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultSaxParser.java @@ -0,0 +1,352 @@ +package com.dianping.cat.consumer.storage.model.transform; + +import static com.dianping.cat.consumer.storage.model.Constants.ELEMENT_ID; +import static com.dianping.cat.consumer.storage.model.Constants.ELEMENT_IDS; +import static com.dianping.cat.consumer.storage.model.Constants.ELEMENT_IP; +import static com.dianping.cat.consumer.storage.model.Constants.ELEMENT_IPS; +import static com.dianping.cat.consumer.storage.model.Constants.ELEMENT_OP; +import static com.dianping.cat.consumer.storage.model.Constants.ELEMENT_OPS; + +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_MACHINE; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_OPERATION; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_SEGMENT; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_SQL; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_STORAGE_REPORT; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.consumer.storage.model.IEntity; +import com.dianping.cat.consumer.storage.model.entity.Domain; +import com.dianping.cat.consumer.storage.model.entity.Machine; +import com.dianping.cat.consumer.storage.model.entity.Operation; +import com.dianping.cat.consumer.storage.model.entity.Segment; +import com.dianping.cat.consumer.storage.model.entity.Sql; +import com.dianping.cat.consumer.storage.model.entity.StorageReport; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static StorageReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(StorageReport.class, new InputSource(removeBOM(in))); + } + + public static StorageReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(StorageReport.class, new InputSource(removeBOM(reader))); + } + + public static StorageReport parse(String xml) throws SAXException, IOException { + return parseEntity(StorageReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof StorageReport) { + StorageReport storageReport = (StorageReport) currentObj; + + if (ELEMENT_ID.equals(currentTag)) { + storageReport.addId(getText()); + } else if (ELEMENT_IP.equals(currentTag)) { + storageReport.addIp(getText()); + } else if (ELEMENT_OP.equals(currentTag)) { + storageReport.addOp(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForDomain(Domain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_OPERATION.equals(qName)) { + Operation operation = m_maker.buildOperation(attributes); + + m_linker.onOperation(parentObj, operation); + m_objs.push(operation); + } else if (ENTITY_SQL.equals(qName)) { + Sql sql = m_maker.buildSql(attributes); + + m_linker.onSql(parentObj, sql); + m_objs.push(sql); + } else { + throw new SAXException(String.format("Element(%s) is not expected under domain!", qName)); + } + + m_tags.push(qName); + } + + private void parseForMachine(Machine parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_linker.onDomain(parentObj, domain); + m_objs.push(domain); + } else { + throw new SAXException(String.format("Element(%s) is not expected under machine!", qName)); + } + + m_tags.push(qName); + } + + private void parseForOperation(Operation parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_SEGMENT.equals(qName)) { + Segment segment = m_maker.buildSegment(attributes); + + m_linker.onSegment(parentObj, segment); + m_objs.push(segment); + } else { + throw new SAXException(String.format("Element(%s) is not expected under operation!", qName)); + } + + m_tags.push(qName); + } + + private void parseForSegment(Segment parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForSql(Sql parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForStorageReport(StorageReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_IDS.equals(qName) || ELEMENT_ID.equals(qName) || ELEMENT_IPS.equals(qName) || ELEMENT_IP.equals(qName) || ELEMENT_OPS.equals(qName) || ELEMENT_OP.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_linker.onMachine(parentObj, machine); + m_objs.push(machine); + } else { + throw new SAXException(String.format("Element(%s) is not expected under storage-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_STORAGE_REPORT.equals(qName)) { + StorageReport storageReport = m_maker.buildStorageReport(attributes); + + m_entity = storageReport; + m_objs.push(storageReport); + m_tags.push(qName); + } else if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_entity = machine; + m_objs.push(machine); + m_tags.push(qName); + } else if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_entity = domain; + m_objs.push(domain); + m_tags.push(qName); + } else if (ENTITY_OPERATION.equals(qName)) { + Operation operation = m_maker.buildOperation(attributes); + + m_entity = operation; + m_objs.push(operation); + m_tags.push(qName); + } else if (ENTITY_SEGMENT.equals(qName)) { + Segment segment = m_maker.buildSegment(attributes); + + m_entity = segment; + m_objs.push(segment); + m_tags.push(qName); + } else if (ENTITY_SQL.equals(qName)) { + Sql sql = m_maker.buildSql(attributes); + + m_entity = sql; + m_objs.push(sql); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof StorageReport) { + parseForStorageReport((StorageReport) parent, tag, qName, attributes); + } else if (parent instanceof Machine) { + parseForMachine((Machine) parent, tag, qName, attributes); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, qName, attributes); + } else if (parent instanceof Operation) { + parseForOperation((Operation) parent, tag, qName, attributes); + } else if (parent instanceof Segment) { + parseForSegment((Segment) parent, tag, qName, attributes); + } else if (parent instanceof Sql) { + parseForSql((Sql) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format) { + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultXmlBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..902f3f42fe --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/DefaultXmlBuilder.java @@ -0,0 +1,360 @@ +package com.dianping.cat.consumer.storage.model.transform; + +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_AVG; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_COUNT; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_ERROR; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_LONG_COUNT; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_STATEMENT; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_SUM; +import static com.dianping.cat.consumer.storage.model.Constants.ATTR_TYPE; +import static com.dianping.cat.consumer.storage.model.Constants.ELEMENT_ID; +import static com.dianping.cat.consumer.storage.model.Constants.ELEMENT_IP; +import static com.dianping.cat.consumer.storage.model.Constants.ELEMENT_OP; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_MACHINE; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_OPERATION; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_SEGMENT; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_SQL; +import static com.dianping.cat.consumer.storage.model.Constants.ENTITY_STORAGE_REPORT; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.consumer.storage.model.IEntity; +import com.dianping.cat.consumer.storage.model.IVisitor; +import com.dianping.cat.consumer.storage.model.entity.Domain; +import com.dianping.cat.consumer.storage.model.entity.Machine; +import com.dianping.cat.consumer.storage.model.entity.Operation; +import com.dianping.cat.consumer.storage.model.entity.Segment; +import com.dianping.cat.consumer.storage.model.entity.Sql; +import com.dianping.cat.consumer.storage.model.entity.StorageReport; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + protected String toString(Number number, String format) { + if (number != null) { + return new java.text.DecimalFormat(format).format(number); + } else { + return null; + } + } + + @Override + public void visitDomain(Domain domain) { + startTag(ENTITY_DOMAIN, null, ATTR_ID, domain.getId()); + + if (!domain.getOperations().isEmpty()) { + for (Operation operation : domain.getOperations().values()) { + operation.accept(m_visitor); + } + } + + if (!domain.getSqls().isEmpty()) { + for (Sql sql : domain.getSqls().values()) { + sql.accept(m_visitor); + } + } + + endTag(ENTITY_DOMAIN); + } + + @Override + public void visitMachine(Machine machine) { + startTag(ENTITY_MACHINE, null, ATTR_ID, machine.getId()); + + if (!machine.getDomains().isEmpty()) { + for (Domain domain : machine.getDomains().values()) { + domain.accept(m_visitor); + } + } + + endTag(ENTITY_MACHINE); + } + + @Override + public void visitOperation(Operation operation) { + startTag(ENTITY_OPERATION, null, ATTR_ID, operation.getId(), ATTR_COUNT, operation.getCount(), ATTR_AVG, toString(operation.getAvg(), "0.0"), ATTR_SUM, toString(operation.getSum(), "0.0"), ATTR_ERROR, operation.getError(), ATTR_LONG_COUNT, operation.getLongCount()); + + if (!operation.getSegments().isEmpty()) { + for (Segment segment : operation.getSegments().values()) { + segment.accept(m_visitor); + } + } + + endTag(ENTITY_OPERATION); + } + + @Override + public void visitSegment(Segment segment) { + startTag(ENTITY_SEGMENT, true, null, ATTR_ID, segment.getId(), ATTR_COUNT, segment.getCount(), ATTR_AVG, toString(segment.getAvg(), "0.0"), ATTR_SUM, toString(segment.getSum(), "0.0"), ATTR_ERROR, segment.getError(), ATTR_LONG_COUNT, segment.getLongCount()); + } + + @Override + public void visitSql(Sql sql) { + startTag(ENTITY_SQL, true, null, ATTR_ID, sql.getId(), ATTR_STATEMENT, sql.getStatement(), ATTR_COUNT, sql.getCount()); + } + + @Override + public void visitStorageReport(StorageReport storageReport) { + startTag(ENTITY_STORAGE_REPORT, null, ATTR_ID, storageReport.getId(), ATTR_NAME, storageReport.getName(), ATTR_TYPE, storageReport.getType(), ATTR_STARTTIME, toString(storageReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_ENDTIME, toString(storageReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!storageReport.getIds().isEmpty()) { + for (String id : storageReport.getIds()) { + tagWithText(ELEMENT_ID, id); + } + } + + if (!storageReport.getIps().isEmpty()) { + for (String ip : storageReport.getIps()) { + tagWithText(ELEMENT_IP, ip); + } + } + + if (!storageReport.getOps().isEmpty()) { + for (String op : storageReport.getOps()) { + tagWithText(ELEMENT_OP, op); + } + } + + if (!storageReport.getMachines().isEmpty()) { + for (Machine machine : storageReport.getMachines().values()) { + machine.accept(m_visitor); + } + } + + endTag(ENTITY_STORAGE_REPORT); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/ILinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/ILinker.java new file mode 100644 index 0000000000..cec66c70c6 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/ILinker.java @@ -0,0 +1,21 @@ +package com.dianping.cat.consumer.storage.model.transform; + +import com.dianping.cat.consumer.storage.model.entity.Domain; +import com.dianping.cat.consumer.storage.model.entity.Machine; +import com.dianping.cat.consumer.storage.model.entity.Operation; +import com.dianping.cat.consumer.storage.model.entity.Segment; +import com.dianping.cat.consumer.storage.model.entity.Sql; +import com.dianping.cat.consumer.storage.model.entity.StorageReport; + +public interface ILinker { + + public boolean onDomain(Machine parent, Domain domain); + + public boolean onMachine(StorageReport parent, Machine machine); + + public boolean onOperation(Domain parent, Operation operation); + + public boolean onSegment(Operation parent, Segment segment); + + public boolean onSql(Domain parent, Sql sql); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/IMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/IMaker.java new file mode 100644 index 0000000000..be137c45be --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/IMaker.java @@ -0,0 +1,29 @@ +package com.dianping.cat.consumer.storage.model.transform; + +import com.dianping.cat.consumer.storage.model.entity.Domain; +import com.dianping.cat.consumer.storage.model.entity.Machine; +import com.dianping.cat.consumer.storage.model.entity.Operation; +import com.dianping.cat.consumer.storage.model.entity.Segment; +import com.dianping.cat.consumer.storage.model.entity.Sql; +import com.dianping.cat.consumer.storage.model.entity.StorageReport; + +public interface IMaker { + + public Domain buildDomain(T node); + + public String buildId(T node); + + public String buildIp(T node); + + public Machine buildMachine(T node); + + public String buildOp(T node); + + public Operation buildOperation(T node); + + public Segment buildSegment(T node); + + public Sql buildSql(T node); + + public StorageReport buildStorageReport(T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/IParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/IParser.java new file mode 100644 index 0000000000..c19be9b083 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/storage/model/transform/IParser.java @@ -0,0 +1,22 @@ +package com.dianping.cat.consumer.storage.model.transform; + +import com.dianping.cat.consumer.storage.model.entity.Domain; +import com.dianping.cat.consumer.storage.model.entity.Machine; +import com.dianping.cat.consumer.storage.model.entity.Operation; +import com.dianping.cat.consumer.storage.model.entity.Segment; +import com.dianping.cat.consumer.storage.model.entity.Sql; +import com.dianping.cat.consumer.storage.model.entity.StorageReport; + +public interface IParser { + public StorageReport parse(IMaker maker, ILinker linker, T node); + + public void parseForDomain(IMaker maker, ILinker linker, Domain parent, T node); + + public void parseForMachine(IMaker maker, ILinker linker, Machine parent, T node); + + public void parseForOperation(IMaker maker, ILinker linker, Operation parent, T node); + + public void parseForSegment(IMaker maker, ILinker linker, Segment parent, T node); + + public void parseForSql(IMaker maker, ILinker linker, Sql parent, T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/BaseEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/BaseEntity.java new file mode 100644 index 0000000000..85001f1e05 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.consumer.top.model; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.consumer.top.model.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/Constants.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/Constants.java new file mode 100644 index 0000000000..5d8b5017dd --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/Constants.java @@ -0,0 +1,76 @@ +package com.dianping.cat.consumer.top.model; + +public class Constants { + + public static final String ATTR_CACHE = "cache"; + + public static final String ATTR_CACHE_DURATION = "cache-duration"; + + public static final String ATTR_CACHE_ERROR = "cache-error"; + + public static final String ATTR_CACHE_SUM = "cache-sum"; + + public static final String ATTR_CALL = "call"; + + public static final String ATTR_CALL_DURATION = "call-duration"; + + public static final String ATTR_CALL_ERROR = "call-error"; + + public static final String ATTR_CALL_SUM = "call-sum"; + + public static final String ATTR_COUNT = "count"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_ERROR = "error"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_NAME = "name"; + + public static final String ATTR_SERVICE = "service"; + + public static final String ATTR_SERVICE_DURATION = "service-duration"; + + public static final String ATTR_SERVICE_ERROR = "service-error"; + + public static final String ATTR_SERVICE_SUM = "service-sum"; + + public static final String ATTR_SQL = "sql"; + + public static final String ATTR_SQL_DURATION = "sql-duration"; + + public static final String ATTR_SQL_ERROR = "sql-error"; + + public static final String ATTR_SQL_SUM = "sql-sum"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ATTR_URL = "url"; + + public static final String ATTR_URL_DURATION = "url-duration"; + + public static final String ATTR_URL_ERROR = "url-error"; + + public static final String ATTR_URL_SUM = "url-sum"; + + public static final String ENTITY_DOMAIN = "domain"; + + public static final String ENTITY_DOMAINS = "domains"; + + public static final String ENTITY_ERROR = "error"; + + public static final String ENTITY_ERRORS = "errors"; + + public static final String ENTITY_MACHINE = "machine"; + + public static final String ENTITY_MACHINES = "machines"; + + public static final String ENTITY_SEGMENT = "segment"; + + public static final String ENTITY_SEGMENTS = "segments"; + + public static final String ENTITY_TOP_REPORT = "top-report"; +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/IEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/IEntity.java new file mode 100644 index 0000000000..0db52a06cb --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.consumer.top.model; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/IVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/IVisitor.java new file mode 100644 index 0000000000..7594a3f384 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/IVisitor.java @@ -0,0 +1,20 @@ +package com.dianping.cat.consumer.top.model; + +import com.dianping.cat.consumer.top.model.entity.Domain; +import com.dianping.cat.consumer.top.model.entity.Error; +import com.dianping.cat.consumer.top.model.entity.Machine; +import com.dianping.cat.consumer.top.model.entity.Segment; +import com.dianping.cat.consumer.top.model.entity.TopReport; + +public interface IVisitor { + + public void visitDomain(Domain domain); + + public void visitError(Error error); + + public void visitMachine(Machine machine); + + public void visitSegment(Segment segment); + + public void visitTopReport(TopReport topReport); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Domain.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Domain.java new file mode 100644 index 0000000000..e3fb2b4a27 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Domain.java @@ -0,0 +1,102 @@ +package com.dianping.cat.consumer.top.model.entity; + +import static com.dianping.cat.consumer.top.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_DOMAIN; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.top.model.BaseEntity; +import com.dianping.cat.consumer.top.model.IVisitor; + +public class Domain extends BaseEntity { + private String m_name; + + private Map m_segments = new LinkedHashMap(); + + public Domain() { + } + + public Domain(String name) { + m_name = name; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomain(this); + } + + public Domain addSegment(Segment segment) { + m_segments.put(segment.getId(), segment); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Domain) { + Domain _o = (Domain) obj; + + if (!equals(getName(), _o.getName())) { + return false; + } + + return true; + } + + return false; + } + + public Segment findSegment(Integer id) { + return m_segments.get(id); + } + + public Segment findOrCreateSegment(Integer id) { + Segment segment = m_segments.get(id); + + if (segment == null) { + synchronized (m_segments) { + segment = m_segments.get(id); + + if (segment == null) { + segment = new Segment(id); + m_segments.put(id, segment); + } + } + } + + return segment; + } + + public String getName() { + return m_name; + } + + public Map getSegments() { + return m_segments; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_name == null ? 0 : m_name.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Domain other) { + assertAttributeEquals(other, ENTITY_DOMAIN, ATTR_NAME, m_name, other.getName()); + + } + + public Segment removeSegment(Integer id) { + return m_segments.remove(id); + } + + public Domain setName(String name) { + m_name = name; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Error.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Error.java new file mode 100644 index 0000000000..ee5b8726cc --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Error.java @@ -0,0 +1,85 @@ +package com.dianping.cat.consumer.top.model.entity; + +import static com.dianping.cat.consumer.top.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_ERROR; + +import com.dianping.cat.consumer.top.model.BaseEntity; +import com.dianping.cat.consumer.top.model.IVisitor; + +public class Error extends BaseEntity { + private String m_id; + + private int m_count; + + public Error() { + } + + public Error(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitError(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Error) { + Error _o = (Error) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public int getCount() { + return m_count; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public Error incCount() { + m_count++; + return this; + } + + public Error incCount(int count) { + m_count += count; + return this; + } + + @Override + public void mergeAttributes(Error other) { + assertAttributeEquals(other, ENTITY_ERROR, ATTR_ID, m_id, other.getId()); + + m_count = other.getCount(); + } + + public Error setCount(int count) { + m_count = count; + return this; + } + + public Error setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Machine.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Machine.java new file mode 100644 index 0000000000..e71b09e023 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Machine.java @@ -0,0 +1,85 @@ +package com.dianping.cat.consumer.top.model.entity; + +import static com.dianping.cat.consumer.top.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_MACHINE; + +import com.dianping.cat.consumer.top.model.BaseEntity; +import com.dianping.cat.consumer.top.model.IVisitor; + +public class Machine extends BaseEntity { + private String m_id; + + private int m_count; + + public Machine() { + } + + public Machine(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMachine(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Machine) { + Machine _o = (Machine) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public int getCount() { + return m_count; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public Machine incCount() { + m_count++; + return this; + } + + public Machine incCount(int count) { + m_count += count; + return this; + } + + @Override + public void mergeAttributes(Machine other) { + assertAttributeEquals(other, ENTITY_MACHINE, ATTR_ID, m_id, other.getId()); + + m_count = other.getCount(); + } + + public Machine setCount(int count) { + m_count = count; + return this; + } + + public Machine setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Segment.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Segment.java new file mode 100644 index 0000000000..68bf342d27 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/Segment.java @@ -0,0 +1,420 @@ +package com.dianping.cat.consumer.top.model.entity; + +import static com.dianping.cat.consumer.top.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_SEGMENT; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.top.model.BaseEntity; +import com.dianping.cat.consumer.top.model.IVisitor; + +public class Segment extends BaseEntity { + private Integer m_id; + + private long m_error; + + private long m_url; + + private double m_urlDuration; + + private long m_service; + + private double m_serviceDuration; + + private long m_sql; + + private double m_sqlDuration; + + private long m_call; + + private double m_callDuration; + + private long m_cache; + + private double m_cacheDuration; + + private long m_urlError; + + private double m_urlSum; + + private long m_serviceError; + + private double m_serviceSum; + + private long m_sqlError; + + private double m_sqlSum; + + private long m_callError; + + private double m_callSum; + + private long m_cacheError; + + private double m_cacheSum; + + private Map m_errors = new LinkedHashMap(); + + private Map m_machines = new LinkedHashMap(); + + public Segment() { + } + + public Segment(Integer id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitSegment(this); + } + + public Segment addError(Error error) { + m_errors.put(error.getId(), error); + return this; + } + + public Segment addMachine(Machine machine) { + m_machines.put(machine.getId(), machine); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Segment) { + Segment _o = (Segment) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Error findError(String id) { + return m_errors.get(id); + } + + public Machine findMachine(String id) { + return m_machines.get(id); + } + + public Error findOrCreateError(String id) { + Error error = m_errors.get(id); + + if (error == null) { + synchronized (m_errors) { + error = m_errors.get(id); + + if (error == null) { + error = new Error(id); + m_errors.put(id, error); + } + } + } + + return error; + } + + public Machine findOrCreateMachine(String id) { + Machine machine = m_machines.get(id); + + if (machine == null) { + synchronized (m_machines) { + machine = m_machines.get(id); + + if (machine == null) { + machine = new Machine(id); + m_machines.put(id, machine); + } + } + } + + return machine; + } + + public long getCache() { + return m_cache; + } + + public double getCacheDuration() { + return m_cacheDuration; + } + + public long getCacheError() { + return m_cacheError; + } + + public double getCacheSum() { + return m_cacheSum; + } + + public long getCall() { + return m_call; + } + + public double getCallDuration() { + return m_callDuration; + } + + public long getCallError() { + return m_callError; + } + + public double getCallSum() { + return m_callSum; + } + + public long getError() { + return m_error; + } + + public Map getErrors() { + return m_errors; + } + + public Integer getId() { + return m_id; + } + + public Map getMachines() { + return m_machines; + } + + public long getService() { + return m_service; + } + + public double getServiceDuration() { + return m_serviceDuration; + } + + public long getServiceError() { + return m_serviceError; + } + + public double getServiceSum() { + return m_serviceSum; + } + + public long getSql() { + return m_sql; + } + + public double getSqlDuration() { + return m_sqlDuration; + } + + public long getSqlError() { + return m_sqlError; + } + + public double getSqlSum() { + return m_sqlSum; + } + + public long getUrl() { + return m_url; + } + + public double getUrlDuration() { + return m_urlDuration; + } + + public long getUrlError() { + return m_urlError; + } + + public double getUrlSum() { + return m_urlSum; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public Segment incError() { + m_error++; + return this; + } + + public Segment incError(long error) { + m_error += error; + return this; + } + + @Override + public void mergeAttributes(Segment other) { + assertAttributeEquals(other, ENTITY_SEGMENT, ATTR_ID, m_id, other.getId()); + + m_error = other.getError(); + + m_url = other.getUrl(); + + m_urlDuration = other.getUrlDuration(); + + m_service = other.getService(); + + m_serviceDuration = other.getServiceDuration(); + + m_sql = other.getSql(); + + m_sqlDuration = other.getSqlDuration(); + + m_call = other.getCall(); + + m_callDuration = other.getCallDuration(); + + m_cache = other.getCache(); + + m_cacheDuration = other.getCacheDuration(); + + m_urlError = other.getUrlError(); + + m_urlSum = other.getUrlSum(); + + m_serviceError = other.getServiceError(); + + m_serviceSum = other.getServiceSum(); + + m_sqlError = other.getSqlError(); + + m_sqlSum = other.getSqlSum(); + + m_callError = other.getCallError(); + + m_callSum = other.getCallSum(); + + m_cacheError = other.getCacheError(); + + m_cacheSum = other.getCacheSum(); + } + + public Error removeError(String id) { + return m_errors.remove(id); + } + + public Machine removeMachine(String id) { + return m_machines.remove(id); + } + + public Segment setCache(long cache) { + m_cache = cache; + return this; + } + + public Segment setCacheDuration(double cacheDuration) { + m_cacheDuration = cacheDuration; + return this; + } + + public Segment setCacheError(long cacheError) { + m_cacheError = cacheError; + return this; + } + + public Segment setCacheSum(double cacheSum) { + m_cacheSum = cacheSum; + return this; + } + + public Segment setCall(long call) { + m_call = call; + return this; + } + + public Segment setCallDuration(double callDuration) { + m_callDuration = callDuration; + return this; + } + + public Segment setCallError(long callError) { + m_callError = callError; + return this; + } + + public Segment setCallSum(double callSum) { + m_callSum = callSum; + return this; + } + + public Segment setError(long error) { + m_error = error; + return this; + } + + public Segment setId(Integer id) { + m_id = id; + return this; + } + + public Segment setService(long service) { + m_service = service; + return this; + } + + public Segment setServiceDuration(double serviceDuration) { + m_serviceDuration = serviceDuration; + return this; + } + + public Segment setServiceError(long serviceError) { + m_serviceError = serviceError; + return this; + } + + public Segment setServiceSum(double serviceSum) { + m_serviceSum = serviceSum; + return this; + } + + public Segment setSql(long sql) { + m_sql = sql; + return this; + } + + public Segment setSqlDuration(double sqlDuration) { + m_sqlDuration = sqlDuration; + return this; + } + + public Segment setSqlError(long sqlError) { + m_sqlError = sqlError; + return this; + } + + public Segment setSqlSum(double sqlSum) { + m_sqlSum = sqlSum; + return this; + } + + public Segment setUrl(long url) { + m_url = url; + return this; + } + + public Segment setUrlDuration(double urlDuration) { + m_urlDuration = urlDuration; + return this; + } + + public Segment setUrlError(long urlError) { + m_urlError = urlError; + return this; + } + + public Segment setUrlSum(double urlSum) { + m_urlSum = urlSum; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/TopReport.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/TopReport.java new file mode 100644 index 0000000000..097e0861ee --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/entity/TopReport.java @@ -0,0 +1,131 @@ +package com.dianping.cat.consumer.top.model.entity; + +import static com.dianping.cat.consumer.top.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_TOP_REPORT; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.top.model.BaseEntity; +import com.dianping.cat.consumer.top.model.IVisitor; + +public class TopReport extends BaseEntity { + private String m_domain; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Map m_domains = new LinkedHashMap(); + + public TopReport() { + } + + public TopReport(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitTopReport(this); + } + + public TopReport addDomain(Domain domain) { + m_domains.put(domain.getName(), domain); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TopReport) { + TopReport _o = (TopReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public Domain findDomain(String name) { + return m_domains.get(name); + } + + public Domain findOrCreateDomain(String name) { + Domain domain = m_domains.get(name); + + if (domain == null) { + synchronized (m_domains) { + domain = m_domains.get(name); + + if (domain == null) { + domain = new Domain(name); + m_domains.put(name, domain); + } + } + } + + return domain; + } + + public String getDomain() { + return m_domain; + } + + public Map getDomains() { + return m_domains; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(TopReport other) { + assertAttributeEquals(other, ENTITY_TOP_REPORT, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Domain removeDomain(String name) { + return m_domains.remove(name); + } + + public TopReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public TopReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public TopReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/BaseVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/BaseVisitor.java new file mode 100644 index 0000000000..2fd4b9a7bc --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/BaseVisitor.java @@ -0,0 +1,43 @@ +package com.dianping.cat.consumer.top.model.transform; + +import com.dianping.cat.consumer.top.model.IVisitor; +import com.dianping.cat.consumer.top.model.entity.Domain; +import com.dianping.cat.consumer.top.model.entity.Error; +import com.dianping.cat.consumer.top.model.entity.Machine; +import com.dianping.cat.consumer.top.model.entity.Segment; +import com.dianping.cat.consumer.top.model.entity.TopReport; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitDomain(Domain domain) { + for (Segment segment : domain.getSegments().values()) { + visitSegment(segment); + } + } + + @Override + public void visitError(Error error) { + } + + @Override + public void visitMachine(Machine machine) { + } + + @Override + public void visitSegment(Segment segment) { + for (Error error : segment.getErrors().values()) { + visitError(error); + } + + for (Machine machine : segment.getMachines().values()) { + visitMachine(machine); + } + } + + @Override + public void visitTopReport(TopReport topReport) { + for (Domain domain : topReport.getDomains().values()) { + visitDomain(domain); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultLinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultLinker.java new file mode 100644 index 0000000000..4c01206177 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultLinker.java @@ -0,0 +1,89 @@ +package com.dianping.cat.consumer.top.model.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.consumer.top.model.entity.Domain; +import com.dianping.cat.consumer.top.model.entity.Error; +import com.dianping.cat.consumer.top.model.entity.Machine; +import com.dianping.cat.consumer.top.model.entity.Segment; +import com.dianping.cat.consumer.top.model.entity.TopReport; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDomain(final TopReport parent, final Domain domain) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDomain(domain); + } + }); + } else { + parent.addDomain(domain); + } + + return true; + } + + @Override + public boolean onError(final Segment parent, final Error error) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addError(error); + } + }); + } else { + parent.addError(error); + } + + return true; + } + + @Override + public boolean onMachine(final Segment parent, final Machine machine) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addMachine(machine); + } + }); + } else { + parent.addMachine(machine); + } + + return true; + } + + @Override + public boolean onSegment(final Domain parent, final Segment segment) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addSegment(segment); + } + }); + } else { + parent.addSegment(segment); + } + + return true; + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultMerger.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultMerger.java new file mode 100644 index 0000000000..52262c8c2d --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultMerger.java @@ -0,0 +1,164 @@ +package com.dianping.cat.consumer.top.model.transform; + +import java.util.Stack; + +import com.dianping.cat.consumer.top.model.IEntity; +import com.dianping.cat.consumer.top.model.IVisitor; +import com.dianping.cat.consumer.top.model.entity.Domain; +import com.dianping.cat.consumer.top.model.entity.Error; +import com.dianping.cat.consumer.top.model.entity.Machine; +import com.dianping.cat.consumer.top.model.entity.Segment; +import com.dianping.cat.consumer.top.model.entity.TopReport; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private TopReport m_topReport; + + public DefaultMerger() { + } + + public DefaultMerger(TopReport topReport) { + m_topReport = topReport; + m_objs.push(topReport); + } + + public TopReport getTopReport() { + return m_topReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeDomain(Domain to, Domain from) { + to.mergeAttributes(from); + } + + protected void mergeError(Error to, Error from) { + to.mergeAttributes(from); + } + + protected void mergeMachine(Machine to, Machine from) { + to.mergeAttributes(from); + } + + protected void mergeSegment(Segment to, Segment from) { + to.mergeAttributes(from); + } + + protected void mergeTopReport(TopReport to, TopReport from) { + to.mergeAttributes(from); + } + + @Override + public void visitDomain(Domain from) { + Domain to = (Domain) m_objs.peek(); + + mergeDomain(to, from); + visitDomainChildren(to, from); + } + + protected void visitDomainChildren(Domain to, Domain from) { + for (Segment source : from.getSegments().values()) { + Segment target = to.findSegment(source.getId()); + + if (target == null) { + target = new Segment(source.getId()); + to.addSegment(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitError(Error from) { + Error to = (Error) m_objs.peek(); + + mergeError(to, from); + visitErrorChildren(to, from); + } + + protected void visitErrorChildren(Error to, Error from) { + } + + @Override + public void visitMachine(Machine from) { + Machine to = (Machine) m_objs.peek(); + + mergeMachine(to, from); + visitMachineChildren(to, from); + } + + protected void visitMachineChildren(Machine to, Machine from) { + } + + @Override + public void visitSegment(Segment from) { + Segment to = (Segment) m_objs.peek(); + + mergeSegment(to, from); + visitSegmentChildren(to, from); + } + + protected void visitSegmentChildren(Segment to, Segment from) { + for (Error source : from.getErrors().values()) { + Error target = to.findError(source.getId()); + + if (target == null) { + target = new Error(source.getId()); + to.addError(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Machine source : from.getMachines().values()) { + Machine target = to.findMachine(source.getId()); + + if (target == null) { + target = new Machine(source.getId()); + to.addMachine(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitTopReport(TopReport from) { + TopReport to = (TopReport) m_objs.peek(); + + mergeTopReport(to, from); + visitTopReportChildren(to, from); + } + + protected void visitTopReportChildren(TopReport to, TopReport from) { + for (Domain source : from.getDomains().values()) { + Domain target = to.findDomain(source.getName()); + + if (target == null) { + target = new Domain(source.getName()); + to.addDomain(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultNativeBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..4e6f3f3be3 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultNativeBuilder.java @@ -0,0 +1,267 @@ +package com.dianping.cat.consumer.top.model.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.consumer.top.model.IVisitor; +import com.dianping.cat.consumer.top.model.entity.Domain; +import com.dianping.cat.consumer.top.model.entity.Error; +import com.dianping.cat.consumer.top.model.entity.Machine; +import com.dianping.cat.consumer.top.model.entity.Segment; +import com.dianping.cat.consumer.top.model.entity.TopReport; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(TopReport topReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(topReport, out); + return out.toByteArray(); + } + + public static void build(TopReport topReport, OutputStream out) { + topReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitDomain(Domain domain) { + if (domain.getName() != null) { + writeTag(1, 1); + writeString(domain.getName()); + } + + if (!domain.getSegments().isEmpty()) { + writeTag(33, 2); + writeInt(domain.getSegments().size()); + + for (Segment segment : domain.getSegments().values()) { + segment.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitError(Error error) { + if (error.getId() != null) { + writeTag(1, 1); + writeString(error.getId()); + } + + writeTag(2, 0); + writeInt(error.getCount()); + + writeTag(63, 3); + } + + @Override + public void visitMachine(Machine machine) { + if (machine.getId() != null) { + writeTag(1, 1); + writeString(machine.getId()); + } + + writeTag(2, 0); + writeInt(machine.getCount()); + + writeTag(63, 3); + } + + @Override + public void visitSegment(Segment segment) { + if (segment.getId() != null) { + writeTag(1, 1); + writeInt(segment.getId()); + } + + writeTag(2, 0); + writeLong(segment.getError()); + + writeTag(3, 0); + writeLong(segment.getUrl()); + + writeTag(4, 0); + writeDouble(segment.getUrlDuration()); + + writeTag(5, 0); + writeLong(segment.getService()); + + writeTag(6, 0); + writeDouble(segment.getServiceDuration()); + + writeTag(7, 0); + writeLong(segment.getSql()); + + writeTag(8, 0); + writeDouble(segment.getSqlDuration()); + + writeTag(9, 0); + writeLong(segment.getCall()); + + writeTag(10, 0); + writeDouble(segment.getCallDuration()); + + writeTag(11, 0); + writeLong(segment.getCache()); + + writeTag(12, 0); + writeDouble(segment.getCacheDuration()); + + writeTag(13, 0); + writeLong(segment.getUrlError()); + + writeTag(14, 0); + writeDouble(segment.getUrlSum()); + + writeTag(15, 0); + writeLong(segment.getServiceError()); + + writeTag(16, 0); + writeDouble(segment.getServiceSum()); + + writeTag(17, 0); + writeLong(segment.getSqlError()); + + writeTag(18, 0); + writeDouble(segment.getSqlSum()); + + writeTag(19, 0); + writeLong(segment.getCallError()); + + writeTag(20, 0); + writeDouble(segment.getCallSum()); + + writeTag(21, 0); + writeLong(segment.getCacheError()); + + writeTag(22, 0); + writeDouble(segment.getCacheSum()); + + if (!segment.getErrors().isEmpty()) { + writeTag(33, 2); + writeInt(segment.getErrors().size()); + + for (Error error : segment.getErrors().values()) { + error.accept(m_visitor); + } + } + + if (!segment.getMachines().isEmpty()) { + writeTag(34, 2); + writeInt(segment.getMachines().size()); + + for (Machine machine : segment.getMachines().values()) { + machine.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitTopReport(TopReport topReport) { + writeTag(63, 0); + + if (topReport.getDomain() != null) { + writeTag(1, 1); + writeString(topReport.getDomain()); + } + + if (topReport.getStartTime() != null) { + writeTag(2, 1); + writeDate(topReport.getStartTime()); + } + + if (topReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(topReport.getEndTime()); + } + + if (!topReport.getDomains().isEmpty()) { + writeTag(33, 2); + writeInt(topReport.getDomains().size()); + + for (Domain domain : topReport.getDomains().values()) { + domain.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeDouble(double value) { + try { + writeVarint(Double.doubleToLongBits(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeLong(long value) { + try { + writeVarint(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultNativeParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..96ebff7b32 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultNativeParser.java @@ -0,0 +1,334 @@ +package com.dianping.cat.consumer.top.model.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.consumer.top.model.IVisitor; +import com.dianping.cat.consumer.top.model.entity.Domain; +import com.dianping.cat.consumer.top.model.entity.Error; +import com.dianping.cat.consumer.top.model.entity.Machine; +import com.dianping.cat.consumer.top.model.entity.Segment; +import com.dianping.cat.consumer.top.model.entity.TopReport; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static TopReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static TopReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + TopReport topReport = new TopReport(); + + try { + topReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return topReport; + } + + @Override + public void visitDomain(Domain domain) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDomainChildren(domain, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDomainChildren(Domain domain, int _field, int _type) { + switch (_field) { + case 1: + domain.setName(readString()); + break; + case 33: + if (_type == 1) { + Segment segment = new Segment(); + + visitSegment(segment); + m_linker.onSegment(domain, segment); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Segment segment = new Segment(); + + visitSegment(segment); + m_linker.onSegment(domain, segment); + } + } + break; + } + } + + @Override + public void visitError(Error error) { + byte tag; + + while ((tag = readTag()) != -1) { + visitErrorChildren(error, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitErrorChildren(Error error, int _field, int _type) { + switch (_field) { + case 1: + error.setId(readString()); + break; + case 2: + error.setCount(readInt()); + break; + } + } + + @Override + public void visitMachine(Machine machine) { + byte tag; + + while ((tag = readTag()) != -1) { + visitMachineChildren(machine, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitMachineChildren(Machine machine, int _field, int _type) { + switch (_field) { + case 1: + machine.setId(readString()); + break; + case 2: + machine.setCount(readInt()); + break; + } + } + + @Override + public void visitSegment(Segment segment) { + byte tag; + + while ((tag = readTag()) != -1) { + visitSegmentChildren(segment, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitSegmentChildren(Segment segment, int _field, int _type) { + switch (_field) { + case 1: + segment.setId(readInt()); + break; + case 2: + segment.setError(readLong()); + break; + case 3: + segment.setUrl(readLong()); + break; + case 4: + segment.setUrlDuration(readDouble()); + break; + case 5: + segment.setService(readLong()); + break; + case 6: + segment.setServiceDuration(readDouble()); + break; + case 7: + segment.setSql(readLong()); + break; + case 8: + segment.setSqlDuration(readDouble()); + break; + case 9: + segment.setCall(readLong()); + break; + case 10: + segment.setCallDuration(readDouble()); + break; + case 11: + segment.setCache(readLong()); + break; + case 12: + segment.setCacheDuration(readDouble()); + break; + case 13: + segment.setUrlError(readLong()); + break; + case 14: + segment.setUrlSum(readDouble()); + break; + case 15: + segment.setServiceError(readLong()); + break; + case 16: + segment.setServiceSum(readDouble()); + break; + case 17: + segment.setSqlError(readLong()); + break; + case 18: + segment.setSqlSum(readDouble()); + break; + case 19: + segment.setCallError(readLong()); + break; + case 20: + segment.setCallSum(readDouble()); + break; + case 21: + segment.setCacheError(readLong()); + break; + case 22: + segment.setCacheSum(readDouble()); + break; + case 33: + if (_type == 1) { + Error error = new Error(); + + visitError(error); + m_linker.onError(segment, error); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Error error = new Error(); + + visitError(error); + m_linker.onError(segment, error); + } + } + break; + case 34: + if (_type == 1) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(segment, machine); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(segment, machine); + } + } + break; + } + } + + @Override + public void visitTopReport(TopReport topReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitTopReportChildren(topReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitTopReportChildren(TopReport topReport, int _field, int _type) { + switch (_field) { + case 1: + topReport.setDomain(readString()); + break; + case 2: + topReport.setStartTime(readDate()); + break; + case 3: + topReport.setEndTime(readDate()); + break; + case 33: + if (_type == 1) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(topReport, domain); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(topReport, domain); + } + } + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private double readDouble() { + try { + return Double.longBitsToDouble(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private long readLong() { + try { + return readVarint(64); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultSaxMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..6cb9793291 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultSaxMaker.java @@ -0,0 +1,256 @@ +package com.dianping.cat.consumer.top.model.transform; + +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CACHE; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CACHE_DURATION; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CACHE_ERROR; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CACHE_SUM; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CALL; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CALL_DURATION; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CALL_ERROR; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CALL_SUM; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_COUNT; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_ERROR; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SERVICE; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SERVICE_DURATION; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SERVICE_ERROR; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SERVICE_SUM; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SQL; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SQL_DURATION; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SQL_ERROR; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SQL_SUM; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_URL; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_URL_DURATION; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_URL_ERROR; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_URL_SUM; + +import org.xml.sax.Attributes; + +import com.dianping.cat.consumer.top.model.entity.Domain; +import com.dianping.cat.consumer.top.model.entity.Error; +import com.dianping.cat.consumer.top.model.entity.Machine; +import com.dianping.cat.consumer.top.model.entity.Segment; +import com.dianping.cat.consumer.top.model.entity.TopReport; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Domain buildDomain(Attributes attributes) { + String name = attributes.getValue(ATTR_NAME); + Domain domain = new Domain(name); + + return domain; + } + + @Override + public Error buildError(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String count = attributes.getValue(ATTR_COUNT); + Error error = new Error(id); + + if (count != null) { + error.setCount(convert(Integer.class, count, 0)); + } + + return error; + } + + @Override + public Machine buildMachine(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String count = attributes.getValue(ATTR_COUNT); + Machine machine = new Machine(id); + + if (count != null) { + machine.setCount(convert(Integer.class, count, 0)); + } + + return machine; + } + + @Override + public Segment buildSegment(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String error = attributes.getValue(ATTR_ERROR); + String url = attributes.getValue(ATTR_URL); + String urlDuration = attributes.getValue(ATTR_URL_DURATION); + String service = attributes.getValue(ATTR_SERVICE); + String serviceDuration = attributes.getValue(ATTR_SERVICE_DURATION); + String sql = attributes.getValue(ATTR_SQL); + String sqlDuration = attributes.getValue(ATTR_SQL_DURATION); + String call = attributes.getValue(ATTR_CALL); + String callDuration = attributes.getValue(ATTR_CALL_DURATION); + String cache = attributes.getValue(ATTR_CACHE); + String cacheDuration = attributes.getValue(ATTR_CACHE_DURATION); + String urlError = attributes.getValue(ATTR_URL_ERROR); + String urlSum = attributes.getValue(ATTR_URL_SUM); + String serviceError = attributes.getValue(ATTR_SERVICE_ERROR); + String serviceSum = attributes.getValue(ATTR_SERVICE_SUM); + String sqlError = attributes.getValue(ATTR_SQL_ERROR); + String sqlSum = attributes.getValue(ATTR_SQL_SUM); + String callError = attributes.getValue(ATTR_CALL_ERROR); + String callSum = attributes.getValue(ATTR_CALL_SUM); + String cacheError = attributes.getValue(ATTR_CACHE_ERROR); + String cacheSum = attributes.getValue(ATTR_CACHE_SUM); + Segment segment = new Segment(id == null ? null : convert(Integer.class, id, null)); + + if (error != null) { + segment.setError(convert(Long.class, error, 0L)); + } + + if (url != null) { + segment.setUrl(convert(Long.class, url, 0L)); + } + + if (urlDuration != null) { + segment.setUrlDuration(toNumber(urlDuration, "0.00", 0).doubleValue()); + } + + if (service != null) { + segment.setService(convert(Long.class, service, 0L)); + } + + if (serviceDuration != null) { + segment.setServiceDuration(toNumber(serviceDuration, "0.00", 0).doubleValue()); + } + + if (sql != null) { + segment.setSql(convert(Long.class, sql, 0L)); + } + + if (sqlDuration != null) { + segment.setSqlDuration(toNumber(sqlDuration, "0.00", 0).doubleValue()); + } + + if (call != null) { + segment.setCall(convert(Long.class, call, 0L)); + } + + if (callDuration != null) { + segment.setCallDuration(toNumber(callDuration, "0.00", 0).doubleValue()); + } + + if (cache != null) { + segment.setCache(convert(Long.class, cache, 0L)); + } + + if (cacheDuration != null) { + segment.setCacheDuration(toNumber(cacheDuration, "0.00", 0).doubleValue()); + } + + if (urlError != null) { + segment.setUrlError(convert(Long.class, urlError, 0L)); + } + + if (urlSum != null) { + segment.setUrlSum(toNumber(urlSum, "0.00", 0).doubleValue()); + } + + if (serviceError != null) { + segment.setServiceError(convert(Long.class, serviceError, 0L)); + } + + if (serviceSum != null) { + segment.setServiceSum(toNumber(serviceSum, "0.00", 0).doubleValue()); + } + + if (sqlError != null) { + segment.setSqlError(convert(Long.class, sqlError, 0L)); + } + + if (sqlSum != null) { + segment.setSqlSum(toNumber(sqlSum, "0.00", 0).doubleValue()); + } + + if (callError != null) { + segment.setCallError(convert(Long.class, callError, 0L)); + } + + if (callSum != null) { + segment.setCallSum(toNumber(callSum, "0.00", 0).doubleValue()); + } + + if (cacheError != null) { + segment.setCacheError(convert(Long.class, cacheError, 0L)); + } + + if (cacheSum != null) { + segment.setCacheSum(toNumber(cacheSum, "0.00", 0).doubleValue()); + } + + return segment; + } + + @Override + public TopReport buildTopReport(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String startTime = attributes.getValue(ATTR_STARTTIME); + String endTime = attributes.getValue(ATTR_ENDTIME); + TopReport topReport = new TopReport(domain); + + if (startTime != null) { + topReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + topReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return topReport; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format, Number defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultSaxParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..4e8b2d0e61 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultSaxParser.java @@ -0,0 +1,309 @@ +package com.dianping.cat.consumer.top.model.transform; + +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_ERROR; +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_MACHINE; +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_SEGMENT; +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_TOP_REPORT; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.consumer.top.model.IEntity; +import com.dianping.cat.consumer.top.model.entity.Domain; +import com.dianping.cat.consumer.top.model.entity.Error; +import com.dianping.cat.consumer.top.model.entity.Machine; +import com.dianping.cat.consumer.top.model.entity.Segment; +import com.dianping.cat.consumer.top.model.entity.TopReport; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static TopReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(TopReport.class, new InputSource(removeBOM(in))); + } + + public static TopReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(TopReport.class, new InputSource(removeBOM(reader))); + } + + public static TopReport parse(String xml) throws SAXException, IOException { + return parseEntity(TopReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForDomain(Domain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_SEGMENT.equals(qName)) { + Segment segment = m_maker.buildSegment(attributes); + + m_linker.onSegment(parentObj, segment); + m_objs.push(segment); + } else { + throw new SAXException(String.format("Element(%s) is not expected under domain!", qName)); + } + + m_tags.push(qName); + } + + private void parseForError(Error parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForMachine(Machine parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForSegment(Segment parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_ERROR.equals(qName)) { + Error error = m_maker.buildError(attributes); + + m_linker.onError(parentObj, error); + m_objs.push(error); + } else if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_linker.onMachine(parentObj, machine); + m_objs.push(machine); + } else { + throw new SAXException(String.format("Element(%s) is not expected under segment!", qName)); + } + + m_tags.push(qName); + } + + private void parseForTopReport(TopReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_linker.onDomain(parentObj, domain); + m_objs.push(domain); + } else { + throw new SAXException(String.format("Element(%s) is not expected under top-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_TOP_REPORT.equals(qName)) { + TopReport topReport = m_maker.buildTopReport(attributes); + + m_entity = topReport; + m_objs.push(topReport); + m_tags.push(qName); + } else if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_entity = domain; + m_objs.push(domain); + m_tags.push(qName); + } else if (ENTITY_SEGMENT.equals(qName)) { + Segment segment = m_maker.buildSegment(attributes); + + m_entity = segment; + m_objs.push(segment); + m_tags.push(qName); + } else if (ENTITY_ERROR.equals(qName)) { + Error error = m_maker.buildError(attributes); + + m_entity = error; + m_objs.push(error); + m_tags.push(qName); + } else if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_entity = machine; + m_objs.push(machine); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof TopReport) { + parseForTopReport((TopReport) parent, tag, qName, attributes); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, qName, attributes); + } else if (parent instanceof Segment) { + parseForSegment((Segment) parent, tag, qName, attributes); + } else if (parent instanceof Error) { + parseForError((Error) parent, tag, qName, attributes); + } else if (parent instanceof Machine) { + parseForMachine((Machine) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format) { + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultXmlBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..11ad3a8eea --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/DefaultXmlBuilder.java @@ -0,0 +1,297 @@ +package com.dianping.cat.consumer.top.model.transform; + +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CACHE; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CACHE_DURATION; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CACHE_ERROR; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CACHE_SUM; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CALL; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CALL_DURATION; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CALL_ERROR; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_CALL_SUM; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_COUNT; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_ERROR; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_NAME; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SERVICE; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SERVICE_DURATION; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SERVICE_ERROR; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SERVICE_SUM; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SQL; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SQL_DURATION; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SQL_ERROR; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_SQL_SUM; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_URL; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_URL_DURATION; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_URL_ERROR; +import static com.dianping.cat.consumer.top.model.Constants.ATTR_URL_SUM; +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_ERROR; +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_MACHINE; +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_SEGMENT; +import static com.dianping.cat.consumer.top.model.Constants.ENTITY_TOP_REPORT; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.consumer.top.model.IEntity; +import com.dianping.cat.consumer.top.model.IVisitor; +import com.dianping.cat.consumer.top.model.entity.Domain; +import com.dianping.cat.consumer.top.model.entity.Error; +import com.dianping.cat.consumer.top.model.entity.Machine; +import com.dianping.cat.consumer.top.model.entity.Segment; +import com.dianping.cat.consumer.top.model.entity.TopReport; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + protected String toString(Number number, String format) { + if (number != null) { + return new java.text.DecimalFormat(format).format(number); + } else { + return null; + } + } + + @Override + public void visitDomain(Domain domain) { + startTag(ENTITY_DOMAIN, null, ATTR_NAME, domain.getName()); + + if (!domain.getSegments().isEmpty()) { + for (Segment segment : domain.getSegments().values()) { + segment.accept(m_visitor); + } + } + + endTag(ENTITY_DOMAIN); + } + + @Override + public void visitError(Error error) { + startTag(ENTITY_ERROR, true, null, ATTR_ID, error.getId(), ATTR_COUNT, error.getCount()); + } + + @Override + public void visitMachine(Machine machine) { + startTag(ENTITY_MACHINE, true, null, ATTR_ID, machine.getId(), ATTR_COUNT, machine.getCount()); + } + + @Override + public void visitSegment(Segment segment) { + startTag(ENTITY_SEGMENT, null, ATTR_ID, segment.getId(), ATTR_ERROR, segment.getError(), ATTR_URL, segment.getUrl(), ATTR_URL_DURATION, toString(segment.getUrlDuration(), "0.00"), ATTR_SERVICE, segment.getService(), ATTR_SERVICE_DURATION, toString(segment.getServiceDuration(), "0.00"), ATTR_SQL, segment.getSql(), ATTR_SQL_DURATION, toString(segment.getSqlDuration(), "0.00"), ATTR_CALL, segment.getCall(), ATTR_CALL_DURATION, toString(segment.getCallDuration(), "0.00"), ATTR_CACHE, segment.getCache(), ATTR_CACHE_DURATION, toString(segment.getCacheDuration(), "0.00"), ATTR_URL_ERROR, segment.getUrlError(), ATTR_URL_SUM, toString(segment.getUrlSum(), "0.00"), ATTR_SERVICE_ERROR, segment.getServiceError(), ATTR_SERVICE_SUM, toString(segment.getServiceSum(), "0.00"), ATTR_SQL_ERROR, segment.getSqlError(), ATTR_SQL_SUM, toString(segment.getSqlSum(), "0.00"), ATTR_CALL_ERROR, segment.getCallError(), ATTR_CALL_SUM, toString(segment.getCallSum(), "0.00"), ATTR_CACHE_ERROR, segment.getCacheError(), ATTR_CACHE_SUM, toString(segment.getCacheSum(), "0.00")); + + if (!segment.getErrors().isEmpty()) { + for (Error error : segment.getErrors().values()) { + error.accept(m_visitor); + } + } + + if (!segment.getMachines().isEmpty()) { + for (Machine machine : segment.getMachines().values()) { + machine.accept(m_visitor); + } + } + + endTag(ENTITY_SEGMENT); + } + + @Override + public void visitTopReport(TopReport topReport) { + startTag(ENTITY_TOP_REPORT, null, ATTR_DOMAIN, topReport.getDomain(), ATTR_STARTTIME, toString(topReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_ENDTIME, toString(topReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!topReport.getDomains().isEmpty()) { + for (Domain domain : topReport.getDomains().values()) { + domain.accept(m_visitor); + } + } + + endTag(ENTITY_TOP_REPORT); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/ILinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/ILinker.java new file mode 100644 index 0000000000..25c7832011 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/ILinker.java @@ -0,0 +1,18 @@ +package com.dianping.cat.consumer.top.model.transform; + +import com.dianping.cat.consumer.top.model.entity.Domain; +import com.dianping.cat.consumer.top.model.entity.Error; +import com.dianping.cat.consumer.top.model.entity.Machine; +import com.dianping.cat.consumer.top.model.entity.Segment; +import com.dianping.cat.consumer.top.model.entity.TopReport; + +public interface ILinker { + + public boolean onDomain(TopReport parent, Domain domain); + + public boolean onError(Segment parent, Error error); + + public boolean onMachine(Segment parent, Machine machine); + + public boolean onSegment(Domain parent, Segment segment); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/IMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/IMaker.java new file mode 100644 index 0000000000..7622f02582 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/IMaker.java @@ -0,0 +1,20 @@ +package com.dianping.cat.consumer.top.model.transform; + +import com.dianping.cat.consumer.top.model.entity.Domain; +import com.dianping.cat.consumer.top.model.entity.Error; +import com.dianping.cat.consumer.top.model.entity.Machine; +import com.dianping.cat.consumer.top.model.entity.Segment; +import com.dianping.cat.consumer.top.model.entity.TopReport; + +public interface IMaker { + + public Domain buildDomain(T node); + + public Error buildError(T node); + + public Machine buildMachine(T node); + + public Segment buildSegment(T node); + + public TopReport buildTopReport(T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/IParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/IParser.java new file mode 100644 index 0000000000..e6627cd697 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/top/model/transform/IParser.java @@ -0,0 +1,19 @@ +package com.dianping.cat.consumer.top.model.transform; + +import com.dianping.cat.consumer.top.model.entity.Domain; +import com.dianping.cat.consumer.top.model.entity.Error; +import com.dianping.cat.consumer.top.model.entity.Machine; +import com.dianping.cat.consumer.top.model.entity.Segment; +import com.dianping.cat.consumer.top.model.entity.TopReport; + +public interface IParser { + public TopReport parse(IMaker maker, ILinker linker, T node); + + public void parseForDomain(IMaker maker, ILinker linker, Domain parent, T node); + + public void parseForError(IMaker maker, ILinker linker, Error parent, T node); + + public void parseForMachine(IMaker maker, ILinker linker, Machine parent, T node); + + public void parseForSegment(IMaker maker, ILinker linker, Segment parent, T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/BaseEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/BaseEntity.java new file mode 100644 index 0000000000..87fe391cb5 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.consumer.transaction.model; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.consumer.transaction.model.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/Constants.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/Constants.java new file mode 100644 index 0000000000..d4d10ef15d --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/Constants.java @@ -0,0 +1,110 @@ +package com.dianping.cat.consumer.transaction.model; + +public class Constants { + + public static final String ATTR_AVG = "avg"; + + public static final String ATTR_COUNT = "count"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_DURATION = "duration"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_FAILCOUNT = "failCount"; + + public static final String ATTR_FAILPERCENT = "failPercent"; + + public static final String ATTR_FAILS = "fails"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_IP = "ip"; + + public static final String ATTR_LINE50VALUE = "line50Value"; + + public static final String ATTR_LINE90VALUE = "line90Value"; + + public static final String ATTR_LINE95VALUE = "line95Value"; + + public static final String ATTR_LINE9999VALUE = "line9999Value"; + + public static final String ATTR_LINE999VALUE = "line999Value"; + + public static final String ATTR_LINE99VALUE = "line99Value"; + + public static final String ATTR_MAX = "max"; + + public static final String ATTR_MIN = "min"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ATTR_STD = "std"; + + public static final String ATTR_SUM = "sum"; + + public static final String ATTR_SUM2 = "sum2"; + + public static final String ATTR_TOTALCOUNT = "totalCount"; + + public static final String ATTR_TPS = "tps"; + + public static final String ATTR_VALUE = "value"; + + public static final String ELEMENT_DOMAIN = "domain"; + + public static final String ELEMENT_DOMAIN_NAMES = "domain-names"; + + public static final String ELEMENT_FAILMESSAGEURL = "failMessageUrl"; + + public static final String ELEMENT_IP = "ip"; + + public static final String ELEMENT_IPS = "ips"; + + public static final String ELEMENT_LONGESTMESSAGEURL = "longestMessageUrl"; + + public static final String ELEMENT_SUCCESSMESSAGEURL = "successMessageUrl"; + + public static final String ENTITY_ALL_DURATION = "all-duration"; + + public static final String ENTITY_DURATION = "duration"; + + public static final String ENTITY_DURATIONS = "durations"; + + public static final String ENTITY_GRAPH = "graph"; + + public static final String ENTITY_GRAPHS = "graphs"; + + public static final String ENTITY_GRAPH_TREND = "graph-trend"; + + public static final String ENTITY_GRAPH2 = "graph2"; + + public static final String ENTITY_GRAPH2S = "graph2s"; + + public static final String ENTITY_MACHINE = "machine"; + + public static final String ENTITY_MACHINES = "machines"; + + public static final String ENTITY_NAME = "name"; + + public static final String ENTITY_NAMES = "names"; + + public static final String ENTITY_RANGE = "range"; + + public static final String ENTITY_RANGES = "ranges"; + + public static final String ENTITY_RANGE2 = "range2"; + + public static final String ENTITY_RANGE2S = "range2s"; + + public static final String ENTITY_STATUSCODE = "statusCode"; + + public static final String ENTITY_STATUSCODES = "statusCodes"; + + public static final String ENTITY_TRANSACTION_REPORT = "transaction-report"; + + public static final String ENTITY_TYPE = "type"; + + public static final String ENTITY_TYPES = "types"; +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/IEntity.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/IEntity.java new file mode 100644 index 0000000000..6d9f6b25f3 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.consumer.transaction.model; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/IVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/IVisitor.java new file mode 100644 index 0000000000..af8df89f50 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/IVisitor.java @@ -0,0 +1,41 @@ +package com.dianping.cat.consumer.transaction.model; + +import com.dianping.cat.consumer.transaction.model.entity.AllDuration; +import com.dianping.cat.consumer.transaction.model.entity.Duration; +import com.dianping.cat.consumer.transaction.model.entity.Graph; +import com.dianping.cat.consumer.transaction.model.entity.Graph2; +import com.dianping.cat.consumer.transaction.model.entity.GraphTrend; +import com.dianping.cat.consumer.transaction.model.entity.Machine; +import com.dianping.cat.consumer.transaction.model.entity.Range; +import com.dianping.cat.consumer.transaction.model.entity.Range2; +import com.dianping.cat.consumer.transaction.model.entity.StatusCode; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; + +public interface IVisitor { + + public void visitAllDuration(AllDuration allDuration); + + public void visitDuration(Duration duration); + + public void visitGraph(Graph graph); + + public void visitGraph2(Graph2 graph2); + + public void visitGraphTrend(GraphTrend graphTrend); + + public void visitMachine(Machine machine); + + public void visitName(TransactionName name); + + public void visitRange(Range range); + + public void visitRange2(Range2 range2); + + public void visitStatusCode(StatusCode statusCode); + + public void visitTransactionReport(TransactionReport transactionReport); + + public void visitType(TransactionType type); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/AllDuration.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/AllDuration.java new file mode 100644 index 0000000000..193d6f9e39 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/AllDuration.java @@ -0,0 +1,85 @@ +package com.dianping.cat.consumer.transaction.model.entity; + +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_ALL_DURATION; + +import com.dianping.cat.consumer.transaction.model.BaseEntity; +import com.dianping.cat.consumer.transaction.model.IVisitor; + +public class AllDuration extends BaseEntity { + private int m_value; + + private int m_count; + + public AllDuration() { + } + + public AllDuration(int value) { + m_value = value; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitAllDuration(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AllDuration) { + AllDuration _o = (AllDuration) obj; + + if (getValue() != _o.getValue()) { + return false; + } + + return true; + } + + return false; + } + + public int getCount() { + return m_count; + } + + public int getValue() { + return m_value; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + m_value; + + return hash; + } + + public AllDuration incCount() { + m_count++; + return this; + } + + public AllDuration incCount(int count) { + m_count += count; + return this; + } + + @Override + public void mergeAttributes(AllDuration other) { + assertAttributeEquals(other, ENTITY_ALL_DURATION, ATTR_VALUE, m_value, other.getValue()); + + m_count = other.getCount(); + } + + public AllDuration setCount(int count) { + m_count = count; + return this; + } + + public AllDuration setValue(int value) { + m_value = value; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Duration.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Duration.java new file mode 100644 index 0000000000..8fd9c51333 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Duration.java @@ -0,0 +1,85 @@ +package com.dianping.cat.consumer.transaction.model.entity; + +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_DURATION; + +import com.dianping.cat.consumer.transaction.model.BaseEntity; +import com.dianping.cat.consumer.transaction.model.IVisitor; + +public class Duration extends BaseEntity { + private int m_value; + + private int m_count; + + public Duration() { + } + + public Duration(int value) { + m_value = value; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDuration(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Duration) { + Duration _o = (Duration) obj; + + if (getValue() != _o.getValue()) { + return false; + } + + return true; + } + + return false; + } + + public int getCount() { + return m_count; + } + + public int getValue() { + return m_value; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + m_value; + + return hash; + } + + public Duration incCount() { + m_count++; + return this; + } + + public Duration incCount(int count) { + m_count += count; + return this; + } + + @Override + public void mergeAttributes(Duration other) { + assertAttributeEquals(other, ENTITY_DURATION, ATTR_VALUE, m_value, other.getValue()); + + m_count = other.getCount(); + } + + public Duration setCount(int count) { + m_count = count; + return this; + } + + public Duration setValue(int value) { + m_value = value; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Graph.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Graph.java new file mode 100644 index 0000000000..9c637f491e --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Graph.java @@ -0,0 +1,114 @@ +package com.dianping.cat.consumer.transaction.model.entity; + +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_DURATION; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_GRAPH; + +import com.dianping.cat.consumer.transaction.model.BaseEntity; +import com.dianping.cat.consumer.transaction.model.IVisitor; + +public class Graph extends BaseEntity { + private int m_duration; + + private String m_sum = ""; + + private String m_avg = ""; + + private String m_count = ""; + + private String m_fails = ""; + + public Graph() { + } + + public Graph(int duration) { + m_duration = duration; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitGraph(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Graph) { + Graph _o = (Graph) obj; + + if (getDuration() != _o.getDuration()) { + return false; + } + + return true; + } + + return false; + } + + public String getAvg() { + return m_avg; + } + + public String getCount() { + return m_count; + } + + public int getDuration() { + return m_duration; + } + + public String getFails() { + return m_fails; + } + + public String getSum() { + return m_sum; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + m_duration; + + return hash; + } + + @Override + public void mergeAttributes(Graph other) { + assertAttributeEquals(other, ENTITY_GRAPH, ATTR_DURATION, m_duration, other.getDuration()); + + m_sum = other.getSum(); + + m_avg = other.getAvg(); + + m_count = other.getCount(); + + m_fails = other.getFails(); + } + + public Graph setAvg(String avg) { + m_avg = avg; + return this; + } + + public Graph setCount(String count) { + m_count = count; + return this; + } + + public Graph setDuration(int duration) { + m_duration = duration; + return this; + } + + public Graph setFails(String fails) { + m_fails = fails; + return this; + } + + public Graph setSum(String sum) { + m_sum = sum; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Graph2.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Graph2.java new file mode 100644 index 0000000000..22ef5a1c8f --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Graph2.java @@ -0,0 +1,114 @@ +package com.dianping.cat.consumer.transaction.model.entity; + +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_DURATION; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_GRAPH2; + +import com.dianping.cat.consumer.transaction.model.BaseEntity; +import com.dianping.cat.consumer.transaction.model.IVisitor; + +public class Graph2 extends BaseEntity { + private int m_duration; + + private String m_sum = ""; + + private String m_avg = ""; + + private String m_count = ""; + + private String m_fails = ""; + + public Graph2() { + } + + public Graph2(int duration) { + m_duration = duration; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitGraph2(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Graph2) { + Graph2 _o = (Graph2) obj; + + if (getDuration() != _o.getDuration()) { + return false; + } + + return true; + } + + return false; + } + + public String getAvg() { + return m_avg; + } + + public String getCount() { + return m_count; + } + + public int getDuration() { + return m_duration; + } + + public String getFails() { + return m_fails; + } + + public String getSum() { + return m_sum; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + m_duration; + + return hash; + } + + @Override + public void mergeAttributes(Graph2 other) { + assertAttributeEquals(other, ENTITY_GRAPH2, ATTR_DURATION, m_duration, other.getDuration()); + + m_sum = other.getSum(); + + m_avg = other.getAvg(); + + m_count = other.getCount(); + + m_fails = other.getFails(); + } + + public Graph2 setAvg(String avg) { + m_avg = avg; + return this; + } + + public Graph2 setCount(String count) { + m_count = count; + return this; + } + + public Graph2 setDuration(int duration) { + m_duration = duration; + return this; + } + + public Graph2 setFails(String fails) { + m_fails = fails; + return this; + } + + public Graph2 setSum(String sum) { + m_sum = sum; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/GraphTrend.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/GraphTrend.java new file mode 100644 index 0000000000..12076751c9 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/GraphTrend.java @@ -0,0 +1,114 @@ +package com.dianping.cat.consumer.transaction.model.entity; + +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_DURATION; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_GRAPH_TREND; + +import com.dianping.cat.consumer.transaction.model.BaseEntity; +import com.dianping.cat.consumer.transaction.model.IVisitor; + +public class GraphTrend extends BaseEntity { + private int m_duration; + + private String m_sum = ""; + + private String m_avg = ""; + + private String m_count = ""; + + private String m_fails = ""; + + public GraphTrend() { + } + + public GraphTrend(int duration) { + m_duration = duration; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitGraphTrend(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof GraphTrend) { + GraphTrend _o = (GraphTrend) obj; + + if (getDuration() != _o.getDuration()) { + return false; + } + + return true; + } + + return false; + } + + public String getAvg() { + return m_avg; + } + + public String getCount() { + return m_count; + } + + public int getDuration() { + return m_duration; + } + + public String getFails() { + return m_fails; + } + + public String getSum() { + return m_sum; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + m_duration; + + return hash; + } + + @Override + public void mergeAttributes(GraphTrend other) { + assertAttributeEquals(other, ENTITY_GRAPH_TREND, ATTR_DURATION, m_duration, other.getDuration()); + + m_sum = other.getSum(); + + m_avg = other.getAvg(); + + m_count = other.getCount(); + + m_fails = other.getFails(); + } + + public GraphTrend setAvg(String avg) { + m_avg = avg; + return this; + } + + public GraphTrend setCount(String count) { + m_count = count; + return this; + } + + public GraphTrend setDuration(int duration) { + m_duration = duration; + return this; + } + + public GraphTrend setFails(String fails) { + m_fails = fails; + return this; + } + + public GraphTrend setSum(String sum) { + m_sum = sum; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Machine.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Machine.java new file mode 100644 index 0000000000..a62c0db08b --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Machine.java @@ -0,0 +1,102 @@ +package com.dianping.cat.consumer.transaction.model.entity; + +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_MACHINE; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.dianping.cat.consumer.transaction.model.BaseEntity; +import com.dianping.cat.consumer.transaction.model.IVisitor; + +public class Machine extends BaseEntity { + private String m_ip; + + private Map m_types = new ConcurrentHashMap(); + + public Machine() { + } + + public Machine(String ip) { + m_ip = ip; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMachine(this); + } + + public Machine addType(TransactionType type) { + m_types.put(type.getId(), type); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Machine) { + Machine _o = (Machine) obj; + + if (!equals(getIp(), _o.getIp())) { + return false; + } + + return true; + } + + return false; + } + + public TransactionType findType(String id) { + return m_types.get(id); + } + + public TransactionType findOrCreateType(String id) { + TransactionType type = m_types.get(id); + + if (type == null) { + synchronized (m_types) { + type = m_types.get(id); + + if (type == null) { + type = new TransactionType(id); + m_types.put(id, type); + } + } + } + + return type; + } + + public String getIp() { + return m_ip; + } + + public Map getTypes() { + return m_types; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_ip == null ? 0 : m_ip.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Machine other) { + assertAttributeEquals(other, ENTITY_MACHINE, ATTR_IP, m_ip, other.getIp()); + + } + + public TransactionType removeType(String id) { + return m_types.remove(id); + } + + public Machine setIp(String ip) { + m_ip = ip; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Range.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Range.java new file mode 100644 index 0000000000..e53e8f0061 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Range.java @@ -0,0 +1,294 @@ +package com.dianping.cat.consumer.transaction.model.entity; + +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_RANGE; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.dianping.cat.consumer.transaction.model.BaseEntity; +import com.dianping.cat.consumer.transaction.model.IVisitor; + +public class Range extends BaseEntity { + private int m_value; + + private int m_count; + + private double m_sum; + + private double m_avg; + + private int m_fails; + + private double m_min = 86400000d; + + private double m_max = -1d; + + private double m_line95Value; + + private double m_line99Value; + + private double m_line999Value; + + private double m_line90Value; + + private transient Map m_allDurations = new ConcurrentHashMap(); + + private transient boolean m_clearDuration; + + private double m_line50Value; + + private double m_line9999Value; + + public Range() { + } + + public Range(int value) { + m_value = value; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitRange(this); + } + + public Range addAllDuration(AllDuration allDuration) { + m_allDurations.put(allDuration.getValue(), allDuration); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Range) { + Range _o = (Range) obj; + + if (getValue() != _o.getValue()) { + return false; + } + + return true; + } + + return false; + } + + public AllDuration findAllDuration(int value) { + return m_allDurations.get(value); + } + + public AllDuration findOrCreateAllDuration(int value) { + AllDuration allDuration = m_allDurations.get(value); + + if (allDuration == null) { + synchronized (m_allDurations) { + allDuration = m_allDurations.get(value); + + if (allDuration == null) { + allDuration = new AllDuration(value); + m_allDurations.put(value, allDuration); + } + } + } + + return allDuration; + } + + public Map getAllDurations() { + return m_allDurations; + } + + public double getAvg() { + return m_avg; + } + + public boolean getClearDuration() { + return m_clearDuration; + } + + public int getCount() { + return m_count; + } + + public int getFails() { + return m_fails; + } + + public double getLine50Value() { + return m_line50Value; + } + + public double getLine90Value() { + return m_line90Value; + } + + public double getLine95Value() { + return m_line95Value; + } + + public double getLine9999Value() { + return m_line9999Value; + } + + public double getLine999Value() { + return m_line999Value; + } + + public double getLine99Value() { + return m_line99Value; + } + + public double getMax() { + return m_max; + } + + public double getMin() { + return m_min; + } + + public double getSum() { + return m_sum; + } + + public int getValue() { + return m_value; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + m_value; + + return hash; + } + + public Range incCount() { + m_count++; + return this; + } + + public Range incCount(int count) { + m_count += count; + return this; + } + + public Range incFails() { + m_fails++; + return this; + } + + public Range incFails(int fails) { + m_fails += fails; + return this; + } + + public boolean isClearDuration() { + return m_clearDuration; + } + + @Override + public void mergeAttributes(Range other) { + assertAttributeEquals(other, ENTITY_RANGE, ATTR_VALUE, m_value, other.getValue()); + + m_count = other.getCount(); + + m_sum = other.getSum(); + + m_avg = other.getAvg(); + + m_fails = other.getFails(); + + m_min = other.getMin(); + + m_max = other.getMax(); + + m_line95Value = other.getLine95Value(); + + m_line99Value = other.getLine99Value(); + + m_line999Value = other.getLine999Value(); + + m_line90Value = other.getLine90Value(); + + m_clearDuration = other.getClearDuration(); + + m_line50Value = other.getLine50Value(); + + m_line9999Value = other.getLine9999Value(); + } + + public AllDuration removeAllDuration(int value) { + return m_allDurations.remove(value); + } + + public Range setAvg(double avg) { + m_avg = avg; + return this; + } + + public Range setClearDuration(boolean clearDuration) { + m_clearDuration = clearDuration; + return this; + } + + public Range setCount(int count) { + m_count = count; + return this; + } + + public Range setFails(int fails) { + m_fails = fails; + return this; + } + + public Range setLine50Value(double line50Value) { + m_line50Value = line50Value; + return this; + } + + public Range setLine90Value(double line90Value) { + m_line90Value = line90Value; + return this; + } + + public Range setLine95Value(double line95Value) { + m_line95Value = line95Value; + return this; + } + + public Range setLine9999Value(double line9999Value) { + m_line9999Value = line9999Value; + return this; + } + + public Range setLine999Value(double line999Value) { + m_line999Value = line999Value; + return this; + } + + public Range setLine99Value(double line99Value) { + m_line99Value = line99Value; + return this; + } + + public Range setMax(double max) { + m_max = max; + return this; + } + + public Range setMin(double min) { + m_min = min; + return this; + } + + public Range setSum(double sum) { + m_sum = sum; + return this; + } + + public Range setValue(int value) { + m_value = value; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Range2.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Range2.java new file mode 100644 index 0000000000..fc961db903 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/Range2.java @@ -0,0 +1,294 @@ +package com.dianping.cat.consumer.transaction.model.entity; + +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_RANGE2; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.dianping.cat.consumer.transaction.model.BaseEntity; +import com.dianping.cat.consumer.transaction.model.IVisitor; + +public class Range2 extends BaseEntity { + private int m_value; + + private int m_count; + + private double m_sum; + + private double m_avg; + + private int m_fails; + + private double m_min = 86400000d; + + private double m_max = -1d; + + private double m_line95Value; + + private double m_line99Value; + + private double m_line999Value; + + private double m_line90Value; + + private transient Map m_allDurations = new ConcurrentHashMap(); + + private transient boolean m_clearDuration; + + private double m_line50Value; + + private double m_line9999Value; + + public Range2() { + } + + public Range2(int value) { + m_value = value; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitRange2(this); + } + + public Range2 addAllDuration(AllDuration allDuration) { + m_allDurations.put(allDuration.getValue(), allDuration); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Range2) { + Range2 _o = (Range2) obj; + + if (getValue() != _o.getValue()) { + return false; + } + + return true; + } + + return false; + } + + public AllDuration findAllDuration(int value) { + return m_allDurations.get(value); + } + + public AllDuration findOrCreateAllDuration(int value) { + AllDuration allDuration = m_allDurations.get(value); + + if (allDuration == null) { + synchronized (m_allDurations) { + allDuration = m_allDurations.get(value); + + if (allDuration == null) { + allDuration = new AllDuration(value); + m_allDurations.put(value, allDuration); + } + } + } + + return allDuration; + } + + public Map getAllDurations() { + return m_allDurations; + } + + public double getAvg() { + return m_avg; + } + + public boolean getClearDuration() { + return m_clearDuration; + } + + public int getCount() { + return m_count; + } + + public int getFails() { + return m_fails; + } + + public double getLine50Value() { + return m_line50Value; + } + + public double getLine90Value() { + return m_line90Value; + } + + public double getLine95Value() { + return m_line95Value; + } + + public double getLine9999Value() { + return m_line9999Value; + } + + public double getLine999Value() { + return m_line999Value; + } + + public double getLine99Value() { + return m_line99Value; + } + + public double getMax() { + return m_max; + } + + public double getMin() { + return m_min; + } + + public double getSum() { + return m_sum; + } + + public int getValue() { + return m_value; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + m_value; + + return hash; + } + + public Range2 incCount() { + m_count++; + return this; + } + + public Range2 incCount(int count) { + m_count += count; + return this; + } + + public Range2 incFails() { + m_fails++; + return this; + } + + public Range2 incFails(int fails) { + m_fails += fails; + return this; + } + + public boolean isClearDuration() { + return m_clearDuration; + } + + @Override + public void mergeAttributes(Range2 other) { + assertAttributeEquals(other, ENTITY_RANGE2, ATTR_VALUE, m_value, other.getValue()); + + m_count = other.getCount(); + + m_sum = other.getSum(); + + m_avg = other.getAvg(); + + m_fails = other.getFails(); + + m_min = other.getMin(); + + m_max = other.getMax(); + + m_line95Value = other.getLine95Value(); + + m_line99Value = other.getLine99Value(); + + m_line999Value = other.getLine999Value(); + + m_line90Value = other.getLine90Value(); + + m_clearDuration = other.getClearDuration(); + + m_line50Value = other.getLine50Value(); + + m_line9999Value = other.getLine9999Value(); + } + + public AllDuration removeAllDuration(int value) { + return m_allDurations.remove(value); + } + + public Range2 setAvg(double avg) { + m_avg = avg; + return this; + } + + public Range2 setClearDuration(boolean clearDuration) { + m_clearDuration = clearDuration; + return this; + } + + public Range2 setCount(int count) { + m_count = count; + return this; + } + + public Range2 setFails(int fails) { + m_fails = fails; + return this; + } + + public Range2 setLine50Value(double line50Value) { + m_line50Value = line50Value; + return this; + } + + public Range2 setLine90Value(double line90Value) { + m_line90Value = line90Value; + return this; + } + + public Range2 setLine95Value(double line95Value) { + m_line95Value = line95Value; + return this; + } + + public Range2 setLine9999Value(double line9999Value) { + m_line9999Value = line9999Value; + return this; + } + + public Range2 setLine999Value(double line999Value) { + m_line999Value = line999Value; + return this; + } + + public Range2 setLine99Value(double line99Value) { + m_line99Value = line99Value; + return this; + } + + public Range2 setMax(double max) { + m_max = max; + return this; + } + + public Range2 setMin(double min) { + m_min = min; + return this; + } + + public Range2 setSum(double sum) { + m_sum = sum; + return this; + } + + public Range2 setValue(int value) { + m_value = value; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/StatusCode.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/StatusCode.java new file mode 100644 index 0000000000..3a2915b289 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/StatusCode.java @@ -0,0 +1,85 @@ +package com.dianping.cat.consumer.transaction.model.entity; + +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_STATUSCODE; + +import com.dianping.cat.consumer.transaction.model.BaseEntity; +import com.dianping.cat.consumer.transaction.model.IVisitor; + +public class StatusCode extends BaseEntity { + private String m_id; + + private long m_count; + + public StatusCode() { + } + + public StatusCode(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitStatusCode(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StatusCode) { + StatusCode _o = (StatusCode) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public long getCount() { + return m_count; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public StatusCode incCount() { + m_count++; + return this; + } + + public StatusCode incCount(long count) { + m_count += count; + return this; + } + + @Override + public void mergeAttributes(StatusCode other) { + assertAttributeEquals(other, ENTITY_STATUSCODE, ATTR_ID, m_id, other.getId()); + + m_count = other.getCount(); + } + + public StatusCode setCount(long count) { + m_count = count; + return this; + } + + public StatusCode setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/TransactionName.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/TransactionName.java new file mode 100644 index 0000000000..82ef03f371 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/TransactionName.java @@ -0,0 +1,530 @@ +package com.dianping.cat.consumer.transaction.model.entity; + +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_NAME; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.dianping.cat.consumer.transaction.model.BaseEntity; +import com.dianping.cat.consumer.transaction.model.IVisitor; + +public class TransactionName extends BaseEntity { + private String m_id; + + private long m_totalCount; + + private long m_failCount; + + private double m_failPercent; + + private double m_min = 86400000d; + + private double m_max = -1d; + + private double m_avg; + + private double m_sum; + + private double m_sum2; + + private double m_std; + + private String m_successMessageUrl; + + private String m_failMessageUrl; + + private Map m_ranges = new ConcurrentHashMap(); + + private Map m_durations = new ConcurrentHashMap(); + + private transient double m_totalPercent; + + private double m_tps; + + private double m_line95Value; + + private double m_line99Value; + + private double m_line999Value; + + private double m_line90Value; + + private Map m_graphs = new ConcurrentHashMap(); + + private transient Map m_allDurations = new ConcurrentHashMap(); + + private GraphTrend m_graphTrend; + + private Map m_statusCodes = new ConcurrentHashMap(); + + private double m_line50Value; + + private double m_line9999Value; + + private String m_longestMessageUrl; + + public TransactionName() { + } + + public TransactionName(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitName(this); + } + + public TransactionName addAllDuration(AllDuration allDuration) { + m_allDurations.put(allDuration.getValue(), allDuration); + return this; + } + + public TransactionName addDuration(Duration duration) { + m_durations.put(duration.getValue(), duration); + return this; + } + + public TransactionName addGraph(Graph graph) { + m_graphs.put(graph.getDuration(), graph); + return this; + } + + public TransactionName addRange(Range range) { + m_ranges.put(range.getValue(), range); + return this; + } + + public TransactionName addStatusCode(StatusCode statusCode) { + m_statusCodes.put(statusCode.getId(), statusCode); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TransactionName) { + TransactionName _o = (TransactionName) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public AllDuration findAllDuration(int value) { + return m_allDurations.get(value); + } + + public Duration findDuration(int value) { + return m_durations.get(value); + } + + public Graph findGraph(int duration) { + return m_graphs.get(duration); + } + + public Range findRange(int value) { + return m_ranges.get(value); + } + + public StatusCode findStatusCode(String id) { + return m_statusCodes.get(id); + } + + public AllDuration findOrCreateAllDuration(int value) { + AllDuration allDuration = m_allDurations.get(value); + + if (allDuration == null) { + synchronized (m_allDurations) { + allDuration = m_allDurations.get(value); + + if (allDuration == null) { + allDuration = new AllDuration(value); + m_allDurations.put(value, allDuration); + } + } + } + + return allDuration; + } + + public Duration findOrCreateDuration(int value) { + Duration duration = m_durations.get(value); + + if (duration == null) { + synchronized (m_durations) { + duration = m_durations.get(value); + + if (duration == null) { + duration = new Duration(value); + m_durations.put(value, duration); + } + } + } + + return duration; + } + + public Graph findOrCreateGraph(int duration) { + Graph graph = m_graphs.get(duration); + + if (graph == null) { + synchronized (m_graphs) { + graph = m_graphs.get(duration); + + if (graph == null) { + graph = new Graph(duration); + m_graphs.put(duration, graph); + } + } + } + + return graph; + } + + public Range findOrCreateRange(int value) { + Range range = m_ranges.get(value); + + if (range == null) { + synchronized (m_ranges) { + range = m_ranges.get(value); + + if (range == null) { + range = new Range(value); + m_ranges.put(value, range); + } + } + } + + return range; + } + + public StatusCode findOrCreateStatusCode(String id) { + StatusCode statusCode = m_statusCodes.get(id); + + if (statusCode == null) { + synchronized (m_statusCodes) { + statusCode = m_statusCodes.get(id); + + if (statusCode == null) { + statusCode = new StatusCode(id); + m_statusCodes.put(id, statusCode); + } + } + } + + return statusCode; + } + + public Map getAllDurations() { + return m_allDurations; + } + + public double getAvg() { + return m_avg; + } + + public Map getDurations() { + return m_durations; + } + + public long getFailCount() { + return m_failCount; + } + + public String getFailMessageUrl() { + return m_failMessageUrl; + } + + public double getFailPercent() { + return m_failPercent; + } + + public Map getGraphs() { + return m_graphs; + } + + public GraphTrend getGraphTrend() { + return m_graphTrend; + } + + public String getId() { + return m_id; + } + + public double getLine50Value() { + return m_line50Value; + } + + public double getLine90Value() { + return m_line90Value; + } + + public double getLine95Value() { + return m_line95Value; + } + + public double getLine9999Value() { + return m_line9999Value; + } + + public double getLine999Value() { + return m_line999Value; + } + + public double getLine99Value() { + return m_line99Value; + } + + public String getLongestMessageUrl() { + return m_longestMessageUrl; + } + + public double getMax() { + return m_max; + } + + public double getMin() { + return m_min; + } + + public Map getRanges() { + return m_ranges; + } + + public Map getStatusCodes() { + return m_statusCodes; + } + + public double getStd() { + return m_std; + } + + public String getSuccessMessageUrl() { + return m_successMessageUrl; + } + + public double getSum() { + return m_sum; + } + + public double getSum2() { + return m_sum2; + } + + public long getTotalCount() { + return m_totalCount; + } + + public double getTotalPercent() { + return m_totalPercent; + } + + public double getTps() { + return m_tps; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public TransactionName incFailCount() { + m_failCount++; + return this; + } + + public TransactionName incFailCount(long failCount) { + m_failCount += failCount; + return this; + } + + public TransactionName incTotalCount() { + m_totalCount++; + return this; + } + + public TransactionName incTotalCount(long totalCount) { + m_totalCount += totalCount; + return this; + } + + @Override + public void mergeAttributes(TransactionName other) { + assertAttributeEquals(other, ENTITY_NAME, ATTR_ID, m_id, other.getId()); + + m_totalCount = other.getTotalCount(); + + m_failCount = other.getFailCount(); + + m_failPercent = other.getFailPercent(); + + m_min = other.getMin(); + + m_max = other.getMax(); + + m_avg = other.getAvg(); + + m_sum = other.getSum(); + + m_sum2 = other.getSum2(); + + m_std = other.getStd(); + + m_totalPercent = other.getTotalPercent(); + + m_tps = other.getTps(); + + m_line95Value = other.getLine95Value(); + + m_line99Value = other.getLine99Value(); + + m_line999Value = other.getLine999Value(); + + m_line90Value = other.getLine90Value(); + + m_line50Value = other.getLine50Value(); + + m_line9999Value = other.getLine9999Value(); + } + + public AllDuration removeAllDuration(int value) { + return m_allDurations.remove(value); + } + + public Duration removeDuration(int value) { + return m_durations.remove(value); + } + + public Graph removeGraph(int duration) { + return m_graphs.remove(duration); + } + + public Range removeRange(int value) { + return m_ranges.remove(value); + } + + public StatusCode removeStatusCode(String id) { + return m_statusCodes.remove(id); + } + + public TransactionName setAvg(double avg) { + m_avg = avg; + return this; + } + + public TransactionName setFailCount(long failCount) { + m_failCount = failCount; + return this; + } + + public TransactionName setFailMessageUrl(String failMessageUrl) { + m_failMessageUrl = failMessageUrl; + return this; + } + + public TransactionName setFailPercent(double failPercent) { + m_failPercent = failPercent; + return this; + } + + public TransactionName setGraphTrend(GraphTrend graphTrend) { + m_graphTrend = graphTrend; + return this; + } + + public TransactionName setId(String id) { + m_id = id; + return this; + } + + public TransactionName setLine50Value(double line50Value) { + m_line50Value = line50Value; + return this; + } + + public TransactionName setLine90Value(double line90Value) { + m_line90Value = line90Value; + return this; + } + + public TransactionName setLine95Value(double line95Value) { + m_line95Value = line95Value; + return this; + } + + public TransactionName setLine9999Value(double line9999Value) { + m_line9999Value = line9999Value; + return this; + } + + public TransactionName setLine999Value(double line999Value) { + m_line999Value = line999Value; + return this; + } + + public TransactionName setLine99Value(double line99Value) { + m_line99Value = line99Value; + return this; + } + + public TransactionName setLongestMessageUrl(String longestMessageUrl) { + m_longestMessageUrl = longestMessageUrl; + return this; + } + + public TransactionName setMax(double max) { + m_max = max; + return this; + } + + public TransactionName setMin(double min) { + m_min = min; + return this; + } + + public TransactionName setStd(double std) { + m_std = std; + return this; + } + + public TransactionName setSuccessMessageUrl(String successMessageUrl) { + m_successMessageUrl = successMessageUrl; + return this; + } + + public TransactionName setSum(double sum) { + m_sum = sum; + return this; + } + + public TransactionName setSum2(double sum2) { + m_sum2 = sum2; + return this; + } + + public TransactionName setTotalCount(long totalCount) { + m_totalCount = totalCount; + return this; + } + + public TransactionName setTotalPercent(double totalPercent) { + m_totalPercent = totalPercent; + return this; + } + + public TransactionName setTps(double tps) { + m_tps = tps; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/TransactionReport.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/TransactionReport.java new file mode 100644 index 0000000000..2157aae3ed --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/TransactionReport.java @@ -0,0 +1,155 @@ +package com.dianping.cat.consumer.transaction.model.entity; + +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_TRANSACTION_REPORT; + +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import com.dianping.cat.consumer.transaction.model.BaseEntity; +import com.dianping.cat.consumer.transaction.model.IVisitor; + +public class TransactionReport extends BaseEntity { + private String m_domain; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Set m_domainNames = new LinkedHashSet(); + + private Map m_machines = new ConcurrentHashMap(); + + private Set m_ips = new LinkedHashSet(); + + public TransactionReport() { + } + + public TransactionReport(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitTransactionReport(this); + } + + public TransactionReport addDomain(String domain) { + m_domainNames.add(domain); + return this; + } + + public TransactionReport addIp(String ip) { + m_ips.add(ip); + return this; + } + + public TransactionReport addMachine(Machine machine) { + m_machines.put(machine.getIp(), machine); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TransactionReport) { + TransactionReport _o = (TransactionReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public Machine findMachine(String ip) { + return m_machines.get(ip); + } + + public Machine findOrCreateMachine(String ip) { + Machine machine = m_machines.get(ip); + + if (machine == null) { + synchronized (m_machines) { + machine = m_machines.get(ip); + + if (machine == null) { + machine = new Machine(ip); + m_machines.put(ip, machine); + } + } + } + + return machine; + } + + public String getDomain() { + return m_domain; + } + + public Set getDomainNames() { + return m_domainNames; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public Set getIps() { + return m_ips; + } + + public Map getMachines() { + return m_machines; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(TransactionReport other) { + assertAttributeEquals(other, ENTITY_TRANSACTION_REPORT, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Machine removeMachine(String ip) { + return m_machines.remove(ip); + } + + public TransactionReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public TransactionReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public TransactionReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/TransactionType.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/TransactionType.java new file mode 100644 index 0000000000..18a227e3db --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/entity/TransactionType.java @@ -0,0 +1,500 @@ +package com.dianping.cat.consumer.transaction.model.entity; + +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_TYPE; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.dianping.cat.consumer.transaction.model.BaseEntity; +import com.dianping.cat.consumer.transaction.model.IVisitor; + +public class TransactionType extends BaseEntity { + private String m_id; + + private long m_totalCount; + + private long m_failCount; + + private double m_failPercent; + + private double m_min = 86400000d; + + private double m_max = -1d; + + private double m_avg; + + private double m_sum; + + private double m_sum2; + + private double m_std; + + private String m_successMessageUrl; + + private String m_failMessageUrl; + + private Map m_names = new ConcurrentHashMap(); + + private double m_tps; + + private double m_line95Value; + + private double m_line99Value; + + private double m_line999Value; + + private double m_line90Value; + + private Map m_graph2s = new ConcurrentHashMap(); + + private transient Map m_allDurations = new ConcurrentHashMap(); + + private GraphTrend m_graphTrend; + + private Map m_range2s = new ConcurrentHashMap(); + + private double m_line50Value; + + private double m_line9999Value; + + private String m_longestMessageUrl; + + private Map m_dynamicAttributes = new LinkedHashMap(); + + public TransactionType() { + } + + public TransactionType(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitType(this); + } + + public TransactionType addAllDuration(AllDuration allDuration) { + m_allDurations.put(allDuration.getValue(), allDuration); + return this; + } + + public TransactionType addGraph2(Graph2 graph2) { + m_graph2s.put(graph2.getDuration(), graph2); + return this; + } + + public TransactionType addName(TransactionName name) { + m_names.put(name.getId(), name); + return this; + } + + public TransactionType addRange2(Range2 range2) { + m_range2s.put(range2.getValue(), range2); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TransactionType) { + TransactionType _o = (TransactionType) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public AllDuration findAllDuration(int value) { + return m_allDurations.get(value); + } + + public Graph2 findGraph2(int duration) { + return m_graph2s.get(duration); + } + + public TransactionName findName(String id) { + return m_names.get(id); + } + + public Range2 findRange2(int value) { + return m_range2s.get(value); + } + + public AllDuration findOrCreateAllDuration(int value) { + AllDuration allDuration = m_allDurations.get(value); + + if (allDuration == null) { + synchronized (m_allDurations) { + allDuration = m_allDurations.get(value); + + if (allDuration == null) { + allDuration = new AllDuration(value); + m_allDurations.put(value, allDuration); + } + } + } + + return allDuration; + } + + public Graph2 findOrCreateGraph2(int duration) { + Graph2 graph2 = m_graph2s.get(duration); + + if (graph2 == null) { + synchronized (m_graph2s) { + graph2 = m_graph2s.get(duration); + + if (graph2 == null) { + graph2 = new Graph2(duration); + m_graph2s.put(duration, graph2); + } + } + } + + return graph2; + } + + public TransactionName findOrCreateName(String id) { + TransactionName name = m_names.get(id); + + if (name == null) { + synchronized (m_names) { + name = m_names.get(id); + + if (name == null) { + name = new TransactionName(id); + m_names.put(id, name); + } + } + } + + return name; + } + + public Range2 findOrCreateRange2(int value) { + Range2 range2 = m_range2s.get(value); + + if (range2 == null) { + synchronized (m_range2s) { + range2 = m_range2s.get(value); + + if (range2 == null) { + range2 = new Range2(value); + m_range2s.put(value, range2); + } + } + } + + return range2; + } + + public String getDynamicAttribute(String name) { + return m_dynamicAttributes.get(name); + } + + public Map getDynamicAttributes() { + return m_dynamicAttributes; + } + + public Map getAllDurations() { + return m_allDurations; + } + + public double getAvg() { + return m_avg; + } + + public long getFailCount() { + return m_failCount; + } + + public String getFailMessageUrl() { + return m_failMessageUrl; + } + + public double getFailPercent() { + return m_failPercent; + } + + public Map getGraph2s() { + return m_graph2s; + } + + public GraphTrend getGraphTrend() { + return m_graphTrend; + } + + public String getId() { + return m_id; + } + + public double getLine50Value() { + return m_line50Value; + } + + public double getLine90Value() { + return m_line90Value; + } + + public double getLine95Value() { + return m_line95Value; + } + + public double getLine9999Value() { + return m_line9999Value; + } + + public double getLine999Value() { + return m_line999Value; + } + + public double getLine99Value() { + return m_line99Value; + } + + public String getLongestMessageUrl() { + return m_longestMessageUrl; + } + + public double getMax() { + return m_max; + } + + public double getMin() { + return m_min; + } + + public Map getNames() { + return m_names; + } + + public Map getRange2s() { + return m_range2s; + } + + public double getStd() { + return m_std; + } + + public String getSuccessMessageUrl() { + return m_successMessageUrl; + } + + public double getSum() { + return m_sum; + } + + public double getSum2() { + return m_sum2; + } + + public long getTotalCount() { + return m_totalCount; + } + + public double getTps() { + return m_tps; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public TransactionType incFailCount() { + m_failCount++; + return this; + } + + public TransactionType incFailCount(long failCount) { + m_failCount += failCount; + return this; + } + + public TransactionType incTotalCount() { + m_totalCount++; + return this; + } + + public TransactionType incTotalCount(long totalCount) { + m_totalCount += totalCount; + return this; + } + + @Override + public void mergeAttributes(TransactionType other) { + assertAttributeEquals(other, ENTITY_TYPE, ATTR_ID, m_id, other.getId()); + + for (Map.Entry e : other.getDynamicAttributes().entrySet()) { + m_dynamicAttributes.put(e.getKey(), e.getValue()); + } + + m_totalCount = other.getTotalCount(); + + m_failCount = other.getFailCount(); + + m_failPercent = other.getFailPercent(); + + m_min = other.getMin(); + + m_max = other.getMax(); + + m_avg = other.getAvg(); + + m_sum = other.getSum(); + + m_sum2 = other.getSum2(); + + m_std = other.getStd(); + + m_tps = other.getTps(); + + m_line95Value = other.getLine95Value(); + + m_line99Value = other.getLine99Value(); + + m_line999Value = other.getLine999Value(); + + m_line90Value = other.getLine90Value(); + + m_line50Value = other.getLine50Value(); + + m_line9999Value = other.getLine9999Value(); + } + + public AllDuration removeAllDuration(int value) { + return m_allDurations.remove(value); + } + + public Graph2 removeGraph2(int duration) { + return m_graph2s.remove(duration); + } + + public TransactionName removeName(String id) { + return m_names.remove(id); + } + + public Range2 removeRange2(int value) { + return m_range2s.remove(value); + } + + public void setDynamicAttribute(String name, String value) { + m_dynamicAttributes.put(name, value); + } + + public TransactionType setAvg(double avg) { + m_avg = avg; + return this; + } + + public TransactionType setFailCount(long failCount) { + m_failCount = failCount; + return this; + } + + public TransactionType setFailMessageUrl(String failMessageUrl) { + m_failMessageUrl = failMessageUrl; + return this; + } + + public TransactionType setFailPercent(double failPercent) { + m_failPercent = failPercent; + return this; + } + + public TransactionType setGraphTrend(GraphTrend graphTrend) { + m_graphTrend = graphTrend; + return this; + } + + public TransactionType setId(String id) { + m_id = id; + return this; + } + + public TransactionType setLine50Value(double line50Value) { + m_line50Value = line50Value; + return this; + } + + public TransactionType setLine90Value(double line90Value) { + m_line90Value = line90Value; + return this; + } + + public TransactionType setLine95Value(double line95Value) { + m_line95Value = line95Value; + return this; + } + + public TransactionType setLine9999Value(double line9999Value) { + m_line9999Value = line9999Value; + return this; + } + + public TransactionType setLine999Value(double line999Value) { + m_line999Value = line999Value; + return this; + } + + public TransactionType setLine99Value(double line99Value) { + m_line99Value = line99Value; + return this; + } + + public TransactionType setLongestMessageUrl(String longestMessageUrl) { + m_longestMessageUrl = longestMessageUrl; + return this; + } + + public TransactionType setMax(double max) { + m_max = max; + return this; + } + + public TransactionType setMin(double min) { + m_min = min; + return this; + } + + public TransactionType setStd(double std) { + m_std = std; + return this; + } + + public TransactionType setSuccessMessageUrl(String successMessageUrl) { + m_successMessageUrl = successMessageUrl; + return this; + } + + public TransactionType setSum(double sum) { + m_sum = sum; + return this; + } + + public TransactionType setSum2(double sum2) { + m_sum2 = sum2; + return this; + } + + public TransactionType setTotalCount(long totalCount) { + m_totalCount = totalCount; + return this; + } + + public TransactionType setTps(double tps) { + m_tps = tps; + return this; + } + +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/BaseVisitor.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/BaseVisitor.java new file mode 100644 index 0000000000..833a74f627 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/BaseVisitor.java @@ -0,0 +1,119 @@ +package com.dianping.cat.consumer.transaction.model.transform; + +import com.dianping.cat.consumer.transaction.model.IVisitor; +import com.dianping.cat.consumer.transaction.model.entity.AllDuration; +import com.dianping.cat.consumer.transaction.model.entity.Duration; +import com.dianping.cat.consumer.transaction.model.entity.Graph; +import com.dianping.cat.consumer.transaction.model.entity.Graph2; +import com.dianping.cat.consumer.transaction.model.entity.GraphTrend; +import com.dianping.cat.consumer.transaction.model.entity.Machine; +import com.dianping.cat.consumer.transaction.model.entity.Range; +import com.dianping.cat.consumer.transaction.model.entity.Range2; +import com.dianping.cat.consumer.transaction.model.entity.StatusCode; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitAllDuration(AllDuration allDuration) { + } + + @Override + public void visitDuration(Duration duration) { + } + + @Override + public void visitGraph(Graph graph) { + } + + @Override + public void visitGraph2(Graph2 graph2) { + } + + @Override + public void visitGraphTrend(GraphTrend graphTrend) { + } + + @Override + public void visitMachine(Machine machine) { + for (TransactionType type : machine.getTypes().values()) { + visitType(type); + } + } + + @Override + public void visitName(TransactionName name) { + for (Range range : name.getRanges().values()) { + visitRange(range); + } + + for (Duration duration : name.getDurations().values()) { + visitDuration(duration); + } + + for (Graph graph : name.getGraphs().values()) { + visitGraph(graph); + } + + for (AllDuration allDuration : name.getAllDurations().values()) { + visitAllDuration(allDuration); + } + + if (name.getGraphTrend() != null) { + visitGraphTrend(name.getGraphTrend()); + } + + for (StatusCode statusCode : name.getStatusCodes().values()) { + visitStatusCode(statusCode); + } + } + + @Override + public void visitRange(Range range) { + for (AllDuration allDuration : range.getAllDurations().values()) { + visitAllDuration(allDuration); + } + } + + @Override + public void visitRange2(Range2 range2) { + for (AllDuration allDuration : range2.getAllDurations().values()) { + visitAllDuration(allDuration); + } + } + + @Override + public void visitStatusCode(StatusCode statusCode) { + } + + @Override + public void visitTransactionReport(TransactionReport transactionReport) { + for (Machine machine : transactionReport.getMachines().values()) { + visitMachine(machine); + } + } + + @Override + public void visitType(TransactionType type) { + for (TransactionName name : type.getNames().values()) { + visitName(name); + } + + for (Graph2 graph2 : type.getGraph2s().values()) { + visitGraph2(graph2); + } + + for (AllDuration allDuration : type.getAllDurations().values()) { + visitAllDuration(allDuration); + } + + if (type.getGraphTrend() != null) { + visitGraphTrend(type.getGraphTrend()); + } + + for (Range2 range2 : type.getRange2s().values()) { + visitRange2(range2); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultLinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultLinker.java new file mode 100644 index 0000000000..85fb209d58 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultLinker.java @@ -0,0 +1,252 @@ +package com.dianping.cat.consumer.transaction.model.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.consumer.transaction.model.entity.AllDuration; +import com.dianping.cat.consumer.transaction.model.entity.Duration; +import com.dianping.cat.consumer.transaction.model.entity.Graph; +import com.dianping.cat.consumer.transaction.model.entity.Graph2; +import com.dianping.cat.consumer.transaction.model.entity.GraphTrend; +import com.dianping.cat.consumer.transaction.model.entity.Machine; +import com.dianping.cat.consumer.transaction.model.entity.Range; +import com.dianping.cat.consumer.transaction.model.entity.Range2; +import com.dianping.cat.consumer.transaction.model.entity.StatusCode; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onAllDuration(final TransactionType parent, final AllDuration allDuration) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addAllDuration(allDuration); + } + }); + } else { + parent.addAllDuration(allDuration); + } + + return true; + } + + @Override + public boolean onAllDuration(final TransactionName parent, final AllDuration allDuration) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addAllDuration(allDuration); + } + }); + } else { + parent.addAllDuration(allDuration); + } + + return true; + } + + @Override + public boolean onAllDuration(final Range parent, final AllDuration allDuration) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addAllDuration(allDuration); + } + }); + } else { + parent.addAllDuration(allDuration); + } + + return true; + } + + @Override + public boolean onAllDuration(final Range2 parent, final AllDuration allDuration) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addAllDuration(allDuration); + } + }); + } else { + parent.addAllDuration(allDuration); + } + + return true; + } + + @Override + public boolean onDuration(final TransactionName parent, final Duration duration) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDuration(duration); + } + }); + } else { + parent.addDuration(duration); + } + + return true; + } + + @Override + public boolean onGraph(final TransactionName parent, final Graph graph) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addGraph(graph); + } + }); + } else { + parent.addGraph(graph); + } + + return true; + } + + @Override + public boolean onGraph2(final TransactionType parent, final Graph2 graph2) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addGraph2(graph2); + } + }); + } else { + parent.addGraph2(graph2); + } + + return true; + } + + @Override + public boolean onGraphTrend(final TransactionType parent, final GraphTrend graphTrend) { + parent.setGraphTrend(graphTrend); + return true; + } + + @Override + public boolean onGraphTrend(final TransactionName parent, final GraphTrend graphTrend) { + parent.setGraphTrend(graphTrend); + return true; + } + + @Override + public boolean onMachine(final TransactionReport parent, final Machine machine) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addMachine(machine); + } + }); + } else { + parent.addMachine(machine); + } + + return true; + } + + @Override + public boolean onName(final TransactionType parent, final TransactionName name) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addName(name); + } + }); + } else { + parent.addName(name); + } + + return true; + } + + @Override + public boolean onRange(final TransactionName parent, final Range range) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addRange(range); + } + }); + } else { + parent.addRange(range); + } + + return true; + } + + @Override + public boolean onRange2(final TransactionType parent, final Range2 range2) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addRange2(range2); + } + }); + } else { + parent.addRange2(range2); + } + + return true; + } + + @Override + public boolean onStatusCode(final TransactionName parent, final StatusCode statusCode) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addStatusCode(statusCode); + } + }); + } else { + parent.addStatusCode(statusCode); + } + + return true; + } + + @Override + public boolean onType(final Machine parent, final TransactionType type) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addType(type); + } + }); + } else { + parent.addType(type); + } + + return true; + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultMerger.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultMerger.java new file mode 100644 index 0000000000..2d98432b41 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultMerger.java @@ -0,0 +1,428 @@ +package com.dianping.cat.consumer.transaction.model.transform; + +import java.util.Stack; + +import com.dianping.cat.consumer.transaction.model.IEntity; +import com.dianping.cat.consumer.transaction.model.IVisitor; +import com.dianping.cat.consumer.transaction.model.entity.AllDuration; +import com.dianping.cat.consumer.transaction.model.entity.Duration; +import com.dianping.cat.consumer.transaction.model.entity.Graph; +import com.dianping.cat.consumer.transaction.model.entity.Graph2; +import com.dianping.cat.consumer.transaction.model.entity.GraphTrend; +import com.dianping.cat.consumer.transaction.model.entity.Machine; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.Range; +import com.dianping.cat.consumer.transaction.model.entity.Range2; +import com.dianping.cat.consumer.transaction.model.entity.StatusCode; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private TransactionReport m_transactionReport; + + public DefaultMerger() { + } + + public DefaultMerger(TransactionReport transactionReport) { + m_transactionReport = transactionReport; + m_objs.push(transactionReport); + } + + public TransactionReport getTransactionReport() { + return m_transactionReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeAllDuration(AllDuration to, AllDuration from) { + to.mergeAttributes(from); + } + + protected void mergeDuration(Duration to, Duration from) { + to.mergeAttributes(from); + } + + protected void mergeGraph(Graph to, Graph from) { + to.mergeAttributes(from); + } + + protected void mergeGraph2(Graph2 to, Graph2 from) { + to.mergeAttributes(from); + } + + protected void mergeGraphTrend(GraphTrend to, GraphTrend from) { + to.mergeAttributes(from); + } + + protected void mergeMachine(Machine to, Machine from) { + to.mergeAttributes(from); + } + + protected void mergeName(TransactionName to, TransactionName from) { + to.mergeAttributes(from); + to.setSuccessMessageUrl(from.getSuccessMessageUrl()); + to.setFailMessageUrl(from.getFailMessageUrl()); + to.setLongestMessageUrl(from.getLongestMessageUrl()); + } + + protected void mergeRange(Range to, Range from) { + to.mergeAttributes(from); + } + + protected void mergeRange2(Range2 to, Range2 from) { + to.mergeAttributes(from); + } + + protected void mergeStatusCode(StatusCode to, StatusCode from) { + to.mergeAttributes(from); + } + + protected void mergeTransactionReport(TransactionReport to, TransactionReport from) { + to.mergeAttributes(from); + to.getDomainNames().addAll(from.getDomainNames()); + to.getIps().addAll(from.getIps()); + } + + protected void mergeType(TransactionType to, TransactionType from) { + to.mergeAttributes(from); + to.setSuccessMessageUrl(from.getSuccessMessageUrl()); + to.setFailMessageUrl(from.getFailMessageUrl()); + to.setLongestMessageUrl(from.getLongestMessageUrl()); + } + + @Override + public void visitAllDuration(AllDuration from) { + AllDuration to = (AllDuration) m_objs.peek(); + + mergeAllDuration(to, from); + visitAllDurationChildren(to, from); + } + + protected void visitAllDurationChildren(AllDuration to, AllDuration from) { + } + + @Override + public void visitDuration(Duration from) { + Duration to = (Duration) m_objs.peek(); + + mergeDuration(to, from); + visitDurationChildren(to, from); + } + + protected void visitDurationChildren(Duration to, Duration from) { + } + + @Override + public void visitGraph(Graph from) { + Graph to = (Graph) m_objs.peek(); + + mergeGraph(to, from); + visitGraphChildren(to, from); + } + + protected void visitGraphChildren(Graph to, Graph from) { + } + + @Override + public void visitGraph2(Graph2 from) { + Graph2 to = (Graph2) m_objs.peek(); + + mergeGraph2(to, from); + visitGraph2Children(to, from); + } + + protected void visitGraph2Children(Graph2 to, Graph2 from) { + } + + @Override + public void visitGraphTrend(GraphTrend from) { + GraphTrend to = (GraphTrend) m_objs.peek(); + + mergeGraphTrend(to, from); + visitGraphTrendChildren(to, from); + } + + protected void visitGraphTrendChildren(GraphTrend to, GraphTrend from) { + } + + @Override + public void visitMachine(Machine from) { + Machine to = (Machine) m_objs.peek(); + + mergeMachine(to, from); + visitMachineChildren(to, from); + } + + protected void visitMachineChildren(Machine to, Machine from) { + for (TransactionType source : from.getTypes().values()) { + TransactionType target = to.findType(source.getId()); + + if (target == null) { + target = new TransactionType(source.getId()); + to.addType(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitName(TransactionName from) { + TransactionName to = (TransactionName) m_objs.peek(); + + mergeName(to, from); + visitNameChildren(to, from); + } + + protected void visitNameChildren(TransactionName to, TransactionName from) { + for (Range source : from.getRanges().values()) { + Range target = to.findRange(source.getValue()); + + if (target == null) { + target = new Range(source.getValue()); + to.addRange(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Duration source : from.getDurations().values()) { + Duration target = to.findDuration(source.getValue()); + + if (target == null) { + target = new Duration(source.getValue()); + to.addDuration(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Graph source : from.getGraphs().values()) { + Graph target = to.findGraph(source.getDuration()); + + if (target == null) { + target = new Graph(source.getDuration()); + to.addGraph(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (AllDuration source : from.getAllDurations().values()) { + AllDuration target = to.findAllDuration(source.getValue()); + + if (target == null) { + target = new AllDuration(source.getValue()); + to.addAllDuration(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + if (from.getGraphTrend() != null) { + GraphTrend target = to.getGraphTrend(); + + if (target == null) { + GraphTrend source = from.getGraphTrend(); + + target = new GraphTrend(source.getDuration()); + to.setGraphTrend(target); + } + + m_objs.push(target); + from.getGraphTrend().accept(this); + m_objs.pop(); + } + + for (StatusCode source : from.getStatusCodes().values()) { + StatusCode target = to.findStatusCode(source.getId()); + + if (target == null) { + target = new StatusCode(source.getId()); + to.addStatusCode(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitRange(Range from) { + Range to = (Range) m_objs.peek(); + + mergeRange(to, from); + visitRangeChildren(to, from); + } + + protected void visitRangeChildren(Range to, Range from) { + for (AllDuration source : from.getAllDurations().values()) { + AllDuration target = to.findAllDuration(source.getValue()); + + if (target == null) { + target = new AllDuration(source.getValue()); + to.addAllDuration(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitRange2(Range2 from) { + Range2 to = (Range2) m_objs.peek(); + + mergeRange2(to, from); + visitRange2Children(to, from); + } + + protected void visitRange2Children(Range2 to, Range2 from) { + for (AllDuration source : from.getAllDurations().values()) { + AllDuration target = to.findAllDuration(source.getValue()); + + if (target == null) { + target = new AllDuration(source.getValue()); + to.addAllDuration(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitStatusCode(StatusCode from) { + StatusCode to = (StatusCode) m_objs.peek(); + + mergeStatusCode(to, from); + visitStatusCodeChildren(to, from); + } + + protected void visitStatusCodeChildren(StatusCode to, StatusCode from) { + } + + @Override + public void visitTransactionReport(TransactionReport from) { + TransactionReport to = (TransactionReport) m_objs.peek(); + + mergeTransactionReport(to, from); + visitTransactionReportChildren(to, from); + } + + protected void visitTransactionReportChildren(TransactionReport to, TransactionReport from) { + for (Machine source : from.getMachines().values()) { + Machine target = to.findMachine(source.getIp()); + + if (target == null) { + target = new Machine(source.getIp()); + to.addMachine(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitType(TransactionType from) { + TransactionType to = (TransactionType) m_objs.peek(); + + mergeType(to, from); + visitTypeChildren(to, from); + } + + protected void visitTypeChildren(TransactionType to, TransactionType from) { + for (TransactionName source : from.getNames().values()) { + TransactionName target = to.findName(source.getId()); + + if (target == null) { + target = new TransactionName(source.getId()); + to.addName(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Graph2 source : from.getGraph2s().values()) { + Graph2 target = to.findGraph2(source.getDuration()); + + if (target == null) { + target = new Graph2(source.getDuration()); + to.addGraph2(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (AllDuration source : from.getAllDurations().values()) { + AllDuration target = to.findAllDuration(source.getValue()); + + if (target == null) { + target = new AllDuration(source.getValue()); + to.addAllDuration(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + if (from.getGraphTrend() != null) { + GraphTrend target = to.getGraphTrend(); + + if (target == null) { + GraphTrend source = from.getGraphTrend(); + + target = new GraphTrend(source.getDuration()); + to.setGraphTrend(target); + } + + m_objs.push(target); + from.getGraphTrend().accept(this); + m_objs.pop(); + } + + for (Range2 source : from.getRange2s().values()) { + Range2 target = to.findRange2(source.getValue()); + + if (target == null) { + target = new Range2(source.getValue()); + to.addRange2(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultNativeBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..67fd774d37 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultNativeBuilder.java @@ -0,0 +1,589 @@ +package com.dianping.cat.consumer.transaction.model.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import java.util.Map; + +import com.dianping.cat.consumer.transaction.model.IVisitor; +import com.dianping.cat.consumer.transaction.model.entity.AllDuration; +import com.dianping.cat.consumer.transaction.model.entity.Duration; +import com.dianping.cat.consumer.transaction.model.entity.Graph; +import com.dianping.cat.consumer.transaction.model.entity.Graph2; +import com.dianping.cat.consumer.transaction.model.entity.GraphTrend; +import com.dianping.cat.consumer.transaction.model.entity.Machine; +import com.dianping.cat.consumer.transaction.model.entity.Range; +import com.dianping.cat.consumer.transaction.model.entity.Range2; +import com.dianping.cat.consumer.transaction.model.entity.StatusCode; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(TransactionReport transactionReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(transactionReport, out); + return out.toByteArray(); + } + + public static void build(TransactionReport transactionReport, OutputStream out) { + transactionReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitAllDuration(AllDuration allDuration) { + writeTag(1, 0); + writeInt(allDuration.getValue()); + + writeTag(2, 0); + writeInt(allDuration.getCount()); + + writeTag(63, 3); + } + + @Override + public void visitDuration(Duration duration) { + writeTag(1, 0); + writeInt(duration.getValue()); + + writeTag(2, 0); + writeInt(duration.getCount()); + + writeTag(63, 3); + } + + @Override + public void visitGraph(Graph graph) { + writeTag(1, 0); + writeInt(graph.getDuration()); + + writeTag(2, 0); + writeString(graph.getSum()); + + writeTag(3, 0); + writeString(graph.getAvg()); + + writeTag(4, 0); + writeString(graph.getCount()); + + writeTag(5, 0); + writeString(graph.getFails()); + + writeTag(63, 3); + } + + @Override + public void visitGraph2(Graph2 graph2) { + writeTag(1, 0); + writeInt(graph2.getDuration()); + + writeTag(2, 0); + writeString(graph2.getSum()); + + writeTag(3, 0); + writeString(graph2.getAvg()); + + writeTag(4, 0); + writeString(graph2.getCount()); + + writeTag(5, 0); + writeString(graph2.getFails()); + + writeTag(63, 3); + } + + @Override + public void visitGraphTrend(GraphTrend graphTrend) { + writeTag(1, 0); + writeInt(graphTrend.getDuration()); + + writeTag(2, 0); + writeString(graphTrend.getSum()); + + writeTag(3, 0); + writeString(graphTrend.getAvg()); + + writeTag(4, 0); + writeString(graphTrend.getCount()); + + writeTag(5, 0); + writeString(graphTrend.getFails()); + + writeTag(63, 3); + } + + @Override + public void visitMachine(Machine machine) { + if (machine.getIp() != null) { + writeTag(1, 1); + writeString(machine.getIp()); + } + + if (!machine.getTypes().isEmpty()) { + writeTag(33, 2); + writeInt(machine.getTypes().size()); + + for (TransactionType type : machine.getTypes().values()) { + type.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitName(TransactionName name) { + if (name.getId() != null) { + writeTag(1, 1); + writeString(name.getId()); + } + + writeTag(2, 0); + writeLong(name.getTotalCount()); + + writeTag(3, 0); + writeLong(name.getFailCount()); + + writeTag(4, 0); + writeDouble(name.getFailPercent()); + + writeTag(5, 0); + writeDouble(name.getMin()); + + writeTag(6, 0); + writeDouble(name.getMax()); + + writeTag(7, 0); + writeDouble(name.getAvg()); + + writeTag(8, 0); + writeDouble(name.getSum()); + + writeTag(9, 0); + writeDouble(name.getSum2()); + + writeTag(10, 0); + writeDouble(name.getStd()); + + if (name.getSuccessMessageUrl() != null) { + writeTag(11, 1); + writeString(name.getSuccessMessageUrl()); + } + + if (name.getFailMessageUrl() != null) { + writeTag(12, 1); + writeString(name.getFailMessageUrl()); + } + + writeTag(13, 0); + writeDouble(name.getTps()); + + writeTag(14, 0); + writeDouble(name.getLine95Value()); + + writeTag(15, 0); + writeDouble(name.getLine99Value()); + + writeTag(16, 0); + writeDouble(name.getLine999Value()); + + writeTag(17, 0); + writeDouble(name.getLine90Value()); + + writeTag(18, 0); + writeDouble(name.getLine50Value()); + + writeTag(19, 0); + writeDouble(name.getLine9999Value()); + + if (name.getLongestMessageUrl() != null) { + writeTag(20, 1); + writeString(name.getLongestMessageUrl()); + } + + if (!name.getRanges().isEmpty()) { + writeTag(33, 2); + writeInt(name.getRanges().size()); + + for (Range range : name.getRanges().values()) { + range.accept(m_visitor); + } + } + + if (!name.getDurations().isEmpty()) { + writeTag(34, 2); + writeInt(name.getDurations().size()); + + for (Duration duration : name.getDurations().values()) { + duration.accept(m_visitor); + } + } + + if (!name.getGraphs().isEmpty()) { + writeTag(35, 2); + writeInt(name.getGraphs().size()); + + for (Graph graph : name.getGraphs().values()) { + graph.accept(m_visitor); + } + } + + if (name.getGraphTrend() != null) { + writeTag(36, 1); + name.getGraphTrend().accept(m_visitor); + } + + if (!name.getStatusCodes().isEmpty()) { + writeTag(37, 2); + writeInt(name.getStatusCodes().size()); + + for (StatusCode statusCode : name.getStatusCodes().values()) { + statusCode.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitRange(Range range) { + writeTag(1, 0); + writeInt(range.getValue()); + + writeTag(2, 0); + writeInt(range.getCount()); + + writeTag(3, 0); + writeDouble(range.getSum()); + + writeTag(4, 0); + writeDouble(range.getAvg()); + + writeTag(5, 0); + writeInt(range.getFails()); + + writeTag(6, 0); + writeDouble(range.getMin()); + + writeTag(7, 0); + writeDouble(range.getMax()); + + writeTag(8, 0); + writeDouble(range.getLine95Value()); + + writeTag(9, 0); + writeDouble(range.getLine99Value()); + + writeTag(10, 0); + writeDouble(range.getLine999Value()); + + writeTag(11, 0); + writeDouble(range.getLine90Value()); + + writeTag(12, 0); + writeDouble(range.getLine50Value()); + + writeTag(13, 0); + writeDouble(range.getLine9999Value()); + + writeTag(63, 3); + } + + @Override + public void visitRange2(Range2 range2) { + writeTag(1, 0); + writeInt(range2.getValue()); + + writeTag(2, 0); + writeInt(range2.getCount()); + + writeTag(3, 0); + writeDouble(range2.getSum()); + + writeTag(4, 0); + writeDouble(range2.getAvg()); + + writeTag(5, 0); + writeInt(range2.getFails()); + + writeTag(6, 0); + writeDouble(range2.getMin()); + + writeTag(7, 0); + writeDouble(range2.getMax()); + + writeTag(8, 0); + writeDouble(range2.getLine95Value()); + + writeTag(9, 0); + writeDouble(range2.getLine99Value()); + + writeTag(10, 0); + writeDouble(range2.getLine999Value()); + + writeTag(11, 0); + writeDouble(range2.getLine90Value()); + + writeTag(12, 0); + writeDouble(range2.getLine50Value()); + + writeTag(13, 0); + writeDouble(range2.getLine9999Value()); + + writeTag(63, 3); + } + + @Override + public void visitStatusCode(StatusCode statusCode) { + if (statusCode.getId() != null) { + writeTag(1, 1); + writeString(statusCode.getId()); + } + + writeTag(2, 0); + writeLong(statusCode.getCount()); + + writeTag(63, 3); + } + + @Override + public void visitTransactionReport(TransactionReport transactionReport) { + writeTag(63, 0); + + if (transactionReport.getDomain() != null) { + writeTag(1, 1); + writeString(transactionReport.getDomain()); + } + + if (transactionReport.getStartTime() != null) { + writeTag(2, 1); + writeDate(transactionReport.getStartTime()); + } + + if (transactionReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(transactionReport.getEndTime()); + } + + if (transactionReport.getDomainNames() != null) { + writeTag(4, 2); + writeInt(transactionReport.getDomainNames().size()); + + for (String domain : transactionReport.getDomainNames()) { + writeString(domain); + } + } + + if (transactionReport.getIps() != null) { + writeTag(5, 2); + writeInt(transactionReport.getIps().size()); + + for (String ip : transactionReport.getIps()) { + writeString(ip); + } + } + + if (!transactionReport.getMachines().isEmpty()) { + writeTag(33, 2); + writeInt(transactionReport.getMachines().size()); + + for (Machine machine : transactionReport.getMachines().values()) { + machine.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitType(TransactionType type) { + if (type.getId() != null) { + writeTag(1, 1); + writeString(type.getId()); + } + + writeTag(2, 0); + writeLong(type.getTotalCount()); + + writeTag(3, 0); + writeLong(type.getFailCount()); + + writeTag(4, 0); + writeDouble(type.getFailPercent()); + + writeTag(5, 0); + writeDouble(type.getMin()); + + writeTag(6, 0); + writeDouble(type.getMax()); + + writeTag(7, 0); + writeDouble(type.getAvg()); + + writeTag(8, 0); + writeDouble(type.getSum()); + + writeTag(9, 0); + writeDouble(type.getSum2()); + + writeTag(10, 0); + writeDouble(type.getStd()); + + if (type.getSuccessMessageUrl() != null) { + writeTag(11, 1); + writeString(type.getSuccessMessageUrl()); + } + + if (type.getFailMessageUrl() != null) { + writeTag(12, 1); + writeString(type.getFailMessageUrl()); + } + + writeTag(13, 0); + writeDouble(type.getTps()); + + writeTag(14, 0); + writeDouble(type.getLine95Value()); + + writeTag(15, 0); + writeDouble(type.getLine99Value()); + + writeTag(16, 0); + writeDouble(type.getLine999Value()); + + writeTag(17, 0); + writeDouble(type.getLine90Value()); + + writeTag(18, 0); + writeDouble(type.getLine50Value()); + + writeTag(19, 0); + writeDouble(type.getLine9999Value()); + + if (type.getLongestMessageUrl() != null) { + writeTag(20, 1); + writeString(type.getLongestMessageUrl()); + } + + if (!type.getNames().isEmpty()) { + writeTag(33, 2); + writeInt(type.getNames().size()); + + for (TransactionName name : type.getNames().values()) { + name.accept(m_visitor); + } + } + + if (!type.getGraph2s().isEmpty()) { + writeTag(34, 2); + writeInt(type.getGraph2s().size()); + + for (Graph2 graph2 : type.getGraph2s().values()) { + graph2.accept(m_visitor); + } + } + + if (type.getGraphTrend() != null) { + writeTag(35, 1); + type.getGraphTrend().accept(m_visitor); + } + + if (!type.getRange2s().isEmpty()) { + writeTag(36, 2); + writeInt(type.getRange2s().size()); + + for (Range2 range2 : type.getRange2s().values()) { + range2.accept(m_visitor); + } + } + + if (!type.getDynamicAttributes().isEmpty()) { + writeTag(63, 2); + writeInt(type.getDynamicAttributes().size()); + + for (Map.Entry dynamicAttribute : type.getDynamicAttributes().entrySet()) { + writeString(dynamicAttribute.getKey()); + writeString(dynamicAttribute.getValue()); + } + } + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeDouble(double value) { + try { + writeVarint(Double.doubleToLongBits(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeLong(long value) { + try { + writeVarint(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultNativeParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..9e16888cff --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultNativeParser.java @@ -0,0 +1,739 @@ +package com.dianping.cat.consumer.transaction.model.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import java.util.Map; + +import com.dianping.cat.consumer.transaction.model.IVisitor; +import com.dianping.cat.consumer.transaction.model.entity.AllDuration; +import com.dianping.cat.consumer.transaction.model.entity.Duration; +import com.dianping.cat.consumer.transaction.model.entity.Graph; +import com.dianping.cat.consumer.transaction.model.entity.Graph2; +import com.dianping.cat.consumer.transaction.model.entity.GraphTrend; +import com.dianping.cat.consumer.transaction.model.entity.Machine; +import com.dianping.cat.consumer.transaction.model.entity.Range; +import com.dianping.cat.consumer.transaction.model.entity.Range2; +import com.dianping.cat.consumer.transaction.model.entity.StatusCode; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static TransactionReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static TransactionReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + TransactionReport transactionReport = new TransactionReport(); + + try { + transactionReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return transactionReport; + } + + @Override + public void visitAllDuration(AllDuration allDuration) { + byte tag; + + while ((tag = readTag()) != -1) { + visitAllDurationChildren(allDuration, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitAllDurationChildren(AllDuration allDuration, int _field, int _type) { + switch (_field) { + case 1: + allDuration.setValue(readInt()); + break; + case 2: + allDuration.setCount(readInt()); + break; + } + } + + @Override + public void visitDuration(Duration duration) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDurationChildren(duration, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDurationChildren(Duration duration, int _field, int _type) { + switch (_field) { + case 1: + duration.setValue(readInt()); + break; + case 2: + duration.setCount(readInt()); + break; + } + } + + @Override + public void visitGraph(Graph graph) { + byte tag; + + while ((tag = readTag()) != -1) { + visitGraphChildren(graph, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitGraphChildren(Graph graph, int _field, int _type) { + switch (_field) { + case 1: + graph.setDuration(readInt()); + break; + case 2: + graph.setSum(readString()); + break; + case 3: + graph.setAvg(readString()); + break; + case 4: + graph.setCount(readString()); + break; + case 5: + graph.setFails(readString()); + break; + } + } + + @Override + public void visitGraph2(Graph2 graph2) { + byte tag; + + while ((tag = readTag()) != -1) { + visitGraph2Children(graph2, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitGraph2Children(Graph2 graph2, int _field, int _type) { + switch (_field) { + case 1: + graph2.setDuration(readInt()); + break; + case 2: + graph2.setSum(readString()); + break; + case 3: + graph2.setAvg(readString()); + break; + case 4: + graph2.setCount(readString()); + break; + case 5: + graph2.setFails(readString()); + break; + } + } + + @Override + public void visitGraphTrend(GraphTrend graphTrend) { + byte tag; + + while ((tag = readTag()) != -1) { + visitGraphTrendChildren(graphTrend, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitGraphTrendChildren(GraphTrend graphTrend, int _field, int _type) { + switch (_field) { + case 1: + graphTrend.setDuration(readInt()); + break; + case 2: + graphTrend.setSum(readString()); + break; + case 3: + graphTrend.setAvg(readString()); + break; + case 4: + graphTrend.setCount(readString()); + break; + case 5: + graphTrend.setFails(readString()); + break; + } + } + + @Override + public void visitMachine(Machine machine) { + byte tag; + + while ((tag = readTag()) != -1) { + visitMachineChildren(machine, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitMachineChildren(Machine machine, int _field, int _type) { + switch (_field) { + case 1: + machine.setIp(readString()); + break; + case 33: + if (_type == 1) { + TransactionType type = new TransactionType(); + + visitType(type); + m_linker.onType(machine, type); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + TransactionType type = new TransactionType(); + + visitType(type); + m_linker.onType(machine, type); + } + } + break; + } + } + + @Override + public void visitName(TransactionName name) { + byte tag; + + while ((tag = readTag()) != -1) { + visitNameChildren(name, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitNameChildren(TransactionName name, int _field, int _type) { + switch (_field) { + case 1: + name.setId(readString()); + break; + case 2: + name.setTotalCount(readLong()); + break; + case 3: + name.setFailCount(readLong()); + break; + case 4: + name.setFailPercent(readDouble()); + break; + case 5: + name.setMin(readDouble()); + break; + case 6: + name.setMax(readDouble()); + break; + case 7: + name.setAvg(readDouble()); + break; + case 8: + name.setSum(readDouble()); + break; + case 9: + name.setSum2(readDouble()); + break; + case 10: + name.setStd(readDouble()); + break; + case 11: + name.setSuccessMessageUrl(readString()); + break; + case 12: + name.setFailMessageUrl(readString()); + break; + case 13: + name.setTps(readDouble()); + break; + case 14: + name.setLine95Value(readDouble()); + break; + case 15: + name.setLine99Value(readDouble()); + break; + case 16: + name.setLine999Value(readDouble()); + break; + case 17: + name.setLine90Value(readDouble()); + break; + case 18: + name.setLine50Value(readDouble()); + break; + case 19: + name.setLine9999Value(readDouble()); + break; + case 20: + name.setLongestMessageUrl(readString()); + break; + case 33: + if (_type == 1) { + Range range = new Range(); + + visitRange(range); + m_linker.onRange(name, range); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Range range = new Range(); + + visitRange(range); + m_linker.onRange(name, range); + } + } + break; + case 34: + if (_type == 1) { + Duration duration = new Duration(); + + visitDuration(duration); + m_linker.onDuration(name, duration); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Duration duration = new Duration(); + + visitDuration(duration); + m_linker.onDuration(name, duration); + } + } + break; + case 35: + if (_type == 1) { + Graph graph = new Graph(); + + visitGraph(graph); + m_linker.onGraph(name, graph); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Graph graph = new Graph(); + + visitGraph(graph); + m_linker.onGraph(name, graph); + } + } + break; + case 36: + GraphTrend graphTrend = new GraphTrend(); + + visitGraphTrend(graphTrend); + m_linker.onGraphTrend(name, graphTrend); + break; + case 37: + if (_type == 1) { + StatusCode statusCode = new StatusCode(); + + visitStatusCode(statusCode); + m_linker.onStatusCode(name, statusCode); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + StatusCode statusCode = new StatusCode(); + + visitStatusCode(statusCode); + m_linker.onStatusCode(name, statusCode); + } + } + break; + } + } + + @Override + public void visitRange(Range range) { + byte tag; + + while ((tag = readTag()) != -1) { + visitRangeChildren(range, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitRangeChildren(Range range, int _field, int _type) { + switch (_field) { + case 1: + range.setValue(readInt()); + break; + case 2: + range.setCount(readInt()); + break; + case 3: + range.setSum(readDouble()); + break; + case 4: + range.setAvg(readDouble()); + break; + case 5: + range.setFails(readInt()); + break; + case 6: + range.setMin(readDouble()); + break; + case 7: + range.setMax(readDouble()); + break; + case 8: + range.setLine95Value(readDouble()); + break; + case 9: + range.setLine99Value(readDouble()); + break; + case 10: + range.setLine999Value(readDouble()); + break; + case 11: + range.setLine90Value(readDouble()); + break; + case 12: + range.setLine50Value(readDouble()); + break; + case 13: + range.setLine9999Value(readDouble()); + break; + } + } + + @Override + public void visitRange2(Range2 range2) { + byte tag; + + while ((tag = readTag()) != -1) { + visitRange2Children(range2, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitRange2Children(Range2 range2, int _field, int _type) { + switch (_field) { + case 1: + range2.setValue(readInt()); + break; + case 2: + range2.setCount(readInt()); + break; + case 3: + range2.setSum(readDouble()); + break; + case 4: + range2.setAvg(readDouble()); + break; + case 5: + range2.setFails(readInt()); + break; + case 6: + range2.setMin(readDouble()); + break; + case 7: + range2.setMax(readDouble()); + break; + case 8: + range2.setLine95Value(readDouble()); + break; + case 9: + range2.setLine99Value(readDouble()); + break; + case 10: + range2.setLine999Value(readDouble()); + break; + case 11: + range2.setLine90Value(readDouble()); + break; + case 12: + range2.setLine50Value(readDouble()); + break; + case 13: + range2.setLine9999Value(readDouble()); + break; + } + } + + @Override + public void visitStatusCode(StatusCode statusCode) { + byte tag; + + while ((tag = readTag()) != -1) { + visitStatusCodeChildren(statusCode, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitStatusCodeChildren(StatusCode statusCode, int _field, int _type) { + switch (_field) { + case 1: + statusCode.setId(readString()); + break; + case 2: + statusCode.setCount(readLong()); + break; + } + } + + @Override + public void visitTransactionReport(TransactionReport transactionReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitTransactionReportChildren(transactionReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitTransactionReportChildren(TransactionReport transactionReport, int _field, int _type) { + switch (_field) { + case 1: + transactionReport.setDomain(readString()); + break; + case 2: + transactionReport.setStartTime(readDate()); + break; + case 3: + transactionReport.setEndTime(readDate()); + break; + case 4: + if (_type == 1) { + transactionReport.addDomain(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + transactionReport.addDomain(readString()); + } + } + break; + case 5: + if (_type == 1) { + transactionReport.addIp(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + transactionReport.addIp(readString()); + } + } + break; + case 33: + if (_type == 1) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(transactionReport, machine); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(transactionReport, machine); + } + } + break; + } + } + + @Override + public void visitType(TransactionType type) { + byte tag; + + while ((tag = readTag()) != -1) { + visitTypeChildren(type, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitTypeChildren(TransactionType type, int _field, int _type) { + switch (_field) { + case 1: + type.setId(readString()); + break; + case 2: + type.setTotalCount(readLong()); + break; + case 3: + type.setFailCount(readLong()); + break; + case 4: + type.setFailPercent(readDouble()); + break; + case 5: + type.setMin(readDouble()); + break; + case 6: + type.setMax(readDouble()); + break; + case 7: + type.setAvg(readDouble()); + break; + case 8: + type.setSum(readDouble()); + break; + case 9: + type.setSum2(readDouble()); + break; + case 10: + type.setStd(readDouble()); + break; + case 11: + type.setSuccessMessageUrl(readString()); + break; + case 12: + type.setFailMessageUrl(readString()); + break; + case 13: + type.setTps(readDouble()); + break; + case 14: + type.setLine95Value(readDouble()); + break; + case 15: + type.setLine99Value(readDouble()); + break; + case 16: + type.setLine999Value(readDouble()); + break; + case 17: + type.setLine90Value(readDouble()); + break; + case 18: + type.setLine50Value(readDouble()); + break; + case 19: + type.setLine9999Value(readDouble()); + break; + case 20: + type.setLongestMessageUrl(readString()); + break; + case 33: + if (_type == 1) { + TransactionName name = new TransactionName(); + + visitName(name); + m_linker.onName(type, name); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + TransactionName name = new TransactionName(); + + visitName(name); + m_linker.onName(type, name); + } + } + break; + case 34: + if (_type == 1) { + Graph2 graph2 = new Graph2(); + + visitGraph2(graph2); + m_linker.onGraph2(type, graph2); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Graph2 graph2 = new Graph2(); + + visitGraph2(graph2); + m_linker.onGraph2(type, graph2); + } + } + break; + case 35: + GraphTrend graphTrend = new GraphTrend(); + + visitGraphTrend(graphTrend); + m_linker.onGraphTrend(type, graphTrend); + break; + case 36: + if (_type == 1) { + Range2 range2 = new Range2(); + + visitRange2(range2); + m_linker.onRange2(type, range2); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Range2 range2 = new Range2(); + + visitRange2(range2); + m_linker.onRange2(type, range2); + } + } + break; + case 63: + Map dynamicAttribute = type.getDynamicAttributes(); + + for (int i = readInt(); i > 0; i--) { + String key = readString(); + String value = readString(); + + dynamicAttribute.put(key, value); + } + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private double readDouble() { + try { + return Double.longBitsToDouble(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private long readLong() { + try { + return readVarint(64); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultSaxMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..78d65d8197 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultSaxMaker.java @@ -0,0 +1,596 @@ +package com.dianping.cat.consumer.transaction.model.transform; + +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_AVG; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_COUNT; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_DURATION; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_FAILCOUNT; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_FAILPERCENT; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_FAILS; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_LINE50VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_LINE90VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_LINE95VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_LINE9999VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_LINE999VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_LINE99VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_MAX; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_MIN; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_STD; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_SUM; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_SUM2; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_TOTALCOUNT; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_TPS; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_VALUE; + +import java.util.Map; +import org.xml.sax.Attributes; + +import com.dianping.cat.consumer.transaction.model.entity.AllDuration; +import com.dianping.cat.consumer.transaction.model.entity.Duration; +import com.dianping.cat.consumer.transaction.model.entity.Graph; +import com.dianping.cat.consumer.transaction.model.entity.Graph2; +import com.dianping.cat.consumer.transaction.model.entity.GraphTrend; +import com.dianping.cat.consumer.transaction.model.entity.Machine; +import com.dianping.cat.consumer.transaction.model.entity.Range; +import com.dianping.cat.consumer.transaction.model.entity.Range2; +import com.dianping.cat.consumer.transaction.model.entity.StatusCode; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; + +public class DefaultSaxMaker implements IMaker { + + @Override + public AllDuration buildAllDuration(Attributes attributes) { + String value = attributes.getValue(ATTR_VALUE); + String count = attributes.getValue(ATTR_COUNT); + AllDuration allDuration = new AllDuration(value == null ? 0 : convert(Integer.class, value, 0)); + + if (count != null) { + allDuration.setCount(convert(Integer.class, count, 0)); + } + + return allDuration; + } + + @Override + public String buildDomain(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Duration buildDuration(Attributes attributes) { + String value = attributes.getValue(ATTR_VALUE); + String count = attributes.getValue(ATTR_COUNT); + Duration duration = new Duration(value == null ? 0 : convert(Integer.class, value, 0)); + + if (count != null) { + duration.setCount(convert(Integer.class, count, 0)); + } + + return duration; + } + + @Override + public Graph buildGraph(Attributes attributes) { + String duration = attributes.getValue(ATTR_DURATION); + String sum = attributes.getValue(ATTR_SUM); + String avg = attributes.getValue(ATTR_AVG); + String count = attributes.getValue(ATTR_COUNT); + String fails = attributes.getValue(ATTR_FAILS); + Graph graph = new Graph(duration == null ? 0 : convert(Integer.class, duration, 0)); + + if (sum != null) { + graph.setSum(sum); + } + + if (avg != null) { + graph.setAvg(avg); + } + + if (count != null) { + graph.setCount(count); + } + + if (fails != null) { + graph.setFails(fails); + } + + return graph; + } + + @Override + public Graph2 buildGraph2(Attributes attributes) { + String duration = attributes.getValue(ATTR_DURATION); + String sum = attributes.getValue(ATTR_SUM); + String avg = attributes.getValue(ATTR_AVG); + String count = attributes.getValue(ATTR_COUNT); + String fails = attributes.getValue(ATTR_FAILS); + Graph2 graph2 = new Graph2(duration == null ? 0 : convert(Integer.class, duration, 0)); + + if (sum != null) { + graph2.setSum(sum); + } + + if (avg != null) { + graph2.setAvg(avg); + } + + if (count != null) { + graph2.setCount(count); + } + + if (fails != null) { + graph2.setFails(fails); + } + + return graph2; + } + + @Override + public GraphTrend buildGraphTrend(Attributes attributes) { + String duration = attributes.getValue(ATTR_DURATION); + String sum = attributes.getValue(ATTR_SUM); + String avg = attributes.getValue(ATTR_AVG); + String count = attributes.getValue(ATTR_COUNT); + String fails = attributes.getValue(ATTR_FAILS); + GraphTrend graphTrend = new GraphTrend(duration == null ? 0 : convert(Integer.class, duration, 0)); + + if (sum != null) { + graphTrend.setSum(sum); + } + + if (avg != null) { + graphTrend.setAvg(avg); + } + + if (count != null) { + graphTrend.setCount(count); + } + + if (fails != null) { + graphTrend.setFails(fails); + } + + return graphTrend; + } + + @Override + public String buildIp(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Machine buildMachine(Attributes attributes) { + String ip = attributes.getValue(ATTR_IP); + Machine machine = new Machine(ip); + + return machine; + } + + @Override + public TransactionName buildName(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String totalCount = attributes.getValue(ATTR_TOTALCOUNT); + String failCount = attributes.getValue(ATTR_FAILCOUNT); + String failPercent = attributes.getValue(ATTR_FAILPERCENT); + String min = attributes.getValue(ATTR_MIN); + String max = attributes.getValue(ATTR_MAX); + String avg = attributes.getValue(ATTR_AVG); + String sum = attributes.getValue(ATTR_SUM); + String sum2 = attributes.getValue(ATTR_SUM2); + String std = attributes.getValue(ATTR_STD); + String tps = attributes.getValue(ATTR_TPS); + String line95Value = attributes.getValue(ATTR_LINE95VALUE); + String line99Value = attributes.getValue(ATTR_LINE99VALUE); + String line999Value = attributes.getValue(ATTR_LINE999VALUE); + String line90Value = attributes.getValue(ATTR_LINE90VALUE); + String line50Value = attributes.getValue(ATTR_LINE50VALUE); + String line9999Value = attributes.getValue(ATTR_LINE9999VALUE); + TransactionName name = new TransactionName(id); + + if (totalCount != null) { + name.setTotalCount(convert(Long.class, totalCount, 0L)); + } + + if (failCount != null) { + name.setFailCount(convert(Long.class, failCount, 0L)); + } + + if (failPercent != null) { + name.setFailPercent(toNumber(failPercent, "0.00", 0).doubleValue()); + } + + if (min != null) { + name.setMin(toNumber(min, "0.00", 0).doubleValue()); + } + + if (max != null) { + name.setMax(toNumber(max, "0.00", 0).doubleValue()); + } + + if (avg != null) { + name.setAvg(toNumber(avg, "0.0", 0).doubleValue()); + } + + if (sum != null) { + name.setSum(toNumber(sum, "0.0", 0).doubleValue()); + } + + if (sum2 != null) { + name.setSum2(toNumber(sum2, "0.0", 0).doubleValue()); + } + + if (std != null) { + name.setStd(toNumber(std, "0.0", 0).doubleValue()); + } + + if (tps != null) { + name.setTps(toNumber(tps, "0.00", 0).doubleValue()); + } + + if (line95Value != null) { + name.setLine95Value(toNumber(line95Value, "0.00", 0).doubleValue()); + } + + if (line99Value != null) { + name.setLine99Value(toNumber(line99Value, "0.00", 0).doubleValue()); + } + + if (line999Value != null) { + name.setLine999Value(toNumber(line999Value, "0.00", 0).doubleValue()); + } + + if (line90Value != null) { + name.setLine90Value(toNumber(line90Value, "0.00", 0).doubleValue()); + } + + if (line50Value != null) { + name.setLine50Value(toNumber(line50Value, "0.00", 0).doubleValue()); + } + + if (line9999Value != null) { + name.setLine9999Value(toNumber(line9999Value, "0.00", 0).doubleValue()); + } + + return name; + } + + @Override + public Range buildRange(Attributes attributes) { + String value = attributes.getValue(ATTR_VALUE); + String count = attributes.getValue(ATTR_COUNT); + String sum = attributes.getValue(ATTR_SUM); + String avg = attributes.getValue(ATTR_AVG); + String fails = attributes.getValue(ATTR_FAILS); + String min = attributes.getValue(ATTR_MIN); + String max = attributes.getValue(ATTR_MAX); + String line95Value = attributes.getValue(ATTR_LINE95VALUE); + String line99Value = attributes.getValue(ATTR_LINE99VALUE); + String line999Value = attributes.getValue(ATTR_LINE999VALUE); + String line90Value = attributes.getValue(ATTR_LINE90VALUE); + String line50Value = attributes.getValue(ATTR_LINE50VALUE); + String line9999Value = attributes.getValue(ATTR_LINE9999VALUE); + Range range = new Range(value == null ? 0 : convert(Integer.class, value, 0)); + + if (count != null) { + range.setCount(convert(Integer.class, count, 0)); + } + + if (sum != null) { + range.setSum(convert(Double.class, sum, 0.0)); + } + + if (avg != null) { + range.setAvg(toNumber(avg, "0.0", 0).doubleValue()); + } + + if (fails != null) { + range.setFails(convert(Integer.class, fails, 0)); + } + + if (min != null) { + range.setMin(toNumber(min, "0.00", 0).doubleValue()); + } + + if (max != null) { + range.setMax(toNumber(max, "0.00", 0).doubleValue()); + } + + if (line95Value != null) { + range.setLine95Value(toNumber(line95Value, "0.00", 0).doubleValue()); + } + + if (line99Value != null) { + range.setLine99Value(toNumber(line99Value, "0.00", 0).doubleValue()); + } + + if (line999Value != null) { + range.setLine999Value(toNumber(line999Value, "0.00", 0).doubleValue()); + } + + if (line90Value != null) { + range.setLine90Value(toNumber(line90Value, "0.00", 0).doubleValue()); + } + + if (line50Value != null) { + range.setLine50Value(toNumber(line50Value, "0.00", 0).doubleValue()); + } + + if (line9999Value != null) { + range.setLine9999Value(toNumber(line9999Value, "0.00", 0).doubleValue()); + } + + return range; + } + + @Override + public Range2 buildRange2(Attributes attributes) { + String value = attributes.getValue(ATTR_VALUE); + String count = attributes.getValue(ATTR_COUNT); + String sum = attributes.getValue(ATTR_SUM); + String avg = attributes.getValue(ATTR_AVG); + String fails = attributes.getValue(ATTR_FAILS); + String min = attributes.getValue(ATTR_MIN); + String max = attributes.getValue(ATTR_MAX); + String line95Value = attributes.getValue(ATTR_LINE95VALUE); + String line99Value = attributes.getValue(ATTR_LINE99VALUE); + String line999Value = attributes.getValue(ATTR_LINE999VALUE); + String line90Value = attributes.getValue(ATTR_LINE90VALUE); + String line50Value = attributes.getValue(ATTR_LINE50VALUE); + String line9999Value = attributes.getValue(ATTR_LINE9999VALUE); + Range2 range2 = new Range2(value == null ? 0 : convert(Integer.class, value, 0)); + + if (count != null) { + range2.setCount(convert(Integer.class, count, 0)); + } + + if (sum != null) { + range2.setSum(convert(Double.class, sum, 0.0)); + } + + if (avg != null) { + range2.setAvg(toNumber(avg, "0.0", 0).doubleValue()); + } + + if (fails != null) { + range2.setFails(convert(Integer.class, fails, 0)); + } + + if (min != null) { + range2.setMin(toNumber(min, "0.00", 0).doubleValue()); + } + + if (max != null) { + range2.setMax(toNumber(max, "0.00", 0).doubleValue()); + } + + if (line95Value != null) { + range2.setLine95Value(toNumber(line95Value, "0.00", 0).doubleValue()); + } + + if (line99Value != null) { + range2.setLine99Value(toNumber(line99Value, "0.00", 0).doubleValue()); + } + + if (line999Value != null) { + range2.setLine999Value(toNumber(line999Value, "0.00", 0).doubleValue()); + } + + if (line90Value != null) { + range2.setLine90Value(toNumber(line90Value, "0.00", 0).doubleValue()); + } + + if (line50Value != null) { + range2.setLine50Value(toNumber(line50Value, "0.00", 0).doubleValue()); + } + + if (line9999Value != null) { + range2.setLine9999Value(toNumber(line9999Value, "0.00", 0).doubleValue()); + } + + return range2; + } + + @Override + public StatusCode buildStatusCode(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String count = attributes.getValue(ATTR_COUNT); + StatusCode statusCode = new StatusCode(id); + + if (count != null) { + statusCode.setCount(convert(Long.class, count, 0L)); + } + + return statusCode; + } + + @Override + public TransactionReport buildTransactionReport(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String startTime = attributes.getValue(ATTR_STARTTIME); + String endTime = attributes.getValue(ATTR_ENDTIME); + TransactionReport transactionReport = new TransactionReport(domain); + + if (startTime != null) { + transactionReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + transactionReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return transactionReport; + } + + @Override + public TransactionType buildType(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String totalCount = attributes.getValue(ATTR_TOTALCOUNT); + String failCount = attributes.getValue(ATTR_FAILCOUNT); + String failPercent = attributes.getValue(ATTR_FAILPERCENT); + String min = attributes.getValue(ATTR_MIN); + String max = attributes.getValue(ATTR_MAX); + String avg = attributes.getValue(ATTR_AVG); + String sum = attributes.getValue(ATTR_SUM); + String sum2 = attributes.getValue(ATTR_SUM2); + String std = attributes.getValue(ATTR_STD); + String tps = attributes.getValue(ATTR_TPS); + String line95Value = attributes.getValue(ATTR_LINE95VALUE); + String line99Value = attributes.getValue(ATTR_LINE99VALUE); + String line999Value = attributes.getValue(ATTR_LINE999VALUE); + String line90Value = attributes.getValue(ATTR_LINE90VALUE); + String line50Value = attributes.getValue(ATTR_LINE50VALUE); + String line9999Value = attributes.getValue(ATTR_LINE9999VALUE); + TransactionType type = new TransactionType(id); + + if (totalCount != null) { + type.setTotalCount(convert(Long.class, totalCount, 0L)); + } + + if (failCount != null) { + type.setFailCount(convert(Long.class, failCount, 0L)); + } + + if (failPercent != null) { + type.setFailPercent(toNumber(failPercent, "0.00", 0).doubleValue()); + } + + if (min != null) { + type.setMin(toNumber(min, "0.00", 0).doubleValue()); + } + + if (max != null) { + type.setMax(toNumber(max, "0.00", 0).doubleValue()); + } + + if (avg != null) { + type.setAvg(toNumber(avg, "0.0", 0).doubleValue()); + } + + if (sum != null) { + type.setSum(toNumber(sum, "0.0", 0).doubleValue()); + } + + if (sum2 != null) { + type.setSum2(toNumber(sum2, "0.0", 0).doubleValue()); + } + + if (std != null) { + type.setStd(toNumber(std, "0.0", 0).doubleValue()); + } + + if (tps != null) { + type.setTps(toNumber(tps, "0.00", 0).doubleValue()); + } + + if (line95Value != null) { + type.setLine95Value(toNumber(line95Value, "0.00", 0).doubleValue()); + } + + if (line99Value != null) { + type.setLine99Value(toNumber(line99Value, "0.00", 0).doubleValue()); + } + + if (line999Value != null) { + type.setLine999Value(toNumber(line999Value, "0.00", 0).doubleValue()); + } + + if (line90Value != null) { + type.setLine90Value(toNumber(line90Value, "0.00", 0).doubleValue()); + } + + if (line50Value != null) { + type.setLine50Value(toNumber(line50Value, "0.00", 0).doubleValue()); + } + + if (line9999Value != null) { + type.setLine9999Value(toNumber(line9999Value, "0.00", 0).doubleValue()); + } + + Map dynamicAttributes = type.getDynamicAttributes(); + int _length = attributes == null ? 0 : attributes.getLength(); + + for (int i = 0; i < _length; i++) { + String _name = attributes.getQName(i); + String _value = attributes.getValue(i); + + dynamicAttributes.put(_name, _value); + } + + dynamicAttributes.remove(ATTR_ID); + dynamicAttributes.remove(ATTR_TOTALCOUNT); + dynamicAttributes.remove(ATTR_FAILCOUNT); + dynamicAttributes.remove(ATTR_FAILPERCENT); + dynamicAttributes.remove(ATTR_MIN); + dynamicAttributes.remove(ATTR_MAX); + dynamicAttributes.remove(ATTR_AVG); + dynamicAttributes.remove(ATTR_SUM); + dynamicAttributes.remove(ATTR_SUM2); + dynamicAttributes.remove(ATTR_STD); + dynamicAttributes.remove(ATTR_TPS); + dynamicAttributes.remove(ATTR_LINE95VALUE); + dynamicAttributes.remove(ATTR_LINE99VALUE); + dynamicAttributes.remove(ATTR_LINE999VALUE); + dynamicAttributes.remove(ATTR_LINE90VALUE); + dynamicAttributes.remove(ATTR_LINE50VALUE); + dynamicAttributes.remove(ATTR_LINE9999VALUE); + + return type; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format, Number defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultSaxParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..cb3ce4bcf1 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultSaxParser.java @@ -0,0 +1,488 @@ +package com.dianping.cat.consumer.transaction.model.transform; + +import static com.dianping.cat.consumer.transaction.model.Constants.ELEMENT_DOMAIN; +import static com.dianping.cat.consumer.transaction.model.Constants.ELEMENT_DOMAIN_NAMES; +import static com.dianping.cat.consumer.transaction.model.Constants.ELEMENT_FAILMESSAGEURL; +import static com.dianping.cat.consumer.transaction.model.Constants.ELEMENT_IP; +import static com.dianping.cat.consumer.transaction.model.Constants.ELEMENT_IPS; +import static com.dianping.cat.consumer.transaction.model.Constants.ELEMENT_LONGESTMESSAGEURL; +import static com.dianping.cat.consumer.transaction.model.Constants.ELEMENT_SUCCESSMESSAGEURL; + +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_DURATION; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_GRAPH; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_GRAPH_TREND; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_GRAPH2; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_MACHINE; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_NAME; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_RANGE; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_RANGE2; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_STATUSCODE; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_TRANSACTION_REPORT; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_TYPE; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.consumer.transaction.model.IEntity; +import com.dianping.cat.consumer.transaction.model.entity.AllDuration; +import com.dianping.cat.consumer.transaction.model.entity.Duration; +import com.dianping.cat.consumer.transaction.model.entity.Graph; +import com.dianping.cat.consumer.transaction.model.entity.Graph2; +import com.dianping.cat.consumer.transaction.model.entity.GraphTrend; +import com.dianping.cat.consumer.transaction.model.entity.Machine; +import com.dianping.cat.consumer.transaction.model.entity.Range; +import com.dianping.cat.consumer.transaction.model.entity.Range2; +import com.dianping.cat.consumer.transaction.model.entity.StatusCode; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static TransactionReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(TransactionReport.class, new InputSource(removeBOM(in))); + } + + public static TransactionReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(TransactionReport.class, new InputSource(removeBOM(reader))); + } + + public static TransactionReport parse(String xml) throws SAXException, IOException { + return parseEntity(TransactionReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof TransactionReport) { + TransactionReport transactionReport = (TransactionReport) currentObj; + + if (ELEMENT_DOMAIN.equals(currentTag)) { + transactionReport.addDomain(getText()); + } else if (ELEMENT_IP.equals(currentTag)) { + transactionReport.addIp(getText()); + } + } else if (currentObj instanceof TransactionType) { + TransactionType type = (TransactionType) currentObj; + + if (ELEMENT_SUCCESSMESSAGEURL.equals(currentTag)) { + type.setSuccessMessageUrl(getText()); + } else if (ELEMENT_FAILMESSAGEURL.equals(currentTag)) { + type.setFailMessageUrl(getText()); + } else if (ELEMENT_LONGESTMESSAGEURL.equals(currentTag)) { + type.setLongestMessageUrl(getText()); + } + } else if (currentObj instanceof TransactionName) { + TransactionName name = (TransactionName) currentObj; + + if (ELEMENT_SUCCESSMESSAGEURL.equals(currentTag)) { + name.setSuccessMessageUrl(getText()); + } else if (ELEMENT_FAILMESSAGEURL.equals(currentTag)) { + name.setFailMessageUrl(getText()); + } else if (ELEMENT_LONGESTMESSAGEURL.equals(currentTag)) { + name.setLongestMessageUrl(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForAllDuration(AllDuration parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForDuration(Duration parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForGraph(Graph parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForGraph2(Graph2 parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForGraphTrend(GraphTrend parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForMachine(Machine parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_TYPE.equals(qName)) { + TransactionType type = m_maker.buildType(attributes); + + m_linker.onType(parentObj, type); + m_objs.push(type); + } else { + throw new SAXException(String.format("Element(%s) is not expected under machine!", qName)); + } + + m_tags.push(qName); + } + + private void parseForName(TransactionName parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_SUCCESSMESSAGEURL.equals(qName) || ELEMENT_FAILMESSAGEURL.equals(qName) || ELEMENT_LONGESTMESSAGEURL.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_RANGE.equals(qName)) { + Range range = m_maker.buildRange(attributes); + + m_linker.onRange(parentObj, range); + m_objs.push(range); + } else if (ENTITY_DURATION.equals(qName)) { + Duration duration = m_maker.buildDuration(attributes); + + m_linker.onDuration(parentObj, duration); + m_objs.push(duration); + } else if (ENTITY_GRAPH.equals(qName)) { + Graph graph = m_maker.buildGraph(attributes); + + m_linker.onGraph(parentObj, graph); + m_objs.push(graph); + } else if (ENTITY_GRAPH_TREND.equals(qName)) { + GraphTrend graphTrend = m_maker.buildGraphTrend(attributes); + + m_linker.onGraphTrend(parentObj, graphTrend); + m_objs.push(graphTrend); + } else if (ENTITY_STATUSCODE.equals(qName)) { + StatusCode statusCode = m_maker.buildStatusCode(attributes); + + m_linker.onStatusCode(parentObj, statusCode); + m_objs.push(statusCode); + } else { + throw new SAXException(String.format("Element(%s) is not expected under name!", qName)); + } + + m_tags.push(qName); + } + + private void parseForRange(Range parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForRange2(Range2 parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForStatusCode(StatusCode parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForTransactionReport(TransactionReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_DOMAIN_NAMES.equals(qName) || ELEMENT_DOMAIN.equals(qName) || ELEMENT_IPS.equals(qName) || ELEMENT_IP.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_linker.onMachine(parentObj, machine); + m_objs.push(machine); + } else { + throw new SAXException(String.format("Element(%s) is not expected under transaction-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseForType(TransactionType parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_SUCCESSMESSAGEURL.equals(qName) || ELEMENT_FAILMESSAGEURL.equals(qName) || ELEMENT_LONGESTMESSAGEURL.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_NAME.equals(qName)) { + TransactionName name = m_maker.buildName(attributes); + + m_linker.onName(parentObj, name); + m_objs.push(name); + } else if (ENTITY_GRAPH2.equals(qName)) { + Graph2 graph2 = m_maker.buildGraph2(attributes); + + m_linker.onGraph2(parentObj, graph2); + m_objs.push(graph2); + } else if (ENTITY_GRAPH_TREND.equals(qName)) { + GraphTrend graphTrend = m_maker.buildGraphTrend(attributes); + + m_linker.onGraphTrend(parentObj, graphTrend); + m_objs.push(graphTrend); + } else if (ENTITY_RANGE2.equals(qName)) { + Range2 range2 = m_maker.buildRange2(attributes); + + m_linker.onRange2(parentObj, range2); + m_objs.push(range2); + } else { + throw new SAXException(String.format("Element(%s) is not expected under type!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_TRANSACTION_REPORT.equals(qName)) { + TransactionReport transactionReport = m_maker.buildTransactionReport(attributes); + + m_entity = transactionReport; + m_objs.push(transactionReport); + m_tags.push(qName); + } else if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_entity = machine; + m_objs.push(machine); + m_tags.push(qName); + } else if (ENTITY_TYPE.equals(qName)) { + TransactionType type = m_maker.buildType(attributes); + + m_entity = type; + m_objs.push(type); + m_tags.push(qName); + } else if (ENTITY_NAME.equals(qName)) { + TransactionName name = m_maker.buildName(attributes); + + m_entity = name; + m_objs.push(name); + m_tags.push(qName); + } else if (ENTITY_RANGE.equals(qName)) { + Range range = m_maker.buildRange(attributes); + + m_entity = range; + m_objs.push(range); + m_tags.push(qName); + } else if (ENTITY_DURATION.equals(qName)) { + Duration duration = m_maker.buildDuration(attributes); + + m_entity = duration; + m_objs.push(duration); + m_tags.push(qName); + } else if (ENTITY_RANGE2.equals(qName)) { + Range2 range2 = m_maker.buildRange2(attributes); + + m_entity = range2; + m_objs.push(range2); + m_tags.push(qName); + } else if (ENTITY_GRAPH.equals(qName)) { + Graph graph = m_maker.buildGraph(attributes); + + m_entity = graph; + m_objs.push(graph); + m_tags.push(qName); + } else if (ENTITY_GRAPH2.equals(qName)) { + Graph2 graph2 = m_maker.buildGraph2(attributes); + + m_entity = graph2; + m_objs.push(graph2); + m_tags.push(qName); + } else if (ENTITY_GRAPH_TREND.equals(qName)) { + GraphTrend graphTrend = m_maker.buildGraphTrend(attributes); + + m_entity = graphTrend; + m_objs.push(graphTrend); + m_tags.push(qName); + } else if (ENTITY_STATUSCODE.equals(qName)) { + StatusCode statusCode = m_maker.buildStatusCode(attributes); + + m_entity = statusCode; + m_objs.push(statusCode); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof TransactionReport) { + parseForTransactionReport((TransactionReport) parent, tag, qName, attributes); + } else if (parent instanceof Machine) { + parseForMachine((Machine) parent, tag, qName, attributes); + } else if (parent instanceof TransactionType) { + parseForType((TransactionType) parent, tag, qName, attributes); + } else if (parent instanceof TransactionName) { + parseForName((TransactionName) parent, tag, qName, attributes); + } else if (parent instanceof Range) { + parseForRange((Range) parent, tag, qName, attributes); + } else if (parent instanceof Duration) { + parseForDuration((Duration) parent, tag, qName, attributes); + } else if (parent instanceof Range2) { + parseForRange2((Range2) parent, tag, qName, attributes); + } else if (parent instanceof Graph) { + parseForGraph((Graph) parent, tag, qName, attributes); + } else if (parent instanceof Graph2) { + parseForGraph2((Graph2) parent, tag, qName, attributes); + } else if (parent instanceof GraphTrend) { + parseForGraphTrend((GraphTrend) parent, tag, qName, attributes); + } else if (parent instanceof AllDuration) { + parseForAllDuration((AllDuration) parent, tag, qName, attributes); + } else if (parent instanceof StatusCode) { + parseForStatusCode((StatusCode) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format) { + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultXmlBuilder.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..5dfc743f54 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/DefaultXmlBuilder.java @@ -0,0 +1,456 @@ +package com.dianping.cat.consumer.transaction.model.transform; + +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_AVG; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_COUNT; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_DOMAIN; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_DURATION; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_ENDTIME; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_FAILCOUNT; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_FAILPERCENT; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_FAILS; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_ID; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_IP; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_LINE50VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_LINE90VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_LINE95VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_LINE9999VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_LINE999VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_LINE99VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_MAX; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_MIN; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_STARTTIME; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_STD; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_SUM; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_SUM2; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_TOTALCOUNT; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_TPS; +import static com.dianping.cat.consumer.transaction.model.Constants.ATTR_VALUE; +import static com.dianping.cat.consumer.transaction.model.Constants.ELEMENT_DOMAIN; +import static com.dianping.cat.consumer.transaction.model.Constants.ELEMENT_FAILMESSAGEURL; +import static com.dianping.cat.consumer.transaction.model.Constants.ELEMENT_IP; +import static com.dianping.cat.consumer.transaction.model.Constants.ELEMENT_LONGESTMESSAGEURL; +import static com.dianping.cat.consumer.transaction.model.Constants.ELEMENT_SUCCESSMESSAGEURL; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_ALL_DURATION; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_DURATION; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_GRAPH; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_GRAPH_TREND; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_GRAPH2; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_MACHINE; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_NAME; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_RANGE; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_RANGE2; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_STATUSCODE; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_TRANSACTION_REPORT; +import static com.dianping.cat.consumer.transaction.model.Constants.ENTITY_TYPE; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.consumer.transaction.model.IEntity; +import com.dianping.cat.consumer.transaction.model.IVisitor; +import com.dianping.cat.consumer.transaction.model.entity.AllDuration; +import com.dianping.cat.consumer.transaction.model.entity.Duration; +import com.dianping.cat.consumer.transaction.model.entity.Graph; +import com.dianping.cat.consumer.transaction.model.entity.Graph2; +import com.dianping.cat.consumer.transaction.model.entity.GraphTrend; +import com.dianping.cat.consumer.transaction.model.entity.Machine; +import com.dianping.cat.consumer.transaction.model.entity.Range; +import com.dianping.cat.consumer.transaction.model.entity.Range2; +import com.dianping.cat.consumer.transaction.model.entity.StatusCode; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + protected String toString(Number number, String format) { + if (number != null) { + return new java.text.DecimalFormat(format).format(number); + } else { + return null; + } + } + + @Override + public void visitAllDuration(AllDuration allDuration) { + startTag(ENTITY_ALL_DURATION, true, null, ATTR_VALUE, allDuration.getValue(), ATTR_COUNT, allDuration.getCount()); + } + + @Override + public void visitDuration(Duration duration) { + startTag(ENTITY_DURATION, true, null, ATTR_VALUE, duration.getValue(), ATTR_COUNT, duration.getCount()); + } + + @Override + public void visitGraph(Graph graph) { + startTag(ENTITY_GRAPH, true, null, ATTR_DURATION, graph.getDuration(), ATTR_SUM, graph.getSum(), ATTR_AVG, graph.getAvg(), ATTR_COUNT, graph.getCount(), ATTR_FAILS, graph.getFails()); + } + + @Override + public void visitGraph2(Graph2 graph2) { + startTag(ENTITY_GRAPH2, true, null, ATTR_DURATION, graph2.getDuration(), ATTR_SUM, graph2.getSum(), ATTR_AVG, graph2.getAvg(), ATTR_COUNT, graph2.getCount(), ATTR_FAILS, graph2.getFails()); + } + + @Override + public void visitGraphTrend(GraphTrend graphTrend) { + startTag(ENTITY_GRAPH_TREND, true, null, ATTR_DURATION, graphTrend.getDuration(), ATTR_SUM, graphTrend.getSum(), ATTR_AVG, graphTrend.getAvg(), ATTR_COUNT, graphTrend.getCount(), ATTR_FAILS, graphTrend.getFails()); + } + + @Override + public void visitMachine(Machine machine) { + startTag(ENTITY_MACHINE, null, ATTR_IP, machine.getIp()); + + if (!machine.getTypes().isEmpty()) { + for (TransactionType type : machine.getTypes().values()) { + type.accept(m_visitor); + } + } + + endTag(ENTITY_MACHINE); + } + + @Override + public void visitName(TransactionName name) { + startTag(ENTITY_NAME, null, ATTR_ID, name.getId(), ATTR_TOTALCOUNT, name.getTotalCount(), ATTR_FAILCOUNT, name.getFailCount(), ATTR_FAILPERCENT, toString(name.getFailPercent(), "0.00"), ATTR_MIN, toString(name.getMin(), "0.00"), ATTR_MAX, toString(name.getMax(), "0.00"), ATTR_AVG, toString(name.getAvg(), "0.0"), ATTR_SUM, toString(name.getSum(), "0.0"), ATTR_SUM2, toString(name.getSum2(), "0.0"), ATTR_STD, toString(name.getStd(), "0.0"), ATTR_TPS, toString(name.getTps(), "0.00"), ATTR_LINE95VALUE, toString(name.getLine95Value(), "0.00"), ATTR_LINE99VALUE, toString(name.getLine99Value(), "0.00"), ATTR_LINE999VALUE, toString(name.getLine999Value(), "0.00"), ATTR_LINE90VALUE, toString(name.getLine90Value(), "0.00"), ATTR_LINE50VALUE, toString(name.getLine50Value(), "0.00"), ATTR_LINE9999VALUE, toString(name.getLine9999Value(), "0.00")); + + element(ELEMENT_SUCCESSMESSAGEURL, name.getSuccessMessageUrl(), null, true); + + element(ELEMENT_FAILMESSAGEURL, name.getFailMessageUrl(), null, true); + + element(ELEMENT_LONGESTMESSAGEURL, name.getLongestMessageUrl(), null, true); + + if (!name.getRanges().isEmpty()) { + for (Range range : name.getRanges().values()) { + range.accept(m_visitor); + } + } + + if (!name.getDurations().isEmpty()) { + for (Duration duration : name.getDurations().values()) { + duration.accept(m_visitor); + } + } + + if (!name.getGraphs().isEmpty()) { + for (Graph graph : name.getGraphs().values()) { + graph.accept(m_visitor); + } + } + + if (name.getGraphTrend() != null) { + name.getGraphTrend().accept(m_visitor); + } + + if (!name.getStatusCodes().isEmpty()) { + for (StatusCode statusCode : name.getStatusCodes().values()) { + statusCode.accept(m_visitor); + } + } + + endTag(ENTITY_NAME); + } + + @Override + public void visitRange(Range range) { + startTag(ENTITY_RANGE, true, null, ATTR_VALUE, range.getValue(), ATTR_COUNT, range.getCount(), ATTR_SUM, range.getSum(), ATTR_AVG, toString(range.getAvg(), "0.0"), ATTR_FAILS, range.getFails(), ATTR_MIN, toString(range.getMin(), "0.00"), ATTR_MAX, toString(range.getMax(), "0.00"), ATTR_LINE95VALUE, toString(range.getLine95Value(), "0.00"), ATTR_LINE99VALUE, toString(range.getLine99Value(), "0.00"), ATTR_LINE999VALUE, toString(range.getLine999Value(), "0.00"), ATTR_LINE90VALUE, toString(range.getLine90Value(), "0.00"), ATTR_LINE50VALUE, toString(range.getLine50Value(), "0.00"), ATTR_LINE9999VALUE, toString(range.getLine9999Value(), "0.00")); + } + + @Override + public void visitRange2(Range2 range2) { + startTag(ENTITY_RANGE2, true, null, ATTR_VALUE, range2.getValue(), ATTR_COUNT, range2.getCount(), ATTR_SUM, range2.getSum(), ATTR_AVG, toString(range2.getAvg(), "0.0"), ATTR_FAILS, range2.getFails(), ATTR_MIN, toString(range2.getMin(), "0.00"), ATTR_MAX, toString(range2.getMax(), "0.00"), ATTR_LINE95VALUE, toString(range2.getLine95Value(), "0.00"), ATTR_LINE99VALUE, toString(range2.getLine99Value(), "0.00"), ATTR_LINE999VALUE, toString(range2.getLine999Value(), "0.00"), ATTR_LINE90VALUE, toString(range2.getLine90Value(), "0.00"), ATTR_LINE50VALUE, toString(range2.getLine50Value(), "0.00"), ATTR_LINE9999VALUE, toString(range2.getLine9999Value(), "0.00")); + } + + @Override + public void visitStatusCode(StatusCode statusCode) { + startTag(ENTITY_STATUSCODE, true, null, ATTR_ID, statusCode.getId(), ATTR_COUNT, statusCode.getCount()); + } + + @Override + public void visitTransactionReport(TransactionReport transactionReport) { + startTag(ENTITY_TRANSACTION_REPORT, null, ATTR_DOMAIN, transactionReport.getDomain(), ATTR_STARTTIME, toString(transactionReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_ENDTIME, toString(transactionReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!transactionReport.getDomainNames().isEmpty()) { + for (String domain : transactionReport.getDomainNames()) { + tagWithText(ELEMENT_DOMAIN, domain); + } + } + + if (!transactionReport.getIps().isEmpty()) { + for (String ip : transactionReport.getIps()) { + tagWithText(ELEMENT_IP, ip); + } + } + + if (!transactionReport.getMachines().isEmpty()) { + for (Machine machine : transactionReport.getMachines().values()) { + machine.accept(m_visitor); + } + } + + endTag(ENTITY_TRANSACTION_REPORT); + } + + @Override + public void visitType(TransactionType type) { + startTag(ENTITY_TYPE, type.getDynamicAttributes(), ATTR_ID, type.getId(), ATTR_TOTALCOUNT, type.getTotalCount(), ATTR_FAILCOUNT, type.getFailCount(), ATTR_FAILPERCENT, toString(type.getFailPercent(), "0.00"), ATTR_MIN, toString(type.getMin(), "0.00"), ATTR_MAX, toString(type.getMax(), "0.00"), ATTR_AVG, toString(type.getAvg(), "0.0"), ATTR_SUM, toString(type.getSum(), "0.0"), ATTR_SUM2, toString(type.getSum2(), "0.0"), ATTR_STD, toString(type.getStd(), "0.0"), ATTR_TPS, toString(type.getTps(), "0.00"), ATTR_LINE95VALUE, toString(type.getLine95Value(), "0.00"), ATTR_LINE99VALUE, toString(type.getLine99Value(), "0.00"), ATTR_LINE999VALUE, toString(type.getLine999Value(), "0.00"), ATTR_LINE90VALUE, toString(type.getLine90Value(), "0.00"), ATTR_LINE50VALUE, toString(type.getLine50Value(), "0.00"), ATTR_LINE9999VALUE, toString(type.getLine9999Value(), "0.00")); + + element(ELEMENT_SUCCESSMESSAGEURL, type.getSuccessMessageUrl(), null, true); + + element(ELEMENT_FAILMESSAGEURL, type.getFailMessageUrl(), null, true); + + element(ELEMENT_LONGESTMESSAGEURL, type.getLongestMessageUrl(), null, true); + + if (!type.getNames().isEmpty()) { + for (TransactionName name : type.getNames().values()) { + name.accept(m_visitor); + } + } + + if (!type.getGraph2s().isEmpty()) { + for (Graph2 graph2 : type.getGraph2s().values()) { + graph2.accept(m_visitor); + } + } + + if (type.getGraphTrend() != null) { + type.getGraphTrend().accept(m_visitor); + } + + if (!type.getRange2s().isEmpty()) { + for (Range2 range2 : type.getRange2s().values()) { + range2.accept(m_visitor); + } + } + + endTag(ENTITY_TYPE); + } +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/ILinker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/ILinker.java new file mode 100644 index 0000000000..82b15db5cd --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/ILinker.java @@ -0,0 +1,47 @@ +package com.dianping.cat.consumer.transaction.model.transform; + +import com.dianping.cat.consumer.transaction.model.entity.AllDuration; +import com.dianping.cat.consumer.transaction.model.entity.Duration; +import com.dianping.cat.consumer.transaction.model.entity.Graph; +import com.dianping.cat.consumer.transaction.model.entity.Graph2; +import com.dianping.cat.consumer.transaction.model.entity.GraphTrend; +import com.dianping.cat.consumer.transaction.model.entity.Machine; +import com.dianping.cat.consumer.transaction.model.entity.Range; +import com.dianping.cat.consumer.transaction.model.entity.Range2; +import com.dianping.cat.consumer.transaction.model.entity.StatusCode; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; + +public interface ILinker { + + public boolean onAllDuration(TransactionType parent, AllDuration allDuration); + + public boolean onAllDuration(TransactionName parent, AllDuration allDuration); + + public boolean onAllDuration(Range parent, AllDuration allDuration); + + public boolean onAllDuration(Range2 parent, AllDuration allDuration); + + public boolean onDuration(TransactionName parent, Duration duration); + + public boolean onGraph(TransactionName parent, Graph graph); + + public boolean onGraph2(TransactionType parent, Graph2 graph2); + + public boolean onGraphTrend(TransactionType parent, GraphTrend graphTrend); + + public boolean onGraphTrend(TransactionName parent, GraphTrend graphTrend); + + public boolean onMachine(TransactionReport parent, Machine machine); + + public boolean onName(TransactionType parent, TransactionName name); + + public boolean onRange(TransactionName parent, Range range); + + public boolean onRange2(TransactionType parent, Range2 range2); + + public boolean onStatusCode(TransactionName parent, StatusCode statusCode); + + public boolean onType(Machine parent, TransactionType type); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/IMaker.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/IMaker.java new file mode 100644 index 0000000000..74341d0490 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/IMaker.java @@ -0,0 +1,45 @@ +package com.dianping.cat.consumer.transaction.model.transform; + +import com.dianping.cat.consumer.transaction.model.entity.AllDuration; +import com.dianping.cat.consumer.transaction.model.entity.Duration; +import com.dianping.cat.consumer.transaction.model.entity.Graph; +import com.dianping.cat.consumer.transaction.model.entity.Graph2; +import com.dianping.cat.consumer.transaction.model.entity.GraphTrend; +import com.dianping.cat.consumer.transaction.model.entity.Machine; +import com.dianping.cat.consumer.transaction.model.entity.Range; +import com.dianping.cat.consumer.transaction.model.entity.Range2; +import com.dianping.cat.consumer.transaction.model.entity.StatusCode; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; + +public interface IMaker { + + public AllDuration buildAllDuration(T node); + + public String buildDomain(T node); + + public Duration buildDuration(T node); + + public Graph buildGraph(T node); + + public Graph2 buildGraph2(T node); + + public GraphTrend buildGraphTrend(T node); + + public String buildIp(T node); + + public Machine buildMachine(T node); + + public TransactionName buildName(T node); + + public Range buildRange(T node); + + public Range2 buildRange2(T node); + + public StatusCode buildStatusCode(T node); + + public TransactionReport buildTransactionReport(T node); + + public TransactionType buildType(T node); +} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/IParser.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/IParser.java new file mode 100644 index 0000000000..1abfc72608 --- /dev/null +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/transaction/model/transform/IParser.java @@ -0,0 +1,40 @@ +package com.dianping.cat.consumer.transaction.model.transform; + +import com.dianping.cat.consumer.transaction.model.entity.AllDuration; +import com.dianping.cat.consumer.transaction.model.entity.Duration; +import com.dianping.cat.consumer.transaction.model.entity.Graph; +import com.dianping.cat.consumer.transaction.model.entity.Graph2; +import com.dianping.cat.consumer.transaction.model.entity.GraphTrend; +import com.dianping.cat.consumer.transaction.model.entity.Machine; +import com.dianping.cat.consumer.transaction.model.entity.Range; +import com.dianping.cat.consumer.transaction.model.entity.Range2; +import com.dianping.cat.consumer.transaction.model.entity.StatusCode; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; + +public interface IParser { + public TransactionReport parse(IMaker maker, ILinker linker, T node); + + public void parseForAllDuration(IMaker maker, ILinker linker, AllDuration parent, T node); + + public void parseForDuration(IMaker maker, ILinker linker, Duration parent, T node); + + public void parseForGraph(IMaker maker, ILinker linker, Graph parent, T node); + + public void parseForGraph2(IMaker maker, ILinker linker, Graph2 parent, T node); + + public void parseForGraphTrend(IMaker maker, ILinker linker, GraphTrend parent, T node); + + public void parseForMachine(IMaker maker, ILinker linker, Machine parent, T node); + + public void parseForTransactionName(IMaker maker, ILinker linker, TransactionName parent, T node); + + public void parseForRange(IMaker maker, ILinker linker, Range parent, T node); + + public void parseForRange2(IMaker maker, ILinker linker, Range2 parent, T node); + + public void parseForStatusCode(IMaker maker, ILinker linker, StatusCode parent, T node); + + public void parseForTransactionType(IMaker maker, ILinker linker, TransactionType parent, T node); +} diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/all-report-codegen.xml b/cat-consumer/src/main/resources/META-INF/dal/model/all-report-codegen.xml deleted file mode 100644 index e727d9fc17..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/all-report-codegen.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/all-report-manifest.xml b/cat-consumer/src/main/resources/META-INF/dal/model/all-report-manifest.xml deleted file mode 100644 index 1fdf6a7517..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/all-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/all-report-model.xml b/cat-consumer/src/main/resources/META-INF/dal/model/all-report-model.xml deleted file mode 100644 index 7497ef1cc0..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/all-report-model.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/business-report-codegen.xml b/cat-consumer/src/main/resources/META-INF/dal/model/business-report-codegen.xml deleted file mode 100644 index 954c069c3b..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/business-report-codegen.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/business-report-manifest.xml b/cat-consumer/src/main/resources/META-INF/dal/model/business-report-manifest.xml deleted file mode 100644 index dbc2b637fe..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/business-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/business-report-model.xml b/cat-consumer/src/main/resources/META-INF/dal/model/business-report-model.xml deleted file mode 100644 index 92da5f4625..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/business-report-model.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/cross-report-codegen.xml b/cat-consumer/src/main/resources/META-INF/dal/model/cross-report-codegen.xml deleted file mode 100644 index 74dec8fa2c..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/cross-report-codegen.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/cross-report-manifest.xml b/cat-consumer/src/main/resources/META-INF/dal/model/cross-report-manifest.xml deleted file mode 100644 index 123b0821a8..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/cross-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/cross-report-model.xml b/cat-consumer/src/main/resources/META-INF/dal/model/cross-report-model.xml deleted file mode 100644 index 528ac68034..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/cross-report-model.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/dependency-report-codegen.xml b/cat-consumer/src/main/resources/META-INF/dal/model/dependency-report-codegen.xml deleted file mode 100644 index 36322d4c9a..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/dependency-report-codegen.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/dependency-report-manifest.xml b/cat-consumer/src/main/resources/META-INF/dal/model/dependency-report-manifest.xml deleted file mode 100644 index 45093af1e1..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/dependency-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/dependency-report-model.xml b/cat-consumer/src/main/resources/META-INF/dal/model/dependency-report-model.xml deleted file mode 100644 index ebdc0835c3..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/dependency-report-model.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/event-report-codegen.xml b/cat-consumer/src/main/resources/META-INF/dal/model/event-report-codegen.xml deleted file mode 100644 index df13ef4fc9..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/event-report-codegen.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/event-report-manifest.xml b/cat-consumer/src/main/resources/META-INF/dal/model/event-report-manifest.xml deleted file mode 100644 index c1e7fc9036..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/event-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/event-report-model.xml b/cat-consumer/src/main/resources/META-INF/dal/model/event-report-model.xml deleted file mode 100644 index 6dd79d0660..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/event-report-model.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/heartbeat-report-codegen.xml b/cat-consumer/src/main/resources/META-INF/dal/model/heartbeat-report-codegen.xml deleted file mode 100644 index caaaf78b9a..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/heartbeat-report-codegen.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/heartbeat-report-manifest.xml b/cat-consumer/src/main/resources/META-INF/dal/model/heartbeat-report-manifest.xml deleted file mode 100644 index 898c1d6f42..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/heartbeat-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/heartbeat-report-model.xml b/cat-consumer/src/main/resources/META-INF/dal/model/heartbeat-report-model.xml deleted file mode 100644 index 80d2d729e9..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/heartbeat-report-model.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/matrix-report-codegen.xml b/cat-consumer/src/main/resources/META-INF/dal/model/matrix-report-codegen.xml deleted file mode 100644 index 5537c740b8..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/matrix-report-codegen.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/matrix-report-manifest.xml b/cat-consumer/src/main/resources/META-INF/dal/model/matrix-report-manifest.xml deleted file mode 100644 index d439fb9189..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/matrix-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/matrix-report-model.xml b/cat-consumer/src/main/resources/META-INF/dal/model/matrix-report-model.xml deleted file mode 100644 index fc11f32652..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/matrix-report-model.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/problem-report-codegen.xml b/cat-consumer/src/main/resources/META-INF/dal/model/problem-report-codegen.xml deleted file mode 100644 index 4b15b77c51..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/problem-report-codegen.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/problem-report-manifest.xml b/cat-consumer/src/main/resources/META-INF/dal/model/problem-report-manifest.xml deleted file mode 100644 index 3a89d182d7..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/problem-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/problem-report-model.xml b/cat-consumer/src/main/resources/META-INF/dal/model/problem-report-model.xml deleted file mode 100644 index d1fbb2dccf..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/problem-report-model.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/state-report-codegen.xml b/cat-consumer/src/main/resources/META-INF/dal/model/state-report-codegen.xml deleted file mode 100644 index 89116d9f34..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/state-report-codegen.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/state-report-manifest.xml b/cat-consumer/src/main/resources/META-INF/dal/model/state-report-manifest.xml deleted file mode 100644 index 9d2ad60bbe..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/state-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/state-report-model.xml b/cat-consumer/src/main/resources/META-INF/dal/model/state-report-model.xml deleted file mode 100644 index b6e9d2d296..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/state-report-model.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/storage-report-codegen.xml b/cat-consumer/src/main/resources/META-INF/dal/model/storage-report-codegen.xml deleted file mode 100644 index ca3934ee05..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/storage-report-codegen.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/storage-report-manifest.xml b/cat-consumer/src/main/resources/META-INF/dal/model/storage-report-manifest.xml deleted file mode 100644 index 0608b67430..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/storage-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/storage-report-model.xml b/cat-consumer/src/main/resources/META-INF/dal/model/storage-report-model.xml deleted file mode 100644 index c658a49592..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/storage-report-model.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/top-report-codegen.xml b/cat-consumer/src/main/resources/META-INF/dal/model/top-report-codegen.xml deleted file mode 100644 index 49fd8677fb..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/top-report-codegen.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/top-report-manifest.xml b/cat-consumer/src/main/resources/META-INF/dal/model/top-report-manifest.xml deleted file mode 100644 index fa0ee3c7ce..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/top-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/top-report-model.xml b/cat-consumer/src/main/resources/META-INF/dal/model/top-report-model.xml deleted file mode 100644 index 5c7f8da73f..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/top-report-model.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/transaction-report-codegen.xml b/cat-consumer/src/main/resources/META-INF/dal/model/transaction-report-codegen.xml deleted file mode 100644 index 9812bea130..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/transaction-report-codegen.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/transaction-report-manifest.xml b/cat-consumer/src/main/resources/META-INF/dal/model/transaction-report-manifest.xml deleted file mode 100644 index 47930634bd..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/transaction-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/transaction-report-model.xml b/cat-consumer/src/main/resources/META-INF/dal/model/transaction-report-model.xml deleted file mode 100644 index 83b46965e0..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/transaction-report-model.xml +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/url-pattern-codegen.xml b/cat-consumer/src/main/resources/META-INF/dal/model/url-pattern-codegen.xml deleted file mode 100644 index 548fceeb43..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/url-pattern-codegen.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/url-pattern-manifest.xml b/cat-consumer/src/main/resources/META-INF/dal/model/url-pattern-manifest.xml deleted file mode 100644 index d873e11433..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/url-pattern-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-consumer/src/main/resources/META-INF/dal/model/url-pattern-model.xml b/cat-consumer/src/main/resources/META-INF/dal/model/url-pattern-model.xml deleted file mode 100644 index 8f99bf19b9..0000000000 --- a/cat-consumer/src/main/resources/META-INF/dal/model/url-pattern-model.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/cat-core/pom.xml b/cat-core/pom.xml index 06a33da2fd..fe0c54e770 100644 --- a/cat-core/pom.xml +++ b/cat-core/pom.xml @@ -90,70 +90,7 @@ test - - - - org.unidal.maven.plugins - codegen-maven-plugin - - - generate data model - generate-sources - - dal-model - - - ${basedir}/src/main/resources/META-INF/dal/model/server-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/url-pattern-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/server-filter-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/sample-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/business-report-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/atomic-message-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/tp-value-statistic-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/report-reload-config-manifest.xml, - - - - - generate dal jdbc model - generate-sources - - dal-jdbc - - - ${basedir}/src/main/resources/META-INF/dal/jdbc/report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/jdbc/config-manifest.xml, - - - - - - - maven-antrun-plugin - - - rewrite generated dal jdbc sources - generate-sources - - run - - - - - - - - - - - - - - - - - - + utf-8 diff --git a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java index 2d350bf4ff..3d1f4845be 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java @@ -19,8 +19,8 @@ package com.dianping.cat.config; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -30,7 +30,6 @@ import com.dianping.cat.configuration.message.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.task.TimerSyncTask; public class AtomicMessageConfigManager { @@ -69,7 +68,7 @@ public synchronized void initialize() { } try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); @@ -77,7 +76,7 @@ public synchronized void initialize() { m_config = DefaultSaxParser.parse(content); LOGGER.info("Loaded atomic message config from repository, configId={}, modifyTime={}.", m_configId, m_modifyTime); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Atomic message config is missing in repository, loading default content from fetcher.", e); try { @@ -231,7 +230,7 @@ public int getMaxBusinessItemCount(String domain) { } private void refreshConfig() throws Exception { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); long modifyTime = config.getModifyDate().getTime(); synchronized (this) { @@ -255,7 +254,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); LOGGER.info("Stored atomic message config, configId={}.", m_configId); } catch (Exception e) { LOGGER.error("Unable to store atomic message config, configId={}.", m_configId, e); diff --git a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java index 47377d3dd1..35e77da175 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java @@ -25,8 +25,8 @@ import java.util.List; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -36,7 +36,6 @@ import com.dianping.cat.configuration.reload.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -76,7 +75,7 @@ public synchronized void initialize() { } try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); @@ -84,7 +83,7 @@ public synchronized void initialize() { m_config = DefaultSaxParser.parse(content); LOGGER.info("Loaded report reload config from repository, configId={}, modifyTime={}.", m_configId, m_modifyTime); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Report reload config is missing in repository, loading default content from fetcher.", e); try { @@ -178,7 +177,7 @@ public void setFetcher(ContentFetcher fetcher) { } private void refreshConfig() throws Exception { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); long modifyTime = config.getModifyDate().getTime(); synchronized (this) { @@ -202,7 +201,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); LOGGER.info("Stored report reload config, configId={}.", m_configId); } catch (Exception e) { LOGGER.error("Unable to store report reload config, configId={}.", m_configId, e); diff --git a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java index a3c11b487e..e6891ea3fc 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java @@ -26,9 +26,8 @@ import java.util.concurrent.ConcurrentHashMap; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -37,7 +36,6 @@ import com.dianping.cat.configuration.business.transform.DefaultSaxParser; import com.dianping.cat.core.config.BusinessConfig; import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; -import com.dianping.cat.core.config.BusinessConfigEntity; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -74,13 +72,13 @@ public boolean deleteBusinessItem(String domain, String key) { ensureInitialized(); try { - BusinessConfig config = m_configDao.findByNameDomain(BASE_CONFIG, domain, BusinessConfigEntity.READSET_FULL); + BusinessConfig config = m_configDao.findByNameDomain(BASE_CONFIG, domain); BusinessReportConfig businessReportConfig = DefaultSaxParser.parse(config.getContent()); businessReportConfig.removeBusinessItemConfig(key); config.setContent(businessReportConfig.toString()); config.setUpdatetime(new Date()); - m_configDao.updateByPK(config, BusinessConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); Set itemIds = m_domains.get(domain); @@ -98,14 +96,14 @@ public boolean deleteCustomItem(String domain, String key) { ensureInitialized(); try { - BusinessConfig config = m_configDao.findByNameDomain(BASE_CONFIG, domain, BusinessConfigEntity.READSET_FULL); + BusinessConfig config = m_configDao.findByNameDomain(BASE_CONFIG, domain); BusinessReportConfig businessReportConfig = DefaultSaxParser.parse(config.getContent()); businessReportConfig.removeCustomConfig(key); config.setContent(businessReportConfig.toString()); config.setUpdatetime(new Date()); - m_configDao.updateByPK(config, BusinessConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); cacheConfigs(businessReportConfig, domain); } catch (Exception e) { LOGGER.error("Unable to delete business custom config, domain={}, key={}.", domain, key, e); @@ -164,7 +162,7 @@ public void setServerConfigManager(ServerConfigManager serverConfigManager) { private void loadData() { try { - List configs = m_configDao.findByName(BASE_CONFIG, BusinessConfigEntity.READSET_FULL); + List configs = m_configDao.findByName(BASE_CONFIG); Map> domains = new ConcurrentHashMap>(); for (BusinessConfig config : configs) { @@ -224,13 +222,13 @@ public boolean insertBusinessConfigIfNotExist(String domain, String key, ConfigI if (!itemIds.contains(key)) { BusinessConfig businessConfig = m_configDao - .findByNameDomain(BASE_CONFIG, domain, BusinessConfigEntity.READSET_FULL); + .findByNameDomain(BASE_CONFIG, domain); BusinessReportConfig config = DefaultSaxParser.parse(businessConfig.getContent()); BusinessItemConfig businessItemConfig = buildBusinessItemConfig(key, item); config.addBusinessItemConfig(businessItemConfig); businessConfig.setContent(config.toString()); - m_configDao.updateByPK(businessConfig, BusinessConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(businessConfig); itemIds.add(key); cacheConfigs(config, domain); @@ -255,11 +253,11 @@ public BusinessReportConfig queryConfigByDomain(String domain) { if (m_alertMachine) { businessReportConfig = m_configs.get(domain); } else { - BusinessConfig config = m_configDao.findByNameDomain(BASE_CONFIG, domain, BusinessConfigEntity.READSET_FULL); + BusinessConfig config = m_configDao.findByNameDomain(BASE_CONFIG, domain); businessReportConfig = DefaultSaxParser.parse(config.getContent()); } - } catch (DalNotFoundException notFound) { + } catch (EmptyResultDataAccessException notFound) { LOGGER.warn("Business config is missing, domain={}; returning empty config.", domain, notFound); } catch (Exception e) { LOGGER.error("Unable to query business config by domain={}.", domain, e); @@ -283,11 +281,11 @@ public boolean updateConfigByDomain(BusinessReportConfig config) { proto.setContent(config.toString()); try { - m_configDao.updateBaseConfigByDomain(proto, BusinessConfigEntity.UPDATESET_FULL); + m_configDao.updateBaseConfigByDomain(proto); cacheConfigs(config, domain); LOGGER.info("Updated business config, domain={}.", domain); return true; - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to update business config, domain={}.", domain, e); Cat.logError(e); } @@ -311,7 +309,7 @@ public boolean insertConfigByDomain(BusinessReportConfig config) { cacheConfigs(config, domain); LOGGER.info("Inserted business config, domain={}.", domain); return true; - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to insert business config, domain={}.", domain, e); Cat.logError(e); } diff --git a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java index 917f6531f7..56c199709f 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java @@ -19,14 +19,13 @@ package com.dianping.cat.config.sample; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.sample.entity.SampleConfig; import com.dianping.cat.sample.transform.DefaultSaxParser; import com.dianping.cat.task.TimerSyncTask; @@ -66,7 +65,7 @@ public synchronized void initialize() { } try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); @@ -74,7 +73,7 @@ public synchronized void initialize() { m_config = DefaultSaxParser.parse(content); LOGGER.info("Loaded sample config from repository, configId={}, modifyTime={}.", m_configId, m_modifyTime); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Sample config is missing in repository, loading default content from fetcher.", e); try { @@ -139,7 +138,7 @@ public boolean insert(String xml) { } private void refreshConfig() throws Exception { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); long modifyTime = config.getModifyDate().getTime(); synchronized (this) { @@ -162,7 +161,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); LOGGER.info("Stored sample config, configId={}.", m_configId); } catch (Exception e) { LOGGER.error("Unable to store sample config, configId={}.", m_configId, e); diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java index eaae46575d..712fd23a6c 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java @@ -32,9 +32,9 @@ import java.util.regex.Pattern; import org.apache.commons.io.FileUtils; +import org.springframework.dao.EmptyResultDataAccessException; import org.apache.commons.lang3.tuple.Pair; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.support.Threads; import org.xml.sax.SAXException; @@ -55,7 +55,6 @@ import com.dianping.cat.configuration.server.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -403,7 +402,7 @@ public synchronized void initialize() { try { try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); @@ -411,7 +410,7 @@ public synchronized void initialize() { m_config = DefaultSaxParser.parse(content); SLF4J_LOGGER.info("Loaded server config from repository, configId={}, modifyTime={}.", m_configId, m_modifyTime); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { SLF4J_LOGGER.warn("Server config is missing in repository, loading default content from fetcher.", e); try { @@ -586,7 +585,7 @@ private void prepare() { } private void refreshConfig() throws Exception { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); long modifyTime = config.getModifyDate().getTime(); synchronized (this) { @@ -632,7 +631,7 @@ public boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); refreshServer(); SLF4J_LOGGER.info("Stored server config, configId={}.", m_configId); } catch (Exception e) { diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java index 004ec0fa14..9a756dfba5 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java @@ -22,9 +22,8 @@ import java.util.HashSet; import java.util.Set; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.xml.sax.SAXException; +import org.springframework.dao.EmptyResultDataAccessException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -33,7 +32,6 @@ import com.dianping.cat.configuration.server.filter.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -115,13 +113,13 @@ public synchronized void initialize() { } try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); m_modifyTime = config.getModifyDate().getTime(); m_config = DefaultSaxParser.parse(content); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -176,8 +174,8 @@ public boolean insert(String xml) { } } - private void refreshConfig() throws DalException, SAXException, IOException { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + private void refreshConfig() throws SAXException, IOException { + Config config = m_configDao.findByName(CONFIG_NAME); long modifyTime = config.getModifyDate().getTime(); synchronized (this) { @@ -201,7 +199,7 @@ public boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); } catch (Exception e) { Cat.logError(e); return false; diff --git a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java index c80af95868..ed1c76403a 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java @@ -21,7 +21,7 @@ import java.util.HashSet; import java.util.Set; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; @@ -31,7 +31,6 @@ import com.dianping.cat.configuration.tp.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.task.TimerSyncTask; public class TpValueStatisticConfigManager { @@ -71,13 +70,13 @@ public synchronized void initialize() { } try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); m_modifyTime = config.getModifyDate().getTime(); m_config = DefaultSaxParser.parse(content); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -139,7 +138,7 @@ public void setServerConfigManager(ServerConfigManager serverConfigManager) { } private void refreshConfig() throws Exception { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); long modifyTime = config.getModifyDate().getTime(); synchronized (this) { @@ -193,7 +192,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); } catch (Exception e) { Cat.logError(e); return false; diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/business/BaseEntity.java b/cat-core/src/main/java/com/dianping/cat/configuration/business/BaseEntity.java new file mode 100644 index 0000000000..082af339e3 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/business/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.configuration.business; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.configuration.business.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/business/Constants.java b/cat-core/src/main/java/com/dianping/cat/configuration/business/Constants.java new file mode 100644 index 0000000000..997bab34bc --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/business/Constants.java @@ -0,0 +1,32 @@ +package com.dianping.cat.configuration.business; + +public class Constants { + + public static final String ATTR_ALARM = "alarm"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_PRIVILEGE = "privilege"; + + public static final String ATTR_SHOW_AVG = "show-avg"; + + public static final String ATTR_SHOW_COUNT = "show-count"; + + public static final String ATTR_SHOW_SUM = "show-sum"; + + public static final String ATTR_TITLE = "title"; + + public static final String ATTR_VIEW_ORDER = "view-order"; + + public static final String ELEMENT_PATTERN = "pattern"; + + public static final String ENTITY_BUSINESS_ITEM_CONFIG = "business-item-config"; + + public static final String ENTITY_BUSINESS_ITEM_CONFIGS = "business-item-configs"; + + public static final String ENTITY_BUSINESS_REPORT_CONFIG = "business-report-config"; + + public static final String ENTITY_CUSTOM_CONFIG = "custom-config"; + + public static final String ENTITY_CUSTOM_CONFIGS = "custom-configs"; +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/business/IEntity.java b/cat-core/src/main/java/com/dianping/cat/configuration/business/IEntity.java new file mode 100644 index 0000000000..b28f63cfcc --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/business/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.configuration.business; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/business/IVisitor.java b/cat-core/src/main/java/com/dianping/cat/configuration/business/IVisitor.java new file mode 100644 index 0000000000..28db872d68 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/business/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.configuration.business; + +import com.dianping.cat.configuration.business.entity.BusinessItemConfig; +import com.dianping.cat.configuration.business.entity.BusinessReportConfig; +import com.dianping.cat.configuration.business.entity.CustomConfig; + +public interface IVisitor { + + public void visitBusinessItemConfig(BusinessItemConfig businessItemConfig); + + public void visitBusinessReportConfig(BusinessReportConfig businessReportConfig); + + public void visitCustomConfig(CustomConfig customConfig); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/business/entity/BusinessItemConfig.java b/cat-core/src/main/java/com/dianping/cat/configuration/business/entity/BusinessItemConfig.java new file mode 100644 index 0000000000..948e8c40a6 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/business/entity/BusinessItemConfig.java @@ -0,0 +1,175 @@ +package com.dianping.cat.configuration.business.entity; + +import static com.dianping.cat.configuration.business.Constants.ATTR_ID; +import static com.dianping.cat.configuration.business.Constants.ENTITY_BUSINESS_ITEM_CONFIG; + +import com.dianping.cat.configuration.business.BaseEntity; +import com.dianping.cat.configuration.business.IVisitor; + +public class BusinessItemConfig extends BaseEntity { + private String m_id; + + private double m_viewOrder; + + private String m_title; + + private boolean m_showCount; + + private boolean m_showAvg; + + private boolean m_showSum; + + private boolean m_alarm = false; + + private boolean m_privilege = false; + + public BusinessItemConfig() { + } + + public BusinessItemConfig(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitBusinessItemConfig(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof BusinessItemConfig) { + BusinessItemConfig _o = (BusinessItemConfig) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public boolean getAlarm() { + return m_alarm; + } + + public String getId() { + return m_id; + } + + public boolean getPrivilege() { + return m_privilege; + } + + public boolean getShowAvg() { + return m_showAvg; + } + + public boolean getShowCount() { + return m_showCount; + } + + public boolean getShowSum() { + return m_showSum; + } + + public String getTitle() { + return m_title; + } + + public double getViewOrder() { + return m_viewOrder; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public boolean isAlarm() { + return m_alarm; + } + + public boolean isPrivilege() { + return m_privilege; + } + + public boolean isShowAvg() { + return m_showAvg; + } + + public boolean isShowCount() { + return m_showCount; + } + + public boolean isShowSum() { + return m_showSum; + } + + @Override + public void mergeAttributes(BusinessItemConfig other) { + assertAttributeEquals(other, ENTITY_BUSINESS_ITEM_CONFIG, ATTR_ID, m_id, other.getId()); + + m_viewOrder = other.getViewOrder(); + + if (other.getTitle() != null) { + m_title = other.getTitle(); + } + + m_showCount = other.getShowCount(); + + m_showAvg = other.getShowAvg(); + + m_showSum = other.getShowSum(); + + m_alarm = other.getAlarm(); + + m_privilege = other.getPrivilege(); + } + + public BusinessItemConfig setAlarm(boolean alarm) { + m_alarm = alarm; + return this; + } + + public BusinessItemConfig setId(String id) { + m_id = id; + return this; + } + + public BusinessItemConfig setPrivilege(boolean privilege) { + m_privilege = privilege; + return this; + } + + public BusinessItemConfig setShowAvg(boolean showAvg) { + m_showAvg = showAvg; + return this; + } + + public BusinessItemConfig setShowCount(boolean showCount) { + m_showCount = showCount; + return this; + } + + public BusinessItemConfig setShowSum(boolean showSum) { + m_showSum = showSum; + return this; + } + + public BusinessItemConfig setTitle(String title) { + m_title = title; + return this; + } + + public BusinessItemConfig setViewOrder(double viewOrder) { + m_viewOrder = viewOrder; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/business/entity/BusinessReportConfig.java b/cat-core/src/main/java/com/dianping/cat/configuration/business/entity/BusinessReportConfig.java new file mode 100644 index 0000000000..b82ebdbd97 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/business/entity/BusinessReportConfig.java @@ -0,0 +1,109 @@ +package com.dianping.cat.configuration.business.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.configuration.business.BaseEntity; +import com.dianping.cat.configuration.business.IVisitor; + +public class BusinessReportConfig extends BaseEntity { + private String m_id; + + private Map m_businessItemConfigs = new LinkedHashMap(); + + private Map m_customConfigs = new LinkedHashMap(); + + public BusinessReportConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitBusinessReportConfig(this); + } + + public BusinessReportConfig addBusinessItemConfig(BusinessItemConfig businessItemConfig) { + m_businessItemConfigs.put(businessItemConfig.getId(), businessItemConfig); + return this; + } + + public BusinessReportConfig addCustomConfig(CustomConfig customConfig) { + m_customConfigs.put(customConfig.getId(), customConfig); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof BusinessReportConfig) { + BusinessReportConfig _o = (BusinessReportConfig) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + if (!equals(getBusinessItemConfigs(), _o.getBusinessItemConfigs())) { + return false; + } + + if (!equals(getCustomConfigs(), _o.getCustomConfigs())) { + return false; + } + + + return true; + } + + return false; + } + + public BusinessItemConfig findBusinessItemConfig(String id) { + return m_businessItemConfigs.get(id); + } + + public CustomConfig findCustomConfig(String id) { + return m_customConfigs.get(id); + } + + public Map getBusinessItemConfigs() { + return m_businessItemConfigs; + } + + public Map getCustomConfigs() { + return m_customConfigs; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + hash = hash * 31 + (m_businessItemConfigs == null ? 0 : m_businessItemConfigs.hashCode()); + hash = hash * 31 + (m_customConfigs == null ? 0 : m_customConfigs.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(BusinessReportConfig other) { + if (other.getId() != null) { + m_id = other.getId(); + } + } + + public BusinessItemConfig removeBusinessItemConfig(String id) { + return m_businessItemConfigs.remove(id); + } + + public CustomConfig removeCustomConfig(String id) { + return m_customConfigs.remove(id); + } + + public BusinessReportConfig setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/business/entity/CustomConfig.java b/cat-core/src/main/java/com/dianping/cat/configuration/business/entity/CustomConfig.java new file mode 100644 index 0000000000..68f12503bb --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/business/entity/CustomConfig.java @@ -0,0 +1,135 @@ +package com.dianping.cat.configuration.business.entity; + +import static com.dianping.cat.configuration.business.Constants.ATTR_ID; +import static com.dianping.cat.configuration.business.Constants.ENTITY_CUSTOM_CONFIG; + +import com.dianping.cat.configuration.business.BaseEntity; +import com.dianping.cat.configuration.business.IVisitor; + +public class CustomConfig extends BaseEntity { + private String m_id; + + private double m_viewOrder; + + private String m_title; + + private boolean m_alarm = false; + + private boolean m_privilege = false; + + private String m_pattern; + + public CustomConfig() { + } + + public CustomConfig(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitCustomConfig(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CustomConfig) { + CustomConfig _o = (CustomConfig) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public boolean getAlarm() { + return m_alarm; + } + + public String getId() { + return m_id; + } + + public String getPattern() { + return m_pattern; + } + + public boolean getPrivilege() { + return m_privilege; + } + + public String getTitle() { + return m_title; + } + + public double getViewOrder() { + return m_viewOrder; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public boolean isAlarm() { + return m_alarm; + } + + public boolean isPrivilege() { + return m_privilege; + } + + @Override + public void mergeAttributes(CustomConfig other) { + assertAttributeEquals(other, ENTITY_CUSTOM_CONFIG, ATTR_ID, m_id, other.getId()); + + m_viewOrder = other.getViewOrder(); + + if (other.getTitle() != null) { + m_title = other.getTitle(); + } + + m_alarm = other.getAlarm(); + + m_privilege = other.getPrivilege(); + } + + public CustomConfig setAlarm(boolean alarm) { + m_alarm = alarm; + return this; + } + + public CustomConfig setId(String id) { + m_id = id; + return this; + } + + public CustomConfig setPattern(String pattern) { + m_pattern = pattern; + return this; + } + + public CustomConfig setPrivilege(boolean privilege) { + m_privilege = privilege; + return this; + } + + public CustomConfig setTitle(String title) { + m_title = title; + return this; + } + + public CustomConfig setViewOrder(double viewOrder) { + m_viewOrder = viewOrder; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultLinker.java b/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultLinker.java new file mode 100644 index 0000000000..9ee79c7ad1 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultLinker.java @@ -0,0 +1,55 @@ +package com.dianping.cat.configuration.business.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.configuration.business.entity.BusinessItemConfig; +import com.dianping.cat.configuration.business.entity.BusinessReportConfig; +import com.dianping.cat.configuration.business.entity.CustomConfig; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onBusinessItemConfig(final BusinessReportConfig parent, final BusinessItemConfig businessItemConfig) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addBusinessItemConfig(businessItemConfig); + } + }); + } else { + parent.addBusinessItemConfig(businessItemConfig); + } + + return true; + } + + @Override + public boolean onCustomConfig(final BusinessReportConfig parent, final CustomConfig customConfig) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addCustomConfig(customConfig); + } + }); + } else { + parent.addCustomConfig(customConfig); + } + + return true; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultSaxMaker.java b/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..e3fa30f3a3 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultSaxMaker.java @@ -0,0 +1,129 @@ +package com.dianping.cat.configuration.business.transform; + +import static com.dianping.cat.configuration.business.Constants.ATTR_ALARM; +import static com.dianping.cat.configuration.business.Constants.ATTR_ID; +import static com.dianping.cat.configuration.business.Constants.ATTR_PRIVILEGE; +import static com.dianping.cat.configuration.business.Constants.ATTR_SHOW_AVG; +import static com.dianping.cat.configuration.business.Constants.ATTR_SHOW_COUNT; +import static com.dianping.cat.configuration.business.Constants.ATTR_SHOW_SUM; +import static com.dianping.cat.configuration.business.Constants.ATTR_TITLE; +import static com.dianping.cat.configuration.business.Constants.ATTR_VIEW_ORDER; + +import org.xml.sax.Attributes; + +import com.dianping.cat.configuration.business.entity.BusinessItemConfig; +import com.dianping.cat.configuration.business.entity.BusinessReportConfig; +import com.dianping.cat.configuration.business.entity.CustomConfig; + +public class DefaultSaxMaker implements IMaker { + + @Override + public BusinessItemConfig buildBusinessItemConfig(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String viewOrder = attributes.getValue(ATTR_VIEW_ORDER); + String title = attributes.getValue(ATTR_TITLE); + String showCount = attributes.getValue(ATTR_SHOW_COUNT); + String showAvg = attributes.getValue(ATTR_SHOW_AVG); + String showSum = attributes.getValue(ATTR_SHOW_SUM); + String alarm = attributes.getValue(ATTR_ALARM); + String privilege = attributes.getValue(ATTR_PRIVILEGE); + BusinessItemConfig businessItemConfig = new BusinessItemConfig(id); + + if (viewOrder != null) { + businessItemConfig.setViewOrder(convert(Double.class, viewOrder, 0.0)); + } + + if (title != null) { + businessItemConfig.setTitle(title); + } + + if (showCount != null) { + businessItemConfig.setShowCount(convert(Boolean.class, showCount, false)); + } + + if (showAvg != null) { + businessItemConfig.setShowAvg(convert(Boolean.class, showAvg, false)); + } + + if (showSum != null) { + businessItemConfig.setShowSum(convert(Boolean.class, showSum, false)); + } + + if (alarm != null) { + businessItemConfig.setAlarm(convert(Boolean.class, alarm, false)); + } + + if (privilege != null) { + businessItemConfig.setPrivilege(convert(Boolean.class, privilege, false)); + } + + return businessItemConfig; + } + + @Override + public BusinessReportConfig buildBusinessReportConfig(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + BusinessReportConfig businessReportConfig = new BusinessReportConfig(); + + if (id != null) { + businessReportConfig.setId(id); + } + + return businessReportConfig; + } + + @Override + public CustomConfig buildCustomConfig(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String viewOrder = attributes.getValue(ATTR_VIEW_ORDER); + String title = attributes.getValue(ATTR_TITLE); + String alarm = attributes.getValue(ATTR_ALARM); + String privilege = attributes.getValue(ATTR_PRIVILEGE); + CustomConfig customConfig = new CustomConfig(id); + + if (viewOrder != null) { + customConfig.setViewOrder(convert(Double.class, viewOrder, 0.0)); + } + + if (title != null) { + customConfig.setTitle(title); + } + + if (alarm != null) { + customConfig.setAlarm(convert(Boolean.class, alarm, false)); + } + + if (privilege != null) { + customConfig.setPrivilege(convert(Boolean.class, privilege, false)); + } + + return customConfig; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultSaxParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..d1fdafb8ab --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultSaxParser.java @@ -0,0 +1,261 @@ +package com.dianping.cat.configuration.business.transform; + +import static com.dianping.cat.configuration.business.Constants.ELEMENT_PATTERN; + +import static com.dianping.cat.configuration.business.Constants.ENTITY_BUSINESS_ITEM_CONFIG; +import static com.dianping.cat.configuration.business.Constants.ENTITY_BUSINESS_REPORT_CONFIG; +import static com.dianping.cat.configuration.business.Constants.ENTITY_CUSTOM_CONFIG; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.configuration.business.IEntity; +import com.dianping.cat.configuration.business.entity.BusinessItemConfig; +import com.dianping.cat.configuration.business.entity.BusinessReportConfig; +import com.dianping.cat.configuration.business.entity.CustomConfig; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static BusinessReportConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(BusinessReportConfig.class, new InputSource(removeBOM(in))); + } + + public static BusinessReportConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(BusinessReportConfig.class, new InputSource(removeBOM(reader))); + } + + public static BusinessReportConfig parse(String xml) throws SAXException, IOException { + return parseEntity(BusinessReportConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof CustomConfig) { + CustomConfig customConfig = (CustomConfig) currentObj; + + if (ELEMENT_PATTERN.equals(currentTag)) { + customConfig.setPattern(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForBusinessItemConfig(BusinessItemConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForBusinessReportConfig(BusinessReportConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_BUSINESS_ITEM_CONFIG.equals(qName)) { + BusinessItemConfig businessItemConfig = m_maker.buildBusinessItemConfig(attributes); + + m_linker.onBusinessItemConfig(parentObj, businessItemConfig); + m_objs.push(businessItemConfig); + } else if (ENTITY_CUSTOM_CONFIG.equals(qName)) { + CustomConfig customConfig = m_maker.buildCustomConfig(attributes); + + m_linker.onCustomConfig(parentObj, customConfig); + m_objs.push(customConfig); + } else { + throw new SAXException(String.format("Element(%s) is not expected under business-report-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseForCustomConfig(CustomConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_PATTERN.equals(qName)) { + m_objs.push(parentObj); + } else { + throw new SAXException(String.format("Element(%s) is not expected under custom-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_BUSINESS_REPORT_CONFIG.equals(qName)) { + BusinessReportConfig businessReportConfig = m_maker.buildBusinessReportConfig(attributes); + + m_entity = businessReportConfig; + m_objs.push(businessReportConfig); + m_tags.push(qName); + } else if (ENTITY_BUSINESS_ITEM_CONFIG.equals(qName)) { + BusinessItemConfig businessItemConfig = m_maker.buildBusinessItemConfig(attributes); + + m_entity = businessItemConfig; + m_objs.push(businessItemConfig); + m_tags.push(qName); + } else if (ENTITY_CUSTOM_CONFIG.equals(qName)) { + CustomConfig customConfig = m_maker.buildCustomConfig(attributes); + + m_entity = customConfig; + m_objs.push(customConfig); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof BusinessReportConfig) { + parseForBusinessReportConfig((BusinessReportConfig) parent, tag, qName, attributes); + } else if (parent instanceof BusinessItemConfig) { + parseForBusinessItemConfig((BusinessItemConfig) parent, tag, qName, attributes); + } else if (parent instanceof CustomConfig) { + parseForCustomConfig((CustomConfig) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultXmlBuilder.java b/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..78d6b00272 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/DefaultXmlBuilder.java @@ -0,0 +1,280 @@ +package com.dianping.cat.configuration.business.transform; + +import static com.dianping.cat.configuration.business.Constants.ATTR_ALARM; +import static com.dianping.cat.configuration.business.Constants.ATTR_ID; +import static com.dianping.cat.configuration.business.Constants.ATTR_PRIVILEGE; +import static com.dianping.cat.configuration.business.Constants.ATTR_SHOW_AVG; +import static com.dianping.cat.configuration.business.Constants.ATTR_SHOW_COUNT; +import static com.dianping.cat.configuration.business.Constants.ATTR_SHOW_SUM; +import static com.dianping.cat.configuration.business.Constants.ATTR_TITLE; +import static com.dianping.cat.configuration.business.Constants.ATTR_VIEW_ORDER; +import static com.dianping.cat.configuration.business.Constants.ELEMENT_PATTERN; +import static com.dianping.cat.configuration.business.Constants.ENTITY_BUSINESS_ITEM_CONFIG; +import static com.dianping.cat.configuration.business.Constants.ENTITY_BUSINESS_REPORT_CONFIG; +import static com.dianping.cat.configuration.business.Constants.ENTITY_CUSTOM_CONFIG; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.configuration.business.IEntity; +import com.dianping.cat.configuration.business.IVisitor; +import com.dianping.cat.configuration.business.entity.BusinessItemConfig; +import com.dianping.cat.configuration.business.entity.BusinessReportConfig; +import com.dianping.cat.configuration.business.entity.CustomConfig; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + @Override + public void visitBusinessItemConfig(BusinessItemConfig businessItemConfig) { + startTag(ENTITY_BUSINESS_ITEM_CONFIG, true, null, ATTR_ID, businessItemConfig.getId(), ATTR_VIEW_ORDER, businessItemConfig.getViewOrder(), ATTR_TITLE, businessItemConfig.getTitle(), ATTR_SHOW_COUNT, businessItemConfig.isShowCount(), ATTR_SHOW_AVG, businessItemConfig.isShowAvg(), ATTR_SHOW_SUM, businessItemConfig.isShowSum(), ATTR_ALARM, businessItemConfig.isAlarm(), ATTR_PRIVILEGE, businessItemConfig.isPrivilege()); + } + + @Override + public void visitBusinessReportConfig(BusinessReportConfig businessReportConfig) { + startTag(ENTITY_BUSINESS_REPORT_CONFIG, null, ATTR_ID, businessReportConfig.getId()); + + if (!businessReportConfig.getBusinessItemConfigs().isEmpty()) { + for (BusinessItemConfig businessItemConfig : businessReportConfig.getBusinessItemConfigs().values()) { + businessItemConfig.accept(m_visitor); + } + } + + if (!businessReportConfig.getCustomConfigs().isEmpty()) { + for (CustomConfig customConfig : businessReportConfig.getCustomConfigs().values()) { + customConfig.accept(m_visitor); + } + } + + endTag(ENTITY_BUSINESS_REPORT_CONFIG); + } + + @Override + public void visitCustomConfig(CustomConfig customConfig) { + startTag(ENTITY_CUSTOM_CONFIG, null, ATTR_ID, customConfig.getId(), ATTR_VIEW_ORDER, customConfig.getViewOrder(), ATTR_TITLE, customConfig.getTitle(), ATTR_ALARM, customConfig.isAlarm(), ATTR_PRIVILEGE, customConfig.isPrivilege()); + + element(ELEMENT_PATTERN, customConfig.getPattern(), null, true); + + endTag(ENTITY_CUSTOM_CONFIG); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/ILinker.java b/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/ILinker.java new file mode 100644 index 0000000000..5ac25ebabe --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.configuration.business.transform; + +import com.dianping.cat.configuration.business.entity.BusinessItemConfig; +import com.dianping.cat.configuration.business.entity.BusinessReportConfig; +import com.dianping.cat.configuration.business.entity.CustomConfig; + +public interface ILinker { + + public boolean onBusinessItemConfig(BusinessReportConfig parent, BusinessItemConfig businessItemConfig); + + public boolean onCustomConfig(BusinessReportConfig parent, CustomConfig customConfig); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/IMaker.java b/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/IMaker.java new file mode 100644 index 0000000000..cc052cf5c7 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/IMaker.java @@ -0,0 +1,14 @@ +package com.dianping.cat.configuration.business.transform; + +import com.dianping.cat.configuration.business.entity.BusinessItemConfig; +import com.dianping.cat.configuration.business.entity.BusinessReportConfig; +import com.dianping.cat.configuration.business.entity.CustomConfig; + +public interface IMaker { + + public BusinessItemConfig buildBusinessItemConfig(T node); + + public BusinessReportConfig buildBusinessReportConfig(T node); + + public CustomConfig buildCustomConfig(T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/IParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/IParser.java new file mode 100644 index 0000000000..3e09526de0 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/business/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.configuration.business.transform; + +import com.dianping.cat.configuration.business.entity.BusinessItemConfig; +import com.dianping.cat.configuration.business.entity.BusinessReportConfig; +import com.dianping.cat.configuration.business.entity.CustomConfig; + +public interface IParser { + public BusinessReportConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForBusinessItemConfig(IMaker maker, ILinker linker, BusinessItemConfig parent, T node); + + public void parseForCustomConfig(IMaker maker, ILinker linker, CustomConfig parent, T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/message/BaseEntity.java b/cat-core/src/main/java/com/dianping/cat/configuration/message/BaseEntity.java new file mode 100644 index 0000000000..e8b87ca8fd --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/message/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.configuration.message; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.configuration.message.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/message/Constants.java b/cat-core/src/main/java/com/dianping/cat/configuration/message/Constants.java new file mode 100644 index 0000000000..62a8b87d97 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/message/Constants.java @@ -0,0 +1,24 @@ +package com.dianping.cat.configuration.message; + +public class Constants { + + public static final String ATTR_ID = "id"; + + public static final String ATTR_NAME = "name"; + + public static final String ATTR_VALUE = "value"; + + public static final String ELEMENT_MATCH_TYPES = "match-types"; + + public static final String ELEMENT_START_TYPES = "start-types"; + + public static final String ENTITY_ATOMIC_MESSAGE_CONFIG = "atomic-message-config"; + + public static final String ENTITY_DOMAIN = "domain"; + + public static final String ENTITY_DOMAINS = "domains"; + + public static final String ENTITY_PROPERTIES = "properties"; + + public static final String ENTITY_PROPERTY = "property"; +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/message/IEntity.java b/cat-core/src/main/java/com/dianping/cat/configuration/message/IEntity.java new file mode 100644 index 0000000000..6dbff194fa --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/message/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.configuration.message; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/message/IVisitor.java b/cat-core/src/main/java/com/dianping/cat/configuration/message/IVisitor.java new file mode 100644 index 0000000000..e2e9dd6a35 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/message/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.configuration.message; + +import com.dianping.cat.configuration.message.entity.AtomicMessageConfig; +import com.dianping.cat.configuration.message.entity.Domain; +import com.dianping.cat.configuration.message.entity.Property; + +public interface IVisitor { + + public void visitAtomicMessageConfig(AtomicMessageConfig atomicMessageConfig); + + public void visitDomain(Domain domain); + + public void visitProperty(Property property); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/message/entity/AtomicMessageConfig.java b/cat-core/src/main/java/com/dianping/cat/configuration/message/entity/AtomicMessageConfig.java new file mode 100644 index 0000000000..08b2313c50 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/message/entity/AtomicMessageConfig.java @@ -0,0 +1,66 @@ +package com.dianping.cat.configuration.message.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.configuration.message.BaseEntity; +import com.dianping.cat.configuration.message.IVisitor; + +public class AtomicMessageConfig extends BaseEntity { + private Map m_domains = new LinkedHashMap(); + + public AtomicMessageConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitAtomicMessageConfig(this); + } + + public AtomicMessageConfig addDomain(Domain domain) { + m_domains.put(domain.getId(), domain); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AtomicMessageConfig) { + AtomicMessageConfig _o = (AtomicMessageConfig) obj; + + if (!equals(getDomains(), _o.getDomains())) { + return false; + } + + + return true; + } + + return false; + } + + public Domain findDomain(String id) { + return m_domains.get(id); + } + + public Map getDomains() { + return m_domains; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domains == null ? 0 : m_domains.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(AtomicMessageConfig other) { + } + + public Domain removeDomain(String id) { + return m_domains.remove(id); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/message/entity/Domain.java b/cat-core/src/main/java/com/dianping/cat/configuration/message/entity/Domain.java new file mode 100644 index 0000000000..e700f89d02 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/message/entity/Domain.java @@ -0,0 +1,107 @@ +package com.dianping.cat.configuration.message.entity; + +import static com.dianping.cat.configuration.message.Constants.ATTR_ID; +import static com.dianping.cat.configuration.message.Constants.ENTITY_DOMAIN; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.configuration.message.BaseEntity; +import com.dianping.cat.configuration.message.IVisitor; + +public class Domain extends BaseEntity { + private String m_id; + + private String m_startTypes; + + private String m_matchTypes; + + private Map m_properties = new LinkedHashMap(); + + public Domain() { + } + + public Domain(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomain(this); + } + + public Domain addProperty(Property property) { + m_properties.put(property.getName(), property); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Domain) { + Domain _o = (Domain) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Property findProperty(String name) { + return m_properties.get(name); + } + + public String getId() { + return m_id; + } + + public String getMatchTypes() { + return m_matchTypes; + } + + public Map getProperties() { + return m_properties; + } + + public String getStartTypes() { + return m_startTypes; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Domain other) { + assertAttributeEquals(other, ENTITY_DOMAIN, ATTR_ID, m_id, other.getId()); + + } + + public Property removeProperty(String name) { + return m_properties.remove(name); + } + + public Domain setId(String id) { + m_id = id; + return this; + } + + public Domain setMatchTypes(String matchTypes) { + m_matchTypes = matchTypes; + return this; + } + + public Domain setStartTypes(String startTypes) { + m_startTypes = startTypes; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/message/entity/Property.java b/cat-core/src/main/java/com/dianping/cat/configuration/message/entity/Property.java new file mode 100644 index 0000000000..1efb4bf653 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/message/entity/Property.java @@ -0,0 +1,77 @@ +package com.dianping.cat.configuration.message.entity; + +import static com.dianping.cat.configuration.message.Constants.ATTR_NAME; +import static com.dianping.cat.configuration.message.Constants.ENTITY_PROPERTY; + +import com.dianping.cat.configuration.message.BaseEntity; +import com.dianping.cat.configuration.message.IVisitor; + +public class Property extends BaseEntity { + private String m_name; + + private String m_value; + + public Property() { + } + + public Property(String name) { + m_name = name; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitProperty(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Property) { + Property _o = (Property) obj; + + if (!equals(getName(), _o.getName())) { + return false; + } + + return true; + } + + return false; + } + + public String getName() { + return m_name; + } + + public String getValue() { + return m_value; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_name == null ? 0 : m_name.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Property other) { + assertAttributeEquals(other, ENTITY_PROPERTY, ATTR_NAME, m_name, other.getName()); + + if (other.getValue() != null) { + m_value = other.getValue(); + } + } + + public Property setName(String name) { + m_name = name; + return this; + } + + public Property setValue(String value) { + m_value = value; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultLinker.java b/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultLinker.java new file mode 100644 index 0000000000..51fdcff310 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultLinker.java @@ -0,0 +1,55 @@ +package com.dianping.cat.configuration.message.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.configuration.message.entity.AtomicMessageConfig; +import com.dianping.cat.configuration.message.entity.Domain; +import com.dianping.cat.configuration.message.entity.Property; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDomain(final AtomicMessageConfig parent, final Domain domain) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDomain(domain); + } + }); + } else { + parent.addDomain(domain); + } + + return true; + } + + @Override + public boolean onProperty(final Domain parent, final Property property) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addProperty(property); + } + }); + } else { + parent.addProperty(property); + } + + return true; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultSaxMaker.java b/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..d7ed487cd4 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultSaxMaker.java @@ -0,0 +1,69 @@ +package com.dianping.cat.configuration.message.transform; + +import static com.dianping.cat.configuration.message.Constants.ATTR_ID; +import static com.dianping.cat.configuration.message.Constants.ATTR_NAME; +import static com.dianping.cat.configuration.message.Constants.ATTR_VALUE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.configuration.message.entity.AtomicMessageConfig; +import com.dianping.cat.configuration.message.entity.Domain; +import com.dianping.cat.configuration.message.entity.Property; + +public class DefaultSaxMaker implements IMaker { + + @Override + public AtomicMessageConfig buildAtomicMessageConfig(Attributes attributes) { + AtomicMessageConfig atomicMessageConfig = new AtomicMessageConfig(); + + return atomicMessageConfig; + } + + @Override + public Domain buildDomain(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Domain domain = new Domain(id); + + return domain; + } + + @Override + public Property buildProperty(Attributes attributes) { + String name = attributes.getValue(ATTR_NAME); + String value = attributes.getValue(ATTR_VALUE); + Property property = new Property(name); + + if (value != null) { + property.setValue(value); + } + + return property; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultSaxParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..30332e7966 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultSaxParser.java @@ -0,0 +1,265 @@ +package com.dianping.cat.configuration.message.transform; + +import static com.dianping.cat.configuration.message.Constants.ELEMENT_MATCH_TYPES; +import static com.dianping.cat.configuration.message.Constants.ELEMENT_START_TYPES; + +import static com.dianping.cat.configuration.message.Constants.ENTITY_ATOMIC_MESSAGE_CONFIG; +import static com.dianping.cat.configuration.message.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.configuration.message.Constants.ENTITY_PROPERTY; +import static com.dianping.cat.configuration.message.Constants.ENTITY_PROPERTIES; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.configuration.message.IEntity; +import com.dianping.cat.configuration.message.entity.AtomicMessageConfig; +import com.dianping.cat.configuration.message.entity.Domain; +import com.dianping.cat.configuration.message.entity.Property; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static AtomicMessageConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(AtomicMessageConfig.class, new InputSource(removeBOM(in))); + } + + public static AtomicMessageConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(AtomicMessageConfig.class, new InputSource(removeBOM(reader))); + } + + public static AtomicMessageConfig parse(String xml) throws SAXException, IOException { + return parseEntity(AtomicMessageConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof Domain) { + Domain domain = (Domain) currentObj; + + if (ELEMENT_START_TYPES.equals(currentTag)) { + domain.setStartTypes(getText()); + } else if (ELEMENT_MATCH_TYPES.equals(currentTag)) { + domain.setMatchTypes(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForAtomicMessageConfig(AtomicMessageConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_linker.onDomain(parentObj, domain); + m_objs.push(domain); + } else { + throw new SAXException(String.format("Element(%s) is not expected under atomic-message-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseForDomain(Domain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_START_TYPES.equals(qName) || ELEMENT_MATCH_TYPES.equals(qName) || ENTITY_PROPERTIES.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_PROPERTY.equals(qName)) { + Property property = m_maker.buildProperty(attributes); + + m_linker.onProperty(parentObj, property); + m_objs.push(property); + } else { + throw new SAXException(String.format("Element(%s) is not expected under domain!", qName)); + } + + m_tags.push(qName); + } + + private void parseForProperty(Property parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_ATOMIC_MESSAGE_CONFIG.equals(qName)) { + AtomicMessageConfig atomicMessageConfig = m_maker.buildAtomicMessageConfig(attributes); + + m_entity = atomicMessageConfig; + m_objs.push(atomicMessageConfig); + m_tags.push(qName); + } else if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_entity = domain; + m_objs.push(domain); + m_tags.push(qName); + } else if (ENTITY_PROPERTY.equals(qName)) { + Property property = m_maker.buildProperty(attributes); + + m_entity = property; + m_objs.push(property); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof AtomicMessageConfig) { + parseForAtomicMessageConfig((AtomicMessageConfig) parent, tag, qName, attributes); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, qName, attributes); + } else if (parent instanceof Property) { + parseForProperty((Property) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultXmlBuilder.java b/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..b69f8c5885 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/DefaultXmlBuilder.java @@ -0,0 +1,283 @@ +package com.dianping.cat.configuration.message.transform; + +import static com.dianping.cat.configuration.message.Constants.ATTR_ID; +import static com.dianping.cat.configuration.message.Constants.ATTR_NAME; +import static com.dianping.cat.configuration.message.Constants.ATTR_VALUE; +import static com.dianping.cat.configuration.message.Constants.ELEMENT_MATCH_TYPES; +import static com.dianping.cat.configuration.message.Constants.ELEMENT_START_TYPES; +import static com.dianping.cat.configuration.message.Constants.ENTITY_ATOMIC_MESSAGE_CONFIG; +import static com.dianping.cat.configuration.message.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.configuration.message.Constants.ENTITY_PROPERTIES; +import static com.dianping.cat.configuration.message.Constants.ENTITY_PROPERTY; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.configuration.message.IEntity; +import com.dianping.cat.configuration.message.IVisitor; +import com.dianping.cat.configuration.message.entity.AtomicMessageConfig; +import com.dianping.cat.configuration.message.entity.Domain; +import com.dianping.cat.configuration.message.entity.Property; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + @Override + public void visitAtomicMessageConfig(AtomicMessageConfig atomicMessageConfig) { + startTag(ENTITY_ATOMIC_MESSAGE_CONFIG, null); + + if (!atomicMessageConfig.getDomains().isEmpty()) { + for (Domain domain : atomicMessageConfig.getDomains().values()) { + domain.accept(m_visitor); + } + } + + endTag(ENTITY_ATOMIC_MESSAGE_CONFIG); + } + + @Override + public void visitDomain(Domain domain) { + startTag(ENTITY_DOMAIN, null, ATTR_ID, domain.getId()); + + element(ELEMENT_START_TYPES, domain.getStartTypes(), null, true); + + element(ELEMENT_MATCH_TYPES, domain.getMatchTypes(), null, true); + + if (!domain.getProperties().isEmpty()) { + startTag(ENTITY_PROPERTIES); + + for (Property property : domain.getProperties().values()) { + property.accept(m_visitor); + } + + endTag(ENTITY_PROPERTIES); + } + + endTag(ENTITY_DOMAIN); + } + + @Override + public void visitProperty(Property property) { + startTag(ENTITY_PROPERTY, true, null, ATTR_NAME, property.getName(), ATTR_VALUE, property.getValue()); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/ILinker.java b/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/ILinker.java new file mode 100644 index 0000000000..3218b9af7f --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.configuration.message.transform; + +import com.dianping.cat.configuration.message.entity.AtomicMessageConfig; +import com.dianping.cat.configuration.message.entity.Domain; +import com.dianping.cat.configuration.message.entity.Property; + +public interface ILinker { + + public boolean onDomain(AtomicMessageConfig parent, Domain domain); + + public boolean onProperty(Domain parent, Property property); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/IMaker.java b/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/IMaker.java new file mode 100644 index 0000000000..32e21d34f4 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/IMaker.java @@ -0,0 +1,14 @@ +package com.dianping.cat.configuration.message.transform; + +import com.dianping.cat.configuration.message.entity.AtomicMessageConfig; +import com.dianping.cat.configuration.message.entity.Domain; +import com.dianping.cat.configuration.message.entity.Property; + +public interface IMaker { + + public AtomicMessageConfig buildAtomicMessageConfig(T node); + + public Domain buildDomain(T node); + + public Property buildProperty(T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/IParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/IParser.java new file mode 100644 index 0000000000..4c3da33358 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/message/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.configuration.message.transform; + +import com.dianping.cat.configuration.message.entity.AtomicMessageConfig; +import com.dianping.cat.configuration.message.entity.Domain; +import com.dianping.cat.configuration.message.entity.Property; + +public interface IParser { + public AtomicMessageConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForDomain(IMaker maker, ILinker linker, Domain parent, T node); + + public void parseForProperty(IMaker maker, ILinker linker, Property parent, T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/reload/BaseEntity.java b/cat-core/src/main/java/com/dianping/cat/configuration/reload/BaseEntity.java new file mode 100644 index 0000000000..9164fe9fd9 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/reload/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.configuration.reload; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.configuration.reload.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/reload/Constants.java b/cat-core/src/main/java/com/dianping/cat/configuration/reload/Constants.java new file mode 100644 index 0000000000..b483e6965a --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/reload/Constants.java @@ -0,0 +1,16 @@ +package com.dianping.cat.configuration.reload; + +public class Constants { + + public static final String ATTR_ID = "id"; + + public static final String ENTITY_REPORT_PERIOD = "report-period"; + + public static final String ENTITY_REPORT_PERIODS = "report-periods"; + + public static final String ENTITY_REPORT_RELOAD_CONFIG = "report-reload-config"; + + public static final String ENTITY_REPORT_TYPE = "report-type"; + + public static final String ENTITY_REPORT_TYPES = "report-types"; +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/reload/IEntity.java b/cat-core/src/main/java/com/dianping/cat/configuration/reload/IEntity.java new file mode 100644 index 0000000000..eebf591cef --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/reload/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.configuration.reload; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/reload/IVisitor.java b/cat-core/src/main/java/com/dianping/cat/configuration/reload/IVisitor.java new file mode 100644 index 0000000000..05d0922ae5 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/reload/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.configuration.reload; + +import com.dianping.cat.configuration.reload.entity.ReportPeriod; +import com.dianping.cat.configuration.reload.entity.ReportReloadConfig; +import com.dianping.cat.configuration.reload.entity.ReportType; + +public interface IVisitor { + + public void visitReportPeriod(ReportPeriod reportPeriod); + + public void visitReportReloadConfig(ReportReloadConfig reportReloadConfig); + + public void visitReportType(ReportType reportType); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/reload/entity/ReportPeriod.java b/cat-core/src/main/java/com/dianping/cat/configuration/reload/entity/ReportPeriod.java new file mode 100644 index 0000000000..27b2509526 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/reload/entity/ReportPeriod.java @@ -0,0 +1,58 @@ +package com.dianping.cat.configuration.reload.entity; + +import com.dianping.cat.configuration.reload.BaseEntity; +import com.dianping.cat.configuration.reload.IVisitor; + +public class ReportPeriod extends BaseEntity { + private String m_id; + + public ReportPeriod() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitReportPeriod(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ReportPeriod) { + ReportPeriod _o = (ReportPeriod) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ReportPeriod other) { + if (other.getId() != null) { + m_id = other.getId(); + } + } + + public ReportPeriod setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/reload/entity/ReportReloadConfig.java b/cat-core/src/main/java/com/dianping/cat/configuration/reload/entity/ReportReloadConfig.java new file mode 100644 index 0000000000..1566a6e7e4 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/reload/entity/ReportReloadConfig.java @@ -0,0 +1,66 @@ +package com.dianping.cat.configuration.reload.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.configuration.reload.BaseEntity; +import com.dianping.cat.configuration.reload.IVisitor; + +public class ReportReloadConfig extends BaseEntity { + private Map m_reportTypes = new LinkedHashMap(); + + public ReportReloadConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitReportReloadConfig(this); + } + + public ReportReloadConfig addReportType(ReportType reportType) { + m_reportTypes.put(reportType.getId(), reportType); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ReportReloadConfig) { + ReportReloadConfig _o = (ReportReloadConfig) obj; + + if (!equals(getReportTypes(), _o.getReportTypes())) { + return false; + } + + + return true; + } + + return false; + } + + public ReportType findReportType(String id) { + return m_reportTypes.get(id); + } + + public Map getReportTypes() { + return m_reportTypes; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_reportTypes == null ? 0 : m_reportTypes.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ReportReloadConfig other) { + } + + public ReportType removeReportType(String id) { + return m_reportTypes.remove(id); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/reload/entity/ReportType.java b/cat-core/src/main/java/com/dianping/cat/configuration/reload/entity/ReportType.java new file mode 100644 index 0000000000..252392f220 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/reload/entity/ReportType.java @@ -0,0 +1,77 @@ +package com.dianping.cat.configuration.reload.entity; + +import static com.dianping.cat.configuration.reload.Constants.ATTR_ID; +import static com.dianping.cat.configuration.reload.Constants.ENTITY_REPORT_TYPE; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.configuration.reload.BaseEntity; +import com.dianping.cat.configuration.reload.IVisitor; + +public class ReportType extends BaseEntity { + private String m_id; + + private List m_reportPeriods = new ArrayList(); + + public ReportType() { + } + + public ReportType(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitReportType(this); + } + + public ReportType addReportPeriod(ReportPeriod reportPeriod) { + m_reportPeriods.add(reportPeriod); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ReportType) { + ReportType _o = (ReportType) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + public List getReportPeriods() { + return m_reportPeriods; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ReportType other) { + assertAttributeEquals(other, ENTITY_REPORT_TYPE, ATTR_ID, m_id, other.getId()); + + } + + public ReportType setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultLinker.java b/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultLinker.java new file mode 100644 index 0000000000..a1d6d7eea4 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultLinker.java @@ -0,0 +1,45 @@ +package com.dianping.cat.configuration.reload.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.configuration.reload.entity.ReportPeriod; +import com.dianping.cat.configuration.reload.entity.ReportReloadConfig; +import com.dianping.cat.configuration.reload.entity.ReportType; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onReportPeriod(final ReportType parent, final ReportPeriod reportPeriod) { + parent.addReportPeriod(reportPeriod); + return true; + } + + @Override + public boolean onReportType(final ReportReloadConfig parent, final ReportType reportType) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addReportType(reportType); + } + }); + } else { + parent.addReportType(reportType); + } + + return true; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultSaxMaker.java b/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..22e3a6ba83 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultSaxMaker.java @@ -0,0 +1,66 @@ +package com.dianping.cat.configuration.reload.transform; + +import static com.dianping.cat.configuration.reload.Constants.ATTR_ID; + +import org.xml.sax.Attributes; + +import com.dianping.cat.configuration.reload.entity.ReportPeriod; +import com.dianping.cat.configuration.reload.entity.ReportReloadConfig; +import com.dianping.cat.configuration.reload.entity.ReportType; + +public class DefaultSaxMaker implements IMaker { + + @Override + public ReportPeriod buildReportPeriod(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + ReportPeriod reportPeriod = new ReportPeriod(); + + if (id != null) { + reportPeriod.setId(id); + } + + return reportPeriod; + } + + @Override + public ReportReloadConfig buildReportReloadConfig(Attributes attributes) { + ReportReloadConfig reportReloadConfig = new ReportReloadConfig(); + + return reportReloadConfig; + } + + @Override + public ReportType buildReportType(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + ReportType reportType = new ReportType(id); + + return reportType; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultSaxParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..2bfc91194d --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultSaxParser.java @@ -0,0 +1,250 @@ +package com.dianping.cat.configuration.reload.transform; + +import static com.dianping.cat.configuration.reload.Constants.ENTITY_REPORT_PERIOD; +import static com.dianping.cat.configuration.reload.Constants.ENTITY_REPORT_RELOAD_CONFIG; +import static com.dianping.cat.configuration.reload.Constants.ENTITY_REPORT_TYPE; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.configuration.reload.IEntity; +import com.dianping.cat.configuration.reload.entity.ReportPeriod; +import com.dianping.cat.configuration.reload.entity.ReportReloadConfig; +import com.dianping.cat.configuration.reload.entity.ReportType; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static ReportReloadConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(ReportReloadConfig.class, new InputSource(removeBOM(in))); + } + + public static ReportReloadConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(ReportReloadConfig.class, new InputSource(removeBOM(reader))); + } + + public static ReportReloadConfig parse(String xml) throws SAXException, IOException { + return parseEntity(ReportReloadConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForReportPeriod(ReportPeriod parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForReportReloadConfig(ReportReloadConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_REPORT_TYPE.equals(qName)) { + ReportType reportType = m_maker.buildReportType(attributes); + + m_linker.onReportType(parentObj, reportType); + m_objs.push(reportType); + } else { + throw new SAXException(String.format("Element(%s) is not expected under report-reload-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseForReportType(ReportType parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_REPORT_PERIOD.equals(qName)) { + ReportPeriod reportPeriod = m_maker.buildReportPeriod(attributes); + + m_linker.onReportPeriod(parentObj, reportPeriod); + m_objs.push(reportPeriod); + } else { + throw new SAXException(String.format("Element(%s) is not expected under report-type!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_REPORT_RELOAD_CONFIG.equals(qName)) { + ReportReloadConfig reportReloadConfig = m_maker.buildReportReloadConfig(attributes); + + m_entity = reportReloadConfig; + m_objs.push(reportReloadConfig); + m_tags.push(qName); + } else if (ENTITY_REPORT_TYPE.equals(qName)) { + ReportType reportType = m_maker.buildReportType(attributes); + + m_entity = reportType; + m_objs.push(reportType); + m_tags.push(qName); + } else if (ENTITY_REPORT_PERIOD.equals(qName)) { + ReportPeriod reportPeriod = m_maker.buildReportPeriod(attributes); + + m_entity = reportPeriod; + m_objs.push(reportPeriod); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof ReportReloadConfig) { + parseForReportReloadConfig((ReportReloadConfig) parent, tag, qName, attributes); + } else if (parent instanceof ReportType) { + parseForReportType((ReportType) parent, tag, qName, attributes); + } else if (parent instanceof ReportPeriod) { + parseForReportPeriod((ReportPeriod) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultXmlBuilder.java b/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..3c8b976541 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/DefaultXmlBuilder.java @@ -0,0 +1,227 @@ +package com.dianping.cat.configuration.reload.transform; + +import static com.dianping.cat.configuration.reload.Constants.ATTR_ID; +import static com.dianping.cat.configuration.reload.Constants.ENTITY_REPORT_PERIOD; +import static com.dianping.cat.configuration.reload.Constants.ENTITY_REPORT_RELOAD_CONFIG; +import static com.dianping.cat.configuration.reload.Constants.ENTITY_REPORT_TYPE; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.configuration.reload.IEntity; +import com.dianping.cat.configuration.reload.IVisitor; +import com.dianping.cat.configuration.reload.entity.ReportPeriod; +import com.dianping.cat.configuration.reload.entity.ReportReloadConfig; +import com.dianping.cat.configuration.reload.entity.ReportType; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitReportPeriod(ReportPeriod reportPeriod) { + startTag(ENTITY_REPORT_PERIOD, true, null, ATTR_ID, reportPeriod.getId()); + } + + @Override + public void visitReportReloadConfig(ReportReloadConfig reportReloadConfig) { + startTag(ENTITY_REPORT_RELOAD_CONFIG, null); + + if (!reportReloadConfig.getReportTypes().isEmpty()) { + for (ReportType reportType : reportReloadConfig.getReportTypes().values()) { + reportType.accept(m_visitor); + } + } + + endTag(ENTITY_REPORT_RELOAD_CONFIG); + } + + @Override + public void visitReportType(ReportType reportType) { + startTag(ENTITY_REPORT_TYPE, null, ATTR_ID, reportType.getId()); + + if (!reportType.getReportPeriods().isEmpty()) { + for (ReportPeriod reportPeriod : reportType.getReportPeriods()) { + reportPeriod.accept(m_visitor); + } + } + + endTag(ENTITY_REPORT_TYPE); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/ILinker.java b/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/ILinker.java new file mode 100644 index 0000000000..6ac1fbd4fa --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.configuration.reload.transform; + +import com.dianping.cat.configuration.reload.entity.ReportPeriod; +import com.dianping.cat.configuration.reload.entity.ReportReloadConfig; +import com.dianping.cat.configuration.reload.entity.ReportType; + +public interface ILinker { + + public boolean onReportPeriod(ReportType parent, ReportPeriod reportPeriod); + + public boolean onReportType(ReportReloadConfig parent, ReportType reportType); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/IMaker.java b/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/IMaker.java new file mode 100644 index 0000000000..ca9ebacd44 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/IMaker.java @@ -0,0 +1,14 @@ +package com.dianping.cat.configuration.reload.transform; + +import com.dianping.cat.configuration.reload.entity.ReportPeriod; +import com.dianping.cat.configuration.reload.entity.ReportReloadConfig; +import com.dianping.cat.configuration.reload.entity.ReportType; + +public interface IMaker { + + public ReportPeriod buildReportPeriod(T node); + + public ReportReloadConfig buildReportReloadConfig(T node); + + public ReportType buildReportType(T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/IParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/IParser.java new file mode 100644 index 0000000000..aceb37852b --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/reload/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.configuration.reload.transform; + +import com.dianping.cat.configuration.reload.entity.ReportPeriod; +import com.dianping.cat.configuration.reload.entity.ReportReloadConfig; +import com.dianping.cat.configuration.reload.entity.ReportType; + +public interface IParser { + public ReportReloadConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForReportPeriod(IMaker maker, ILinker linker, ReportPeriod parent, T node); + + public void parseForReportType(IMaker maker, ILinker linker, ReportType parent, T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/BaseEntity.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/BaseEntity.java new file mode 100644 index 0000000000..be323f1a7d --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.configuration.server; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.configuration.server.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/Constants.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/Constants.java new file mode 100644 index 0000000000..259cae5e7a --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/Constants.java @@ -0,0 +1,68 @@ +package com.dianping.cat.configuration.server; + +public class Constants { + + public static final String ATTR_BASE_DIR = "base-dir"; + + public static final String ATTR_DEFAULT_SERVICE_THRESHOLD = "default-service-threshold"; + + public static final String ATTR_DEFAULT_SQL_THRESHOLD = "default-sql-threshold"; + + public static final String ATTR_DEFAULT_URL_THRESHOLD = "default-url-threshold"; + + public static final String ATTR_HAR_MODE = "har-mode"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_LOCAL_BASE_DIR = "local-base-dir"; + + public static final String ATTR_LOCAL_LOGIVEW_STORAGE_TIME = "local-logivew-storage-time"; + + public static final String ATTR_LOCAL_REPORT_STORAGE_TIME = "local-report-storage-time"; + + public static final String ATTR_MAX_HDFS_STORAGE_TIME = "max-hdfs-storage-time"; + + public static final String ATTR_MAX_SIZE = "max-size"; + + public static final String ATTR_NAME = "name"; + + public static final String ATTR_SERVER_URI = "server-uri"; + + public static final String ATTR_SERVICE_THRESHOLD = "service-threshold"; + + public static final String ATTR_SQL_THRESHOLD = "sql-threshold"; + + public static final String ATTR_UPLOAD_THREAD = "upload-thread"; + + public static final String ATTR_URL_THRESHOLD = "url-threshold"; + + public static final String ATTR_VALUE = "value"; + + public static final String ENTITY_CONSUMER = "consumer"; + + public static final String ENTITY_DOMAIN = "domain"; + + public static final String ENTITY_DOMAINS = "domains"; + + public static final String ENTITY_HARFS = "harfs"; + + public static final String ENTITY_HARFSES = "harfses"; + + public static final String ENTITY_HDFS = "hdfs"; + + public static final String ENTITY_HDFSES = "hdfses"; + + public static final String ENTITY_LONG_CONFIG = "long-config"; + + public static final String ENTITY_PROPERTIES = "properties"; + + public static final String ENTITY_PROPERTY = "property"; + + public static final String ENTITY_SERVER = "server"; + + public static final String ENTITY_SERVERS = "servers"; + + public static final String ENTITY_SERVER_CONFIG = "server-config"; + + public static final String ENTITY_STORAGE = "storage"; +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/IEntity.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/IEntity.java new file mode 100644 index 0000000000..c7dfa03bf1 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.configuration.server; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/IVisitor.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/IVisitor.java new file mode 100644 index 0000000000..1921825c7e --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/IVisitor.java @@ -0,0 +1,32 @@ +package com.dianping.cat.configuration.server; + +import com.dianping.cat.configuration.server.entity.ConsumerConfig; +import com.dianping.cat.configuration.server.entity.Domain; +import com.dianping.cat.configuration.server.entity.HarfsConfig; +import com.dianping.cat.configuration.server.entity.HdfsConfig; +import com.dianping.cat.configuration.server.entity.LongConfig; +import com.dianping.cat.configuration.server.entity.Property; +import com.dianping.cat.configuration.server.entity.Server; +import com.dianping.cat.configuration.server.entity.ServerConfig; +import com.dianping.cat.configuration.server.entity.StorageConfig; + +public interface IVisitor { + + public void visitConsumer(ConsumerConfig consumer); + + public void visitDomain(Domain domain); + + public void visitHarfs(HarfsConfig harfs); + + public void visitHdfs(HdfsConfig hdfs); + + public void visitLongConfig(LongConfig longConfig); + + public void visitProperty(Property property); + + public void visitServer(Server server); + + public void visitServerConfig(ServerConfig serverConfig); + + public void visitStorage(StorageConfig storage); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/ConsumerConfig.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/ConsumerConfig.java new file mode 100644 index 0000000000..8e76a2c1dd --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/ConsumerConfig.java @@ -0,0 +1,55 @@ +package com.dianping.cat.configuration.server.entity; + +import com.dianping.cat.configuration.server.BaseEntity; +import com.dianping.cat.configuration.server.IVisitor; + +public class ConsumerConfig extends BaseEntity { + private LongConfig m_longConfig; + + public ConsumerConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitConsumer(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ConsumerConfig) { + ConsumerConfig _o = (ConsumerConfig) obj; + + if (!equals(getLongConfig(), _o.getLongConfig())) { + return false; + } + + + return true; + } + + return false; + } + + public LongConfig getLongConfig() { + return m_longConfig; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_longConfig == null ? 0 : m_longConfig.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ConsumerConfig other) { + } + + public ConsumerConfig setLongConfig(LongConfig longConfig) { + m_longConfig = longConfig; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/Domain.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/Domain.java new file mode 100644 index 0000000000..108ca38887 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/Domain.java @@ -0,0 +1,107 @@ +package com.dianping.cat.configuration.server.entity; + +import static com.dianping.cat.configuration.server.Constants.ATTR_NAME; +import static com.dianping.cat.configuration.server.Constants.ENTITY_DOMAIN; + +import com.dianping.cat.configuration.server.BaseEntity; +import com.dianping.cat.configuration.server.IVisitor; + +public class Domain extends BaseEntity { + private String m_name; + + private Integer m_urlThreshold; + + private Integer m_sqlThreshold; + + private Integer m_serviceThreshold; + + public Domain() { + } + + public Domain(String name) { + m_name = name; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomain(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Domain) { + Domain _o = (Domain) obj; + + if (!equals(getName(), _o.getName())) { + return false; + } + + return true; + } + + return false; + } + + public String getName() { + return m_name; + } + + public Integer getServiceThreshold() { + return m_serviceThreshold; + } + + public Integer getSqlThreshold() { + return m_sqlThreshold; + } + + public Integer getUrlThreshold() { + return m_urlThreshold; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_name == null ? 0 : m_name.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Domain other) { + assertAttributeEquals(other, ENTITY_DOMAIN, ATTR_NAME, m_name, other.getName()); + + if (other.getUrlThreshold() != null) { + m_urlThreshold = other.getUrlThreshold(); + } + + if (other.getSqlThreshold() != null) { + m_sqlThreshold = other.getSqlThreshold(); + } + + if (other.getServiceThreshold() != null) { + m_serviceThreshold = other.getServiceThreshold(); + } + } + + public Domain setName(String name) { + m_name = name; + return this; + } + + public Domain setServiceThreshold(Integer serviceThreshold) { + m_serviceThreshold = serviceThreshold; + return this; + } + + public Domain setSqlThreshold(Integer sqlThreshold) { + m_sqlThreshold = sqlThreshold; + return this; + } + + public Domain setUrlThreshold(Integer urlThreshold) { + m_urlThreshold = urlThreshold; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/HarfsConfig.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/HarfsConfig.java new file mode 100644 index 0000000000..ead72d8b50 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/HarfsConfig.java @@ -0,0 +1,107 @@ +package com.dianping.cat.configuration.server.entity; + +import static com.dianping.cat.configuration.server.Constants.ATTR_ID; +import static com.dianping.cat.configuration.server.Constants.ENTITY_HARFS; + +import com.dianping.cat.configuration.server.BaseEntity; +import com.dianping.cat.configuration.server.IVisitor; + +public class HarfsConfig extends BaseEntity { + private String m_id; + + private String m_maxSize = "128M"; + + private String m_serverUri; + + private String m_baseDir; + + public HarfsConfig() { + } + + public HarfsConfig(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitHarfs(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof HarfsConfig) { + HarfsConfig _o = (HarfsConfig) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getBaseDir() { + return m_baseDir; + } + + public String getId() { + return m_id; + } + + public String getMaxSize() { + return m_maxSize; + } + + public String getServerUri() { + return m_serverUri; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(HarfsConfig other) { + assertAttributeEquals(other, ENTITY_HARFS, ATTR_ID, m_id, other.getId()); + + if (other.getMaxSize() != null) { + m_maxSize = other.getMaxSize(); + } + + if (other.getServerUri() != null) { + m_serverUri = other.getServerUri(); + } + + if (other.getBaseDir() != null) { + m_baseDir = other.getBaseDir(); + } + } + + public HarfsConfig setBaseDir(String baseDir) { + m_baseDir = baseDir; + return this; + } + + public HarfsConfig setId(String id) { + m_id = id; + return this; + } + + public HarfsConfig setMaxSize(String maxSize) { + m_maxSize = maxSize; + return this; + } + + public HarfsConfig setServerUri(String serverUri) { + m_serverUri = serverUri; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/HdfsConfig.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/HdfsConfig.java new file mode 100644 index 0000000000..a8b7835035 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/HdfsConfig.java @@ -0,0 +1,107 @@ +package com.dianping.cat.configuration.server.entity; + +import static com.dianping.cat.configuration.server.Constants.ATTR_ID; +import static com.dianping.cat.configuration.server.Constants.ENTITY_HDFS; + +import com.dianping.cat.configuration.server.BaseEntity; +import com.dianping.cat.configuration.server.IVisitor; + +public class HdfsConfig extends BaseEntity { + private String m_id; + + private String m_maxSize = "128M"; + + private String m_serverUri; + + private String m_baseDir; + + public HdfsConfig() { + } + + public HdfsConfig(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitHdfs(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof HdfsConfig) { + HdfsConfig _o = (HdfsConfig) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getBaseDir() { + return m_baseDir; + } + + public String getId() { + return m_id; + } + + public String getMaxSize() { + return m_maxSize; + } + + public String getServerUri() { + return m_serverUri; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(HdfsConfig other) { + assertAttributeEquals(other, ENTITY_HDFS, ATTR_ID, m_id, other.getId()); + + if (other.getMaxSize() != null) { + m_maxSize = other.getMaxSize(); + } + + if (other.getServerUri() != null) { + m_serverUri = other.getServerUri(); + } + + if (other.getBaseDir() != null) { + m_baseDir = other.getBaseDir(); + } + } + + public HdfsConfig setBaseDir(String baseDir) { + m_baseDir = baseDir; + return this; + } + + public HdfsConfig setId(String id) { + m_id = id; + return this; + } + + public HdfsConfig setMaxSize(String maxSize) { + m_maxSize = maxSize; + return this; + } + + public HdfsConfig setServerUri(String serverUri) { + m_serverUri = serverUri; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/LongConfig.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/LongConfig.java new file mode 100644 index 0000000000..8a8d2b3dea --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/LongConfig.java @@ -0,0 +1,119 @@ +package com.dianping.cat.configuration.server.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.configuration.server.BaseEntity; +import com.dianping.cat.configuration.server.IVisitor; + +public class LongConfig extends BaseEntity { + private int m_defaultUrlThreshold = 1000; + + private int m_defaultSqlThreshold = 100; + + private Map m_domains = new LinkedHashMap(); + + private int m_defaultServiceThreshold = 50; + + public LongConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitLongConfig(this); + } + + public LongConfig addDomain(Domain domain) { + m_domains.put(domain.getName(), domain); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof LongConfig) { + LongConfig _o = (LongConfig) obj; + + if (getDefaultUrlThreshold() != _o.getDefaultUrlThreshold()) { + return false; + } + + if (getDefaultSqlThreshold() != _o.getDefaultSqlThreshold()) { + return false; + } + + if (!equals(getDomains(), _o.getDomains())) { + return false; + } + + if (getDefaultServiceThreshold() != _o.getDefaultServiceThreshold()) { + return false; + } + + + return true; + } + + return false; + } + + public Domain findDomain(String name) { + return m_domains.get(name); + } + + public int getDefaultServiceThreshold() { + return m_defaultServiceThreshold; + } + + public int getDefaultSqlThreshold() { + return m_defaultSqlThreshold; + } + + public int getDefaultUrlThreshold() { + return m_defaultUrlThreshold; + } + + public Map getDomains() { + return m_domains; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + m_defaultUrlThreshold; + hash = hash * 31 + m_defaultSqlThreshold; + hash = hash * 31 + (m_domains == null ? 0 : m_domains.hashCode()); + hash = hash * 31 + m_defaultServiceThreshold; + + return hash; + } + + @Override + public void mergeAttributes(LongConfig other) { + m_defaultUrlThreshold = other.getDefaultUrlThreshold(); + + m_defaultSqlThreshold = other.getDefaultSqlThreshold(); + + m_defaultServiceThreshold = other.getDefaultServiceThreshold(); + } + + public Domain removeDomain(String name) { + return m_domains.remove(name); + } + + public LongConfig setDefaultServiceThreshold(int defaultServiceThreshold) { + m_defaultServiceThreshold = defaultServiceThreshold; + return this; + } + + public LongConfig setDefaultSqlThreshold(int defaultSqlThreshold) { + m_defaultSqlThreshold = defaultSqlThreshold; + return this; + } + + public LongConfig setDefaultUrlThreshold(int defaultUrlThreshold) { + m_defaultUrlThreshold = defaultUrlThreshold; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/Property.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/Property.java new file mode 100644 index 0000000000..d8896ed7c8 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/Property.java @@ -0,0 +1,77 @@ +package com.dianping.cat.configuration.server.entity; + +import static com.dianping.cat.configuration.server.Constants.ATTR_NAME; +import static com.dianping.cat.configuration.server.Constants.ENTITY_PROPERTY; + +import com.dianping.cat.configuration.server.BaseEntity; +import com.dianping.cat.configuration.server.IVisitor; + +public class Property extends BaseEntity { + private String m_name; + + private String m_value; + + public Property() { + } + + public Property(String name) { + m_name = name; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitProperty(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Property) { + Property _o = (Property) obj; + + if (!equals(getName(), _o.getName())) { + return false; + } + + return true; + } + + return false; + } + + public String getName() { + return m_name; + } + + public String getValue() { + return m_value; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_name == null ? 0 : m_name.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Property other) { + assertAttributeEquals(other, ENTITY_PROPERTY, ATTR_NAME, m_name, other.getName()); + + if (other.getValue() != null) { + m_value = other.getValue(); + } + } + + public Property setName(String name) { + m_name = name; + return this; + } + + public Property setValue(String value) { + m_value = value; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/Server.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/Server.java new file mode 100644 index 0000000000..b0f5131a96 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/Server.java @@ -0,0 +1,107 @@ +package com.dianping.cat.configuration.server.entity; + +import static com.dianping.cat.configuration.server.Constants.ATTR_ID; +import static com.dianping.cat.configuration.server.Constants.ENTITY_SERVER; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.configuration.server.BaseEntity; +import com.dianping.cat.configuration.server.IVisitor; + +public class Server extends BaseEntity { + private String m_id; + + private Map m_properties = new LinkedHashMap(); + + private StorageConfig m_storage; + + private ConsumerConfig m_consumer; + + public Server() { + } + + public Server(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitServer(this); + } + + public Server addProperty(Property property) { + m_properties.put(property.getName(), property); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Server) { + Server _o = (Server) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Property findProperty(String name) { + return m_properties.get(name); + } + + public ConsumerConfig getConsumer() { + return m_consumer; + } + + public String getId() { + return m_id; + } + + public Map getProperties() { + return m_properties; + } + + public StorageConfig getStorage() { + return m_storage; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Server other) { + assertAttributeEquals(other, ENTITY_SERVER, ATTR_ID, m_id, other.getId()); + + } + + public Property removeProperty(String name) { + return m_properties.remove(name); + } + + public Server setConsumer(ConsumerConfig consumer) { + m_consumer = consumer; + return this; + } + + public Server setId(String id) { + m_id = id; + return this; + } + + public Server setStorage(StorageConfig storage) { + m_storage = storage; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/ServerConfig.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/ServerConfig.java new file mode 100644 index 0000000000..74c438033a --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/ServerConfig.java @@ -0,0 +1,66 @@ +package com.dianping.cat.configuration.server.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.configuration.server.BaseEntity; +import com.dianping.cat.configuration.server.IVisitor; + +public class ServerConfig extends BaseEntity { + private Map m_servers = new LinkedHashMap(); + + public ServerConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitServerConfig(this); + } + + public ServerConfig addServer(Server server) { + m_servers.put(server.getId(), server); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ServerConfig) { + ServerConfig _o = (ServerConfig) obj; + + if (!equals(getServers(), _o.getServers())) { + return false; + } + + + return true; + } + + return false; + } + + public Server findServer(String id) { + return m_servers.get(id); + } + + public Map getServers() { + return m_servers; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_servers == null ? 0 : m_servers.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ServerConfig other) { + } + + public Server removeServer(String id) { + return m_servers.remove(id); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/StorageConfig.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/StorageConfig.java new file mode 100644 index 0000000000..edbd64e87a --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/entity/StorageConfig.java @@ -0,0 +1,227 @@ +package com.dianping.cat.configuration.server.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.configuration.server.BaseEntity; +import com.dianping.cat.configuration.server.IVisitor; + +public class StorageConfig extends BaseEntity { + private String m_localBaseDir = "target/bucket"; + + private int m_maxHdfsStorageTime = 15; + + private int m_localReportStorageTime = 3; + + private int m_localLogivewStorageTime = 7; + + private boolean m_harMode = true; + + private Map m_hdfses = new LinkedHashMap(); + + private Map m_harfses = new LinkedHashMap(); + + private Map m_properties = new LinkedHashMap(); + + private int m_uploadThread = 5; + + public StorageConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitStorage(this); + } + + public StorageConfig addHarfs(HarfsConfig harfs) { + m_harfses.put(harfs.getId(), harfs); + return this; + } + + public StorageConfig addHdfs(HdfsConfig hdfs) { + m_hdfses.put(hdfs.getId(), hdfs); + return this; + } + + public StorageConfig addProperty(Property property) { + m_properties.put(property.getName(), property); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StorageConfig) { + StorageConfig _o = (StorageConfig) obj; + + if (!equals(getLocalBaseDir(), _o.getLocalBaseDir())) { + return false; + } + + if (getMaxHdfsStorageTime() != _o.getMaxHdfsStorageTime()) { + return false; + } + + if (getLocalReportStorageTime() != _o.getLocalReportStorageTime()) { + return false; + } + + if (getLocalLogivewStorageTime() != _o.getLocalLogivewStorageTime()) { + return false; + } + + if (getHarMode() != _o.getHarMode()) { + return false; + } + + if (!equals(getHdfses(), _o.getHdfses())) { + return false; + } + + if (!equals(getHarfses(), _o.getHarfses())) { + return false; + } + + if (!equals(getProperties(), _o.getProperties())) { + return false; + } + + if (getUploadThread() != _o.getUploadThread()) { + return false; + } + + + return true; + } + + return false; + } + + public HarfsConfig findHarfs(String id) { + return m_harfses.get(id); + } + + public HdfsConfig findHdfs(String id) { + return m_hdfses.get(id); + } + + public Property findProperty(String name) { + return m_properties.get(name); + } + + public Map getHarfses() { + return m_harfses; + } + + public boolean getHarMode() { + return m_harMode; + } + + public Map getHdfses() { + return m_hdfses; + } + + public String getLocalBaseDir() { + return m_localBaseDir; + } + + public int getLocalLogivewStorageTime() { + return m_localLogivewStorageTime; + } + + public int getLocalReportStorageTime() { + return m_localReportStorageTime; + } + + public int getMaxHdfsStorageTime() { + return m_maxHdfsStorageTime; + } + + public Map getProperties() { + return m_properties; + } + + public int getUploadThread() { + return m_uploadThread; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_localBaseDir == null ? 0 : m_localBaseDir.hashCode()); + hash = hash * 31 + m_maxHdfsStorageTime; + hash = hash * 31 + m_localReportStorageTime; + hash = hash * 31 + m_localLogivewStorageTime; + hash = hash * 31 + (m_harMode ? 1 : 0); + hash = hash * 31 + (m_hdfses == null ? 0 : m_hdfses.hashCode()); + hash = hash * 31 + (m_harfses == null ? 0 : m_harfses.hashCode()); + hash = hash * 31 + (m_properties == null ? 0 : m_properties.hashCode()); + hash = hash * 31 + m_uploadThread; + + return hash; + } + + public boolean isHarMode() { + return m_harMode; + } + + @Override + public void mergeAttributes(StorageConfig other) { + if (other.getLocalBaseDir() != null) { + m_localBaseDir = other.getLocalBaseDir(); + } + + m_maxHdfsStorageTime = other.getMaxHdfsStorageTime(); + + m_localReportStorageTime = other.getLocalReportStorageTime(); + + m_localLogivewStorageTime = other.getLocalLogivewStorageTime(); + + m_harMode = other.getHarMode(); + + m_uploadThread = other.getUploadThread(); + } + + public HarfsConfig removeHarfs(String id) { + return m_harfses.remove(id); + } + + public HdfsConfig removeHdfs(String id) { + return m_hdfses.remove(id); + } + + public Property removeProperty(String name) { + return m_properties.remove(name); + } + + public StorageConfig setHarMode(boolean harMode) { + m_harMode = harMode; + return this; + } + + public StorageConfig setLocalBaseDir(String localBaseDir) { + m_localBaseDir = localBaseDir; + return this; + } + + public StorageConfig setLocalLogivewStorageTime(int localLogivewStorageTime) { + m_localLogivewStorageTime = localLogivewStorageTime; + return this; + } + + public StorageConfig setLocalReportStorageTime(int localReportStorageTime) { + m_localReportStorageTime = localReportStorageTime; + return this; + } + + public StorageConfig setMaxHdfsStorageTime(int maxHdfsStorageTime) { + m_maxHdfsStorageTime = maxHdfsStorageTime; + return this; + } + + public StorageConfig setUploadThread(int uploadThread) { + m_uploadThread = uploadThread; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/BaseEntity.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/BaseEntity.java new file mode 100644 index 0000000000..759719630f --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.configuration.server.filter; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.configuration.server.filter.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/Constants.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/Constants.java new file mode 100644 index 0000000000..b86d05a3d5 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/Constants.java @@ -0,0 +1,32 @@ +package com.dianping.cat.configuration.server.filter; + +public class Constants { + + public static final String ATTR_ID = "id"; + + public static final String ATTR_MATCH_TYPES = "match-types"; + + public static final String ATTR_START_TYPES = "start-types"; + + public static final String ATTR_TITLE = "title"; + + public static final String ELEMENT_DOMAIN = "domain"; + + public static final String ELEMENT_DOMAINS = "domains"; + + public static final String ELEMENT_TRANSACTION_NAME = "transaction-name"; + + public static final String ELEMENT_TRANSACTION_NAMES = "transaction-names"; + + public static final String ELEMENT_TRANSACTION_TYPE = "transaction-type"; + + public static final String ELEMENT_TRANSACTION_TYPES = "transaction-types"; + + public static final String ENTITY_ATOMIC_TREE_CONFIG = "atomic-tree-config"; + + public static final String ENTITY_CRASH_LOG_DOMAIN = "crash-log-domain"; + + public static final String ENTITY_CRASH_LOG_DOMAINS = "crash-log-domains"; + + public static final String ENTITY_SERVER_FILTER_CONFIG = "server-filter-config"; +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/IEntity.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/IEntity.java new file mode 100644 index 0000000000..9db0c10192 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.configuration.server.filter; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/IVisitor.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/IVisitor.java new file mode 100644 index 0000000000..f99880ed44 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.configuration.server.filter; + +import com.dianping.cat.configuration.server.filter.entity.AtomicTreeConfig; +import com.dianping.cat.configuration.server.filter.entity.CrashLogDomain; +import com.dianping.cat.configuration.server.filter.entity.ServerFilterConfig; + +public interface IVisitor { + + public void visitAtomicTreeConfig(AtomicTreeConfig atomicTreeConfig); + + public void visitCrashLogDomain(CrashLogDomain crashLogDomain); + + public void visitServerFilterConfig(ServerFilterConfig serverFilterConfig); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/entity/AtomicTreeConfig.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/entity/AtomicTreeConfig.java new file mode 100644 index 0000000000..08d73fbec7 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/entity/AtomicTreeConfig.java @@ -0,0 +1,78 @@ +package com.dianping.cat.configuration.server.filter.entity; + +import com.dianping.cat.configuration.server.filter.BaseEntity; +import com.dianping.cat.configuration.server.filter.IVisitor; + +public class AtomicTreeConfig extends BaseEntity { + private String m_startTypes; + + private String m_matchTypes; + + public AtomicTreeConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitAtomicTreeConfig(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AtomicTreeConfig) { + AtomicTreeConfig _o = (AtomicTreeConfig) obj; + + if (!equals(getStartTypes(), _o.getStartTypes())) { + return false; + } + + if (!equals(getMatchTypes(), _o.getMatchTypes())) { + return false; + } + + + return true; + } + + return false; + } + + public String getMatchTypes() { + return m_matchTypes; + } + + public String getStartTypes() { + return m_startTypes; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_startTypes == null ? 0 : m_startTypes.hashCode()); + hash = hash * 31 + (m_matchTypes == null ? 0 : m_matchTypes.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(AtomicTreeConfig other) { + if (other.getStartTypes() != null) { + m_startTypes = other.getStartTypes(); + } + + if (other.getMatchTypes() != null) { + m_matchTypes = other.getMatchTypes(); + } + } + + public AtomicTreeConfig setMatchTypes(String matchTypes) { + m_matchTypes = matchTypes; + return this; + } + + public AtomicTreeConfig setStartTypes(String startTypes) { + m_startTypes = startTypes; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/entity/CrashLogDomain.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/entity/CrashLogDomain.java new file mode 100644 index 0000000000..2baff8dddf --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/entity/CrashLogDomain.java @@ -0,0 +1,77 @@ +package com.dianping.cat.configuration.server.filter.entity; + +import static com.dianping.cat.configuration.server.filter.Constants.ATTR_ID; +import static com.dianping.cat.configuration.server.filter.Constants.ENTITY_CRASH_LOG_DOMAIN; + +import com.dianping.cat.configuration.server.filter.BaseEntity; +import com.dianping.cat.configuration.server.filter.IVisitor; + +public class CrashLogDomain extends BaseEntity { + private String m_id; + + private String m_title; + + public CrashLogDomain() { + } + + public CrashLogDomain(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitCrashLogDomain(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CrashLogDomain) { + CrashLogDomain _o = (CrashLogDomain) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + public String getTitle() { + return m_title; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(CrashLogDomain other) { + assertAttributeEquals(other, ENTITY_CRASH_LOG_DOMAIN, ATTR_ID, m_id, other.getId()); + + if (other.getTitle() != null) { + m_title = other.getTitle(); + } + } + + public CrashLogDomain setId(String id) { + m_id = id; + return this; + } + + public CrashLogDomain setTitle(String title) { + m_title = title; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/entity/ServerFilterConfig.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/entity/ServerFilterConfig.java new file mode 100644 index 0000000000..073cd1870a --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/entity/ServerFilterConfig.java @@ -0,0 +1,141 @@ +package com.dianping.cat.configuration.server.filter.entity; + +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +import com.dianping.cat.configuration.server.filter.BaseEntity; +import com.dianping.cat.configuration.server.filter.IVisitor; + +public class ServerFilterConfig extends BaseEntity { + private Set m_transactionTypes = new LinkedHashSet(); + + private Set m_transactionNames = new LinkedHashSet(); + + private Set m_domains = new LinkedHashSet(); + + private Map m_crashLogDomains = new LinkedHashMap(); + + private AtomicTreeConfig m_atomicTreeConfig; + + public ServerFilterConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitServerFilterConfig(this); + } + + public ServerFilterConfig addCrashLogDomain(CrashLogDomain crashLogDomain) { + m_crashLogDomains.put(crashLogDomain.getId(), crashLogDomain); + return this; + } + + public ServerFilterConfig addDomain(String domain) { + m_domains.add(domain); + return this; + } + + public ServerFilterConfig addTransactionName(String transactionName) { + m_transactionNames.add(transactionName); + return this; + } + + public ServerFilterConfig addTransactionType(String transactionType) { + m_transactionTypes.add(transactionType); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ServerFilterConfig) { + ServerFilterConfig _o = (ServerFilterConfig) obj; + + if (!equals(getTransactionTypes(), _o.getTransactionTypes())) { + return false; + } + + if (!equals(getTransactionNames(), _o.getTransactionNames())) { + return false; + } + + if (!equals(getDomains(), _o.getDomains())) { + return false; + } + + if (!equals(getCrashLogDomains(), _o.getCrashLogDomains())) { + return false; + } + + if (!equals(getAtomicTreeConfig(), _o.getAtomicTreeConfig())) { + return false; + } + + + return true; + } + + return false; + } + + public CrashLogDomain findCrashLogDomain(String id) { + return m_crashLogDomains.get(id); + } + + public AtomicTreeConfig getAtomicTreeConfig() { + return m_atomicTreeConfig; + } + + public Map getCrashLogDomains() { + return m_crashLogDomains; + } + + public Set getDomains() { + return m_domains; + } + + public Set getTransactionNames() { + return m_transactionNames; + } + + public Set getTransactionTypes() { + return m_transactionTypes; + } + + @Override + public int hashCode() { + int hash = 0; + + for (String e : m_transactionTypes) { + hash = hash * 31 + (e == null ? 0 :e.hashCode()); + } + + for (String e : m_transactionNames) { + hash = hash * 31 + (e == null ? 0 :e.hashCode()); + } + + for (String e : m_domains) { + hash = hash * 31 + (e == null ? 0 :e.hashCode()); + } + + hash = hash * 31 + (m_crashLogDomains == null ? 0 : m_crashLogDomains.hashCode()); + hash = hash * 31 + (m_atomicTreeConfig == null ? 0 : m_atomicTreeConfig.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ServerFilterConfig other) { + } + + public CrashLogDomain removeCrashLogDomain(String id) { + return m_crashLogDomains.remove(id); + } + + public ServerFilterConfig setAtomicTreeConfig(AtomicTreeConfig atomicTreeConfig) { + m_atomicTreeConfig = atomicTreeConfig; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultLinker.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultLinker.java new file mode 100644 index 0000000000..6e173db914 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultLinker.java @@ -0,0 +1,45 @@ +package com.dianping.cat.configuration.server.filter.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.configuration.server.filter.entity.AtomicTreeConfig; +import com.dianping.cat.configuration.server.filter.entity.CrashLogDomain; +import com.dianping.cat.configuration.server.filter.entity.ServerFilterConfig; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onAtomicTreeConfig(final ServerFilterConfig parent, final AtomicTreeConfig atomicTreeConfig) { + parent.setAtomicTreeConfig(atomicTreeConfig); + return true; + } + + @Override + public boolean onCrashLogDomain(final ServerFilterConfig parent, final CrashLogDomain crashLogDomain) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addCrashLogDomain(crashLogDomain); + } + }); + } else { + parent.addCrashLogDomain(crashLogDomain); + } + + return true; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultSaxMaker.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..0a405e8bf9 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultSaxMaker.java @@ -0,0 +1,94 @@ +package com.dianping.cat.configuration.server.filter.transform; + +import static com.dianping.cat.configuration.server.filter.Constants.ATTR_ID; +import static com.dianping.cat.configuration.server.filter.Constants.ATTR_MATCH_TYPES; +import static com.dianping.cat.configuration.server.filter.Constants.ATTR_START_TYPES; +import static com.dianping.cat.configuration.server.filter.Constants.ATTR_TITLE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.configuration.server.filter.entity.AtomicTreeConfig; +import com.dianping.cat.configuration.server.filter.entity.CrashLogDomain; +import com.dianping.cat.configuration.server.filter.entity.ServerFilterConfig; + +public class DefaultSaxMaker implements IMaker { + + @Override + public AtomicTreeConfig buildAtomicTreeConfig(Attributes attributes) { + String startTypes = attributes.getValue(ATTR_START_TYPES); + String matchTypes = attributes.getValue(ATTR_MATCH_TYPES); + AtomicTreeConfig atomicTreeConfig = new AtomicTreeConfig(); + + if (startTypes != null) { + atomicTreeConfig.setStartTypes(startTypes); + } + + if (matchTypes != null) { + atomicTreeConfig.setMatchTypes(matchTypes); + } + + return atomicTreeConfig; + } + + @Override + public CrashLogDomain buildCrashLogDomain(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String title = attributes.getValue(ATTR_TITLE); + CrashLogDomain crashLogDomain = new CrashLogDomain(id); + + if (title != null) { + crashLogDomain.setTitle(title); + } + + return crashLogDomain; + } + + @Override + public String buildDomain(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public ServerFilterConfig buildServerFilterConfig(Attributes attributes) { + ServerFilterConfig serverFilterConfig = new ServerFilterConfig(); + + return serverFilterConfig; + } + + @Override + public String buildTransactionName(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public String buildTransactionType(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultSaxParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..aa1eaf3dc8 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultSaxParser.java @@ -0,0 +1,267 @@ +package com.dianping.cat.configuration.server.filter.transform; + +import static com.dianping.cat.configuration.server.filter.Constants.ELEMENT_DOMAIN; +import static com.dianping.cat.configuration.server.filter.Constants.ELEMENT_DOMAINS; +import static com.dianping.cat.configuration.server.filter.Constants.ELEMENT_TRANSACTION_NAME; +import static com.dianping.cat.configuration.server.filter.Constants.ELEMENT_TRANSACTION_NAMES; +import static com.dianping.cat.configuration.server.filter.Constants.ELEMENT_TRANSACTION_TYPE; +import static com.dianping.cat.configuration.server.filter.Constants.ELEMENT_TRANSACTION_TYPES; + +import static com.dianping.cat.configuration.server.filter.Constants.ENTITY_ATOMIC_TREE_CONFIG; +import static com.dianping.cat.configuration.server.filter.Constants.ENTITY_CRASH_LOG_DOMAIN; +import static com.dianping.cat.configuration.server.filter.Constants.ENTITY_SERVER_FILTER_CONFIG; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.configuration.server.filter.IEntity; +import com.dianping.cat.configuration.server.filter.entity.AtomicTreeConfig; +import com.dianping.cat.configuration.server.filter.entity.CrashLogDomain; +import com.dianping.cat.configuration.server.filter.entity.ServerFilterConfig; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static ServerFilterConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(ServerFilterConfig.class, new InputSource(removeBOM(in))); + } + + public static ServerFilterConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(ServerFilterConfig.class, new InputSource(removeBOM(reader))); + } + + public static ServerFilterConfig parse(String xml) throws SAXException, IOException { + return parseEntity(ServerFilterConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof ServerFilterConfig) { + ServerFilterConfig serverFilterConfig = (ServerFilterConfig) currentObj; + + if (ELEMENT_TRANSACTION_TYPE.equals(currentTag)) { + serverFilterConfig.addTransactionType(getText()); + } else if (ELEMENT_TRANSACTION_NAME.equals(currentTag)) { + serverFilterConfig.addTransactionName(getText()); + } else if (ELEMENT_DOMAIN.equals(currentTag)) { + serverFilterConfig.addDomain(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForAtomicTreeConfig(AtomicTreeConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForCrashLogDomain(CrashLogDomain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForServerFilterConfig(ServerFilterConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_TRANSACTION_TYPES.equals(qName) || ELEMENT_TRANSACTION_TYPE.equals(qName) || ELEMENT_TRANSACTION_NAMES.equals(qName) || ELEMENT_TRANSACTION_NAME.equals(qName) || ELEMENT_DOMAINS.equals(qName) || ELEMENT_DOMAIN.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_CRASH_LOG_DOMAIN.equals(qName)) { + CrashLogDomain crashLogDomain = m_maker.buildCrashLogDomain(attributes); + + m_linker.onCrashLogDomain(parentObj, crashLogDomain); + m_objs.push(crashLogDomain); + } else if (ENTITY_ATOMIC_TREE_CONFIG.equals(qName)) { + AtomicTreeConfig atomicTreeConfig = m_maker.buildAtomicTreeConfig(attributes); + + m_linker.onAtomicTreeConfig(parentObj, atomicTreeConfig); + m_objs.push(atomicTreeConfig); + } else { + throw new SAXException(String.format("Element(%s) is not expected under server-filter-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_SERVER_FILTER_CONFIG.equals(qName)) { + ServerFilterConfig serverFilterConfig = m_maker.buildServerFilterConfig(attributes); + + m_entity = serverFilterConfig; + m_objs.push(serverFilterConfig); + m_tags.push(qName); + } else if (ENTITY_CRASH_LOG_DOMAIN.equals(qName)) { + CrashLogDomain crashLogDomain = m_maker.buildCrashLogDomain(attributes); + + m_entity = crashLogDomain; + m_objs.push(crashLogDomain); + m_tags.push(qName); + } else if (ENTITY_ATOMIC_TREE_CONFIG.equals(qName)) { + AtomicTreeConfig atomicTreeConfig = m_maker.buildAtomicTreeConfig(attributes); + + m_entity = atomicTreeConfig; + m_objs.push(atomicTreeConfig); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof ServerFilterConfig) { + parseForServerFilterConfig((ServerFilterConfig) parent, tag, qName, attributes); + } else if (parent instanceof CrashLogDomain) { + parseForCrashLogDomain((CrashLogDomain) parent, tag, qName, attributes); + } else if (parent instanceof AtomicTreeConfig) { + parseForAtomicTreeConfig((AtomicTreeConfig) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultValidator.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultValidator.java new file mode 100644 index 0000000000..20ca57f05b --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultValidator.java @@ -0,0 +1,85 @@ +package com.dianping.cat.configuration.server.filter.transform; + +import static com.dianping.cat.configuration.server.filter.Constants.ATTR_ID; +import static com.dianping.cat.configuration.server.filter.Constants.ENTITY_CRASH_LOG_DOMAIN; +import static com.dianping.cat.configuration.server.filter.Constants.ENTITY_SERVER_FILTER_CONFIG; + +import java.util.Stack; + +import com.dianping.cat.configuration.server.filter.IVisitor; +import com.dianping.cat.configuration.server.filter.entity.AtomicTreeConfig; +import com.dianping.cat.configuration.server.filter.entity.CrashLogDomain; +import com.dianping.cat.configuration.server.filter.entity.ServerFilterConfig; + +public class DefaultValidator implements IVisitor { + + private Path m_path = new Path(); + + protected void assertRequired(String name, Object value) { + if (value == null) { + throw new RuntimeException(String.format("%s at path(%s) is required!", name, m_path)); + } + } + + @Override + public void visitAtomicTreeConfig(AtomicTreeConfig atomicTreeConfig) { + } + + @Override + public void visitCrashLogDomain(CrashLogDomain crashLogDomain) { + m_path.down(ENTITY_CRASH_LOG_DOMAIN); + + assertRequired(ATTR_ID, crashLogDomain.getId()); + + m_path.up(ENTITY_CRASH_LOG_DOMAIN); + } + + @Override + public void visitServerFilterConfig(ServerFilterConfig serverFilterConfig) { + m_path.down(ENTITY_SERVER_FILTER_CONFIG); + + visitServerFilterConfigChildren(serverFilterConfig); + + m_path.up(ENTITY_SERVER_FILTER_CONFIG); + } + + protected void visitServerFilterConfigChildren(ServerFilterConfig serverFilterConfig) { + for (CrashLogDomain crashLogDomain : serverFilterConfig.getCrashLogDomains().values()) { + visitCrashLogDomain(crashLogDomain); + } + + if (serverFilterConfig.getAtomicTreeConfig() != null) { + visitAtomicTreeConfig(serverFilterConfig.getAtomicTreeConfig()); + } + } + + static class Path { + private Stack m_sections = new Stack(); + + public Path down(String nextSection) { + m_sections.push(nextSection); + + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + for (String section : m_sections) { + sb.append('/').append(section); + } + + return sb.toString(); + } + + public Path up(String currentSection) { + if (m_sections.isEmpty() || !m_sections.peek().equals(currentSection)) { + throw new RuntimeException("INTERNAL ERROR: stack mismatched!"); + } + + m_sections.pop(); + return this; + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultXmlBuilder.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..9bfe37adba --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/DefaultXmlBuilder.java @@ -0,0 +1,290 @@ +package com.dianping.cat.configuration.server.filter.transform; + +import static com.dianping.cat.configuration.server.filter.Constants.ATTR_ID; +import static com.dianping.cat.configuration.server.filter.Constants.ATTR_MATCH_TYPES; +import static com.dianping.cat.configuration.server.filter.Constants.ATTR_START_TYPES; +import static com.dianping.cat.configuration.server.filter.Constants.ATTR_TITLE; +import static com.dianping.cat.configuration.server.filter.Constants.ELEMENT_DOMAIN; +import static com.dianping.cat.configuration.server.filter.Constants.ELEMENT_TRANSACTION_NAME; +import static com.dianping.cat.configuration.server.filter.Constants.ELEMENT_TRANSACTION_TYPE; +import static com.dianping.cat.configuration.server.filter.Constants.ENTITY_ATOMIC_TREE_CONFIG; +import static com.dianping.cat.configuration.server.filter.Constants.ENTITY_CRASH_LOG_DOMAIN; +import static com.dianping.cat.configuration.server.filter.Constants.ENTITY_SERVER_FILTER_CONFIG; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.configuration.server.filter.IEntity; +import com.dianping.cat.configuration.server.filter.IVisitor; +import com.dianping.cat.configuration.server.filter.entity.AtomicTreeConfig; +import com.dianping.cat.configuration.server.filter.entity.CrashLogDomain; +import com.dianping.cat.configuration.server.filter.entity.ServerFilterConfig; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + @Override + public void visitAtomicTreeConfig(AtomicTreeConfig atomicTreeConfig) { + startTag(ENTITY_ATOMIC_TREE_CONFIG, true, null, ATTR_START_TYPES, atomicTreeConfig.getStartTypes(), ATTR_MATCH_TYPES, atomicTreeConfig.getMatchTypes()); + } + + @Override + public void visitCrashLogDomain(CrashLogDomain crashLogDomain) { + startTag(ENTITY_CRASH_LOG_DOMAIN, true, null, ATTR_ID, crashLogDomain.getId(), ATTR_TITLE, crashLogDomain.getTitle()); + } + + @Override + public void visitServerFilterConfig(ServerFilterConfig serverFilterConfig) { + startTag(ENTITY_SERVER_FILTER_CONFIG, null); + + if (!serverFilterConfig.getTransactionTypes().isEmpty()) { + for (String transactionType : serverFilterConfig.getTransactionTypes()) { + tagWithText(ELEMENT_TRANSACTION_TYPE, transactionType); + } + } + + if (!serverFilterConfig.getTransactionNames().isEmpty()) { + for (String transactionName : serverFilterConfig.getTransactionNames()) { + tagWithText(ELEMENT_TRANSACTION_NAME, transactionName); + } + } + + if (!serverFilterConfig.getDomains().isEmpty()) { + for (String domain : serverFilterConfig.getDomains()) { + tagWithText(ELEMENT_DOMAIN, domain); + } + } + + if (!serverFilterConfig.getCrashLogDomains().isEmpty()) { + for (CrashLogDomain crashLogDomain : serverFilterConfig.getCrashLogDomains().values()) { + crashLogDomain.accept(m_visitor); + } + } + + if (serverFilterConfig.getAtomicTreeConfig() != null) { + serverFilterConfig.getAtomicTreeConfig().accept(m_visitor); + } + + endTag(ENTITY_SERVER_FILTER_CONFIG); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/ILinker.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/ILinker.java new file mode 100644 index 0000000000..a3e2d44445 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.configuration.server.filter.transform; + +import com.dianping.cat.configuration.server.filter.entity.AtomicTreeConfig; +import com.dianping.cat.configuration.server.filter.entity.CrashLogDomain; +import com.dianping.cat.configuration.server.filter.entity.ServerFilterConfig; + +public interface ILinker { + + public boolean onAtomicTreeConfig(ServerFilterConfig parent, AtomicTreeConfig atomicTreeConfig); + + public boolean onCrashLogDomain(ServerFilterConfig parent, CrashLogDomain crashLogDomain); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/IMaker.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/IMaker.java new file mode 100644 index 0000000000..e45894324c --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/IMaker.java @@ -0,0 +1,20 @@ +package com.dianping.cat.configuration.server.filter.transform; + +import com.dianping.cat.configuration.server.filter.entity.AtomicTreeConfig; +import com.dianping.cat.configuration.server.filter.entity.CrashLogDomain; +import com.dianping.cat.configuration.server.filter.entity.ServerFilterConfig; + +public interface IMaker { + + public AtomicTreeConfig buildAtomicTreeConfig(T node); + + public CrashLogDomain buildCrashLogDomain(T node); + + public String buildDomain(T node); + + public ServerFilterConfig buildServerFilterConfig(T node); + + public String buildTransactionName(T node); + + public String buildTransactionType(T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/IParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/IParser.java new file mode 100644 index 0000000000..72e6b4ef2f --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/filter/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.configuration.server.filter.transform; + +import com.dianping.cat.configuration.server.filter.entity.AtomicTreeConfig; +import com.dianping.cat.configuration.server.filter.entity.CrashLogDomain; +import com.dianping.cat.configuration.server.filter.entity.ServerFilterConfig; + +public interface IParser { + public ServerFilterConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForAtomicTreeConfig(IMaker maker, ILinker linker, AtomicTreeConfig parent, T node); + + public void parseForCrashLogDomain(IMaker maker, ILinker linker, CrashLogDomain parent, T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/BaseVisitor.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/BaseVisitor.java new file mode 100644 index 0000000000..50478ed2fe --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/BaseVisitor.java @@ -0,0 +1,81 @@ +package com.dianping.cat.configuration.server.transform; + +import com.dianping.cat.configuration.server.IVisitor; +import com.dianping.cat.configuration.server.entity.ConsumerConfig; +import com.dianping.cat.configuration.server.entity.Domain; +import com.dianping.cat.configuration.server.entity.HarfsConfig; +import com.dianping.cat.configuration.server.entity.HdfsConfig; +import com.dianping.cat.configuration.server.entity.LongConfig; +import com.dianping.cat.configuration.server.entity.Property; +import com.dianping.cat.configuration.server.entity.Server; +import com.dianping.cat.configuration.server.entity.ServerConfig; +import com.dianping.cat.configuration.server.entity.StorageConfig; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitConsumer(ConsumerConfig consumer) { + if (consumer.getLongConfig() != null) { + visitLongConfig(consumer.getLongConfig()); + } + } + + @Override + public void visitDomain(Domain domain) { + } + + @Override + public void visitHarfs(HarfsConfig harfs) { + } + + @Override + public void visitHdfs(HdfsConfig hdfs) { + } + + @Override + public void visitLongConfig(LongConfig longConfig) { + for (Domain domain : longConfig.getDomains().values()) { + visitDomain(domain); + } + } + + @Override + public void visitProperty(Property property) { + } + + @Override + public void visitServer(Server server) { + for (Property property : server.getProperties().values()) { + visitProperty(property); + } + + if (server.getStorage() != null) { + visitStorage(server.getStorage()); + } + + if (server.getConsumer() != null) { + visitConsumer(server.getConsumer()); + } + } + + @Override + public void visitServerConfig(ServerConfig serverConfig) { + for (Server server : serverConfig.getServers().values()) { + visitServer(server); + } + } + + @Override + public void visitStorage(StorageConfig storage) { + for (HdfsConfig hdfs : storage.getHdfses().values()) { + visitHdfs(hdfs); + } + + for (HarfsConfig harfs : storage.getHarfses().values()) { + visitHarfs(harfs); + } + + for (Property property : storage.getProperties().values()) { + visitProperty(property); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultLinker.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultLinker.java new file mode 100644 index 0000000000..58b9dde1f7 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultLinker.java @@ -0,0 +1,143 @@ +package com.dianping.cat.configuration.server.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.configuration.server.entity.ConsumerConfig; +import com.dianping.cat.configuration.server.entity.Domain; +import com.dianping.cat.configuration.server.entity.HarfsConfig; +import com.dianping.cat.configuration.server.entity.HdfsConfig; +import com.dianping.cat.configuration.server.entity.LongConfig; +import com.dianping.cat.configuration.server.entity.Property; +import com.dianping.cat.configuration.server.entity.Server; +import com.dianping.cat.configuration.server.entity.ServerConfig; +import com.dianping.cat.configuration.server.entity.StorageConfig; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onConsumer(final Server parent, final ConsumerConfig consumer) { + parent.setConsumer(consumer); + return true; + } + + @Override + public boolean onDomain(final LongConfig parent, final Domain domain) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDomain(domain); + } + }); + } else { + parent.addDomain(domain); + } + + return true; + } + + @Override + public boolean onHarfs(final StorageConfig parent, final HarfsConfig harfs) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addHarfs(harfs); + } + }); + } else { + parent.addHarfs(harfs); + } + + return true; + } + + @Override + public boolean onHdfs(final StorageConfig parent, final HdfsConfig hdfs) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addHdfs(hdfs); + } + }); + } else { + parent.addHdfs(hdfs); + } + + return true; + } + + @Override + public boolean onLongConfig(final ConsumerConfig parent, final LongConfig longConfig) { + parent.setLongConfig(longConfig); + return true; + } + + @Override + public boolean onProperty(final Server parent, final Property property) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addProperty(property); + } + }); + } else { + parent.addProperty(property); + } + + return true; + } + + @Override + public boolean onProperty(final StorageConfig parent, final Property property) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addProperty(property); + } + }); + } else { + parent.addProperty(property); + } + + return true; + } + + @Override + public boolean onServer(final ServerConfig parent, final Server server) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addServer(server); + } + }); + } else { + parent.addServer(server); + } + + return true; + } + + @Override + public boolean onStorage(final Server parent, final StorageConfig storage) { + parent.setStorage(storage); + return true; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultMerger.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultMerger.java new file mode 100644 index 0000000000..3702ab946e --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultMerger.java @@ -0,0 +1,291 @@ +package com.dianping.cat.configuration.server.transform; + +import java.util.Stack; + +import com.dianping.cat.configuration.server.IEntity; +import com.dianping.cat.configuration.server.IVisitor; +import com.dianping.cat.configuration.server.entity.ConsumerConfig; +import com.dianping.cat.configuration.server.entity.Domain; +import com.dianping.cat.configuration.server.entity.HarfsConfig; +import com.dianping.cat.configuration.server.entity.HdfsConfig; +import com.dianping.cat.configuration.server.entity.LongConfig; +import com.dianping.cat.configuration.server.entity.Property; +import com.dianping.cat.configuration.server.entity.Server; +import com.dianping.cat.configuration.server.entity.ServerConfig; +import com.dianping.cat.configuration.server.entity.StorageConfig; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private ServerConfig m_serverConfig; + + public DefaultMerger() { + } + + public DefaultMerger(ServerConfig serverConfig) { + m_serverConfig = serverConfig; + m_objs.push(serverConfig); + } + + public ServerConfig getServerConfig() { + return m_serverConfig; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeConsumer(ConsumerConfig to, ConsumerConfig from) { + to.mergeAttributes(from); + } + + protected void mergeDomain(Domain to, Domain from) { + to.mergeAttributes(from); + } + + protected void mergeHarfs(HarfsConfig to, HarfsConfig from) { + to.mergeAttributes(from); + } + + protected void mergeHdfs(HdfsConfig to, HdfsConfig from) { + to.mergeAttributes(from); + } + + protected void mergeLongConfig(LongConfig to, LongConfig from) { + to.mergeAttributes(from); + } + + protected void mergeProperty(Property to, Property from) { + to.mergeAttributes(from); + } + + protected void mergeServer(Server to, Server from) { + to.mergeAttributes(from); + } + + protected void mergeServerConfig(ServerConfig to, ServerConfig from) { + to.mergeAttributes(from); + } + + protected void mergeStorage(StorageConfig to, StorageConfig from) { + to.mergeAttributes(from); + } + + @Override + public void visitConsumer(ConsumerConfig from) { + ConsumerConfig to = (ConsumerConfig) m_objs.peek(); + + mergeConsumer(to, from); + visitConsumerChildren(to, from); + } + + protected void visitConsumerChildren(ConsumerConfig to, ConsumerConfig from) { + if (from.getLongConfig() != null) { + LongConfig target = to.getLongConfig(); + + if (target == null) { + target = new LongConfig(); + to.setLongConfig(target); + } + + m_objs.push(target); + from.getLongConfig().accept(this); + m_objs.pop(); + } + } + + @Override + public void visitDomain(Domain from) { + Domain to = (Domain) m_objs.peek(); + + mergeDomain(to, from); + visitDomainChildren(to, from); + } + + protected void visitDomainChildren(Domain to, Domain from) { + } + + @Override + public void visitHarfs(HarfsConfig from) { + HarfsConfig to = (HarfsConfig) m_objs.peek(); + + mergeHarfs(to, from); + visitHarfsChildren(to, from); + } + + protected void visitHarfsChildren(HarfsConfig to, HarfsConfig from) { + } + + @Override + public void visitHdfs(HdfsConfig from) { + HdfsConfig to = (HdfsConfig) m_objs.peek(); + + mergeHdfs(to, from); + visitHdfsChildren(to, from); + } + + protected void visitHdfsChildren(HdfsConfig to, HdfsConfig from) { + } + + @Override + public void visitLongConfig(LongConfig from) { + LongConfig to = (LongConfig) m_objs.peek(); + + mergeLongConfig(to, from); + visitLongConfigChildren(to, from); + } + + protected void visitLongConfigChildren(LongConfig to, LongConfig from) { + for (Domain source : from.getDomains().values()) { + Domain target = to.findDomain(source.getName()); + + if (target == null) { + target = new Domain(source.getName()); + to.addDomain(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitProperty(Property from) { + Property to = (Property) m_objs.peek(); + + mergeProperty(to, from); + visitPropertyChildren(to, from); + } + + protected void visitPropertyChildren(Property to, Property from) { + } + + @Override + public void visitServer(Server from) { + Server to = (Server) m_objs.peek(); + + mergeServer(to, from); + visitServerChildren(to, from); + } + + protected void visitServerChildren(Server to, Server from) { + for (Property source : from.getProperties().values()) { + Property target = to.findProperty(source.getName()); + + if (target == null) { + target = new Property(source.getName()); + to.addProperty(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + if (from.getStorage() != null) { + StorageConfig target = to.getStorage(); + + if (target == null) { + target = new StorageConfig(); + to.setStorage(target); + } + + m_objs.push(target); + from.getStorage().accept(this); + m_objs.pop(); + } + + if (from.getConsumer() != null) { + ConsumerConfig target = to.getConsumer(); + + if (target == null) { + target = new ConsumerConfig(); + to.setConsumer(target); + } + + m_objs.push(target); + from.getConsumer().accept(this); + m_objs.pop(); + } + } + + @Override + public void visitServerConfig(ServerConfig from) { + ServerConfig to = (ServerConfig) m_objs.peek(); + + mergeServerConfig(to, from); + visitServerConfigChildren(to, from); + } + + protected void visitServerConfigChildren(ServerConfig to, ServerConfig from) { + for (Server source : from.getServers().values()) { + Server target = to.findServer(source.getId()); + + if (target == null) { + target = new Server(source.getId()); + to.addServer(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitStorage(StorageConfig from) { + StorageConfig to = (StorageConfig) m_objs.peek(); + + mergeStorage(to, from); + visitStorageChildren(to, from); + } + + protected void visitStorageChildren(StorageConfig to, StorageConfig from) { + for (HdfsConfig source : from.getHdfses().values()) { + HdfsConfig target = to.findHdfs(source.getId()); + + if (target == null) { + target = new HdfsConfig(source.getId()); + to.addHdfs(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (HarfsConfig source : from.getHarfses().values()) { + HarfsConfig target = to.findHarfs(source.getId()); + + if (target == null) { + target = new HarfsConfig(source.getId()); + to.addHarfs(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Property source : from.getProperties().values()) { + Property target = to.findProperty(source.getName()); + + if (target == null) { + target = new Property(source.getName()); + to.addProperty(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultSaxMaker.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..cd3a5bbf9a --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultSaxMaker.java @@ -0,0 +1,225 @@ +package com.dianping.cat.configuration.server.transform; + +import static com.dianping.cat.configuration.server.Constants.ATTR_BASE_DIR; +import static com.dianping.cat.configuration.server.Constants.ATTR_DEFAULT_SERVICE_THRESHOLD; +import static com.dianping.cat.configuration.server.Constants.ATTR_DEFAULT_SQL_THRESHOLD; +import static com.dianping.cat.configuration.server.Constants.ATTR_DEFAULT_URL_THRESHOLD; +import static com.dianping.cat.configuration.server.Constants.ATTR_HAR_MODE; +import static com.dianping.cat.configuration.server.Constants.ATTR_ID; +import static com.dianping.cat.configuration.server.Constants.ATTR_LOCAL_BASE_DIR; +import static com.dianping.cat.configuration.server.Constants.ATTR_LOCAL_LOGIVEW_STORAGE_TIME; +import static com.dianping.cat.configuration.server.Constants.ATTR_LOCAL_REPORT_STORAGE_TIME; +import static com.dianping.cat.configuration.server.Constants.ATTR_MAX_HDFS_STORAGE_TIME; +import static com.dianping.cat.configuration.server.Constants.ATTR_MAX_SIZE; +import static com.dianping.cat.configuration.server.Constants.ATTR_NAME; +import static com.dianping.cat.configuration.server.Constants.ATTR_SERVER_URI; +import static com.dianping.cat.configuration.server.Constants.ATTR_SERVICE_THRESHOLD; +import static com.dianping.cat.configuration.server.Constants.ATTR_SQL_THRESHOLD; +import static com.dianping.cat.configuration.server.Constants.ATTR_UPLOAD_THREAD; +import static com.dianping.cat.configuration.server.Constants.ATTR_URL_THRESHOLD; +import static com.dianping.cat.configuration.server.Constants.ATTR_VALUE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.configuration.server.entity.ConsumerConfig; +import com.dianping.cat.configuration.server.entity.Domain; +import com.dianping.cat.configuration.server.entity.HarfsConfig; +import com.dianping.cat.configuration.server.entity.HdfsConfig; +import com.dianping.cat.configuration.server.entity.LongConfig; +import com.dianping.cat.configuration.server.entity.Property; +import com.dianping.cat.configuration.server.entity.Server; +import com.dianping.cat.configuration.server.entity.ServerConfig; +import com.dianping.cat.configuration.server.entity.StorageConfig; + +public class DefaultSaxMaker implements IMaker { + + @Override + public ConsumerConfig buildConsumer(Attributes attributes) { + ConsumerConfig consumer = new ConsumerConfig(); + + return consumer; + } + + @Override + public Domain buildDomain(Attributes attributes) { + String name = attributes.getValue(ATTR_NAME); + String urlThreshold = attributes.getValue(ATTR_URL_THRESHOLD); + String sqlThreshold = attributes.getValue(ATTR_SQL_THRESHOLD); + String serviceThreshold = attributes.getValue(ATTR_SERVICE_THRESHOLD); + Domain domain = new Domain(name); + + if (urlThreshold != null) { + domain.setUrlThreshold(convert(Integer.class, urlThreshold, null)); + } + + if (sqlThreshold != null) { + domain.setSqlThreshold(convert(Integer.class, sqlThreshold, null)); + } + + if (serviceThreshold != null) { + domain.setServiceThreshold(convert(Integer.class, serviceThreshold, null)); + } + + return domain; + } + + @Override + public HarfsConfig buildHarfs(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String maxSize = attributes.getValue(ATTR_MAX_SIZE); + String serverUri = attributes.getValue(ATTR_SERVER_URI); + String baseDir = attributes.getValue(ATTR_BASE_DIR); + HarfsConfig harfs = new HarfsConfig(id); + + if (maxSize != null) { + harfs.setMaxSize(maxSize); + } + + if (serverUri != null) { + harfs.setServerUri(serverUri); + } + + if (baseDir != null) { + harfs.setBaseDir(baseDir); + } + + return harfs; + } + + @Override + public HdfsConfig buildHdfs(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String maxSize = attributes.getValue(ATTR_MAX_SIZE); + String serverUri = attributes.getValue(ATTR_SERVER_URI); + String baseDir = attributes.getValue(ATTR_BASE_DIR); + HdfsConfig hdfs = new HdfsConfig(id); + + if (maxSize != null) { + hdfs.setMaxSize(maxSize); + } + + if (serverUri != null) { + hdfs.setServerUri(serverUri); + } + + if (baseDir != null) { + hdfs.setBaseDir(baseDir); + } + + return hdfs; + } + + @Override + public LongConfig buildLongConfig(Attributes attributes) { + String defaultUrlThreshold = attributes.getValue(ATTR_DEFAULT_URL_THRESHOLD); + String defaultSqlThreshold = attributes.getValue(ATTR_DEFAULT_SQL_THRESHOLD); + String defaultServiceThreshold = attributes.getValue(ATTR_DEFAULT_SERVICE_THRESHOLD); + LongConfig longConfig = new LongConfig(); + + if (defaultUrlThreshold != null) { + longConfig.setDefaultUrlThreshold(convert(Integer.class, defaultUrlThreshold, 0)); + } + + if (defaultSqlThreshold != null) { + longConfig.setDefaultSqlThreshold(convert(Integer.class, defaultSqlThreshold, 0)); + } + + if (defaultServiceThreshold != null) { + longConfig.setDefaultServiceThreshold(convert(Integer.class, defaultServiceThreshold, 0)); + } + + return longConfig; + } + + @Override + public Property buildProperty(Attributes attributes) { + String name = attributes.getValue(ATTR_NAME); + String value = attributes.getValue(ATTR_VALUE); + Property property = new Property(name); + + if (value != null) { + property.setValue(value); + } + + return property; + } + + @Override + public Server buildServer(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Server server = new Server(id); + + return server; + } + + @Override + public ServerConfig buildServerConfig(Attributes attributes) { + ServerConfig serverConfig = new ServerConfig(); + + return serverConfig; + } + + @Override + public StorageConfig buildStorage(Attributes attributes) { + String localBaseDir = attributes.getValue(ATTR_LOCAL_BASE_DIR); + String maxHdfsStorageTime = attributes.getValue(ATTR_MAX_HDFS_STORAGE_TIME); + String localReportStorageTime = attributes.getValue(ATTR_LOCAL_REPORT_STORAGE_TIME); + String localLogivewStorageTime = attributes.getValue(ATTR_LOCAL_LOGIVEW_STORAGE_TIME); + String harMode = attributes.getValue(ATTR_HAR_MODE); + String uploadThread = attributes.getValue(ATTR_UPLOAD_THREAD); + StorageConfig storage = new StorageConfig(); + + if (localBaseDir != null) { + storage.setLocalBaseDir(localBaseDir); + } + + if (maxHdfsStorageTime != null) { + storage.setMaxHdfsStorageTime(convert(Integer.class, maxHdfsStorageTime, 0)); + } + + if (localReportStorageTime != null) { + storage.setLocalReportStorageTime(convert(Integer.class, localReportStorageTime, 0)); + } + + if (localLogivewStorageTime != null) { + storage.setLocalLogivewStorageTime(convert(Integer.class, localLogivewStorageTime, 0)); + } + + if (harMode != null) { + storage.setHarMode(convert(Boolean.class, harMode, false)); + } + + if (uploadThread != null) { + storage.setUploadThread(convert(Integer.class, uploadThread, 0)); + } + + return storage; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultSaxParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..c518764371 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultSaxParser.java @@ -0,0 +1,389 @@ +package com.dianping.cat.configuration.server.transform; + +import static com.dianping.cat.configuration.server.Constants.ENTITY_CONSUMER; +import static com.dianping.cat.configuration.server.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.configuration.server.Constants.ENTITY_HARFS; +import static com.dianping.cat.configuration.server.Constants.ENTITY_HDFS; +import static com.dianping.cat.configuration.server.Constants.ENTITY_LONG_CONFIG; +import static com.dianping.cat.configuration.server.Constants.ENTITY_PROPERTY; +import static com.dianping.cat.configuration.server.Constants.ENTITY_SERVER; +import static com.dianping.cat.configuration.server.Constants.ENTITY_SERVER_CONFIG; +import static com.dianping.cat.configuration.server.Constants.ENTITY_STORAGE; +import static com.dianping.cat.configuration.server.Constants.ENTITY_PROPERTIES; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.configuration.server.IEntity; +import com.dianping.cat.configuration.server.entity.ConsumerConfig; +import com.dianping.cat.configuration.server.entity.Domain; +import com.dianping.cat.configuration.server.entity.HarfsConfig; +import com.dianping.cat.configuration.server.entity.HdfsConfig; +import com.dianping.cat.configuration.server.entity.LongConfig; +import com.dianping.cat.configuration.server.entity.Property; +import com.dianping.cat.configuration.server.entity.Server; +import com.dianping.cat.configuration.server.entity.ServerConfig; +import com.dianping.cat.configuration.server.entity.StorageConfig; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static ServerConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(ServerConfig.class, new InputSource(removeBOM(in))); + } + + public static ServerConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(ServerConfig.class, new InputSource(removeBOM(reader))); + } + + public static ServerConfig parse(String xml) throws SAXException, IOException { + return parseEntity(ServerConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForConsumer(ConsumerConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_LONG_CONFIG.equals(qName)) { + LongConfig longConfig = m_maker.buildLongConfig(attributes); + + m_linker.onLongConfig(parentObj, longConfig); + m_objs.push(longConfig); + } else { + throw new SAXException(String.format("Element(%s) is not expected under consumer!", qName)); + } + + m_tags.push(qName); + } + + private void parseForDomain(Domain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForHarfs(HarfsConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForHdfs(HdfsConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForLongConfig(LongConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_linker.onDomain(parentObj, domain); + m_objs.push(domain); + } else { + throw new SAXException(String.format("Element(%s) is not expected under long-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseForProperty(Property parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForServer(Server parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_PROPERTIES.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_PROPERTY.equals(qName)) { + Property property = m_maker.buildProperty(attributes); + + m_linker.onProperty(parentObj, property); + m_objs.push(property); + } else if (ENTITY_STORAGE.equals(qName)) { + StorageConfig storage = m_maker.buildStorage(attributes); + + m_linker.onStorage(parentObj, storage); + m_objs.push(storage); + } else if (ENTITY_CONSUMER.equals(qName)) { + ConsumerConfig consumer = m_maker.buildConsumer(attributes); + + m_linker.onConsumer(parentObj, consumer); + m_objs.push(consumer); + } else { + throw new SAXException(String.format("Element(%s) is not expected under server!", qName)); + } + + m_tags.push(qName); + } + + private void parseForServerConfig(ServerConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_SERVER.equals(qName)) { + Server server = m_maker.buildServer(attributes); + + m_linker.onServer(parentObj, server); + m_objs.push(server); + } else { + throw new SAXException(String.format("Element(%s) is not expected under server-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseForStorage(StorageConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_PROPERTIES.equals(qName)) { + m_objs.push(parentObj); + } else if (ENTITY_HDFS.equals(qName)) { + HdfsConfig hdfs = m_maker.buildHdfs(attributes); + + m_linker.onHdfs(parentObj, hdfs); + m_objs.push(hdfs); + } else if (ENTITY_HARFS.equals(qName)) { + HarfsConfig harfs = m_maker.buildHarfs(attributes); + + m_linker.onHarfs(parentObj, harfs); + m_objs.push(harfs); + } else if (ENTITY_PROPERTY.equals(qName)) { + Property property = m_maker.buildProperty(attributes); + + m_linker.onProperty(parentObj, property); + m_objs.push(property); + } else { + throw new SAXException(String.format("Element(%s) is not expected under storage!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_SERVER_CONFIG.equals(qName)) { + ServerConfig serverConfig = m_maker.buildServerConfig(attributes); + + m_entity = serverConfig; + m_objs.push(serverConfig); + m_tags.push(qName); + } else if (ENTITY_SERVER.equals(qName)) { + Server server = m_maker.buildServer(attributes); + + m_entity = server; + m_objs.push(server); + m_tags.push(qName); + } else if (ENTITY_PROPERTY.equals(qName)) { + Property property = m_maker.buildProperty(attributes); + + m_entity = property; + m_objs.push(property); + m_tags.push(qName); + } else if (ENTITY_STORAGE.equals(qName)) { + StorageConfig storage = m_maker.buildStorage(attributes); + + m_entity = storage; + m_objs.push(storage); + m_tags.push(qName); + } else if (ENTITY_HDFS.equals(qName)) { + HdfsConfig hdfs = m_maker.buildHdfs(attributes); + + m_entity = hdfs; + m_objs.push(hdfs); + m_tags.push(qName); + } else if (ENTITY_HARFS.equals(qName)) { + HarfsConfig harfs = m_maker.buildHarfs(attributes); + + m_entity = harfs; + m_objs.push(harfs); + m_tags.push(qName); + } else if (ENTITY_CONSUMER.equals(qName)) { + ConsumerConfig consumer = m_maker.buildConsumer(attributes); + + m_entity = consumer; + m_objs.push(consumer); + m_tags.push(qName); + } else if (ENTITY_LONG_CONFIG.equals(qName)) { + LongConfig longConfig = m_maker.buildLongConfig(attributes); + + m_entity = longConfig; + m_objs.push(longConfig); + m_tags.push(qName); + } else if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_entity = domain; + m_objs.push(domain); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof ServerConfig) { + parseForServerConfig((ServerConfig) parent, tag, qName, attributes); + } else if (parent instanceof Server) { + parseForServer((Server) parent, tag, qName, attributes); + } else if (parent instanceof Property) { + parseForProperty((Property) parent, tag, qName, attributes); + } else if (parent instanceof StorageConfig) { + parseForStorage((StorageConfig) parent, tag, qName, attributes); + } else if (parent instanceof HdfsConfig) { + parseForHdfs((HdfsConfig) parent, tag, qName, attributes); + } else if (parent instanceof HarfsConfig) { + parseForHarfs((HarfsConfig) parent, tag, qName, attributes); + } else if (parent instanceof ConsumerConfig) { + parseForConsumer((ConsumerConfig) parent, tag, qName, attributes); + } else if (parent instanceof LongConfig) { + parseForLongConfig((LongConfig) parent, tag, qName, attributes); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultValidator.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultValidator.java new file mode 100644 index 0000000000..083e4ff0a4 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultValidator.java @@ -0,0 +1,205 @@ +package com.dianping.cat.configuration.server.transform; + +import static com.dianping.cat.configuration.server.Constants.ATTR_ID; +import static com.dianping.cat.configuration.server.Constants.ATTR_NAME; +import static com.dianping.cat.configuration.server.Constants.ENTITY_CONSUMER; +import static com.dianping.cat.configuration.server.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.configuration.server.Constants.ENTITY_HARFS; +import static com.dianping.cat.configuration.server.Constants.ENTITY_HDFS; +import static com.dianping.cat.configuration.server.Constants.ENTITY_LONG_CONFIG; +import static com.dianping.cat.configuration.server.Constants.ENTITY_PROPERTIES; +import static com.dianping.cat.configuration.server.Constants.ENTITY_PROPERTY; +import static com.dianping.cat.configuration.server.Constants.ENTITY_SERVER; +import static com.dianping.cat.configuration.server.Constants.ENTITY_SERVER_CONFIG; +import static com.dianping.cat.configuration.server.Constants.ENTITY_STORAGE; + +import java.util.Stack; + +import com.dianping.cat.configuration.server.IVisitor; +import com.dianping.cat.configuration.server.entity.ConsumerConfig; +import com.dianping.cat.configuration.server.entity.Domain; +import com.dianping.cat.configuration.server.entity.HarfsConfig; +import com.dianping.cat.configuration.server.entity.HdfsConfig; +import com.dianping.cat.configuration.server.entity.LongConfig; +import com.dianping.cat.configuration.server.entity.Property; +import com.dianping.cat.configuration.server.entity.Server; +import com.dianping.cat.configuration.server.entity.ServerConfig; +import com.dianping.cat.configuration.server.entity.StorageConfig; + +public class DefaultValidator implements IVisitor { + + private Path m_path = new Path(); + + protected void assertRequired(String name, Object value) { + if (value == null) { + throw new RuntimeException(String.format("%s at path(%s) is required!", name, m_path)); + } + } + + @Override + public void visitConsumer(ConsumerConfig consumer) { + m_path.down(ENTITY_CONSUMER); + + visitConsumerChildren(consumer); + + m_path.up(ENTITY_CONSUMER); + } + + protected void visitConsumerChildren(ConsumerConfig consumer) { + if (consumer.getLongConfig() != null) { + visitLongConfig(consumer.getLongConfig()); + } + } + + @Override + public void visitDomain(Domain domain) { + m_path.down(ENTITY_DOMAIN); + + assertRequired(ATTR_NAME, domain.getName()); + + m_path.up(ENTITY_DOMAIN); + } + + @Override + public void visitHarfs(HarfsConfig harfs) { + m_path.down(ENTITY_HARFS); + + assertRequired(ATTR_ID, harfs.getId()); + + m_path.up(ENTITY_HARFS); + } + + @Override + public void visitHdfs(HdfsConfig hdfs) { + m_path.down(ENTITY_HDFS); + + assertRequired(ATTR_ID, hdfs.getId()); + + m_path.up(ENTITY_HDFS); + } + + @Override + public void visitLongConfig(LongConfig longConfig) { + m_path.down(ENTITY_LONG_CONFIG); + + visitLongConfigChildren(longConfig); + + m_path.up(ENTITY_LONG_CONFIG); + } + + protected void visitLongConfigChildren(LongConfig longConfig) { + for (Domain domain : longConfig.getDomains().values()) { + visitDomain(domain); + } + } + + @Override + public void visitProperty(Property property) { + m_path.down(ENTITY_PROPERTY); + + assertRequired(ATTR_NAME, property.getName()); + + m_path.up(ENTITY_PROPERTY); + } + + @Override + public void visitServer(Server server) { + m_path.down(ENTITY_SERVER); + + assertRequired(ATTR_ID, server.getId()); + + visitServerChildren(server); + + m_path.up(ENTITY_SERVER); + } + + protected void visitServerChildren(Server server) { + m_path.down(ENTITY_PROPERTIES); + + for (Property property : server.getProperties().values()) { + visitProperty(property); + } + + m_path.up(ENTITY_PROPERTIES); + + if (server.getStorage() != null) { + visitStorage(server.getStorage()); + } + + if (server.getConsumer() != null) { + visitConsumer(server.getConsumer()); + } + } + + @Override + public void visitServerConfig(ServerConfig serverConfig) { + m_path.down(ENTITY_SERVER_CONFIG); + + visitServerConfigChildren(serverConfig); + + m_path.up(ENTITY_SERVER_CONFIG); + } + + protected void visitServerConfigChildren(ServerConfig serverConfig) { + for (Server server : serverConfig.getServers().values()) { + visitServer(server); + } + } + + @Override + public void visitStorage(StorageConfig storage) { + m_path.down(ENTITY_STORAGE); + + visitStorageChildren(storage); + + m_path.up(ENTITY_STORAGE); + } + + protected void visitStorageChildren(StorageConfig storage) { + for (HdfsConfig hdfs : storage.getHdfses().values()) { + visitHdfs(hdfs); + } + + for (HarfsConfig harfs : storage.getHarfses().values()) { + visitHarfs(harfs); + } + + m_path.down(ENTITY_PROPERTIES); + + for (Property property : storage.getProperties().values()) { + visitProperty(property); + } + + m_path.up(ENTITY_PROPERTIES); + } + + static class Path { + private Stack m_sections = new Stack(); + + public Path down(String nextSection) { + m_sections.push(nextSection); + + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + for (String section : m_sections) { + sb.append('/').append(section); + } + + return sb.toString(); + } + + public Path up(String currentSection) { + if (m_sections.isEmpty() || !m_sections.peek().equals(currentSection)) { + throw new RuntimeException("INTERNAL ERROR: stack mismatched!"); + } + + m_sections.pop(); + return this; + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultXmlBuilder.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..1d28c505fa --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/DefaultXmlBuilder.java @@ -0,0 +1,337 @@ +package com.dianping.cat.configuration.server.transform; + +import static com.dianping.cat.configuration.server.Constants.ATTR_BASE_DIR; +import static com.dianping.cat.configuration.server.Constants.ATTR_DEFAULT_SERVICE_THRESHOLD; +import static com.dianping.cat.configuration.server.Constants.ATTR_DEFAULT_SQL_THRESHOLD; +import static com.dianping.cat.configuration.server.Constants.ATTR_DEFAULT_URL_THRESHOLD; +import static com.dianping.cat.configuration.server.Constants.ATTR_HAR_MODE; +import static com.dianping.cat.configuration.server.Constants.ATTR_ID; +import static com.dianping.cat.configuration.server.Constants.ATTR_LOCAL_BASE_DIR; +import static com.dianping.cat.configuration.server.Constants.ATTR_LOCAL_LOGIVEW_STORAGE_TIME; +import static com.dianping.cat.configuration.server.Constants.ATTR_LOCAL_REPORT_STORAGE_TIME; +import static com.dianping.cat.configuration.server.Constants.ATTR_MAX_HDFS_STORAGE_TIME; +import static com.dianping.cat.configuration.server.Constants.ATTR_MAX_SIZE; +import static com.dianping.cat.configuration.server.Constants.ATTR_NAME; +import static com.dianping.cat.configuration.server.Constants.ATTR_SERVER_URI; +import static com.dianping.cat.configuration.server.Constants.ATTR_SERVICE_THRESHOLD; +import static com.dianping.cat.configuration.server.Constants.ATTR_SQL_THRESHOLD; +import static com.dianping.cat.configuration.server.Constants.ATTR_UPLOAD_THREAD; +import static com.dianping.cat.configuration.server.Constants.ATTR_URL_THRESHOLD; +import static com.dianping.cat.configuration.server.Constants.ATTR_VALUE; +import static com.dianping.cat.configuration.server.Constants.ENTITY_CONSUMER; +import static com.dianping.cat.configuration.server.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.configuration.server.Constants.ENTITY_HARFS; +import static com.dianping.cat.configuration.server.Constants.ENTITY_HDFS; +import static com.dianping.cat.configuration.server.Constants.ENTITY_LONG_CONFIG; +import static com.dianping.cat.configuration.server.Constants.ENTITY_PROPERTIES; +import static com.dianping.cat.configuration.server.Constants.ENTITY_PROPERTY; +import static com.dianping.cat.configuration.server.Constants.ENTITY_SERVER; +import static com.dianping.cat.configuration.server.Constants.ENTITY_SERVER_CONFIG; +import static com.dianping.cat.configuration.server.Constants.ENTITY_STORAGE; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.configuration.server.IEntity; +import com.dianping.cat.configuration.server.IVisitor; +import com.dianping.cat.configuration.server.entity.ConsumerConfig; +import com.dianping.cat.configuration.server.entity.Domain; +import com.dianping.cat.configuration.server.entity.HarfsConfig; +import com.dianping.cat.configuration.server.entity.HdfsConfig; +import com.dianping.cat.configuration.server.entity.LongConfig; +import com.dianping.cat.configuration.server.entity.Property; +import com.dianping.cat.configuration.server.entity.Server; +import com.dianping.cat.configuration.server.entity.ServerConfig; +import com.dianping.cat.configuration.server.entity.StorageConfig; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitConsumer(ConsumerConfig consumer) { + startTag(ENTITY_CONSUMER, null); + + if (consumer.getLongConfig() != null) { + consumer.getLongConfig().accept(m_visitor); + } + + endTag(ENTITY_CONSUMER); + } + + @Override + public void visitDomain(Domain domain) { + startTag(ENTITY_DOMAIN, true, null, ATTR_NAME, domain.getName(), ATTR_URL_THRESHOLD, domain.getUrlThreshold(), ATTR_SQL_THRESHOLD, domain.getSqlThreshold(), ATTR_SERVICE_THRESHOLD, domain.getServiceThreshold()); + } + + @Override + public void visitHarfs(HarfsConfig harfs) { + startTag(ENTITY_HARFS, true, null, ATTR_ID, harfs.getId(), ATTR_MAX_SIZE, harfs.getMaxSize(), ATTR_SERVER_URI, harfs.getServerUri(), ATTR_BASE_DIR, harfs.getBaseDir()); + } + + @Override + public void visitHdfs(HdfsConfig hdfs) { + startTag(ENTITY_HDFS, true, null, ATTR_ID, hdfs.getId(), ATTR_MAX_SIZE, hdfs.getMaxSize(), ATTR_SERVER_URI, hdfs.getServerUri(), ATTR_BASE_DIR, hdfs.getBaseDir()); + } + + @Override + public void visitLongConfig(LongConfig longConfig) { + startTag(ENTITY_LONG_CONFIG, null, ATTR_DEFAULT_URL_THRESHOLD, longConfig.getDefaultUrlThreshold(), ATTR_DEFAULT_SQL_THRESHOLD, longConfig.getDefaultSqlThreshold(), ATTR_DEFAULT_SERVICE_THRESHOLD, longConfig.getDefaultServiceThreshold()); + + if (!longConfig.getDomains().isEmpty()) { + for (Domain domain : longConfig.getDomains().values()) { + domain.accept(m_visitor); + } + } + + endTag(ENTITY_LONG_CONFIG); + } + + @Override + public void visitProperty(Property property) { + startTag(ENTITY_PROPERTY, true, null, ATTR_NAME, property.getName(), ATTR_VALUE, property.getValue()); + } + + @Override + public void visitServer(Server server) { + startTag(ENTITY_SERVER, null, ATTR_ID, server.getId()); + + if (!server.getProperties().isEmpty()) { + startTag(ENTITY_PROPERTIES); + + for (Property property : server.getProperties().values()) { + property.accept(m_visitor); + } + + endTag(ENTITY_PROPERTIES); + } + + if (server.getStorage() != null) { + server.getStorage().accept(m_visitor); + } + + if (server.getConsumer() != null) { + server.getConsumer().accept(m_visitor); + } + + endTag(ENTITY_SERVER); + } + + @Override + public void visitServerConfig(ServerConfig serverConfig) { + startTag(ENTITY_SERVER_CONFIG, null); + + if (!serverConfig.getServers().isEmpty()) { + for (Server server : serverConfig.getServers().values()) { + server.accept(m_visitor); + } + } + + endTag(ENTITY_SERVER_CONFIG); + } + + @Override + public void visitStorage(StorageConfig storage) { + startTag(ENTITY_STORAGE, null, ATTR_LOCAL_BASE_DIR, storage.getLocalBaseDir(), ATTR_MAX_HDFS_STORAGE_TIME, storage.getMaxHdfsStorageTime(), ATTR_LOCAL_REPORT_STORAGE_TIME, storage.getLocalReportStorageTime(), ATTR_LOCAL_LOGIVEW_STORAGE_TIME, storage.getLocalLogivewStorageTime(), ATTR_HAR_MODE, storage.isHarMode(), ATTR_UPLOAD_THREAD, storage.getUploadThread()); + + if (!storage.getHdfses().isEmpty()) { + for (HdfsConfig hdfs : storage.getHdfses().values()) { + hdfs.accept(m_visitor); + } + } + + if (!storage.getHarfses().isEmpty()) { + for (HarfsConfig harfs : storage.getHarfses().values()) { + harfs.accept(m_visitor); + } + } + + if (!storage.getProperties().isEmpty()) { + startTag(ENTITY_PROPERTIES); + + for (Property property : storage.getProperties().values()) { + property.accept(m_visitor); + } + + endTag(ENTITY_PROPERTIES); + } + + endTag(ENTITY_STORAGE); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/ILinker.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/ILinker.java new file mode 100644 index 0000000000..e133f5a09a --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/ILinker.java @@ -0,0 +1,32 @@ +package com.dianping.cat.configuration.server.transform; + +import com.dianping.cat.configuration.server.entity.ConsumerConfig; +import com.dianping.cat.configuration.server.entity.Domain; +import com.dianping.cat.configuration.server.entity.HarfsConfig; +import com.dianping.cat.configuration.server.entity.HdfsConfig; +import com.dianping.cat.configuration.server.entity.LongConfig; +import com.dianping.cat.configuration.server.entity.Property; +import com.dianping.cat.configuration.server.entity.Server; +import com.dianping.cat.configuration.server.entity.ServerConfig; +import com.dianping.cat.configuration.server.entity.StorageConfig; + +public interface ILinker { + + public boolean onConsumer(Server parent, ConsumerConfig consumer); + + public boolean onDomain(LongConfig parent, Domain domain); + + public boolean onHarfs(StorageConfig parent, HarfsConfig harfs); + + public boolean onHdfs(StorageConfig parent, HdfsConfig hdfs); + + public boolean onLongConfig(ConsumerConfig parent, LongConfig longConfig); + + public boolean onProperty(Server parent, Property property); + + public boolean onProperty(StorageConfig parent, Property property); + + public boolean onServer(ServerConfig parent, Server server); + + public boolean onStorage(Server parent, StorageConfig storage); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/IMaker.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/IMaker.java new file mode 100644 index 0000000000..053c85741e --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/IMaker.java @@ -0,0 +1,32 @@ +package com.dianping.cat.configuration.server.transform; + +import com.dianping.cat.configuration.server.entity.ConsumerConfig; +import com.dianping.cat.configuration.server.entity.Domain; +import com.dianping.cat.configuration.server.entity.HarfsConfig; +import com.dianping.cat.configuration.server.entity.HdfsConfig; +import com.dianping.cat.configuration.server.entity.LongConfig; +import com.dianping.cat.configuration.server.entity.Property; +import com.dianping.cat.configuration.server.entity.Server; +import com.dianping.cat.configuration.server.entity.ServerConfig; +import com.dianping.cat.configuration.server.entity.StorageConfig; + +public interface IMaker { + + public ConsumerConfig buildConsumer(T node); + + public Domain buildDomain(T node); + + public HarfsConfig buildHarfs(T node); + + public HdfsConfig buildHdfs(T node); + + public LongConfig buildLongConfig(T node); + + public Property buildProperty(T node); + + public Server buildServer(T node); + + public ServerConfig buildServerConfig(T node); + + public StorageConfig buildStorage(T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/IParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/IParser.java new file mode 100644 index 0000000000..9fbb1ae440 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/server/transform/IParser.java @@ -0,0 +1,31 @@ +package com.dianping.cat.configuration.server.transform; + +import com.dianping.cat.configuration.server.entity.ConsumerConfig; +import com.dianping.cat.configuration.server.entity.Domain; +import com.dianping.cat.configuration.server.entity.HarfsConfig; +import com.dianping.cat.configuration.server.entity.HdfsConfig; +import com.dianping.cat.configuration.server.entity.LongConfig; +import com.dianping.cat.configuration.server.entity.Property; +import com.dianping.cat.configuration.server.entity.Server; +import com.dianping.cat.configuration.server.entity.ServerConfig; +import com.dianping.cat.configuration.server.entity.StorageConfig; + +public interface IParser { + public ServerConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForConsumerConfig(IMaker maker, ILinker linker, ConsumerConfig parent, T node); + + public void parseForDomain(IMaker maker, ILinker linker, Domain parent, T node); + + public void parseForHarfsConfig(IMaker maker, ILinker linker, HarfsConfig parent, T node); + + public void parseForHdfsConfig(IMaker maker, ILinker linker, HdfsConfig parent, T node); + + public void parseForLongConfig(IMaker maker, ILinker linker, LongConfig parent, T node); + + public void parseForProperty(IMaker maker, ILinker linker, Property parent, T node); + + public void parseForServer(IMaker maker, ILinker linker, Server parent, T node); + + public void parseForStorageConfig(IMaker maker, ILinker linker, StorageConfig parent, T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/tp/BaseEntity.java b/cat-core/src/main/java/com/dianping/cat/configuration/tp/BaseEntity.java new file mode 100644 index 0000000000..23ccc32d74 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/tp/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.configuration.tp; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.configuration.tp.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/tp/Constants.java b/cat-core/src/main/java/com/dianping/cat/configuration/tp/Constants.java new file mode 100644 index 0000000000..8dee6c3930 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/tp/Constants.java @@ -0,0 +1,16 @@ +package com.dianping.cat.configuration.tp; + +public class Constants { + + public static final String ATTR_ID = "id"; + + public static final String ELEMENT_TRANSACTION_TYPE = "transaction-type"; + + public static final String ELEMENT_TRANSACTION_TYPES = "transaction-types"; + + public static final String ENTITY_DOMAIN = "domain"; + + public static final String ENTITY_DOMAINS = "domains"; + + public static final String ENTITY_TP_VALUE_STATISTIC_CONFIG = "tp-value-statistic-config"; +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/tp/IEntity.java b/cat-core/src/main/java/com/dianping/cat/configuration/tp/IEntity.java new file mode 100644 index 0000000000..46d8a55284 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/tp/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.configuration.tp; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/tp/IVisitor.java b/cat-core/src/main/java/com/dianping/cat/configuration/tp/IVisitor.java new file mode 100644 index 0000000000..84511844b1 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/tp/IVisitor.java @@ -0,0 +1,11 @@ +package com.dianping.cat.configuration.tp; + +import com.dianping.cat.configuration.tp.entity.Domain; +import com.dianping.cat.configuration.tp.entity.TpValueStatisticConfig; + +public interface IVisitor { + + public void visitDomain(Domain domain); + + public void visitTpValueStatisticConfig(TpValueStatisticConfig tpValueStatisticConfig); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/tp/entity/Domain.java b/cat-core/src/main/java/com/dianping/cat/configuration/tp/entity/Domain.java new file mode 100644 index 0000000000..1a365a7eef --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/tp/entity/Domain.java @@ -0,0 +1,77 @@ +package com.dianping.cat.configuration.tp.entity; + +import static com.dianping.cat.configuration.tp.Constants.ATTR_ID; +import static com.dianping.cat.configuration.tp.Constants.ENTITY_DOMAIN; + +import java.util.LinkedHashSet; +import java.util.Set; + +import com.dianping.cat.configuration.tp.BaseEntity; +import com.dianping.cat.configuration.tp.IVisitor; + +public class Domain extends BaseEntity { + private String m_id; + + private Set m_transactionTypes = new LinkedHashSet(); + + public Domain() { + } + + public Domain(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomain(this); + } + + public Domain addTransactionType(String transactionType) { + m_transactionTypes.add(transactionType); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Domain) { + Domain _o = (Domain) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + public Set getTransactionTypes() { + return m_transactionTypes; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Domain other) { + assertAttributeEquals(other, ENTITY_DOMAIN, ATTR_ID, m_id, other.getId()); + + } + + public Domain setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/tp/entity/TpValueStatisticConfig.java b/cat-core/src/main/java/com/dianping/cat/configuration/tp/entity/TpValueStatisticConfig.java new file mode 100644 index 0000000000..7a99b08944 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/tp/entity/TpValueStatisticConfig.java @@ -0,0 +1,83 @@ +package com.dianping.cat.configuration.tp.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.configuration.tp.BaseEntity; +import com.dianping.cat.configuration.tp.IVisitor; + +public class TpValueStatisticConfig extends BaseEntity { + private Map m_domains = new LinkedHashMap(); + + public TpValueStatisticConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitTpValueStatisticConfig(this); + } + + public TpValueStatisticConfig addDomain(Domain domain) { + m_domains.put(domain.getId(), domain); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TpValueStatisticConfig) { + TpValueStatisticConfig _o = (TpValueStatisticConfig) obj; + + if (!equals(getDomains(), _o.getDomains())) { + return false; + } + + + return true; + } + + return false; + } + + public Domain findDomain(String id) { + return m_domains.get(id); + } + + public Domain findOrCreateDomain(String id) { + Domain domain = m_domains.get(id); + + if (domain == null) { + synchronized (m_domains) { + domain = m_domains.get(id); + + if (domain == null) { + domain = new Domain(id); + m_domains.put(id, domain); + } + } + } + + return domain; + } + + public Map getDomains() { + return m_domains; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domains == null ? 0 : m_domains.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(TpValueStatisticConfig other) { + } + + public Domain removeDomain(String id) { + return m_domains.remove(id); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultLinker.java b/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultLinker.java new file mode 100644 index 0000000000..b6aeec53b2 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultLinker.java @@ -0,0 +1,38 @@ +package com.dianping.cat.configuration.tp.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.configuration.tp.entity.Domain; +import com.dianping.cat.configuration.tp.entity.TpValueStatisticConfig; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDomain(final TpValueStatisticConfig parent, final Domain domain) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDomain(domain); + } + }); + } else { + parent.addDomain(domain); + } + + return true; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultSaxMaker.java b/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..781f7d918a --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultSaxMaker.java @@ -0,0 +1,58 @@ +package com.dianping.cat.configuration.tp.transform; + +import static com.dianping.cat.configuration.tp.Constants.ATTR_ID; + +import org.xml.sax.Attributes; + +import com.dianping.cat.configuration.tp.entity.Domain; +import com.dianping.cat.configuration.tp.entity.TpValueStatisticConfig; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Domain buildDomain(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Domain domain = new Domain(id); + + return domain; + } + + @Override + public TpValueStatisticConfig buildTpValueStatisticConfig(Attributes attributes) { + TpValueStatisticConfig tpValueStatisticConfig = new TpValueStatisticConfig(); + + return tpValueStatisticConfig; + } + + @Override + public String buildTransactionType(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultSaxParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..fec98f2dca --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultSaxParser.java @@ -0,0 +1,242 @@ +package com.dianping.cat.configuration.tp.transform; + +import static com.dianping.cat.configuration.tp.Constants.ELEMENT_TRANSACTION_TYPE; +import static com.dianping.cat.configuration.tp.Constants.ELEMENT_TRANSACTION_TYPES; + +import static com.dianping.cat.configuration.tp.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.configuration.tp.Constants.ENTITY_TP_VALUE_STATISTIC_CONFIG; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.configuration.tp.IEntity; +import com.dianping.cat.configuration.tp.entity.Domain; +import com.dianping.cat.configuration.tp.entity.TpValueStatisticConfig; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static TpValueStatisticConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(TpValueStatisticConfig.class, new InputSource(removeBOM(in))); + } + + public static TpValueStatisticConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(TpValueStatisticConfig.class, new InputSource(removeBOM(reader))); + } + + public static TpValueStatisticConfig parse(String xml) throws SAXException, IOException { + return parseEntity(TpValueStatisticConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof Domain) { + Domain domain = (Domain) currentObj; + + if (ELEMENT_TRANSACTION_TYPE.equals(currentTag)) { + domain.addTransactionType(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForDomain(Domain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_TRANSACTION_TYPES.equals(qName) || ELEMENT_TRANSACTION_TYPE.equals(qName)) { + m_objs.push(parentObj); + } else { + throw new SAXException(String.format("Element(%s) is not expected under domain!", qName)); + } + + m_tags.push(qName); + } + + private void parseForTpValueStatisticConfig(TpValueStatisticConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_linker.onDomain(parentObj, domain); + m_objs.push(domain); + } else { + throw new SAXException(String.format("Element(%s) is not expected under tp-value-statistic-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_TP_VALUE_STATISTIC_CONFIG.equals(qName)) { + TpValueStatisticConfig tpValueStatisticConfig = m_maker.buildTpValueStatisticConfig(attributes); + + m_entity = tpValueStatisticConfig; + m_objs.push(tpValueStatisticConfig); + m_tags.push(qName); + } else if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_entity = domain; + m_objs.push(domain); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof TpValueStatisticConfig) { + parseForTpValueStatisticConfig((TpValueStatisticConfig) parent, tag, qName, attributes); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultXmlBuilder.java b/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..a9eb4a7373 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/DefaultXmlBuilder.java @@ -0,0 +1,264 @@ +package com.dianping.cat.configuration.tp.transform; + +import static com.dianping.cat.configuration.tp.Constants.ATTR_ID; +import static com.dianping.cat.configuration.tp.Constants.ELEMENT_TRANSACTION_TYPE; +import static com.dianping.cat.configuration.tp.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.configuration.tp.Constants.ENTITY_TP_VALUE_STATISTIC_CONFIG; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.configuration.tp.IEntity; +import com.dianping.cat.configuration.tp.IVisitor; +import com.dianping.cat.configuration.tp.entity.Domain; +import com.dianping.cat.configuration.tp.entity.TpValueStatisticConfig; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + @Override + public void visitDomain(Domain domain) { + startTag(ENTITY_DOMAIN, null, ATTR_ID, domain.getId()); + + if (!domain.getTransactionTypes().isEmpty()) { + for (String transactionType : domain.getTransactionTypes()) { + tagWithText(ELEMENT_TRANSACTION_TYPE, transactionType); + } + } + + endTag(ENTITY_DOMAIN); + } + + @Override + public void visitTpValueStatisticConfig(TpValueStatisticConfig tpValueStatisticConfig) { + startTag(ENTITY_TP_VALUE_STATISTIC_CONFIG, null); + + if (!tpValueStatisticConfig.getDomains().isEmpty()) { + for (Domain domain : tpValueStatisticConfig.getDomains().values()) { + domain.accept(m_visitor); + } + } + + endTag(ENTITY_TP_VALUE_STATISTIC_CONFIG); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/ILinker.java b/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/ILinker.java new file mode 100644 index 0000000000..424af64ad6 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/ILinker.java @@ -0,0 +1,9 @@ +package com.dianping.cat.configuration.tp.transform; + +import com.dianping.cat.configuration.tp.entity.Domain; +import com.dianping.cat.configuration.tp.entity.TpValueStatisticConfig; + +public interface ILinker { + + public boolean onDomain(TpValueStatisticConfig parent, Domain domain); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/IMaker.java b/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/IMaker.java new file mode 100644 index 0000000000..71967cd427 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/IMaker.java @@ -0,0 +1,13 @@ +package com.dianping.cat.configuration.tp.transform; + +import com.dianping.cat.configuration.tp.entity.Domain; +import com.dianping.cat.configuration.tp.entity.TpValueStatisticConfig; + +public interface IMaker { + + public Domain buildDomain(T node); + + public TpValueStatisticConfig buildTpValueStatisticConfig(T node); + + public String buildTransactionType(T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/IParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/IParser.java new file mode 100644 index 0000000000..bba3ec8b1e --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/tp/transform/IParser.java @@ -0,0 +1,10 @@ +package com.dianping.cat.configuration.tp.transform; + +import com.dianping.cat.configuration.tp.entity.Domain; +import com.dianping.cat.configuration.tp.entity.TpValueStatisticConfig; + +public interface IParser { + public TpValueStatisticConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForDomain(IMaker maker, ILinker linker, Domain parent, T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/BaseEntity.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/BaseEntity.java new file mode 100644 index 0000000000..4b9f32a002 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/BaseEntity.java @@ -0,0 +1,56 @@ +package com.dianping.cat.configuration.web.url; + +import java.util.Formattable; +import java.util.FormattableFlags; +import java.util.Formatter; + +import com.dianping.cat.configuration.web.url.transform.DefaultXmlBuilder; +import com.dianping.cat.configuration.web.url.transform.DefaultJsonBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String JSON = "%#.3s"; + + public static final String JSON_COMPACT = "%#s"; + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean useJson = (flags & FormattableFlags.ALTERNATE) == FormattableFlags.ALTERNATE; + boolean compact = (precision <= 0); + + if (useJson) { + DefaultJsonBuilder builder = new DefaultJsonBuilder(compact); + + formatter.format("%s", builder.build(this)); + } else { + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/Constants.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/Constants.java new file mode 100644 index 0000000000..ce00f3abe7 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/Constants.java @@ -0,0 +1,26 @@ +package com.dianping.cat.configuration.web.url; + +public class Constants { + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_GROUP = "group"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_NAME = "name"; + + public static final String ATTR_PATTERN = "pattern"; + + public static final String ATTR_STATUS = "status"; + + public static final String ENTITY_CODE = "code"; + + public static final String ENTITY_CODES = "codes"; + + public static final String ENTITY_PATTERN_ITEM = "pattern-item"; + + public static final String ENTITY_PATTERN_ITEMS = "pattern-items"; + + public static final String ENTITY_URL_PATTERN = "url-pattern"; +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/IEntity.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/IEntity.java new file mode 100644 index 0000000000..b9055388e6 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.configuration.web.url; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/IVisitor.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/IVisitor.java new file mode 100644 index 0000000000..e8dde77ba0 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.configuration.web.url; + +import com.dianping.cat.configuration.web.url.entity.Code; +import com.dianping.cat.configuration.web.url.entity.PatternItem; +import com.dianping.cat.configuration.web.url.entity.UrlPattern; + +public interface IVisitor { + + public void visitCode(Code code); + + public void visitPatternItem(PatternItem patternItem); + + public void visitUrlPattern(UrlPattern urlPattern); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/entity/Code.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/entity/Code.java new file mode 100644 index 0000000000..3a5b6a1a60 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/entity/Code.java @@ -0,0 +1,92 @@ +package com.dianping.cat.configuration.web.url.entity; + +import static com.dianping.cat.configuration.web.url.Constants.ATTR_ID; +import static com.dianping.cat.configuration.web.url.Constants.ENTITY_CODE; + +import com.dianping.cat.configuration.web.url.BaseEntity; +import com.dianping.cat.configuration.web.url.IVisitor; + +public class Code extends BaseEntity { + private Integer m_id; + + private String m_name; + + private Integer m_status; + + public Code() { + } + + public Code(Integer id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitCode(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Code) { + Code _o = (Code) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Integer getId() { + return m_id; + } + + public String getName() { + return m_name; + } + + public Integer getStatus() { + return m_status; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Code other) { + assertAttributeEquals(other, ENTITY_CODE, ATTR_ID, m_id, other.getId()); + + if (other.getName() != null) { + m_name = other.getName(); + } + + if (other.getStatus() != null) { + m_status = other.getStatus(); + } + } + + public Code setId(Integer id) { + m_id = id; + return this; + } + + public Code setName(String name) { + m_name = name; + return this; + } + + public Code setStatus(Integer status) { + m_status = status; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/entity/PatternItem.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/entity/PatternItem.java new file mode 100644 index 0000000000..ac01da04da --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/entity/PatternItem.java @@ -0,0 +1,120 @@ +package com.dianping.cat.configuration.web.url.entity; + +import static com.dianping.cat.configuration.web.url.Constants.ATTR_NAME; +import static com.dianping.cat.configuration.web.url.Constants.ENTITY_PATTERN_ITEM; + +import com.dianping.cat.configuration.web.url.BaseEntity; +import com.dianping.cat.configuration.web.url.IVisitor; + +public class PatternItem extends BaseEntity { + private String m_group; + + private String m_name; + + private String m_pattern; + + private String m_domain; + + private int m_id; + + public PatternItem() { + } + + public PatternItem(String name) { + m_name = name; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitPatternItem(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PatternItem) { + PatternItem _o = (PatternItem) obj; + + if (!equals(getName(), _o.getName())) { + return false; + } + + return true; + } + + return false; + } + + public String getDomain() { + return m_domain; + } + + public String getGroup() { + return m_group; + } + + public int getId() { + return m_id; + } + + public String getName() { + return m_name; + } + + public String getPattern() { + return m_pattern; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_name == null ? 0 : m_name.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(PatternItem other) { + assertAttributeEquals(other, ENTITY_PATTERN_ITEM, ATTR_NAME, m_name, other.getName()); + + if (other.getGroup() != null) { + m_group = other.getGroup(); + } + + if (other.getPattern() != null) { + m_pattern = other.getPattern(); + } + + if (other.getDomain() != null) { + m_domain = other.getDomain(); + } + + m_id = other.getId(); + } + + public PatternItem setDomain(String domain) { + m_domain = domain; + return this; + } + + public PatternItem setGroup(String group) { + m_group = group; + return this; + } + + public PatternItem setId(int id) { + m_id = id; + return this; + } + + public PatternItem setName(String name) { + m_name = name; + return this; + } + + public PatternItem setPattern(String pattern) { + m_pattern = pattern; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/entity/UrlPattern.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/entity/UrlPattern.java new file mode 100644 index 0000000000..09384bddb0 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/entity/UrlPattern.java @@ -0,0 +1,124 @@ +package com.dianping.cat.configuration.web.url.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.configuration.web.url.BaseEntity; +import com.dianping.cat.configuration.web.url.IVisitor; + +public class UrlPattern extends BaseEntity { + private Map m_patternItems = new LinkedHashMap(); + + private Map m_codes = new LinkedHashMap(); + + public UrlPattern() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitUrlPattern(this); + } + + public UrlPattern addCode(Code code) { + m_codes.put(code.getId(), code); + return this; + } + + public UrlPattern addPatternItem(PatternItem patternItem) { + m_patternItems.put(patternItem.getName(), patternItem); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof UrlPattern) { + UrlPattern _o = (UrlPattern) obj; + + if (!equals(getPatternItems(), _o.getPatternItems())) { + return false; + } + + if (!equals(getCodes(), _o.getCodes())) { + return false; + } + + + return true; + } + + return false; + } + + public Code findCode(Integer id) { + return m_codes.get(id); + } + + public PatternItem findPatternItem(String name) { + return m_patternItems.get(name); + } + + public Code findOrCreateCode(Integer id) { + Code code = m_codes.get(id); + + if (code == null) { + synchronized (m_codes) { + code = m_codes.get(id); + + if (code == null) { + code = new Code(id); + m_codes.put(id, code); + } + } + } + + return code; + } + + public PatternItem findOrCreatePatternItem(String name) { + PatternItem patternItem = m_patternItems.get(name); + + if (patternItem == null) { + synchronized (m_patternItems) { + patternItem = m_patternItems.get(name); + + if (patternItem == null) { + patternItem = new PatternItem(name); + m_patternItems.put(name, patternItem); + } + } + } + + return patternItem; + } + + public Map getCodes() { + return m_codes; + } + + public Map getPatternItems() { + return m_patternItems; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_patternItems == null ? 0 : m_patternItems.hashCode()); + hash = hash * 31 + (m_codes == null ? 0 : m_codes.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(UrlPattern other) { + } + + public Code removeCode(Integer id) { + return m_codes.remove(id); + } + + public PatternItem removePatternItem(String name) { + return m_patternItems.remove(name); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/BaseVisitor.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/BaseVisitor.java new file mode 100644 index 0000000000..b126dbc845 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/BaseVisitor.java @@ -0,0 +1,27 @@ +package com.dianping.cat.configuration.web.url.transform; + +import com.dianping.cat.configuration.web.url.IVisitor; +import com.dianping.cat.configuration.web.url.entity.Code; +import com.dianping.cat.configuration.web.url.entity.PatternItem; +import com.dianping.cat.configuration.web.url.entity.UrlPattern; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitCode(Code code) { + } + + @Override + public void visitPatternItem(PatternItem patternItem) { + } + + @Override + public void visitUrlPattern(UrlPattern urlPattern) { + for (PatternItem patternItem : urlPattern.getPatternItems().values()) { + visitPatternItem(patternItem); + } + + for (Code code : urlPattern.getCodes().values()) { + visitCode(code); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultJsonBuilder.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultJsonBuilder.java new file mode 100644 index 0000000000..46e2d6cf4f --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultJsonBuilder.java @@ -0,0 +1,282 @@ +package com.dianping.cat.configuration.web.url.transform; + +import static com.dianping.cat.configuration.web.url.Constants.ATTR_DOMAIN; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_GROUP; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_ID; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_NAME; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_PATTERN; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_STATUS; +import static com.dianping.cat.configuration.web.url.Constants.ENTITY_CODES; +import static com.dianping.cat.configuration.web.url.Constants.ENTITY_PATTERN_ITEMS; + +import java.lang.reflect.Array; +import java.util.Collection; +import java.util.Map; + +import com.dianping.cat.configuration.web.url.IEntity; +import com.dianping.cat.configuration.web.url.IVisitor; +import com.dianping.cat.configuration.web.url.entity.Code; +import com.dianping.cat.configuration.web.url.entity.PatternItem; +import com.dianping.cat.configuration.web.url.entity.UrlPattern; + +public class DefaultJsonBuilder implements IVisitor { + + private IVisitor m_visitor; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultJsonBuilder() { + this(false); + } + + public DefaultJsonBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultJsonBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_visitor = this; + } + + protected void arrayBegin(String name) { + indent(); + m_sb.append('"').append(name).append(m_compact ? "\":[" : "\": [\r\n"); + m_level++; + } + + protected void arrayEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append("],").append(m_compact ? "" : "\r\n"); + } + + protected void attributes(Map dynamicAttributes, Object... nameValues) { + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + if (attrValue instanceof Collection) { + @SuppressWarnings("unchecked") + Collection items = (Collection) attrValue; + + if (!items.isEmpty()) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (Object item : items) { + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else if (attrValue.getClass().isArray()) { + int length = Array.getLength(attrValue); + + if (length > 0) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (int j = 0; j < length; j++) { + Object item = Array.get(attrValue, j); + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else { + if (m_compact) { + m_sb.append('"').append(attrName).append("\":"); + toString(m_sb, attrValue); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(attrName).append("\": "); + toString(m_sb, attrValue); + m_sb.append(",\r\n"); + } + } + } + } + + if (dynamicAttributes != null) { + for (Map.Entry e : dynamicAttributes.entrySet()) { + if (m_compact) { + m_sb.append('"').append(e.getKey()).append("\":"); + toString(m_sb, e.getValue()); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(e.getKey()).append("\": "); + toString(m_sb, e.getValue()); + m_sb.append(",\r\n"); + } + } + } + } + + public String build(IEntity entity) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + trimComma(); + + return m_sb.toString(); + } + + public String buildArray(Collection> entities) { + m_sb.append('['); + + if (entities != null) { + for (IEntity entity : entities) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + } + + trimComma(); + } + + m_sb.append(']'); + + return m_sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void objectBegin(String name) { + indent(); + + if (name == null) { + m_sb.append("{").append(m_compact ? "" : "\r\n"); + } else { + m_sb.append('"').append(name).append(m_compact ? "\":{" : "\": {\r\n"); + } + + m_level++; + } + + protected void objectEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append(m_compact ? "}," : "},\r\n"); + } + + protected void toString(StringBuilder sb, Object value) { + if (value == null) { + sb.append("null"); + } else if (value instanceof Boolean || value instanceof Number) { + sb.append(value); + } else { + String val = value.toString(); + int len = val.length(); + + sb.append('"'); + + for (int i = 0; i < len; i++) { + char ch = val.charAt(i); + + switch (ch) { + case '\\': + case '/': + case '"': + sb.append('\\').append(ch); + break; + case '\t': + sb.append("\\t"); + break; + case '\r': + sb.append("\\r"); + break; + case '\n': + sb.append("\\n"); + break; + default: + sb.append(ch); + break; + } + } + + sb.append('"'); + } + } + + protected void trimComma() { + int len = m_sb.length(); + + if (m_compact) { + if (len > 1 && m_sb.charAt(len - 1) == ',') { + m_sb.replace(len - 1, len, ""); + } + } else { + if (len > 3 && m_sb.charAt(len - 3) == ',') { + m_sb.replace(len - 3, len - 2, ""); + } + } + } + + @Override + public void visitCode(Code code) { + attributes(null, ATTR_ID, code.getId(), ATTR_NAME, code.getName(), ATTR_STATUS, code.getStatus()); + } + + @Override + public void visitPatternItem(PatternItem patternItem) { + attributes(null, ATTR_GROUP, patternItem.getGroup(), ATTR_NAME, patternItem.getName(), ATTR_PATTERN, patternItem.getPattern(), ATTR_DOMAIN, patternItem.getDomain(), ATTR_ID, patternItem.getId()); + } + + @Override + public void visitUrlPattern(UrlPattern urlPattern) { + + if (!urlPattern.getPatternItems().isEmpty()) { + objectBegin(ENTITY_PATTERN_ITEMS); + + for (Map.Entry e : urlPattern.getPatternItems().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_PATTERN_ITEMS); + } + + if (!urlPattern.getCodes().isEmpty()) { + objectBegin(ENTITY_CODES); + + for (Map.Entry e : urlPattern.getCodes().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_CODES); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultJsonParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultJsonParser.java new file mode 100644 index 0000000000..a469584681 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultJsonParser.java @@ -0,0 +1,375 @@ +package com.dianping.cat.configuration.web.url.transform; + +import static com.dianping.cat.configuration.web.url.Constants.ATTR_DOMAIN; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_GROUP; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_ID; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_NAME; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_PATTERN; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_STATUS; +import static com.dianping.cat.configuration.web.url.Constants.ENTITY_CODES; +import static com.dianping.cat.configuration.web.url.Constants.ENTITY_PATTERN_ITEMS; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.dianping.cat.configuration.web.url.IEntity; +import com.dianping.cat.configuration.web.url.entity.Code; +import com.dianping.cat.configuration.web.url.entity.PatternItem; +import com.dianping.cat.configuration.web.url.entity.UrlPattern; + +public class DefaultJsonParser { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private List m_entities = new ArrayList(); + + private Class m_entityClass; + + private DefaultJsonParser(Class entityClass) { + m_entityClass = entityClass; + } + + public static > T parse(Class entityClass, InputStream in) throws IOException { + return parse(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > T parse(Class entityClass, Reader reader) throws IOException { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.onArrayBegin(); + parser.parse(new JsonReader(reader)); + parser.onArrayEnd(); + + if (parser.m_entities.isEmpty()) { + return null; + } else { + return (T) parser.m_entities.get(0); + } + } + + public static > T parse(Class entityClass, String json) throws IOException { + return parse(entityClass, new StringReader(json)); + } + + public static > List parseArray(Class entityClass, InputStream in) throws Exception { + return parseArray(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > List parseArray(Class entityClass, Reader reader) throws Exception { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.parse(new JsonReader(reader)); + return (List) (List) parser.m_entities; + } + + public static > List parseArray(Class entityClass, String json) throws Exception { + return parseArray(entityClass, new StringReader(json)); + } + + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + private Object createRootEntity() { + try { + Object entity = m_entityClass.newInstance(); + + return entity; + } catch (Exception e) { + throw new RuntimeException(String.format("Unable to create entity(%s) instance!", m_entityClass.getName()), e); + } + } + + private boolean isTopLevel() { + return m_objs.size() == 1; + } + + protected void onArrayBegin() { + if (m_objs.isEmpty()) { + m_objs.push(m_entities); + m_tags.push(""); + } } + + protected void onArrayEnd() { + m_objs.pop(); + m_tags.pop(); + + } + protected void onName(String name) { + m_tags.push(name); + } + + protected void onObjectBegin() { + if (isTopLevel()) { + m_objs.push(createRootEntity()); + m_tags.push(""); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof UrlPattern) { + if (ENTITY_PATTERN_ITEMS.equals(tag) || ENTITY_CODES.equals(tag)) { + m_objs.push(parent); + } else { + String parentTag = m_tags.size() >= 2 ? m_tags.get(m_tags.size() - 2) : null; + + if (ENTITY_PATTERN_ITEMS.equals(parentTag)) { + PatternItem patternItems = new PatternItem(); + + m_linker.onPatternItem((UrlPattern) parent, patternItems); + m_objs.push(patternItems); + } else if (ENTITY_CODES.equals(parentTag)) { + Code codes = new Code(); + + m_linker.onCode((UrlPattern) parent, codes); + m_objs.push(codes); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } + + protected void onObjectEnd() { + m_tags.pop(); + + Object entity = m_objs.pop(); + + if (isTopLevel()) { + m_entities.add(entity); + } + } + + protected void onValue(String value) { + Object parent = m_objs.peek(); + String tag = m_tags.pop(); + + if (parent instanceof UrlPattern) { + parseForUrlPattern((UrlPattern) parent, tag, value); + } else if (parent instanceof PatternItem) { + parseForPatternItem((PatternItem) parent, tag, value); + } else if (parent instanceof Code) { + parseForCode((Code) parent, tag, value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) under %s!", tag, parent)); + } + } + + private void parse(JsonReader reader) throws IOException { + try { + reader.parse(this); + } catch (EOFException e) { + if (m_objs.size() > 1) { + throw new EOFException(String.format("Unexpected end while parsing json! tags: %s.", m_tags)); + } + } + + m_linker.finish(); + } + + public void parseForCode(Code code, String tag, String value) { + if (ATTR_ID.equals(tag)) { + code.setId(convert(Integer.class, value, null)); + } else if (ATTR_NAME.equals(tag)) { + code.setName(value); + } else if (ATTR_STATUS.equals(tag)) { + code.setStatus(convert(Integer.class, value, null)); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, code, m_tags)); + } + } + + public void parseForPatternItem(PatternItem patternItem, String tag, String value) { + if (ATTR_GROUP.equals(tag)) { + patternItem.setGroup(value); + } else if (ATTR_NAME.equals(tag)) { + patternItem.setName(value); + } else if (ATTR_PATTERN.equals(tag)) { + patternItem.setPattern(value); + } else if (ATTR_DOMAIN.equals(tag)) { + patternItem.setDomain(value); + } else if (ATTR_ID.equals(tag)) { + patternItem.setId(convert(Integer.class, value, 0)); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, patternItem, m_tags)); + } + } + + public void parseForUrlPattern(UrlPattern urlPattern, String tag, String value) { + if (ENTITY_PATTERN_ITEMS.equals(tag) || ENTITY_CODES.equals(tag)) { + // do nothing here + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, urlPattern, m_tags)); + } + } + + + static class JsonReader { + private Reader m_reader; + + private char[] m_buffer = new char[2048]; + + private int m_size; + + private int m_index; + + public JsonReader(Reader reader) { + m_reader = reader; + } + + private char next() throws IOException { + if (m_index >= m_size) { + m_size = m_reader.read(m_buffer); + m_index = 0; + + if (m_size == -1) { + throw new EOFException(); + } + } + + return m_buffer[m_index++]; + } + + public void parse(DefaultJsonParser parser) throws IOException { + StringBuilder sb = new StringBuilder(); + boolean flag = false; + + while (true) { + char ch = next(); + + switch (ch) { + case ' ': + case '\t': + case '\r': + case '\n': + break; + case '{': + parser.onObjectBegin(); + flag = false; + break; + case '}': + if (flag) { // have value + parser.onValue(sb.toString()); + sb.setLength(0); + } + + parser.onObjectEnd(); + flag = false; + break; + case '\'': + case '"': + while (true) { + char ch2 = next(); + + if (ch2 != ch) { + if (ch2 == '\\') { + char ch3 = next(); + + switch (ch3) { + case 't': + sb.append('\t'); + break; + case 'r': + sb.append('\r'); + break; + case 'n': + sb.append('\n'); + break; + default: + sb.append(ch3); + break; + } + } else { + sb.append(ch2); + } + } else { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + flag = false; + } + + sb.setLength(0); + break; + } + } + + break; + case ':': + if (sb.length() != 0) { + parser.onName(sb.toString()); + sb.setLength(0); + } + + flag = true; + break; + case ',': + if (sb.length() != 0) { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + } + + sb.setLength(0); + } + + flag = false; + break; + case '[': + parser.onArrayBegin(); + flag = false; + break; + case ']': + parser.onArrayEnd(); + flag = false; + break; + default: + sb.append(ch); + break; + } + } + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultLinker.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultLinker.java new file mode 100644 index 0000000000..827ab70edc --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultLinker.java @@ -0,0 +1,55 @@ +package com.dianping.cat.configuration.web.url.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.configuration.web.url.entity.Code; +import com.dianping.cat.configuration.web.url.entity.PatternItem; +import com.dianping.cat.configuration.web.url.entity.UrlPattern; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onCode(final UrlPattern parent, final Code code) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addCode(code); + } + }); + } else { + parent.addCode(code); + } + + return true; + } + + @Override + public boolean onPatternItem(final UrlPattern parent, final PatternItem patternItem) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addPatternItem(patternItem); + } + }); + } else { + parent.addPatternItem(patternItem); + } + + return true; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultMerger.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultMerger.java new file mode 100644 index 0000000000..a6448e817e --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultMerger.java @@ -0,0 +1,108 @@ +package com.dianping.cat.configuration.web.url.transform; + +import java.util.Stack; + +import com.dianping.cat.configuration.web.url.IEntity; +import com.dianping.cat.configuration.web.url.IVisitor; +import com.dianping.cat.configuration.web.url.entity.Code; +import com.dianping.cat.configuration.web.url.entity.PatternItem; +import com.dianping.cat.configuration.web.url.entity.UrlPattern; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private UrlPattern m_urlPattern; + + public DefaultMerger() { + } + + public DefaultMerger(UrlPattern urlPattern) { + m_urlPattern = urlPattern; + m_objs.push(urlPattern); + } + + public UrlPattern getUrlPattern() { + return m_urlPattern; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeCode(Code to, Code from) { + to.mergeAttributes(from); + } + + protected void mergePatternItem(PatternItem to, PatternItem from) { + to.mergeAttributes(from); + } + + protected void mergeUrlPattern(UrlPattern to, UrlPattern from) { + to.mergeAttributes(from); + } + + @Override + public void visitCode(Code from) { + Code to = (Code) m_objs.peek(); + + mergeCode(to, from); + visitCodeChildren(to, from); + } + + protected void visitCodeChildren(Code to, Code from) { + } + + @Override + public void visitPatternItem(PatternItem from) { + PatternItem to = (PatternItem) m_objs.peek(); + + mergePatternItem(to, from); + visitPatternItemChildren(to, from); + } + + protected void visitPatternItemChildren(PatternItem to, PatternItem from) { + } + + @Override + public void visitUrlPattern(UrlPattern from) { + UrlPattern to = (UrlPattern) m_objs.peek(); + + mergeUrlPattern(to, from); + visitUrlPatternChildren(to, from); + } + + protected void visitUrlPatternChildren(UrlPattern to, UrlPattern from) { + for (PatternItem source : from.getPatternItems().values()) { + PatternItem target = to.findPatternItem(source.getName()); + + if (target == null) { + target = new PatternItem(source.getName()); + to.addPatternItem(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Code source : from.getCodes().values()) { + Code target = to.findCode(source.getId()); + + if (target == null) { + target = new Code(source.getId()); + to.addCode(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultNativeBuilder.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..bef1fd0946 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultNativeBuilder.java @@ -0,0 +1,147 @@ +package com.dianping.cat.configuration.web.url.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.configuration.web.url.IVisitor; +import com.dianping.cat.configuration.web.url.entity.Code; +import com.dianping.cat.configuration.web.url.entity.PatternItem; +import com.dianping.cat.configuration.web.url.entity.UrlPattern; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(UrlPattern urlPattern) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(urlPattern, out); + return out.toByteArray(); + } + + public static void build(UrlPattern urlPattern, OutputStream out) { + urlPattern.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitCode(Code code) { + if (code.getId() != null) { + writeTag(1, 1); + writeInt(code.getId()); + } + + if (code.getName() != null) { + writeTag(2, 1); + writeString(code.getName()); + } + + if (code.getStatus() != null) { + writeTag(3, 1); + writeInt(code.getStatus()); + } + + writeTag(63, 3); + } + + @Override + public void visitPatternItem(PatternItem patternItem) { + if (patternItem.getGroup() != null) { + writeTag(1, 1); + writeString(patternItem.getGroup()); + } + + if (patternItem.getName() != null) { + writeTag(2, 1); + writeString(patternItem.getName()); + } + + if (patternItem.getPattern() != null) { + writeTag(3, 1); + writeString(patternItem.getPattern()); + } + + if (patternItem.getDomain() != null) { + writeTag(4, 1); + writeString(patternItem.getDomain()); + } + + writeTag(5, 0); + writeInt(patternItem.getId()); + + writeTag(63, 3); + } + + @Override + public void visitUrlPattern(UrlPattern urlPattern) { + writeTag(63, 0); + + if (!urlPattern.getPatternItems().isEmpty()) { + writeTag(33, 2); + writeInt(urlPattern.getPatternItems().size()); + + for (PatternItem patternItem : urlPattern.getPatternItems().values()) { + patternItem.accept(m_visitor); + } + } + + if (!urlPattern.getCodes().isEmpty()) { + writeTag(34, 2); + writeInt(urlPattern.getCodes().size()); + + for (Code code : urlPattern.getCodes().values()) { + code.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultNativeParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..4b74c47b64 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultNativeParser.java @@ -0,0 +1,184 @@ +package com.dianping.cat.configuration.web.url.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.configuration.web.url.IVisitor; +import com.dianping.cat.configuration.web.url.entity.Code; +import com.dianping.cat.configuration.web.url.entity.PatternItem; +import com.dianping.cat.configuration.web.url.entity.UrlPattern; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static UrlPattern parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static UrlPattern parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + UrlPattern urlPattern = new UrlPattern(); + + try { + urlPattern.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return urlPattern; + } + + @Override + public void visitCode(Code code) { + byte tag; + + while ((tag = readTag()) != -1) { + visitCodeChildren(code, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitCodeChildren(Code code, int _field, int _type) { + switch (_field) { + case 1: + code.setId(readInt()); + break; + case 2: + code.setName(readString()); + break; + case 3: + code.setStatus(readInt()); + break; + } + } + + @Override + public void visitPatternItem(PatternItem patternItem) { + byte tag; + + while ((tag = readTag()) != -1) { + visitPatternItemChildren(patternItem, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitPatternItemChildren(PatternItem patternItem, int _field, int _type) { + switch (_field) { + case 1: + patternItem.setGroup(readString()); + break; + case 2: + patternItem.setName(readString()); + break; + case 3: + patternItem.setPattern(readString()); + break; + case 4: + patternItem.setDomain(readString()); + break; + case 5: + patternItem.setId(readInt()); + break; + } + } + + @Override + public void visitUrlPattern(UrlPattern urlPattern) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitUrlPatternChildren(urlPattern, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitUrlPatternChildren(UrlPattern urlPattern, int _field, int _type) { + switch (_field) { + case 33: + if (_type == 1) { + PatternItem patternItem = new PatternItem(); + + visitPatternItem(patternItem); + m_linker.onPatternItem(urlPattern, patternItem); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + PatternItem patternItem = new PatternItem(); + + visitPatternItem(patternItem); + m_linker.onPatternItem(urlPattern, patternItem); + } + } + break; + case 34: + if (_type == 1) { + Code code = new Code(); + + visitCode(code); + m_linker.onCode(urlPattern, code); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Code code = new Code(); + + visitCode(code); + m_linker.onCode(urlPattern, code); + } + } + break; + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultSaxMaker.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..a840f4b3b1 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultSaxMaker.java @@ -0,0 +1,97 @@ +package com.dianping.cat.configuration.web.url.transform; + +import static com.dianping.cat.configuration.web.url.Constants.ATTR_DOMAIN; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_GROUP; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_ID; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_NAME; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_PATTERN; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_STATUS; + +import org.xml.sax.Attributes; + +import com.dianping.cat.configuration.web.url.entity.Code; +import com.dianping.cat.configuration.web.url.entity.PatternItem; +import com.dianping.cat.configuration.web.url.entity.UrlPattern; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Code buildCode(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String name = attributes.getValue(ATTR_NAME); + String status = attributes.getValue(ATTR_STATUS); + Code code = new Code(id == null ? null : convert(Integer.class, id, null)); + + if (name != null) { + code.setName(name); + } + + if (status != null) { + code.setStatus(convert(Integer.class, status, null)); + } + + return code; + } + + @Override + public PatternItem buildPatternItem(Attributes attributes) { + String group = attributes.getValue(ATTR_GROUP); + String name = attributes.getValue(ATTR_NAME); + String pattern = attributes.getValue(ATTR_PATTERN); + String domain = attributes.getValue(ATTR_DOMAIN); + String id = attributes.getValue(ATTR_ID); + PatternItem patternItem = new PatternItem(name); + + if (group != null) { + patternItem.setGroup(group); + } + + if (pattern != null) { + patternItem.setPattern(pattern); + } + + if (domain != null) { + patternItem.setDomain(domain); + } + + if (id != null) { + patternItem.setId(convert(Integer.class, id, 0)); + } + + return patternItem; + } + + @Override + public UrlPattern buildUrlPattern(Attributes attributes) { + UrlPattern urlPattern = new UrlPattern(); + + return urlPattern; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultSaxParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..7e0712caff --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultSaxParser.java @@ -0,0 +1,247 @@ +package com.dianping.cat.configuration.web.url.transform; + +import static com.dianping.cat.configuration.web.url.Constants.ENTITY_CODE; +import static com.dianping.cat.configuration.web.url.Constants.ENTITY_PATTERN_ITEM; +import static com.dianping.cat.configuration.web.url.Constants.ENTITY_URL_PATTERN; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.configuration.web.url.IEntity; +import com.dianping.cat.configuration.web.url.entity.Code; +import com.dianping.cat.configuration.web.url.entity.PatternItem; +import com.dianping.cat.configuration.web.url.entity.UrlPattern; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static UrlPattern parse(InputStream in) throws SAXException, IOException { + return parseEntity(UrlPattern.class, new InputSource(removeBOM(in))); + } + + public static UrlPattern parse(Reader reader) throws SAXException, IOException { + return parseEntity(UrlPattern.class, new InputSource(removeBOM(reader))); + } + + public static UrlPattern parse(String xml) throws SAXException, IOException { + return parseEntity(UrlPattern.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForCode(Code parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForPatternItem(PatternItem parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForUrlPattern(UrlPattern parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_PATTERN_ITEM.equals(qName)) { + PatternItem patternItem = m_maker.buildPatternItem(attributes); + + m_linker.onPatternItem(parentObj, patternItem); + m_objs.push(patternItem); + } else if (ENTITY_CODE.equals(qName)) { + Code code = m_maker.buildCode(attributes); + + m_linker.onCode(parentObj, code); + m_objs.push(code); + } else { + throw new SAXException(String.format("Element(%s) is not expected under url-pattern!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_URL_PATTERN.equals(qName)) { + UrlPattern urlPattern = m_maker.buildUrlPattern(attributes); + + m_entity = urlPattern; + m_objs.push(urlPattern); + m_tags.push(qName); + } else if (ENTITY_PATTERN_ITEM.equals(qName)) { + PatternItem patternItem = m_maker.buildPatternItem(attributes); + + m_entity = patternItem; + m_objs.push(patternItem); + m_tags.push(qName); + } else if (ENTITY_CODE.equals(qName)) { + Code code = m_maker.buildCode(attributes); + + m_entity = code; + m_objs.push(code); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof UrlPattern) { + parseForUrlPattern((UrlPattern) parent, tag, qName, attributes); + } else if (parent instanceof PatternItem) { + parseForPatternItem((PatternItem) parent, tag, qName, attributes); + } else if (parent instanceof Code) { + parseForCode((Code) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultXmlBuilder.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..7dff85b086 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/DefaultXmlBuilder.java @@ -0,0 +1,230 @@ +package com.dianping.cat.configuration.web.url.transform; + +import static com.dianping.cat.configuration.web.url.Constants.ATTR_DOMAIN; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_GROUP; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_ID; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_NAME; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_PATTERN; +import static com.dianping.cat.configuration.web.url.Constants.ATTR_STATUS; +import static com.dianping.cat.configuration.web.url.Constants.ENTITY_CODE; +import static com.dianping.cat.configuration.web.url.Constants.ENTITY_PATTERN_ITEM; +import static com.dianping.cat.configuration.web.url.Constants.ENTITY_URL_PATTERN; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.configuration.web.url.IEntity; +import com.dianping.cat.configuration.web.url.IVisitor; +import com.dianping.cat.configuration.web.url.entity.Code; +import com.dianping.cat.configuration.web.url.entity.PatternItem; +import com.dianping.cat.configuration.web.url.entity.UrlPattern; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitCode(Code code) { + startTag(ENTITY_CODE, true, null, ATTR_ID, code.getId(), ATTR_NAME, code.getName(), ATTR_STATUS, code.getStatus()); + } + + @Override + public void visitPatternItem(PatternItem patternItem) { + startTag(ENTITY_PATTERN_ITEM, true, null, ATTR_GROUP, patternItem.getGroup(), ATTR_NAME, patternItem.getName(), ATTR_PATTERN, patternItem.getPattern(), ATTR_DOMAIN, patternItem.getDomain(), ATTR_ID, patternItem.getId()); + } + + @Override + public void visitUrlPattern(UrlPattern urlPattern) { + startTag(ENTITY_URL_PATTERN, null); + + if (!urlPattern.getPatternItems().isEmpty()) { + for (PatternItem patternItem : urlPattern.getPatternItems().values()) { + patternItem.accept(m_visitor); + } + } + + if (!urlPattern.getCodes().isEmpty()) { + for (Code code : urlPattern.getCodes().values()) { + code.accept(m_visitor); + } + } + + endTag(ENTITY_URL_PATTERN); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/ILinker.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/ILinker.java new file mode 100644 index 0000000000..269a0634bd --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.configuration.web.url.transform; + +import com.dianping.cat.configuration.web.url.entity.Code; +import com.dianping.cat.configuration.web.url.entity.PatternItem; +import com.dianping.cat.configuration.web.url.entity.UrlPattern; + +public interface ILinker { + + public boolean onCode(UrlPattern parent, Code code); + + public boolean onPatternItem(UrlPattern parent, PatternItem patternItem); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/IMaker.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/IMaker.java new file mode 100644 index 0000000000..9f1572d139 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/IMaker.java @@ -0,0 +1,14 @@ +package com.dianping.cat.configuration.web.url.transform; + +import com.dianping.cat.configuration.web.url.entity.Code; +import com.dianping.cat.configuration.web.url.entity.PatternItem; +import com.dianping.cat.configuration.web.url.entity.UrlPattern; + +public interface IMaker { + + public Code buildCode(T node); + + public PatternItem buildPatternItem(T node); + + public UrlPattern buildUrlPattern(T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/IParser.java b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/IParser.java new file mode 100644 index 0000000000..808d237c7e --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/configuration/web/url/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.configuration.web.url.transform; + +import com.dianping.cat.configuration.web.url.entity.Code; +import com.dianping.cat.configuration.web.url.entity.PatternItem; +import com.dianping.cat.configuration.web.url.entity.UrlPattern; + +public interface IParser { + public UrlPattern parse(IMaker maker, ILinker linker, T node); + + public void parseForCode(IMaker maker, ILinker linker, Code parent, T node); + + public void parseForPatternItem(IMaker maker, ILinker linker, PatternItem parent, T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/BusinessConfig.java b/cat-core/src/main/java/com/dianping/cat/core/config/BusinessConfig.java new file mode 100644 index 0000000000..71a941b8be --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/config/BusinessConfig.java @@ -0,0 +1,90 @@ +package com.dianping.cat.core.config; + + +public class BusinessConfig { + private int m_id; + + private String m_name; + + private String m_domain; + + private String m_content; + + private java.util.Date m_updatetime; + + private int m_keyId; + public void afterLoad() { + m_keyId = m_id; + } + + public String getContent() { + return m_content; + } + + public String getDomain() { + return m_domain; + } + + public int getId() { + return m_id; + } + + public int getKeyId() { + return m_keyId; + } + + public String getName() { + return m_name; + } + + public java.util.Date getUpdatetime() { + return m_updatetime; + } + + public BusinessConfig setContent(String content) { + m_content = content; + return this; + } + + public BusinessConfig setDomain(String domain) { + m_domain = domain; + return this; + } + + public BusinessConfig setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public BusinessConfig setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public BusinessConfig setName(String name) { + m_name = name; + return this; + } + + public BusinessConfig setUpdatetime(java.util.Date updatetime) { + m_updatetime = updatetime; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("BusinessConfig["); + sb.append("content: ").append(m_content); + sb.append(", domain: ").append(m_domain); + sb.append(", id: ").append(m_id); + sb.append(", key-id: ").append(m_keyId); + sb.append(", name: ").append(m_name); + sb.append(", updatetime: ").append(m_updatetime); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/Config.java b/cat-core/src/main/java/com/dianping/cat/core/config/Config.java new file mode 100644 index 0000000000..51483a9db9 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/config/Config.java @@ -0,0 +1,90 @@ +package com.dianping.cat.core.config; + + +public class Config { + private int m_id; + + private String m_name; + + private String m_content; + + private java.util.Date m_creationDate; + + private java.util.Date m_modifyDate; + + private int m_keyId; + public void afterLoad() { + m_keyId = m_id; + } + + public String getContent() { + return m_content; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public int getId() { + return m_id; + } + + public int getKeyId() { + return m_keyId; + } + + public java.util.Date getModifyDate() { + return m_modifyDate; + } + + public String getName() { + return m_name; + } + + public Config setContent(String content) { + m_content = content; + return this; + } + + public Config setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public Config setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public Config setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public Config setModifyDate(java.util.Date modifyDate) { + m_modifyDate = modifyDate; + return this; + } + + public Config setName(String name) { + m_name = name; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("Config["); + sb.append("content: ").append(m_content); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", id: ").append(m_id); + sb.append(", key-id: ").append(m_keyId); + sb.append(", modify-date: ").append(m_modifyDate); + sb.append(", name: ").append(m_name); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java index 8a6b0d01dd..90f042ef0f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java @@ -7,9 +7,8 @@ import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.dao.ConfigMapper; @@ -28,31 +27,31 @@ public Config createLocal() { return new Config(); } - public int deleteByPK(Config proto) throws DalException { + public int deleteByPK(Config proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().deleteById(proto.getKeyId())); } - public List findAllConfig(Object readset) throws DalException { + public List findAllConfig() { ConfigMapper mapper = springMapper(); return mapper.queryAll().stream().map(this::toConfig).collect(Collectors.toList()); } - public Config findByName(String name, Object readset) throws DalException { + public Config findByName(String name) { ConfigMapper mapper = springMapper(); return requireFound(mapper.findByName(name), "name", name); } - public Config findByPK(int keyId, Object readset) throws DalException { + public Config findByPK(int keyId) { ConfigMapper mapper = springMapper(); return requireFound(mapper.findById(keyId), "id", String.valueOf(keyId)); } - public int insert(Config proto) throws DalException { + public int insert(Config proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); ConfigDO config = toConfigDO(proto); @@ -63,7 +62,7 @@ public int insert(Config proto) throws DalException { return count; } - public int updateByPK(Config proto, Object updateset) throws DalException { + public int updateByPK(Config proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateById(toConfigDO(proto))); @@ -98,9 +97,9 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private Config requireFound(ConfigDO config, String field, String value) throws DalNotFoundException { + private Config requireFound(ConfigDO config, String field, String value) { if (config == null) { - throw new DalNotFoundException(String.format("No config found by %s(%s).", field, value)); + throw new EmptyResultDataAccessException(String.format("No config found by %s(%s).", field, value), 1); } return toConfig(config); diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReport.java b/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReport.java new file mode 100644 index 0000000000..cd0e8e81f2 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReport.java @@ -0,0 +1,162 @@ +package com.dianping.cat.core.dal; + + +public class DailyReport { + private int m_id; + + private String m_name; + + private String m_ip; + + private String m_domain; + + private java.util.Date m_period; + + private int m_type; + + private java.util.Date m_creationDate; + + private int m_keyId; + + private int m_count; + + private java.util.Date m_startDate; + + private java.util.Date m_endDate; + + private int m_limits; + public void afterLoad() { + m_keyId = m_id; + } + + public int getCount() { + return m_count; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public String getDomain() { + return m_domain; + } + + public java.util.Date getEndDate() { + return m_endDate; + } + + public int getId() { + return m_id; + } + + public String getIp() { + return m_ip; + } + + public int getKeyId() { + return m_keyId; + } + + public int getLimits() { + return m_limits; + } + + public String getName() { + return m_name; + } + + public java.util.Date getPeriod() { + return m_period; + } + + public java.util.Date getStartDate() { + return m_startDate; + } + + public int getType() { + return m_type; + } + + public DailyReport setCount(int count) { + m_count = count; + return this; + } + + public DailyReport setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public DailyReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public DailyReport setEndDate(java.util.Date endDate) { + m_endDate = endDate; + return this; + } + + public DailyReport setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public DailyReport setIp(String ip) { + m_ip = ip; + return this; + } + + public DailyReport setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public DailyReport setLimits(int limits) { + m_limits = limits; + return this; + } + + public DailyReport setName(String name) { + m_name = name; + return this; + } + + public DailyReport setPeriod(java.util.Date period) { + m_period = period; + return this; + } + + public DailyReport setStartDate(java.util.Date startDate) { + m_startDate = startDate; + return this; + } + + public DailyReport setType(int type) { + m_type = type; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("DailyReport["); + sb.append("count: ").append(m_count); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", domain: ").append(m_domain); + sb.append(", end-date: ").append(m_endDate); + sb.append(", id: ").append(m_id); + sb.append(", ip: ").append(m_ip); + sb.append(", key-id: ").append(m_keyId); + sb.append(", limits: ").append(m_limits); + sb.append(", name: ").append(m_name); + sb.append(", period: ").append(m_period); + sb.append(", start-date: ").append(m_startDate); + sb.append(", type: ").append(m_type); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReportContent.java b/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReportContent.java new file mode 100644 index 0000000000..c213bad926 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReportContent.java @@ -0,0 +1,114 @@ +package com.dianping.cat.core.dal; + + +public class DailyReportContent { + private int m_reportId; + + private byte[] m_content; + + private java.util.Date m_creationDate; + + private int m_keyReportId; + + private double m_contentLength; + + private int m_startId; + + private int m_endId; + + private double m_capacity; + public void afterLoad() { + m_keyReportId = m_reportId; + } + + public double getCapacity() { + return m_capacity; + } + + public byte[] getContent() { + return m_content; + } + + public double getContentLength() { + return m_contentLength; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public int getEndId() { + return m_endId; + } + + public int getKeyReportId() { + return m_keyReportId; + } + + public int getReportId() { + return m_reportId; + } + + public int getStartId() { + return m_startId; + } + + public DailyReportContent setCapacity(double capacity) { + m_capacity = capacity; + return this; + } + + public DailyReportContent setContent(byte[] content) { + m_content = content; + return this; + } + + public DailyReportContent setContentLength(double contentLength) { + m_contentLength = contentLength; + return this; + } + + public DailyReportContent setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public DailyReportContent setEndId(int endId) { + m_endId = endId; + return this; + } + + public DailyReportContent setKeyReportId(int keyReportId) { + m_keyReportId = keyReportId; + return this; + } + + public DailyReportContent setReportId(int reportId) { + m_reportId = reportId; + m_keyReportId = reportId; + return this; + } + + public DailyReportContent setStartId(int startId) { + m_startId = startId; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("DailyReportContent["); + sb.append("capacity: ").append(m_capacity); + sb.append(", content: ").append(m_content == null ? null : java.util.Arrays.asList(m_content)); + sb.append(", content-length: ").append(m_contentLength); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", end-id: ").append(m_endId); + sb.append(", key-report-id: ").append(m_keyReportId); + sb.append(", report-id: ").append(m_reportId); + sb.append(", start-id: ").append(m_startId); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/Hostinfo.java b/cat-core/src/main/java/com/dianping/cat/core/dal/Hostinfo.java new file mode 100644 index 0000000000..aa6faa2ca5 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/Hostinfo.java @@ -0,0 +1,102 @@ +package com.dianping.cat.core.dal; + + +public class Hostinfo { + private int m_id; + + private String m_ip; + + private String m_domain; + + private String m_hostname; + + private java.util.Date m_creationDate; + + private java.util.Date m_lastModifiedDate; + + private int m_keyId; + public void afterLoad() { + m_keyId = m_id; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public String getDomain() { + return m_domain; + } + + public String getHostname() { + return m_hostname; + } + + public int getId() { + return m_id; + } + + public String getIp() { + return m_ip; + } + + public int getKeyId() { + return m_keyId; + } + + public java.util.Date getLastModifiedDate() { + return m_lastModifiedDate; + } + + public Hostinfo setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public Hostinfo setDomain(String domain) { + m_domain = domain; + return this; + } + + public Hostinfo setHostname(String hostname) { + m_hostname = hostname; + return this; + } + + public Hostinfo setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public Hostinfo setIp(String ip) { + m_ip = ip; + return this; + } + + public Hostinfo setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public Hostinfo setLastModifiedDate(java.util.Date lastModifiedDate) { + m_lastModifiedDate = lastModifiedDate; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("Hostinfo["); + sb.append("creation-date: ").append(m_creationDate); + sb.append(", domain: ").append(m_domain); + sb.append(", hostname: ").append(m_hostname); + sb.append(", id: ").append(m_id); + sb.append(", ip: ").append(m_ip); + sb.append(", key-id: ").append(m_keyId); + sb.append(", last-modified-date: ").append(m_lastModifiedDate); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReport.java b/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReport.java new file mode 100644 index 0000000000..f9b67a6d90 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReport.java @@ -0,0 +1,138 @@ +package com.dianping.cat.core.dal; + + +public class HourlyReport { + private int m_id; + + private int m_type; + + private String m_name; + + private String m_ip; + + private String m_domain; + + private java.util.Date m_period; + + private java.util.Date m_creationDate; + + private int m_keyId; + + private java.util.Date m_startDate; + + private java.util.Date m_endDate; + public void afterLoad() { + m_keyId = m_id; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public String getDomain() { + return m_domain; + } + + public java.util.Date getEndDate() { + return m_endDate; + } + + public int getId() { + return m_id; + } + + public String getIp() { + return m_ip; + } + + public int getKeyId() { + return m_keyId; + } + + public String getName() { + return m_name; + } + + public java.util.Date getPeriod() { + return m_period; + } + + public java.util.Date getStartDate() { + return m_startDate; + } + + public int getType() { + return m_type; + } + + public HourlyReport setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public HourlyReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public HourlyReport setEndDate(java.util.Date endDate) { + m_endDate = endDate; + return this; + } + + public HourlyReport setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public HourlyReport setIp(String ip) { + m_ip = ip; + return this; + } + + public HourlyReport setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public HourlyReport setName(String name) { + m_name = name; + return this; + } + + public HourlyReport setPeriod(java.util.Date period) { + m_period = period; + return this; + } + + public HourlyReport setStartDate(java.util.Date startDate) { + m_startDate = startDate; + return this; + } + + public HourlyReport setType(int type) { + m_type = type; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("HourlyReport["); + sb.append("creation-date: ").append(m_creationDate); + sb.append(", domain: ").append(m_domain); + sb.append(", end-date: ").append(m_endDate); + sb.append(", id: ").append(m_id); + sb.append(", ip: ").append(m_ip); + sb.append(", key-id: ").append(m_keyId); + sb.append(", name: ").append(m_name); + sb.append(", period: ").append(m_period); + sb.append(", start-date: ").append(m_startDate); + sb.append(", type: ").append(m_type); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReportContent.java b/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReportContent.java new file mode 100644 index 0000000000..12f04b1b73 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReportContent.java @@ -0,0 +1,114 @@ +package com.dianping.cat.core.dal; + + +public class HourlyReportContent { + private int m_reportId; + + private byte[] m_content; + + private java.util.Date m_period; + + private java.util.Date m_creationDate; + + private int m_keyReportId; + + private long m_contentLength; + + private int m_startId; + + private double m_capacity; + public void afterLoad() { + m_keyReportId = m_reportId; + } + + public double getCapacity() { + return m_capacity; + } + + public byte[] getContent() { + return m_content; + } + + public long getContentLength() { + return m_contentLength; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public int getKeyReportId() { + return m_keyReportId; + } + + public java.util.Date getPeriod() { + return m_period; + } + + public int getReportId() { + return m_reportId; + } + + public int getStartId() { + return m_startId; + } + + public HourlyReportContent setCapacity(double capacity) { + m_capacity = capacity; + return this; + } + + public HourlyReportContent setContent(byte[] content) { + m_content = content; + return this; + } + + public HourlyReportContent setContentLength(long contentLength) { + m_contentLength = contentLength; + return this; + } + + public HourlyReportContent setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public HourlyReportContent setKeyReportId(int keyReportId) { + m_keyReportId = keyReportId; + return this; + } + + public HourlyReportContent setPeriod(java.util.Date period) { + m_period = period; + return this; + } + + public HourlyReportContent setReportId(int reportId) { + m_reportId = reportId; + m_keyReportId = reportId; + return this; + } + + public HourlyReportContent setStartId(int startId) { + m_startId = startId; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("HourlyReportContent["); + sb.append("capacity: ").append(m_capacity); + sb.append(", content: ").append(m_content == null ? null : java.util.Arrays.asList(m_content)); + sb.append(", content-length: ").append(m_contentLength); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", key-report-id: ").append(m_keyReportId); + sb.append(", period: ").append(m_period); + sb.append(", report-id: ").append(m_reportId); + sb.append(", start-id: ").append(m_startId); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReport.java b/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReport.java new file mode 100644 index 0000000000..74af07fd24 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReport.java @@ -0,0 +1,114 @@ +package com.dianping.cat.core.dal; + + +public class MonthlyReport { + private int m_id; + + private String m_name; + + private String m_ip; + + private String m_domain; + + private java.util.Date m_period; + + private int m_type; + + private java.util.Date m_creationDate; + + private int m_keyId; + public void afterLoad() { + m_keyId = m_id; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public String getDomain() { + return m_domain; + } + + public int getId() { + return m_id; + } + + public String getIp() { + return m_ip; + } + + public int getKeyId() { + return m_keyId; + } + + public String getName() { + return m_name; + } + + public java.util.Date getPeriod() { + return m_period; + } + + public int getType() { + return m_type; + } + + public MonthlyReport setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public MonthlyReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public MonthlyReport setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public MonthlyReport setIp(String ip) { + m_ip = ip; + return this; + } + + public MonthlyReport setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public MonthlyReport setName(String name) { + m_name = name; + return this; + } + + public MonthlyReport setPeriod(java.util.Date period) { + m_period = period; + return this; + } + + public MonthlyReport setType(int type) { + m_type = type; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("MonthlyReport["); + sb.append("creation-date: ").append(m_creationDate); + sb.append(", domain: ").append(m_domain); + sb.append(", id: ").append(m_id); + sb.append(", ip: ").append(m_ip); + sb.append(", key-id: ").append(m_keyId); + sb.append(", name: ").append(m_name); + sb.append(", period: ").append(m_period); + sb.append(", type: ").append(m_type); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReportContent.java b/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReportContent.java new file mode 100644 index 0000000000..ebf86b94d1 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReportContent.java @@ -0,0 +1,102 @@ +package com.dianping.cat.core.dal; + + +public class MonthlyReportContent { + private int m_reportId; + + private byte[] m_content; + + private java.util.Date m_creationDate; + + private int m_keyReportId; + + private double m_contentLength; + + private double m_capacity; + + private int m_startId; + public void afterLoad() { + m_keyReportId = m_reportId; + } + + public double getCapacity() { + return m_capacity; + } + + public byte[] getContent() { + return m_content; + } + + public double getContentLength() { + return m_contentLength; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public int getKeyReportId() { + return m_keyReportId; + } + + public int getReportId() { + return m_reportId; + } + + public int getStartId() { + return m_startId; + } + + public MonthlyReportContent setCapacity(double capacity) { + m_capacity = capacity; + return this; + } + + public MonthlyReportContent setContent(byte[] content) { + m_content = content; + return this; + } + + public MonthlyReportContent setContentLength(double contentLength) { + m_contentLength = contentLength; + return this; + } + + public MonthlyReportContent setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public MonthlyReportContent setKeyReportId(int keyReportId) { + m_keyReportId = keyReportId; + return this; + } + + public MonthlyReportContent setReportId(int reportId) { + m_reportId = reportId; + m_keyReportId = reportId; + return this; + } + + public MonthlyReportContent setStartId(int startId) { + m_startId = startId; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("MonthlyReportContent["); + sb.append("capacity: ").append(m_capacity); + sb.append(", content: ").append(m_content == null ? null : java.util.Arrays.asList(m_content)); + sb.append(", content-length: ").append(m_contentLength); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", key-report-id: ").append(m_keyReportId); + sb.append(", report-id: ").append(m_reportId); + sb.append(", start-id: ").append(m_startId); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/Project.java b/cat-core/src/main/java/com/dianping/cat/core/dal/Project.java new file mode 100644 index 0000000000..cf77e10d6c --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/Project.java @@ -0,0 +1,162 @@ +package com.dianping.cat.core.dal; + + +public class Project { + private int m_id; + + private String m_domain; + + private String m_cmdbDomain; + + private int m_level; + + private String m_bu; + + private String m_cmdbProductline; + + private String m_owner; + + private String m_email; + + private String m_phone; + + private java.util.Date m_creationDate; + + private java.util.Date m_modifyDate; + + private int m_keyId; + public void afterLoad() { + m_keyId = m_id; + } + + public String getBu() { + return m_bu; + } + + public String getCmdbDomain() { + return m_cmdbDomain; + } + + public String getCmdbProductline() { + return m_cmdbProductline; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public String getDomain() { + return m_domain; + } + + public String getEmail() { + return m_email; + } + + public int getId() { + return m_id; + } + + public int getKeyId() { + return m_keyId; + } + + public int getLevel() { + return m_level; + } + + public java.util.Date getModifyDate() { + return m_modifyDate; + } + + public String getOwner() { + return m_owner; + } + + public String getPhone() { + return m_phone; + } + + public Project setBu(String bu) { + m_bu = bu; + return this; + } + + public Project setCmdbDomain(String cmdbDomain) { + m_cmdbDomain = cmdbDomain; + return this; + } + + public Project setCmdbProductline(String cmdbProductline) { + m_cmdbProductline = cmdbProductline; + return this; + } + + public Project setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public Project setDomain(String domain) { + m_domain = domain; + return this; + } + + public Project setEmail(String email) { + m_email = email; + return this; + } + + public Project setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public Project setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public Project setLevel(int level) { + m_level = level; + return this; + } + + public Project setModifyDate(java.util.Date modifyDate) { + m_modifyDate = modifyDate; + return this; + } + + public Project setOwner(String owner) { + m_owner = owner; + return this; + } + + public Project setPhone(String phone) { + m_phone = phone; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("Project["); + sb.append("bu: ").append(m_bu); + sb.append(", cmdb-domain: ").append(m_cmdbDomain); + sb.append(", cmdb-productline: ").append(m_cmdbProductline); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", domain: ").append(m_domain); + sb.append(", email: ").append(m_email); + sb.append(", id: ").append(m_id); + sb.append(", key-id: ").append(m_keyId); + sb.append(", level: ").append(m_level); + sb.append(", modify-date: ").append(m_modifyDate); + sb.append(", owner: ").append(m_owner); + sb.append(", phone: ").append(m_phone); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/Task.java b/cat-core/src/main/java/com/dianping/cat/core/dal/Task.java new file mode 100644 index 0000000000..ae0581f8a9 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/Task.java @@ -0,0 +1,210 @@ +package com.dianping.cat.core.dal; + + +public class Task { + private int m_id; + + private String m_producer; + + private String m_consumer; + + private int m_failureCount; + + private String m_reportName; + + private String m_reportDomain; + + private java.util.Date m_reportPeriod; + + private int m_status; + + private int m_taskType; + + private java.util.Date m_creationDate; + + private java.util.Date m_startDate; + + private java.util.Date m_endDate; + + private int m_keyId; + + private int m_count; + + private int m_startLimit; + + private int m_endLimit; + public void afterLoad() { + m_keyId = m_id; + } + + public String getConsumer() { + return m_consumer; + } + + public int getCount() { + return m_count; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public java.util.Date getEndDate() { + return m_endDate; + } + + public int getEndLimit() { + return m_endLimit; + } + + public int getFailureCount() { + return m_failureCount; + } + + public int getId() { + return m_id; + } + + public int getKeyId() { + return m_keyId; + } + + public String getProducer() { + return m_producer; + } + + public String getReportDomain() { + return m_reportDomain; + } + + public String getReportName() { + return m_reportName; + } + + public java.util.Date getReportPeriod() { + return m_reportPeriod; + } + + public java.util.Date getStartDate() { + return m_startDate; + } + + public int getStartLimit() { + return m_startLimit; + } + + public int getStatus() { + return m_status; + } + + public int getTaskType() { + return m_taskType; + } + + public Task setConsumer(String consumer) { + m_consumer = consumer; + return this; + } + + public Task setCount(int count) { + m_count = count; + return this; + } + + public Task setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public Task setEndDate(java.util.Date endDate) { + m_endDate = endDate; + return this; + } + + public Task setEndLimit(int endLimit) { + m_endLimit = endLimit; + return this; + } + + public Task setFailureCount(int failureCount) { + m_failureCount = failureCount; + return this; + } + + public Task setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public Task setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public Task setProducer(String producer) { + m_producer = producer; + return this; + } + + public Task setReportDomain(String reportDomain) { + m_reportDomain = reportDomain; + return this; + } + + public Task setReportName(String reportName) { + m_reportName = reportName; + return this; + } + + public Task setReportPeriod(java.util.Date reportPeriod) { + m_reportPeriod = reportPeriod; + return this; + } + + public Task setStartDate(java.util.Date startDate) { + m_startDate = startDate; + return this; + } + + public Task setStartLimit(int startLimit) { + m_startLimit = startLimit; + return this; + } + + public Task setStatus(int status) { + m_status = status; + return this; + } + + public Task setTaskType(int taskType) { + m_taskType = taskType; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("Task["); + sb.append("consumer: ").append(m_consumer); + sb.append(", count: ").append(m_count); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", end-date: ").append(m_endDate); + sb.append(", end-limit: ").append(m_endLimit); + sb.append(", failure-count: ").append(m_failureCount); + sb.append(", id: ").append(m_id); + sb.append(", key-id: ").append(m_keyId); + sb.append(", producer: ").append(m_producer); + sb.append(", report-domain: ").append(m_reportDomain); + sb.append(", report-name: ").append(m_reportName); + sb.append(", report-period: ").append(m_reportPeriod); + sb.append(", start-date: ").append(m_startDate); + sb.append(", start-limit: ").append(m_startLimit); + sb.append(", status: ").append(m_status); + sb.append(", task-type: ").append(m_taskType); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReport.java b/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReport.java new file mode 100644 index 0000000000..8b5abac830 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReport.java @@ -0,0 +1,114 @@ +package com.dianping.cat.core.dal; + + +public class WeeklyReport { + private int m_id; + + private String m_name; + + private String m_ip; + + private String m_domain; + + private java.util.Date m_period; + + private int m_type; + + private java.util.Date m_creationDate; + + private int m_keyId; + public void afterLoad() { + m_keyId = m_id; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public String getDomain() { + return m_domain; + } + + public int getId() { + return m_id; + } + + public String getIp() { + return m_ip; + } + + public int getKeyId() { + return m_keyId; + } + + public String getName() { + return m_name; + } + + public java.util.Date getPeriod() { + return m_period; + } + + public int getType() { + return m_type; + } + + public WeeklyReport setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public WeeklyReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public WeeklyReport setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public WeeklyReport setIp(String ip) { + m_ip = ip; + return this; + } + + public WeeklyReport setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public WeeklyReport setName(String name) { + m_name = name; + return this; + } + + public WeeklyReport setPeriod(java.util.Date period) { + m_period = period; + return this; + } + + public WeeklyReport setType(int type) { + m_type = type; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("WeeklyReport["); + sb.append("creation-date: ").append(m_creationDate); + sb.append(", domain: ").append(m_domain); + sb.append(", id: ").append(m_id); + sb.append(", ip: ").append(m_ip); + sb.append(", key-id: ").append(m_keyId); + sb.append(", name: ").append(m_name); + sb.append(", period: ").append(m_period); + sb.append(", type: ").append(m_type); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReportContent.java b/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReportContent.java new file mode 100644 index 0000000000..af21f923e6 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReportContent.java @@ -0,0 +1,102 @@ +package com.dianping.cat.core.dal; + + +public class WeeklyReportContent { + private int m_reportId; + + private byte[] m_content; + + private java.util.Date m_creationDate; + + private int m_keyReportId; + + private double m_contentLength; + + private double m_capacity; + + private int m_startId; + public void afterLoad() { + m_keyReportId = m_reportId; + } + + public double getCapacity() { + return m_capacity; + } + + public byte[] getContent() { + return m_content; + } + + public double getContentLength() { + return m_contentLength; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public int getKeyReportId() { + return m_keyReportId; + } + + public int getReportId() { + return m_reportId; + } + + public int getStartId() { + return m_startId; + } + + public WeeklyReportContent setCapacity(double capacity) { + m_capacity = capacity; + return this; + } + + public WeeklyReportContent setContent(byte[] content) { + m_content = content; + return this; + } + + public WeeklyReportContent setContentLength(double contentLength) { + m_contentLength = contentLength; + return this; + } + + public WeeklyReportContent setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public WeeklyReportContent setKeyReportId(int keyReportId) { + m_keyReportId = keyReportId; + return this; + } + + public WeeklyReportContent setReportId(int reportId) { + m_reportId = reportId; + m_keyReportId = reportId; + return this; + } + + public WeeklyReportContent setStartId(int startId) { + m_startId = startId; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("WeeklyReportContent["); + sb.append("capacity: ").append(m_capacity); + sb.append(", content: ").append(m_content == null ? null : java.util.Arrays.asList(m_content)); + sb.append(", content-length: ").append(m_contentLength); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", key-report-id: ").append(m_keyReportId); + sb.append(", report-id: ").append(m_reportId); + sb.append(", start-id: ").append(m_startId); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalException.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalException.java deleted file mode 100644 index c12ceec06f..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalException.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dianping.cat.core.dal.jdbc; - -public class DalException extends Exception { - private static final long serialVersionUID = 1L; - - public DalException(String message) { - super(message); - } - - public DalException(String message, Throwable cause) { - super(message, cause); - } - - public DalException(Throwable cause) { - super(cause); - } -} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalNotFoundException.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalNotFoundException.java deleted file mode 100644 index 3a8c1c9110..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DalNotFoundException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dianping.cat.core.dal.jdbc; - -public class DalNotFoundException extends DalException { - private static final long serialVersionUID = 1L; - - public DalNotFoundException(String message) { - super(message); - } - - public DalNotFoundException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataField.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataField.java deleted file mode 100644 index ebd1abb1e3..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataField.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.dianping.cat.core.dal.jdbc; - -public class DataField { - private Class m_entityClass; - - private int m_index; - - private final String m_name; - - public DataField(String name) { - m_name = name; - } - - public Class getEntityClass() { - return m_entityClass; - } - - public int getIndex() { - return m_index; - } - - public String getName() { - return m_name; - } - - public void setEntityClass(Class entityClass) { - m_entityClass = entityClass; - } - - public void setIndex(int index) { - m_index = index; - } - - @Override - public String toString() { - return m_name; - } -} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataObject.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataObject.java deleted file mode 100644 index fa79ccb6c6..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/DataObject.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.dianping.cat.core.dal.jdbc; - -import java.util.HashMap; -import java.util.Map; - -public abstract class DataObject { - private Map m_queryHints; - - private final Map m_usedFields = new HashMap<>(); - - public void afterLoad() { - } - - public void beforeSave() { - } - - protected void clearUsage() { - m_usedFields.clear(); - } - - public Map getQueryHints() { - if (m_queryHints == null) { - m_queryHints = new HashMap<>(); - } - return m_queryHints; - } - - public boolean isFieldUsed(DataField field) { - return Boolean.TRUE.equals(m_usedFields.get(field)); - } - - protected void setFieldUsed(DataField field, boolean used) { - m_usedFields.put(field, used); - } - - public void setQueryHint(String name, Object value) { - getQueryHints().put(name, value); - } -} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryDef.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryDef.java deleted file mode 100644 index 94dfd5778c..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryDef.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.dianping.cat.core.dal.jdbc; - -public class QueryDef { - private final Class m_entityClass; - - private final String m_name; - - private final boolean m_raw; - - private final String m_statement; - - private final QueryType m_type; - - public QueryDef(String name, Class entityClass, QueryType type, String statement) { - this(name, entityClass, type, statement, false); - } - - public QueryDef(String name, Class entityClass, QueryType type, String statement, boolean raw) { - m_name = name; - m_entityClass = entityClass; - m_type = type; - m_statement = statement; - m_raw = raw; - } - - public Class getEntityClass() { - return m_entityClass; - } - - public String getName() { - return m_name; - } - - public QueryType getType() { - return m_type; - } - - public boolean isRaw() { - return m_raw; - } - - public boolean isStoreProcedure() { - return false; - } - - @Override - public String toString() { - return m_statement; - } -} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryType.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryType.java deleted file mode 100644 index a6e1c18c62..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/QueryType.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dianping.cat.core.dal.jdbc; - -public enum QueryType { - SELECT, - INSERT, - UPDATE, - DELETE -} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Readset.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Readset.java deleted file mode 100644 index 21c69d6c8c..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Readset.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.dianping.cat.core.dal.jdbc; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class Readset { - private final List> m_children; - - private final List m_fields; - - @SafeVarargs - public Readset(Readset... children) { - m_children = Collections.unmodifiableList(Arrays.asList(children)); - m_fields = Collections.emptyList(); - } - - public Readset(DataField... fields) { - m_children = Collections.emptyList(); - m_fields = Collections.unmodifiableList(Arrays.asList(fields)); - } - - public List> getChildren() { - return m_children; - } - - public List getFields() { - return m_fields; - } -} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Updateset.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Updateset.java deleted file mode 100644 index c352277770..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/Updateset.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dianping.cat.core.dal.jdbc; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class Updateset { - private final List m_fields; - - public Updateset(DataField... fields) { - m_fields = Collections.unmodifiableList(Arrays.asList(fields)); - } - - public List getFields() { - return m_fields; - } -} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Attribute.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Attribute.java deleted file mode 100644 index 61a1dda514..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Attribute.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dianping.cat.core.dal.jdbc.annotation; - -public @interface Attribute { - boolean autoIncrement() default false; - - String field(); - - String insertExpr() default ""; - - boolean nullable() default true; - - boolean primaryKey() default false; - - String selectExpr() default ""; - - String updateExpr() default ""; -} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Entity.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Entity.java deleted file mode 100644 index cf59a53813..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Entity.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.dianping.cat.core.dal.jdbc.annotation; - -public @interface Entity { - String alias(); - - String logicalName(); - - String physicalName(); -} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Variable.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Variable.java deleted file mode 100644 index d89382f043..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/annotation/Variable.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.dianping.cat.core.dal.jdbc.annotation; - -public @interface Variable { - int scale() default 0; - - int sqlType() default 0; -} diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java index 846c7b612e..dc883a0975 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java @@ -7,9 +7,8 @@ import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.config.BusinessConfig; import com.dianping.cat.core.mybatis.generated.business.config.dao.BusinessConfigMapper; @@ -28,13 +27,13 @@ public BusinessConfig createLocal() { return new BusinessConfig(); } - public int deleteByPK(BusinessConfig proto) throws DalException { + public int deleteByPK(BusinessConfig proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } - public List findByName(String name, Object readset) throws DalException { + public List findByName(String name) { BusinessConfigMapper mapper = springMapper(); BusinessConfigDO record = new BusinessConfigDO(); @@ -42,14 +41,13 @@ public List findByName(String name, Object readset) throws DalEx return mapper.findByName(record).stream().map(this::toModel).collect(Collectors.toList()); } - public BusinessConfig findByPK(int keyId, Object readset) throws DalException { + public BusinessConfig findByPK(int keyId) { BusinessConfigMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } - public BusinessConfig findByNameDomain(String name, String domain, Object readset) - throws DalException { + public BusinessConfig findByNameDomain(String name, String domain) { BusinessConfigMapper mapper = springMapper(); BusinessConfigDO record = new BusinessConfigDO(); @@ -60,7 +58,7 @@ public BusinessConfig findByNameDomain(String name, String domain, Object readse return requireFound(result, "findByNameDomain", record.toString()); } - public int insert(BusinessConfig proto) throws DalException { + public int insert(BusinessConfig proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); BusinessConfigDO record = toRecord(proto); @@ -71,13 +69,13 @@ public int insert(BusinessConfig proto) throws DalException { return count; } - public int updateByPK(BusinessConfig proto, Object updateset) throws DalException { + public int updateByPK(BusinessConfig proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } - public int updateBaseConfigByDomain(BusinessConfig proto, Object updateset) throws DalException { + public int updateBaseConfigByDomain(BusinessConfig proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateBaseConfigByDomain(toRecord(proto))); @@ -109,9 +107,9 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private BusinessConfig requireFound(BusinessConfigDO record, String field, String value) throws DalNotFoundException { + private BusinessConfig requireFound(BusinessConfigDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No BusinessConfig found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No BusinessConfig found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java index 1e2e817654..8e1b3594f8 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java @@ -7,9 +7,8 @@ import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.DailyReportContent; import com.dianping.cat.core.mybatis.generated.daily.report.content.dao.DailyReportContentMapper; @@ -28,18 +27,17 @@ public DailyReportContent createLocal() { return new DailyReportContent(); } - public int deleteByPK(DailyReportContent proto) throws DalException { + public int deleteByPK(DailyReportContent proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyReportId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for DailyReportContent.", e); + throw new IllegalStateException("Error when executing deleteByPK for DailyReportContent.", e); } } - public List findOverloadReport(int startId, Object readset) - throws DalException { + public List findOverloadReport(int startId) { DailyReportContentMapper mapper = springMapper(); DailyReportContentDO record = new DailyReportContentDO(); @@ -47,39 +45,39 @@ public List findOverloadReport(int startId, Object readset) try { return mapper.findOverloadReport(record).stream().map(this::toModel).collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing findOverloadReport for DailyReportContent.", e); + throw new IllegalStateException("Error when executing findOverloadReport for DailyReportContent.", e); } } - public DailyReportContent findByPK(int keyReportId, Object readset) throws DalException { + public DailyReportContent findByPK(int keyReportId) { DailyReportContentMapper mapper = springMapper(); try { return requireFound(mapper.findByPrimaryKey(keyReportId), "primary key", String.valueOf(keyReportId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for DailyReportContent.", e); + throw new IllegalStateException("Error when executing findByPK for DailyReportContent.", e); } } - public int insert(DailyReportContent proto) throws DalException { + public int insert(DailyReportContent proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper().insert(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing insert for DailyReportContent.", e); + throw new IllegalStateException("Error when executing insert for DailyReportContent.", e); } } - public int updateByPK(DailyReportContent proto, Object updateset) throws DalException { + public int updateByPK(DailyReportContent proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for DailyReportContent.", e); + throw new IllegalStateException("Error when executing updateByPK for DailyReportContent.", e); } } @@ -108,10 +106,9 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private DailyReportContent requireFound(DailyReportContentDO record, String field, String value) - throws DalNotFoundException { + private DailyReportContent requireFound(DailyReportContentDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No DailyReportContent found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No DailyReportContent found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java index 3a496e9c51..6e7fb9526e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java @@ -7,9 +7,8 @@ import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.Hostinfo; import com.dianping.cat.core.mybatis.generated.hostinfo.dao.HostinfoMapper; @@ -28,13 +27,13 @@ public Hostinfo createLocal() { return new Hostinfo(); } - public int deleteByPK(Hostinfo proto) throws DalException { + public int deleteByPK(Hostinfo proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } - public List findAllIp(Object readset) throws DalException { + public List findAllIp() { HostinfoMapper mapper = springMapper(); HostinfoDO record = new HostinfoDO(); @@ -42,13 +41,13 @@ public List findAllIp(Object readset) throws DalException { return mapper.findAllIp(record).stream().map(this::toModel).collect(Collectors.toList()); } - public Hostinfo findByPK(int keyId, Object readset) throws DalException { + public Hostinfo findByPK(int keyId) { HostinfoMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } - public Hostinfo findByIp(String ip, Object readset) throws DalException { + public Hostinfo findByIp(String ip) { HostinfoMapper mapper = springMapper(); HostinfoDO record = new HostinfoDO(); @@ -58,7 +57,7 @@ public Hostinfo findByIp(String ip, Object readset) throws DalException { return requireFound(result, "findByIp", record.toString()); } - public int insert(Hostinfo proto) throws DalException { + public int insert(Hostinfo proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); HostinfoDO record = toRecord(proto); @@ -69,7 +68,7 @@ public int insert(Hostinfo proto) throws DalException { return count; } - public int updateByPK(Hostinfo proto, Object updateset) throws DalException { + public int updateByPK(Hostinfo proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); @@ -104,9 +103,9 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private Hostinfo requireFound(HostinfoDO record, String field, String value) throws DalNotFoundException { + private Hostinfo requireFound(HostinfoDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No Hostinfo found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No Hostinfo found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java index b2376e7d89..bf72ae498b 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java @@ -7,9 +7,8 @@ import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.HourlyReportContent; import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.HourlyReportContentMapper; @@ -28,18 +27,17 @@ public HourlyReportContent createLocal() { return new HourlyReportContent(); } - public int deleteByPK(HourlyReportContent proto) throws DalException { + public int deleteByPK(HourlyReportContent proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyReportId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for HourlyReportContent.", e); + throw new IllegalStateException("Error when executing deleteByPK for HourlyReportContent.", e); } } - public List findOverloadReport(int startId, Object readset) - throws DalException { + public List findOverloadReport(int startId) { HourlyReportContentMapper mapper = springMapper(); HourlyReportContentDO record = new HourlyReportContentDO(); @@ -47,40 +45,39 @@ public List findOverloadReport(int startId, Object readset) try { return mapper.findOverloadReport(record).stream().map(this::toModel).collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing findOverloadReport for HourlyReportContent.", e); + throw new IllegalStateException("Error when executing findOverloadReport for HourlyReportContent.", e); } } - public HourlyReportContent findByPK(int keyReportId, java.util.Date period, Object readset) - throws DalException { + public HourlyReportContent findByPK(int keyReportId, java.util.Date period) { HourlyReportContentMapper mapper = springMapper(); try { return requireFound(mapper.findByPrimaryKey(keyReportId), "primary key", String.valueOf(keyReportId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for HourlyReportContent.", e); + throw new IllegalStateException("Error when executing findByPK for HourlyReportContent.", e); } } - public int insert(HourlyReportContent proto) throws DalException { + public int insert(HourlyReportContent proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper().insert(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing insert for HourlyReportContent.", e); + throw new IllegalStateException("Error when executing insert for HourlyReportContent.", e); } } - public int updateByPK(HourlyReportContent proto, Object updateset) throws DalException { + public int updateByPK(HourlyReportContent proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for HourlyReportContent.", e); + throw new IllegalStateException("Error when executing updateByPK for HourlyReportContent.", e); } } @@ -109,10 +106,9 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private HourlyReportContent requireFound(HourlyReportContentDO record, String field, String value) - throws DalNotFoundException { + private HourlyReportContent requireFound(HourlyReportContentDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No HourlyReportContent found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No HourlyReportContent found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java index 49719e86b3..99ae1c35ff 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java @@ -7,9 +7,8 @@ import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.HourlyreportMapper; @@ -28,14 +27,13 @@ public HourlyReport createLocal() { return new HourlyReport(); } - public int deleteByPK(HourlyReport proto) throws DalException { + public int deleteByPK(HourlyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } - public List findAllByDomainNamePeriod(java.util.Date period, String domain, String name, - Object readset) throws DalException { + public List findAllByDomainNamePeriod(java.util.Date period, String domain, String name) { HourlyreportDO record = new HourlyreportDO(); HourlyreportMapper mapper = springMapper(); @@ -45,8 +43,7 @@ public List findAllByDomainNamePeriod(java.util.Date period, Strin return mapper.findAllByDomainNamePeriod(record).stream().map(this::toModel).collect(Collectors.toList()); } - public List findAllByPeriodName(java.util.Date period, String name, Object readset) - throws DalException { + public List findAllByPeriodName(java.util.Date period, String name) { HourlyreportDO record = new HourlyreportDO(); HourlyreportMapper mapper = springMapper(); @@ -55,13 +52,13 @@ public List findAllByPeriodName(java.util.Date period, String name return mapper.findAllByPeriodName(record).stream().map(this::toModel).collect(Collectors.toList()); } - public HourlyReport findByPK(int keyId, Object readset) throws DalException { + public HourlyReport findByPK(int keyId) { HourlyreportMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } - public int insert(HourlyReport proto) throws DalException { + public int insert(HourlyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); HourlyreportDO record = toRecord(proto); @@ -72,7 +69,7 @@ public int insert(HourlyReport proto) throws DalException { return count; } - public int updateByPK(HourlyReport proto, Object updateset) throws DalException { + public int updateByPK(HourlyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); @@ -107,9 +104,9 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private HourlyReport requireFound(HourlyreportDO record, String field, String value) throws DalNotFoundException { + private HourlyReport requireFound(HourlyreportDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No HourlyReport found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No HourlyReport found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java index ec66c8801e..da5c614dc9 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java @@ -7,9 +7,8 @@ import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.MonthlyReportContent; import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.MonthlyReportContentMapper; @@ -28,18 +27,17 @@ public MonthlyReportContent createLocal() { return new MonthlyReportContent(); } - public int deleteByPK(MonthlyReportContent proto) throws DalException { + public int deleteByPK(MonthlyReportContent proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyReportId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for MonthlyReportContent.", e); + throw new IllegalStateException("Error when executing deleteByPK for MonthlyReportContent.", e); } } - public List findOverloadReport(int startId, Object readset) - throws DalException { + public List findOverloadReport(int startId) { MonthlyReportContentMapper mapper = springMapper(); MonthlyReportContentDO record = new MonthlyReportContentDO(); @@ -47,39 +45,39 @@ public List findOverloadReport(int startId, Object readset try { return mapper.findOverloadReport(record).stream().map(this::toModel).collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing findOverloadReport for MonthlyReportContent.", e); + throw new IllegalStateException("Error when executing findOverloadReport for MonthlyReportContent.", e); } } - public MonthlyReportContent findByPK(int keyReportId, Object readset) throws DalException { + public MonthlyReportContent findByPK(int keyReportId) { MonthlyReportContentMapper mapper = springMapper(); try { return requireFound(mapper.findByPrimaryKey(keyReportId), "primary key", String.valueOf(keyReportId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for MonthlyReportContent.", e); + throw new IllegalStateException("Error when executing findByPK for MonthlyReportContent.", e); } } - public int insert(MonthlyReportContent proto) throws DalException { + public int insert(MonthlyReportContent proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper().insert(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing insert for MonthlyReportContent.", e); + throw new IllegalStateException("Error when executing insert for MonthlyReportContent.", e); } } - public int updateByPK(MonthlyReportContent proto, Object updateset) throws DalException { + public int updateByPK(MonthlyReportContent proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for MonthlyReportContent.", e); + throw new IllegalStateException("Error when executing updateByPK for MonthlyReportContent.", e); } } @@ -108,10 +106,9 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private MonthlyReportContent requireFound(MonthlyReportContentDO record, String field, String value) - throws DalNotFoundException { + private MonthlyReportContent requireFound(MonthlyReportContentDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No MonthlyReportContent found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No MonthlyReportContent found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java index b432ecf613..33dc242008 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java @@ -5,9 +5,8 @@ import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.mybatis.generated.monthreport.dao.MonthreportMapper; @@ -26,26 +25,25 @@ public MonthlyReport createLocal() { return new MonthlyReport(); } - public int deleteByPK(MonthlyReport proto) throws DalException { + public int deleteByPK(MonthlyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } - public int deleteReportByDomainNamePeriod(MonthlyReport proto) throws DalException { + public int deleteReportByDomainNamePeriod(MonthlyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().deleteReportByDomainNamePeriod(toRecord(proto))); } - public MonthlyReport findByPK(int keyId, Object readset) throws DalException { + public MonthlyReport findByPK(int keyId) { MonthreportMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } - public MonthlyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name, - Object readset) throws DalException { + public MonthlyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name) { MonthreportDO record = new MonthreportDO(); MonthreportMapper mapper = springMapper(); @@ -57,7 +55,7 @@ public MonthlyReport findReportByDomainNamePeriod(java.util.Date period, String return requireFound(result, "findReportByDomainNamePeriod", record.toString()); } - public int insert(MonthlyReport proto) throws DalException { + public int insert(MonthlyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); MonthreportDO record = toRecord(proto); @@ -68,7 +66,7 @@ public int insert(MonthlyReport proto) throws DalException { return count; } - public int updateByPK(MonthlyReport proto, Object updateset) throws DalException { + public int updateByPK(MonthlyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); @@ -103,9 +101,9 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private MonthlyReport requireFound(MonthreportDO record, String field, String value) throws DalNotFoundException { + private MonthlyReport requireFound(MonthreportDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No MonthlyReport found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No MonthlyReport found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java index ab6e8ad09e..6215bba54f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java @@ -7,9 +7,8 @@ import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.Project; import com.dianping.cat.core.mybatis.generated.project.dao.ProjectMapper; @@ -28,13 +27,13 @@ public Project createLocal() { return new Project(); } - public int deleteByPK(Project proto) throws DalException { + public int deleteByPK(Project proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } - public List findAll(Object readset) throws DalException { + public List findAll() { ProjectMapper mapper = springMapper(); ProjectDO record = new ProjectDO(); @@ -42,13 +41,13 @@ public List findAll(Object readset) throws DalException { return mapper.findAll(record).stream().map(this::toModel).collect(Collectors.toList()); } - public Project findByPK(int keyId, Object readset) throws DalException { + public Project findByPK(int keyId) { ProjectMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } - public Project findByDomain(String domain, Object readset) throws DalException { + public Project findByDomain(String domain) { ProjectDO record = new ProjectDO(); ProjectMapper mapper = springMapper(); @@ -58,7 +57,7 @@ public Project findByDomain(String domain, Object readset) throws DalException { return requireFound(result, "findByDomain", record.toString()); } - public Project findByCmdbDomain(String domain, Object readset) throws DalException { + public Project findByCmdbDomain(String domain) { ProjectDO record = new ProjectDO(); ProjectMapper mapper = springMapper(); @@ -68,7 +67,7 @@ public Project findByCmdbDomain(String domain, Object readset) throws DalExcepti return requireFound(result, "findByCmdbDomain", record.toString()); } - public int insert(Project proto) throws DalException { + public int insert(Project proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); ProjectDO record = toRecord(proto); @@ -79,7 +78,7 @@ public int insert(Project proto) throws DalException { return count; } - public int updateByPK(Project proto, Object updateset) throws DalException { + public int updateByPK(Project proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); @@ -114,9 +113,9 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private Project requireFound(ProjectDO record, String field, String value) throws DalNotFoundException { + private Project requireFound(ProjectDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No Project found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No Project found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java index a134c5112d..944b5bd72b 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java @@ -5,9 +5,8 @@ import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.Task; import com.dianping.cat.core.mybatis.generated.task.dao.TaskMapper; @@ -26,19 +25,19 @@ public Task createLocal() { return new Task(); } - public int deleteByPK(Task proto) throws DalException { + public int deleteByPK(Task proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } - public Task findByPK(int keyId, Object readset) throws DalException { + public Task findByPK(int keyId) { TaskMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } - public Task findByStatusConsumer(int status, String consumer, Object readset) throws DalException { + public Task findByStatusConsumer(int status, String consumer) { TaskMapper mapper = springMapper(); TaskDO record = new TaskDO(); @@ -49,7 +48,7 @@ public Task findByStatusConsumer(int status, String consumer, Object readset) th return requireFound(result, "findByStatusConsumer", record.toString()); } - public int insert(Task proto) throws DalException { + public int insert(Task proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); TaskDO record = toRecord(proto); @@ -60,37 +59,37 @@ public int insert(Task proto) throws DalException { return count; } - public int updateByPK(Task proto, Object updateset) throws DalException { + public int updateByPK(Task proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } - public int updateTodoToDoing(Task proto, Object updateset) throws DalException { + public int updateTodoToDoing(Task proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateTodoToDoing(toRecord(proto))); } - public int updateDoingToDone(Task proto, Object updateset) throws DalException { + public int updateDoingToDone(Task proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateDoingToDone(toRecord(proto))); } - public int updateFailureToDone(Task proto, Object updateset) throws DalException { + public int updateFailureToDone(Task proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateFailureToDone(toRecord(proto))); } - public int updateStatusToTodo(Task proto, Object updateset) throws DalException { + public int updateStatusToTodo(Task proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateStatusToTodo(toRecord(proto))); } - public int updateDoingToFail(Task proto, Object updateset) throws DalException { + public int updateDoingToFail(Task proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateDoingToFail(toRecord(proto))); @@ -121,9 +120,9 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private Task requireFound(TaskDO record, String field, String value) throws DalNotFoundException { + private Task requireFound(TaskDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No Task found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No Task found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java index 6734c2ae67..e5fd56d995 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java @@ -7,9 +7,8 @@ import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.WeeklyReportContent; import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.WeeklyReportContentMapper; @@ -28,18 +27,17 @@ public WeeklyReportContent createLocal() { return new WeeklyReportContent(); } - public int deleteByPK(WeeklyReportContent proto) throws DalException { + public int deleteByPK(WeeklyReportContent proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyReportId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for WeeklyReportContent.", e); + throw new IllegalStateException("Error when executing deleteByPK for WeeklyReportContent.", e); } } - public List findOverloadReport(int startId, Object readset) - throws DalException { + public List findOverloadReport(int startId) { WeeklyReportContentMapper mapper = springMapper(); WeeklyReportContentDO record = new WeeklyReportContentDO(); @@ -47,39 +45,39 @@ public List findOverloadReport(int startId, Object readset) try { return mapper.findOverloadReport(record).stream().map(this::toModel).collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing findOverloadReport for WeeklyReportContent.", e); + throw new IllegalStateException("Error when executing findOverloadReport for WeeklyReportContent.", e); } } - public WeeklyReportContent findByPK(int keyReportId, Object readset) throws DalException { + public WeeklyReportContent findByPK(int keyReportId) { WeeklyReportContentMapper mapper = springMapper(); try { return requireFound(mapper.findByPrimaryKey(keyReportId), "primary key", String.valueOf(keyReportId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for WeeklyReportContent.", e); + throw new IllegalStateException("Error when executing findByPK for WeeklyReportContent.", e); } } - public int insert(WeeklyReportContent proto) throws DalException { + public int insert(WeeklyReportContent proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper().insert(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing insert for WeeklyReportContent.", e); + throw new IllegalStateException("Error when executing insert for WeeklyReportContent.", e); } } - public int updateByPK(WeeklyReportContent proto, Object updateset) throws DalException { + public int updateByPK(WeeklyReportContent proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for WeeklyReportContent.", e); + throw new IllegalStateException("Error when executing updateByPK for WeeklyReportContent.", e); } } @@ -108,10 +106,9 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private WeeklyReportContent requireFound(WeeklyReportContentDO record, String field, String value) - throws DalNotFoundException { + private WeeklyReportContent requireFound(WeeklyReportContentDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No WeeklyReportContent found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No WeeklyReportContent found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java index 9ee2e0b0ef..d225fef01b 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java @@ -5,9 +5,8 @@ import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.WeeklyreportMapper; @@ -26,26 +25,25 @@ public WeeklyReport createLocal() { return new WeeklyReport(); } - public int deleteByPK(WeeklyReport proto) throws DalException { + public int deleteByPK(WeeklyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); } - public int deleteReportByDomainNamePeriod(WeeklyReport proto) throws DalException { + public int deleteReportByDomainNamePeriod(WeeklyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().deleteReportByDomainNamePeriod(toRecord(proto))); } - public WeeklyReport findByPK(int keyId, Object readset) throws DalException { + public WeeklyReport findByPK(int keyId) { WeeklyreportMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } - public WeeklyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name, - Object readset) throws DalException { + public WeeklyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name) { WeeklyreportDO record = new WeeklyreportDO(); WeeklyreportMapper mapper = springMapper(); @@ -57,7 +55,7 @@ public WeeklyReport findReportByDomainNamePeriod(java.util.Date period, String d return requireFound(result, "findReportByDomainNamePeriod", record.toString()); } - public int insert(WeeklyReport proto) throws DalException { + public int insert(WeeklyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); WeeklyreportDO record = toRecord(proto); @@ -68,7 +66,7 @@ public int insert(WeeklyReport proto) throws DalException { return count; } - public int updateByPK(WeeklyReport proto, Object updateset) throws DalException { + public int updateByPK(WeeklyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); @@ -103,9 +101,9 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private WeeklyReport requireFound(WeeklyreportDO record, String field, String value) throws DalNotFoundException { + private WeeklyReport requireFound(WeeklyreportDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No WeeklyReport found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No WeeklyReport found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java index cd9c556bc6..9fff9faf04 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java @@ -7,9 +7,8 @@ import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.report.daily.dao.DailyReportMapper; @@ -28,34 +27,33 @@ public DailyReport createLocal() { return new DailyReport(); } - public int deleteByDomainNamePeriod(DailyReport proto) throws DalException { + public int deleteByDomainNamePeriod(DailyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().deleteByDomainNamePeriod(proto.getDomain(), proto.getName(), proto.getPeriod())); } - public int deleteByPK(DailyReport proto) throws DalException { + public int deleteByPK(DailyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().deleteById(proto.getKeyId())); } - public DailyReport findByDomainNamePeriod(String domain, String name, java.util.Date period, - Object readset) throws DalException { + public DailyReport findByDomainNamePeriod(String domain, String name, java.util.Date period) { DailyReportMapper mapper = springMapper(); return requireFound(mapper.findByDomainNamePeriod(domain, name, period), "domain/name/period", domain + "/" + name + "/" + period); } - public DailyReport findByPK(int keyId, Object readset) throws DalException { + public DailyReport findByPK(int keyId) { DailyReportMapper mapper = springMapper(); return requireFound(mapper.findById(keyId), "id", String.valueOf(keyId)); } - public int insert(DailyReport proto) throws DalException { + public int insert(DailyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); DailyReportDO report = toDailyReportDO(proto); @@ -66,8 +64,7 @@ public int insert(DailyReport proto) throws DalException { return count; } - public List queryLatestReportsByDomainName(String domain, String name, int limits, - Object readset) throws DalException { + public List queryLatestReportsByDomainName(String domain, String name, int limits) { DailyReportMapper mapper = springMapper(); return mapper.queryLatestReportsByDomainName(domain, name, limits).stream() @@ -75,7 +72,7 @@ public List queryLatestReportsByDomainName(String domain, String na .collect(Collectors.toList()); } - public int updateByPK(DailyReport proto, Object updateset) throws DalException { + public int updateByPK(DailyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); return transactionTemplate.execute(status -> springMapper().updateById(toDailyReportDO(proto))); @@ -110,9 +107,9 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private DailyReport requireFound(DailyReportDO report, String field, String value) throws DalNotFoundException { + private DailyReport requireFound(DailyReportDO report, String field, String value) { if (report == null) { - throw new DalNotFoundException(String.format("No daily report found by %s(%s).", field, value)); + throw new EmptyResultDataAccessException(String.format("No daily report found by %s(%s).", field, value), 1); } return toDailyReport(report); diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java index 4a2695c1bc..ab6e32b4ad 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java @@ -28,8 +28,7 @@ import java.util.Map.Entry; import java.util.Set; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; @@ -39,17 +38,14 @@ import com.dianping.cat.core.dal.HourlyReportContent; import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; -import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; -import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.message.Event; @@ -129,7 +125,7 @@ public boolean insertDailyReport(DailyReport report, byte[] content) { proto.setContent(content); m_dailyReportContentDao.insert(proto); return true; - } catch (DalException e) { + } catch (RuntimeException e) { Cat.logError(e); return false; } @@ -149,7 +145,7 @@ public boolean insertHourlyReport(HourlyReport report, byte[] content) { proto.setPeriod(report.getPeriod()); m_hourlyReportContentDao.insert(proto); return true; - } catch (DalException e) { + } catch (RuntimeException e) { Cat.logError(e); return false; } @@ -160,8 +156,7 @@ public boolean insertMonthlyReport(MonthlyReport report, byte[] content) { ensureReportRepositories(); try { MonthlyReport monthReport = m_monthlyReportDao - .findReportByDomainNamePeriod(report.getPeriod(), report.getDomain(), report.getName(), - MonthlyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(report.getPeriod(), report.getDomain(), report.getName()); if (monthReport != null) { MonthlyReportContent reportContent = m_monthlyReportContentDao.createLocal(); @@ -171,7 +166,7 @@ public boolean insertMonthlyReport(MonthlyReport report, byte[] content) { m_monthlyReportDao.deleteReportByDomainNamePeriod(report); m_monthlyReportContentDao.deleteByPK(reportContent); } - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { } catch (Exception e) { Cat.logError(e); } @@ -187,7 +182,7 @@ public boolean insertMonthlyReport(MonthlyReport report, byte[] content) { m_monthlyReportContentDao.insert(proto); return true; - } catch (DalException e) { + } catch (RuntimeException e) { Cat.logError(e); return false; } @@ -198,8 +193,7 @@ public boolean insertWeeklyReport(WeeklyReport report, byte[] content) { ensureReportRepositories(); try { WeeklyReport weeklyReport = m_weeklyReportDao - .findReportByDomainNamePeriod(report.getPeriod(), report.getDomain(), report.getName(), - WeeklyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(report.getPeriod(), report.getDomain(), report.getName()); if (weeklyReport != null) { WeeklyReportContent reportContent = m_weeklyReportContentDao.createLocal(); @@ -209,7 +203,7 @@ public boolean insertWeeklyReport(WeeklyReport report, byte[] content) { m_weeklyReportContentDao.deleteByPK(reportContent); m_weeklyReportDao.deleteReportByDomainNamePeriod(report); } - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { } catch (Exception e) { Cat.logError(e); } @@ -224,7 +218,7 @@ public boolean insertWeeklyReport(WeeklyReport report, byte[] content) { proto.setContent(content); m_weeklyReportContentDao.insert(proto); return true; - } catch (DalException e) { + } catch (RuntimeException e) { Cat.logError(e); return false; } @@ -252,7 +246,7 @@ private Set queryAllDomains(Date date, String name) { domains = new HashSet(); try { List reports = m_hourlyReportDao - .findAllByPeriodName(date, name, HourlyReportEntity.READSET_DOMAIN_NAME); + .findAllByPeriodName(date, name); if (reports != null) { for (HourlyReport report : reports) { @@ -261,7 +255,7 @@ private Set queryAllDomains(Date date, String name) { } Cat.logEvent("FindDomain", key, Event.SUCCESS, domains.toString()); m_domains.put(key, domains); - } catch (DalException e) { + } catch (RuntimeException e) { Cat.logError(e); } } diff --git a/cat-core/src/main/java/com/dianping/cat/sample/BaseEntity.java b/cat-core/src/main/java/com/dianping/cat/sample/BaseEntity.java new file mode 100644 index 0000000000..eb7388d83e --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/sample/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.sample; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.sample.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/sample/Constants.java b/cat-core/src/main/java/com/dianping/cat/sample/Constants.java new file mode 100644 index 0000000000..1ce7ea5c0b --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/sample/Constants.java @@ -0,0 +1,14 @@ +package com.dianping.cat.sample; + +public class Constants { + + public static final String ATTR_ID = "id"; + + public static final String ATTR_SAMPLE = "sample"; + + public static final String ENTITY_DOMAIN = "domain"; + + public static final String ENTITY_DOMAINS = "domains"; + + public static final String ENTITY_SAMPLE_CONFIG = "sample-config"; +} diff --git a/cat-core/src/main/java/com/dianping/cat/sample/IEntity.java b/cat-core/src/main/java/com/dianping/cat/sample/IEntity.java new file mode 100644 index 0000000000..8be775379f --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/sample/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.sample; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-core/src/main/java/com/dianping/cat/sample/IVisitor.java b/cat-core/src/main/java/com/dianping/cat/sample/IVisitor.java new file mode 100644 index 0000000000..d28d841abe --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/sample/IVisitor.java @@ -0,0 +1,11 @@ +package com.dianping.cat.sample; + +import com.dianping.cat.sample.entity.Domain; +import com.dianping.cat.sample.entity.SampleConfig; + +public interface IVisitor { + + public void visitDomain(Domain domain); + + public void visitSampleConfig(SampleConfig sampleConfig); +} diff --git a/cat-core/src/main/java/com/dianping/cat/sample/entity/Domain.java b/cat-core/src/main/java/com/dianping/cat/sample/entity/Domain.java new file mode 100644 index 0000000000..76cc01e63d --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/sample/entity/Domain.java @@ -0,0 +1,77 @@ +package com.dianping.cat.sample.entity; + +import static com.dianping.cat.sample.Constants.ATTR_ID; +import static com.dianping.cat.sample.Constants.ENTITY_DOMAIN; + +import com.dianping.cat.sample.BaseEntity; +import com.dianping.cat.sample.IVisitor; + +public class Domain extends BaseEntity { + private String m_id; + + private Double m_sample; + + public Domain() { + } + + public Domain(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomain(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Domain) { + Domain _o = (Domain) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + public Double getSample() { + return m_sample; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Domain other) { + assertAttributeEquals(other, ENTITY_DOMAIN, ATTR_ID, m_id, other.getId()); + + if (other.getSample() != null) { + m_sample = other.getSample(); + } + } + + public Domain setId(String id) { + m_id = id; + return this; + } + + public Domain setSample(Double sample) { + m_sample = sample; + return this; + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/sample/entity/SampleConfig.java b/cat-core/src/main/java/com/dianping/cat/sample/entity/SampleConfig.java new file mode 100644 index 0000000000..4ab903b5e5 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/sample/entity/SampleConfig.java @@ -0,0 +1,66 @@ +package com.dianping.cat.sample.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.sample.BaseEntity; +import com.dianping.cat.sample.IVisitor; + +public class SampleConfig extends BaseEntity { + private Map m_domains = new LinkedHashMap(); + + public SampleConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitSampleConfig(this); + } + + public SampleConfig addDomain(Domain domain) { + m_domains.put(domain.getId(), domain); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SampleConfig) { + SampleConfig _o = (SampleConfig) obj; + + if (!equals(getDomains(), _o.getDomains())) { + return false; + } + + + return true; + } + + return false; + } + + public Domain findDomain(String id) { + return m_domains.get(id); + } + + public Map getDomains() { + return m_domains; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domains == null ? 0 : m_domains.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(SampleConfig other) { + } + + public Domain removeDomain(String id) { + return m_domains.remove(id); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultLinker.java b/cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultLinker.java new file mode 100644 index 0000000000..7e8b00babe --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultLinker.java @@ -0,0 +1,38 @@ +package com.dianping.cat.sample.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.sample.entity.Domain; +import com.dianping.cat.sample.entity.SampleConfig; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDomain(final SampleConfig parent, final Domain domain) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDomain(domain); + } + }); + } else { + parent.addDomain(domain); + } + + return true; + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultSaxMaker.java b/cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..84a8e9924d --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultSaxMaker.java @@ -0,0 +1,59 @@ +package com.dianping.cat.sample.transform; + +import static com.dianping.cat.sample.Constants.ATTR_ID; +import static com.dianping.cat.sample.Constants.ATTR_SAMPLE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.sample.entity.Domain; +import com.dianping.cat.sample.entity.SampleConfig; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Domain buildDomain(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String sample = attributes.getValue(ATTR_SAMPLE); + Domain domain = new Domain(id); + + if (sample != null) { + domain.setSample(convert(Double.class, sample, null)); + } + + return domain; + } + + @Override + public SampleConfig buildSampleConfig(Attributes attributes) { + SampleConfig sampleConfig = new SampleConfig(); + + return sampleConfig; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultSaxParser.java b/cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..5384a70dfa --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultSaxParser.java @@ -0,0 +1,227 @@ +package com.dianping.cat.sample.transform; + +import static com.dianping.cat.sample.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.sample.Constants.ENTITY_SAMPLE_CONFIG; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.sample.IEntity; +import com.dianping.cat.sample.entity.Domain; +import com.dianping.cat.sample.entity.SampleConfig; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static SampleConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(SampleConfig.class, new InputSource(removeBOM(in))); + } + + public static SampleConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(SampleConfig.class, new InputSource(removeBOM(reader))); + } + + public static SampleConfig parse(String xml) throws SAXException, IOException { + return parseEntity(SampleConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForDomain(Domain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForSampleConfig(SampleConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_linker.onDomain(parentObj, domain); + m_objs.push(domain); + } else { + throw new SAXException(String.format("Element(%s) is not expected under sample-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_SAMPLE_CONFIG.equals(qName)) { + SampleConfig sampleConfig = m_maker.buildSampleConfig(attributes); + + m_entity = sampleConfig; + m_objs.push(sampleConfig); + m_tags.push(qName); + } else if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_entity = domain; + m_objs.push(domain); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof SampleConfig) { + parseForSampleConfig((SampleConfig) parent, tag, qName, attributes); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultXmlBuilder.java b/cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..782596d8cb --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/sample/transform/DefaultXmlBuilder.java @@ -0,0 +1,213 @@ +package com.dianping.cat.sample.transform; + +import static com.dianping.cat.sample.Constants.ATTR_ID; +import static com.dianping.cat.sample.Constants.ATTR_SAMPLE; +import static com.dianping.cat.sample.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.sample.Constants.ENTITY_SAMPLE_CONFIG; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.sample.IEntity; +import com.dianping.cat.sample.IVisitor; +import com.dianping.cat.sample.entity.Domain; +import com.dianping.cat.sample.entity.SampleConfig; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitDomain(Domain domain) { + startTag(ENTITY_DOMAIN, true, null, ATTR_ID, domain.getId(), ATTR_SAMPLE, domain.getSample()); + } + + @Override + public void visitSampleConfig(SampleConfig sampleConfig) { + startTag(ENTITY_SAMPLE_CONFIG, null); + + if (!sampleConfig.getDomains().isEmpty()) { + for (Domain domain : sampleConfig.getDomains().values()) { + domain.accept(m_visitor); + } + } + + endTag(ENTITY_SAMPLE_CONFIG); + } +} diff --git a/cat-core/src/main/java/com/dianping/cat/sample/transform/ILinker.java b/cat-core/src/main/java/com/dianping/cat/sample/transform/ILinker.java new file mode 100644 index 0000000000..bb67134aff --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/sample/transform/ILinker.java @@ -0,0 +1,9 @@ +package com.dianping.cat.sample.transform; + +import com.dianping.cat.sample.entity.Domain; +import com.dianping.cat.sample.entity.SampleConfig; + +public interface ILinker { + + public boolean onDomain(SampleConfig parent, Domain domain); +} diff --git a/cat-core/src/main/java/com/dianping/cat/sample/transform/IMaker.java b/cat-core/src/main/java/com/dianping/cat/sample/transform/IMaker.java new file mode 100644 index 0000000000..5d530a25c2 --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/sample/transform/IMaker.java @@ -0,0 +1,11 @@ +package com.dianping.cat.sample.transform; + +import com.dianping.cat.sample.entity.Domain; +import com.dianping.cat.sample.entity.SampleConfig; + +public interface IMaker { + + public Domain buildDomain(T node); + + public SampleConfig buildSampleConfig(T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/sample/transform/IParser.java b/cat-core/src/main/java/com/dianping/cat/sample/transform/IParser.java new file mode 100644 index 0000000000..3523aff5ff --- /dev/null +++ b/cat-core/src/main/java/com/dianping/cat/sample/transform/IParser.java @@ -0,0 +1,10 @@ +package com.dianping.cat.sample.transform; + +import com.dianping.cat.sample.entity.Domain; +import com.dianping.cat.sample.entity.SampleConfig; + +public interface IParser { + public SampleConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForDomain(IMaker maker, ILinker linker, Domain parent, T node); +} diff --git a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java index d042ea8503..f94c9a5c2d 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java @@ -26,8 +26,7 @@ import java.util.regex.Pattern; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; import com.dianping.cat.support.Threads; import com.dianping.cat.support.Threads.Task; @@ -35,7 +34,6 @@ import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.dal.Hostinfo; import com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository; -import com.dianping.cat.core.dal.HostinfoEntity; import com.dianping.cat.helper.TimeHelper; public class HostinfoService { @@ -57,7 +55,7 @@ public Hostinfo createLocal() { return m_hostinfoDao.createLocal(); } - public List findAll() throws DalException { + public List findAll() { ensureInitialized(); return new ArrayList(m_hostinfos.values()); @@ -72,7 +70,7 @@ public Hostinfo findByIp(String ip) { return hostinfo; } else { try { - hostinfo = m_hostinfoDao.findByIp(ip, HostinfoEntity.READSET_FULL); + hostinfo = m_hostinfoDao.findByIp(ip); if (hostinfo != null) { m_hostinfos.put(ip, hostinfo); @@ -80,7 +78,7 @@ public Hostinfo findByIp(String ip) { } else { return null; } - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { SLF4J_LOGGER.warn("Hostinfo is missing by ip={}.", ip, e); } catch (Exception e) { SLF4J_LOGGER.error("Unable to find hostinfo by ip={}.", ip, e); @@ -113,7 +111,7 @@ public synchronized void initialize() { SLF4J_LOGGER.info("HostinfoService started refresh task."); } - private boolean insert(Hostinfo hostinfo) throws DalException { + private boolean insert(Hostinfo hostinfo) { m_hostinfos.put(hostinfo.getIp(), hostinfo); int result = m_hostinfoDao.insert(hostinfo); @@ -136,7 +134,7 @@ public boolean insert(String domain, String ip) { m_hostinfos.put(ip, info); SLF4J_LOGGER.info("Inserted hostinfo, domain={}, ip={}.", domain, ip); return true; - } catch (DalException e) { + } catch (RuntimeException e) { SLF4J_LOGGER.error("Unable to insert hostinfo, domain={}, ip={}.", domain, ip, e); Cat.logError(e); } @@ -210,7 +208,7 @@ public List queryIpsByDomain(String domain) { protected void refresh() { try { - List hostinfos = m_hostinfoDao.findAllIp(HostinfoEntity.READSET_FULL); + List hostinfos = m_hostinfoDao.findAllIp(); Map tmpHostInfos = new ConcurrentHashMap(); Map tmpIpDomains = new ConcurrentHashMap(); @@ -221,7 +219,7 @@ protected void refresh() { m_hostinfos = tmpHostInfos; m_ipDomains = tmpIpDomains; SLF4J_LOGGER.info("Refreshed hostinfo cache, hostCount={}.", hostinfos.size()); - } catch (DalException e) { + } catch (RuntimeException e) { SLF4J_LOGGER.error("Unable to refresh hostinfo cache.", e); Cat.logError("initialize HostService error", e); } @@ -247,11 +245,11 @@ public boolean updateHostinfo(Hostinfo hostinfo) { m_hostinfos.put(hostinfo.getIp(), hostinfo); try { - m_hostinfoDao.updateByPK(hostinfo, HostinfoEntity.UPDATESET_FULL); + m_hostinfoDao.updateByPK(hostinfo); SLF4J_LOGGER.info("Updated hostinfo, id={}, domain={}, ip={}.", hostinfo.getId(), hostinfo.getDomain(), hostinfo.getIp()); return true; - } catch (DalException e) { + } catch (RuntimeException e) { SLF4J_LOGGER.error("Unable to update hostinfo, id={}, domain={}, ip={}.", hostinfo.getId(), hostinfo.getDomain(), hostinfo.getIp(), e); Cat.logError(e); diff --git a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java index d9323bb8a2..dd1852b709 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java @@ -22,10 +22,9 @@ import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.dal.Project; import com.dianping.cat.core.mybatis.repository.project.ProjectRepository; -import com.dianping.cat.core.dal.ProjectEntity; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import java.util.*; import java.util.Map.Entry; @@ -95,7 +94,7 @@ public boolean delete(Project project) { } } - public List findAll() throws DalException { + public List findAll() { ensureInitialized(); return new ArrayList(m_domainToProjects.values()); @@ -116,11 +115,11 @@ public Project findByDomain(String domainName) { return project; } else { try { - Project pro = m_projectDao.findByDomain(domainName, ProjectEntity.READSET_FULL); + Project pro = m_projectDao.findByDomain(domainName); m_domainToProjects.put(pro.getDomain(), pro); return project; - } catch (DalException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Project is missing or unavailable by domain={}.", domainName, e); } catch (Exception e) { LOGGER.error("Unable to find project by domain={}.", domainName, e); @@ -214,7 +213,7 @@ public boolean insert(Project project) { result); return false; } - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to insert project, domain={}.", project.getDomain(), e); Cat.logError(e); return false; @@ -244,7 +243,7 @@ public boolean insert(String domain) { protected void refresh() { try { - List projects = m_projectDao.findAll(ProjectEntity.READSET_FULL); + List projects = m_projectDao.findAll(); ConcurrentHashMap tmpDomainProjects = new ConcurrentHashMap(); ConcurrentHashMap tmpCmdbProjects = new ConcurrentHashMap(); ConcurrentHashMap tmpDomains = new ConcurrentHashMap(); @@ -266,7 +265,7 @@ protected void refresh() { m_cmdbToProjects = tmpCmdbProjects; LOGGER.info("Refreshed projects, projectCount={}, cmdbDomainCount={}.", projects.size(), tmpCmdbProjects.size()); - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to refresh ProjectService projects.", e); Cat.logError("initialize ProjectService error", e); } @@ -278,10 +277,10 @@ public boolean update(Project project) { m_domainToProjects.put(project.getDomain(), project); try { - m_projectDao.updateByPK(project, ProjectEntity.UPDATESET_FULL); + m_projectDao.updateByPK(project); LOGGER.info("Updated project, domain={}, id={}.", project.getDomain(), project.getId()); return true; - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to update project, domain={}, id={}.", project.getDomain(), project.getId(), e); Cat.logError(e); return false; diff --git a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java index 2c28ed47bc..9a1a2a03cd 100644 --- a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java +++ b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java @@ -22,7 +22,6 @@ import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.core.dal.Task; import com.dianping.cat.core.mybatis.repository.task.TaskRepository; -import com.dianping.cat.core.dal.jdbc.DalException; import java.util.Calendar; import java.util.Date; @@ -78,13 +77,13 @@ public boolean createTask(Date period, String domain, String name, TaskCreationP } } return true; - } catch (DalException e) { + } catch (RuntimeException e) { Cat.logError(e); return false; } } - protected void insertToDatabase(Date period, String domain, String name, int reportType) throws DalException { + protected void insertToDatabase(Date period, String domain, String name, int reportType) { ensureTaskDao(); Task task = m_taskDao.createLocal(); diff --git a/cat-core/src/main/resources/META-INF/dal/jdbc/config-codegen.xml b/cat-core/src/main/resources/META-INF/dal/jdbc/config-codegen.xml deleted file mode 100644 index 51b53764fb..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/jdbc/config-codegen.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/jdbc/config-dal.xml b/cat-core/src/main/resources/META-INF/dal/jdbc/config-dal.xml deleted file mode 100644 index f13f028d32..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/jdbc/config-dal.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - FROM
- WHERE = ${name}]]> - - - - - - - - - FROM
- ]]> - - - - - - - - - () - VALUES - () - ]]> - - - - - - FROM
- WHERE = ${name} - AND = ${domain} - ]]> - - - - - FROM
- WHERE = ${name} - ]]> - - - - SET =${content}, - =NOW() - WHERE = ${domain} - AND = ${name}; - ]]> - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/jdbc/config-manifest.xml b/cat-core/src/main/resources/META-INF/dal/jdbc/config-manifest.xml deleted file mode 100644 index dac88e7e0d..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/jdbc/config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/jdbc/report-codegen.xml b/cat-core/src/main/resources/META-INF/dal/jdbc/report-codegen.xml deleted file mode 100644 index 679d128a2e..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/jdbc/report-codegen.xml +++ /dev/null @@ -1,447 +0,0 @@ - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-report-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-report-id}]]> - - - - - WHERE = ${key-report-id}]]> - - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-report-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-report-id}]]> - - - - - WHERE = ${key-report-id}]]> - - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-report-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-report-id}]]> - - - - - WHERE = ${key-report-id}]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-report-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-report-id}]]> - - - - - WHERE = ${key-report-id}]]> - - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/jdbc/report-dal.xml b/cat-core/src/main/resources/META-INF/dal/jdbc/report-dal.xml deleted file mode 100644 index 984e64a260..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/jdbc/report-dal.xml +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - () - VALUES - () - ]]> - - - - - - FROM
- WHERE = ${status} - - AND = ${consumer} - limit 1 - ]]> - - - - - SET =${consumer}, - =2, - =${start-date} - WHERE = 1 - AND = ${id}; - ]]> - - - - - SET =3, - =${end-date} - WHERE = 2 - AND = ${id}; - ]]> - - - - - SET =3, - =${end-date} - WHERE =4 - AND = ${id}; - - ]]> - - - - - SET =1, - WHERE = ${id}; - ]]> - - - - - SET =4, - =${end-date}, - = + 1 - WHERE = 2 - AND = ${id}; - ]]> - - - - - - - - - - - FROM
- WHERE = ${ip} - ]]> - - - - FROM
- ]]> - - - - () VALUES() - ON DUPLICATE KEY - UPDATE = ${domain}, - = NOW()]]> - - - - - - - - - - FROM
- ]]> - - - - - FROM
WHERE binary() = binary(${domain}) - ]]> - - - - - FROM
WHERE binary() = binary(${domain}) - ]]> - - - - () VALUES() - ON DUPLICATE KEY - UPDATE = ${domain}, - = NOW()]]> - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-report-id}]]> - - - - - FROM
- WHERE > ${start-id} - ORDER BY asc limit 1000 - ]]> - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${period} - AND = ${domain} - AND = ${name} - AND binary() = binary(${domain}) - ]]> - - - - - - FROM
- WHERE = ${period} - AND = ${name} - ]]> - - - () - VALUES() - ]]> - - - - - - - - - - - - - - - - - - - - - () - VALUES - () - ]]> - - - - - - - FROM
- WHERE = ${period} - AND = ${domain} - AND = ${name} - AND binary() = binary(${domain}) - ]]> - - - - - - - WHERE = ${period} - AND = ${domain} - AND = ${name} - AND binary() = binary(${domain}) - ]]> - - - - - - - FROM
- WHERE = ${domain} - AND = ${name} - AND binary() = binary(${domain}) - ORDER BY DESC LIMIT ${limits} - ]]> - - - - - - - - - - - - FROM
- WHERE = ${period} - AND = ${domain} - AND = ${name} - AND binary() = binary(${domain}) - ]]> - - - - - - - WHERE = ${period} - AND = ${domain} - AND = ${name} - ]]> - - - - - - - - - - - - - FROM
- WHERE = ${period} - AND = ${domain} - AND = ${name} - AND binary() = binary(${domain}) - ]]> - - - - - - - WHERE = ${period} - AND = ${domain} - AND = ${name} - ]]> - - - - - - - - - - - - - - - - - - - FROM
- WHERE > ${start-id} - ORDER BY asc limit 1000 - ]]> - - - - - - - - - - - - - - - - - - - FROM
- WHERE > ${start-id} - ORDER BY asc limit 1000 - ]]> - - - - - - - - - - - - - - - - - - - - FROM
- WHERE > ${start-id} - ORDER BY asc limit 1000 - ]]> - - - - \ No newline at end of file diff --git a/cat-core/src/main/resources/META-INF/dal/jdbc/report-manifest.xml b/cat-core/src/main/resources/META-INF/dal/jdbc/report-manifest.xml deleted file mode 100644 index 17377c186d..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/jdbc/report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/atomic-message-config-codegen.xml b/cat-core/src/main/resources/META-INF/dal/model/atomic-message-config-codegen.xml deleted file mode 100644 index 9e0e11abfa..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/atomic-message-config-codegen.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/atomic-message-config-manifest.xml b/cat-core/src/main/resources/META-INF/dal/model/atomic-message-config-manifest.xml deleted file mode 100644 index 8a0d7bad4a..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/atomic-message-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/atomic-message-config-model.xml b/cat-core/src/main/resources/META-INF/dal/model/atomic-message-config-model.xml deleted file mode 100644 index d0f804fe6a..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/atomic-message-config-model.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/business-report-config-codegen.xml b/cat-core/src/main/resources/META-INF/dal/model/business-report-config-codegen.xml deleted file mode 100644 index aed08431a3..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/business-report-config-codegen.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/business-report-config-manifest.xml b/cat-core/src/main/resources/META-INF/dal/model/business-report-config-manifest.xml deleted file mode 100644 index 640770c1b2..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/business-report-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/business-report-config-model.xml b/cat-core/src/main/resources/META-INF/dal/model/business-report-config-model.xml deleted file mode 100644 index 9134532732..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/business-report-config-model.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/report-reload-config-codegen.xml b/cat-core/src/main/resources/META-INF/dal/model/report-reload-config-codegen.xml deleted file mode 100644 index 2e1484a328..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/report-reload-config-codegen.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/report-reload-config-manifest.xml b/cat-core/src/main/resources/META-INF/dal/model/report-reload-config-manifest.xml deleted file mode 100644 index a8be1d55b9..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/report-reload-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/report-reload-config-model.xml b/cat-core/src/main/resources/META-INF/dal/model/report-reload-config-model.xml deleted file mode 100644 index 03b0556e15..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/report-reload-config-model.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/sample-config-codegen.xml b/cat-core/src/main/resources/META-INF/dal/model/sample-config-codegen.xml deleted file mode 100644 index 29f0f52948..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/sample-config-codegen.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/sample-config-manifest.xml b/cat-core/src/main/resources/META-INF/dal/model/sample-config-manifest.xml deleted file mode 100644 index a03ec502b2..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/sample-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/sample-config-model.xml b/cat-core/src/main/resources/META-INF/dal/model/sample-config-model.xml deleted file mode 100644 index 4d1b8bab93..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/sample-config-model.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/server-codegen.xml b/cat-core/src/main/resources/META-INF/dal/model/server-codegen.xml deleted file mode 100644 index 69a5437ed8..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/server-codegen.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/server-config-codegen.xml b/cat-core/src/main/resources/META-INF/dal/model/server-config-codegen.xml deleted file mode 100644 index 891e47b1e8..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/server-config-codegen.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/server-config-manifest.xml b/cat-core/src/main/resources/META-INF/dal/model/server-config-manifest.xml deleted file mode 100644 index ef33792865..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/server-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/server-config-model.xml b/cat-core/src/main/resources/META-INF/dal/model/server-config-model.xml deleted file mode 100644 index fcbbaf0094..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/server-config-model.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/server-filter-config-codegen.xml b/cat-core/src/main/resources/META-INF/dal/model/server-filter-config-codegen.xml deleted file mode 100644 index cfd61d2f9d..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/server-filter-config-codegen.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/server-filter-config-manifest.xml b/cat-core/src/main/resources/META-INF/dal/model/server-filter-config-manifest.xml deleted file mode 100644 index 9f0db7fa85..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/server-filter-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/server-filter-config-model.xml b/cat-core/src/main/resources/META-INF/dal/model/server-filter-config-model.xml deleted file mode 100644 index ab5875cb9c..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/server-filter-config-model.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/server-manifest.xml b/cat-core/src/main/resources/META-INF/dal/model/server-manifest.xml deleted file mode 100644 index e9dd52b418..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/server-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/server-model.xml b/cat-core/src/main/resources/META-INF/dal/model/server-model.xml deleted file mode 100644 index 2053fe3629..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/server-model.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/tp-value-statistic-config-codegen.xml b/cat-core/src/main/resources/META-INF/dal/model/tp-value-statistic-config-codegen.xml deleted file mode 100644 index d253714577..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/tp-value-statistic-config-codegen.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/tp-value-statistic-config-manifest.xml b/cat-core/src/main/resources/META-INF/dal/model/tp-value-statistic-config-manifest.xml deleted file mode 100644 index 31513f9a41..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/tp-value-statistic-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/tp-value-statistic-config-model.xml b/cat-core/src/main/resources/META-INF/dal/model/tp-value-statistic-config-model.xml deleted file mode 100644 index 26585fe38b..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/tp-value-statistic-config-model.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/url-pattern-codegen.xml b/cat-core/src/main/resources/META-INF/dal/model/url-pattern-codegen.xml deleted file mode 100644 index 548fceeb43..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/url-pattern-codegen.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/url-pattern-manifest.xml b/cat-core/src/main/resources/META-INF/dal/model/url-pattern-manifest.xml deleted file mode 100644 index d873e11433..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/url-pattern-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-core/src/main/resources/META-INF/dal/model/url-pattern-model.xml b/cat-core/src/main/resources/META-INF/dal/model/url-pattern-model.xml deleted file mode 100644 index f8d6e814d0..0000000000 --- a/cat-core/src/main/resources/META-INF/dal/model/url-pattern-model.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java b/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java index dcd037f5cc..e34ba4479a 100644 --- a/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java +++ b/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java @@ -31,7 +31,6 @@ import org.junit.Before; import org.junit.Test; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; @@ -164,7 +163,7 @@ public class MockHourlyReportDao extends HourlyReportRepository { public Date creationDate; @Override - public int insert(HourlyReport proto) throws DalException { + public int insert(HourlyReport proto) { creationDate = proto.getCreationDate(); return count++; } @@ -178,7 +177,7 @@ public class MockReportContentDao extends HourlyReportContentRepository { public Date creationDate; @Override - public int insert(HourlyReportContent proto) throws DalException { + public int insert(HourlyReportContent proto) { creationDate = proto.getCreationDate(); return count++; } diff --git a/cat-core/src/test/java/com/dianping/cat/task/TaskManagerTest.java b/cat-core/src/test/java/com/dianping/cat/task/TaskManagerTest.java index 9ce9a4a765..a260ff8c17 100644 --- a/cat-core/src/test/java/com/dianping/cat/task/TaskManagerTest.java +++ b/cat-core/src/test/java/com/dianping/cat/task/TaskManagerTest.java @@ -28,7 +28,6 @@ import org.junit.Assert; import org.junit.Test; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.task.TaskManager.TaskProlicy; public class TaskManagerTest { @@ -79,7 +78,7 @@ public static class MockTaskManager extends TaskManager { private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); @Override - protected void insertToDatabase(Date period, String ip, String domain, int reportType) throws DalException { + protected void insertToDatabase(Date period, String ip, String domain, int reportType) { Set lists = m_results.get(reportType); if (lists == null) { diff --git a/cat-home/pom.xml b/cat-home/pom.xml index 2d9d626170..3d7052886b 100755 --- a/cat-home/pom.xml +++ b/cat-home/pom.xml @@ -166,74 +166,6 @@ - - org.unidal.maven.plugins - codegen-maven-plugin - - - generate dal model files - generate-sources - - dal-model - - - ${basedir}/src/main/resources/META-INF/dal/model/topology-graph-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/topology-graph-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/service-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/heavy-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/utilization-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/domain-group-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/alert-summary-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/router-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/jar-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/heartbeat-display-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/topology-format-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/exception-rule-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/storage-group-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/storage-alert-info-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/client-report-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/graph-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/server-metric-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/business-tag-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/user-config-manifest.xml, - ${basedir}/src/main/resources/META-INF/dal/model/resource-config-manifest.xml, - - - - generate dal jdbc model - generate-sources - - dal-jdbc - - - - - - - - - maven-antrun-plugin - - - rewrite generated dal jdbc sources - generate-sources - - run - - - - - - - - - - - - - - - org.apache.maven.plugins maven-war-plugin diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java index dd8c514868..e43c8ff587 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java @@ -7,8 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; public class AlertSummaryRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(AlertSummaryRepository.class); @@ -24,29 +23,29 @@ public AlertSummary createLocal() { return new AlertSummary(); } - public int deleteByPK(AlertSummary proto) throws DalException { + public int deleteByPK(AlertSummary proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for AlertSummary.", e); + throw new IllegalStateException("Error when executing deleteByPK for AlertSummary.", e); } } - public AlertSummary findByPK(int keyId, Object readset) throws DalException { + public AlertSummary findByPK(int keyId) { AlertSummaryMapper mapper = springMapper(LOGGER); try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for AlertSummary.", e); + throw new IllegalStateException("Error when executing findByPK for AlertSummary.", e); } } - public int insert(AlertSummary proto) throws DalException { + public int insert(AlertSummary proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { @@ -57,23 +56,23 @@ public int insert(AlertSummary proto) throws DalException { proto.setKeyId(record.getId()); return count; } catch (Exception e) { - throw new DalException("Error when executing insert for AlertSummary.", e); + throw new IllegalStateException("Error when executing insert for AlertSummary.", e); } } - public int updateByPK(AlertSummary proto, Object updateset) throws DalException { + public int updateByPK(AlertSummary proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for AlertSummary.", e); + throw new IllegalStateException("Error when executing updateByPK for AlertSummary.", e); } } - private AlertSummary requireFound(AlertSummaryDO record, String field, String value) throws DalNotFoundException { + private AlertSummary requireFound(AlertSummaryDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No AlertSummary found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No AlertSummary found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java index fb43318961..518e363fdf 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java @@ -9,8 +9,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; public class AlterationRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(AlterationRepository.class); @@ -26,17 +25,17 @@ public Alteration createLocal() { return new Alteration(); } - public int deleteByPK(Alteration proto) throws DalException { + public int deleteByPK(Alteration proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for Alteration.", e); + throw new IllegalStateException("Error when executing deleteByPK for Alteration.", e); } } - public List findByTypeDruation(java.util.Date startTime, java.util.Date endTime, String type, Object readset) throws DalException { + public List findByTypeDruation(java.util.Date startTime, java.util.Date endTime, String type) { AlterationMapper mapper = springMapper(LOGGER); AlterationDO record = new AlterationDO(); @@ -46,11 +45,11 @@ public List findByTypeDruation(java.util.Date startTime, java.util.D try { return mapper.findByTypeDruation(record).stream().map(this::toModel).collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing findByTypeDruation for Alteration.", e); + throw new IllegalStateException("Error when executing findByTypeDruation for Alteration.", e); } } - public List findByDtdh(java.util.Date startTime, java.util.Date endTime, String type, String domain, String hostname, Object readset) throws DalException { + public List findByDtdh(java.util.Date startTime, java.util.Date endTime, String type, String domain, String hostname) { AlterationMapper mapper = springMapper(LOGGER); AlterationDO record = new AlterationDO(); @@ -62,11 +61,11 @@ public List findByDtdh(java.util.Date startTime, java.util.Date endT try { return mapper.findByDtdh(record).stream().map(this::toModel).collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing findByDtdh for Alteration.", e); + throw new IllegalStateException("Error when executing findByDtdh for Alteration.", e); } } - public List findByDtdhTypes(java.util.Date startTime, java.util.Date endTime, String type, String domain, String hostname, String[] types, Object readset) throws DalException { + public List findByDtdhTypes(java.util.Date startTime, java.util.Date endTime, String type, String domain, String hostname, String[] types) { AlterationMapper mapper = springMapper(LOGGER); AlterationDO record = new AlterationDO(); @@ -79,11 +78,11 @@ public List findByDtdhTypes(java.util.Date startTime, java.util.Date try { return mapper.findByDtdhTypes(record).stream().map(this::toModel).collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing findByDtdhTypes for Alteration.", e); + throw new IllegalStateException("Error when executing findByDtdhTypes for Alteration.", e); } } - public List findByDomainAndTime(java.util.Date startTime, java.util.Date endTime, String domain, Object readset) throws DalException { + public List findByDomainAndTime(java.util.Date startTime, java.util.Date endTime, String domain) { AlterationMapper mapper = springMapper(LOGGER); AlterationDO record = new AlterationDO(); @@ -93,23 +92,23 @@ public List findByDomainAndTime(java.util.Date startTime, java.util. try { return mapper.findByDomainAndTime(record).stream().map(this::toModel).collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing findByDomainAndTime for Alteration.", e); + throw new IllegalStateException("Error when executing findByDomainAndTime for Alteration.", e); } } - public Alteration findByPK(int keyId, Object readset) throws DalException { + public Alteration findByPK(int keyId) { AlterationMapper mapper = springMapper(LOGGER); try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for Alteration.", e); + throw new IllegalStateException("Error when executing findByPK for Alteration.", e); } } - public int insert(Alteration proto) throws DalException { + public int insert(Alteration proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { @@ -120,23 +119,23 @@ public int insert(Alteration proto) throws DalException { proto.setKeyId(record.getId()); return count; } catch (Exception e) { - throw new DalException("Error when executing insert for Alteration.", e); + throw new IllegalStateException("Error when executing insert for Alteration.", e); } } - public int updateByPK(Alteration proto, Object updateset) throws DalException { + public int updateByPK(Alteration proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for Alteration.", e); + throw new IllegalStateException("Error when executing updateByPK for Alteration.", e); } } - private Alteration requireFound(AlterationDO record, String field, String value) throws DalNotFoundException { + private Alteration requireFound(AlterationDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No Alteration found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No Alteration found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java index 37d198d3d0..90e54c7941 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java @@ -7,8 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; public class BaselineRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(BaselineRepository.class); @@ -23,29 +22,29 @@ public Baseline createLocal() { return new Baseline(); } - public int deleteByPK(Baseline proto) throws DalException { + public int deleteByPK(Baseline proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for Baseline.", e); + throw new IllegalStateException("Error when executing deleteByPK for Baseline.", e); } } - public Baseline findByPK(int keyId, Object readset) throws DalException { + public Baseline findByPK(int keyId) { BaselineMapper mapper = springMapper(LOGGER); try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for Baseline.", e); + throw new IllegalStateException("Error when executing findByPK for Baseline.", e); } } - public Baseline findByReportNameKeyTime(java.util.Date reportPeriod, String reportName, String indexKey, Object readset) throws DalException { + public Baseline findByReportNameKeyTime(java.util.Date reportPeriod, String reportName, String indexKey) { BaselineMapper mapper = springMapper(LOGGER); BaselineDO record = new BaselineDO(); @@ -56,14 +55,14 @@ public Baseline findByReportNameKeyTime(java.util.Date reportPeriod, String repo BaselineDO result = mapper.findByReportNameKeyTime(record).stream().findFirst().orElse(null); return requireFound(result, "findByReportNameKeyTime", record.toString()); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByReportNameKeyTime for Baseline.", e); + throw new IllegalStateException("Error when executing findByReportNameKeyTime for Baseline.", e); } } - public int insert(Baseline proto) throws DalException { + public int insert(Baseline proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { @@ -74,23 +73,23 @@ public int insert(Baseline proto) throws DalException { proto.setKeyId(record.getId()); return count; } catch (Exception e) { - throw new DalException("Error when executing insert for Baseline.", e); + throw new IllegalStateException("Error when executing insert for Baseline.", e); } } - public int updateByPK(Baseline proto, Object updateset) throws DalException { + public int updateByPK(Baseline proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for Baseline.", e); + throw new IllegalStateException("Error when executing updateByPK for Baseline.", e); } } - private Baseline requireFound(BaselineDO record, String field, String value) throws DalNotFoundException { + private Baseline requireFound(BaselineDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No Baseline found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No Baseline found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java index 9023ea43a6..00fcff1ae7 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java @@ -7,8 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; public class ConfigModificationRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(ConfigModificationRepository.class); @@ -24,29 +23,29 @@ public ConfigModification createLocal() { return new ConfigModification(); } - public int deleteByPK(ConfigModification proto) throws DalException { + public int deleteByPK(ConfigModification proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for ConfigModification.", e); + throw new IllegalStateException("Error when executing deleteByPK for ConfigModification.", e); } } - public ConfigModification findByPK(int keyId, Object readset) throws DalException { + public ConfigModification findByPK(int keyId) { ConfigModificationMapper mapper = springMapper(LOGGER); try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for ConfigModification.", e); + throw new IllegalStateException("Error when executing findByPK for ConfigModification.", e); } } - public int insert(ConfigModification proto) throws DalException { + public int insert(ConfigModification proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { @@ -57,23 +56,23 @@ public int insert(ConfigModification proto) throws DalException { proto.setKeyId(record.getId()); return count; } catch (Exception e) { - throw new DalException("Error when executing insert for ConfigModification.", e); + throw new IllegalStateException("Error when executing insert for ConfigModification.", e); } } - public int updateByPK(ConfigModification proto, Object updateset) throws DalException { + public int updateByPK(ConfigModification proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for ConfigModification.", e); + throw new IllegalStateException("Error when executing updateByPK for ConfigModification.", e); } } - private ConfigModification requireFound(ConfigModificationDO record, String field, String value) throws DalNotFoundException { + private ConfigModification requireFound(ConfigModificationDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No ConfigModification found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No ConfigModification found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java index ed5e641a1a..6fb65ecb31 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java @@ -7,8 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; public class MetricGraphRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(MetricGraphRepository.class); @@ -24,39 +23,39 @@ public MetricGraph createLocal() { return new MetricGraph(); } - public int deleteByPK(MetricGraph proto) throws DalException { + public int deleteByPK(MetricGraph proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for MetricGraph.", e); + throw new IllegalStateException("Error when executing deleteByPK for MetricGraph.", e); } } - public int deleteBeforeDate(MetricGraph proto) throws DalException { + public int deleteBeforeDate(MetricGraph proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteBeforeDate(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing deleteBeforeDate for MetricGraph.", e); + throw new IllegalStateException("Error when executing deleteBeforeDate for MetricGraph.", e); } } - public MetricGraph findByPK(int keyId, Object readset) throws DalException { + public MetricGraph findByPK(int keyId) { MetricGraphMapper mapper = springMapper(LOGGER); try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for MetricGraph.", e); + throw new IllegalStateException("Error when executing findByPK for MetricGraph.", e); } } - public MetricGraph findByGrapId(long graphId, Object readset) throws DalException { + public MetricGraph findByGrapId(long graphId) { MetricGraphMapper mapper = springMapper(LOGGER); MetricGraphDO record = new MetricGraphDO(); @@ -65,14 +64,14 @@ public MetricGraph findByGrapId(long graphId, Object readset) throws DalExceptio MetricGraphDO result = mapper.findByGrapId(record).stream().findFirst().orElse(null); return requireFound(result, "findByGrapId", record.toString()); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByGrapId for MetricGraph.", e); + throw new IllegalStateException("Error when executing findByGrapId for MetricGraph.", e); } } - public MetricGraph findLast(int number, Object readset) throws DalException { + public MetricGraph findLast(int number) { MetricGraphMapper mapper = springMapper(LOGGER); MetricGraphDO record = new MetricGraphDO(); @@ -81,14 +80,14 @@ public MetricGraph findLast(int number, Object readset) throws DalException { MetricGraphDO result = mapper.findLast(record).stream().findFirst().orElse(null); return requireFound(result, "findLast", record.toString()); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findLast for MetricGraph.", e); + throw new IllegalStateException("Error when executing findLast for MetricGraph.", e); } } - public int insert(MetricGraph proto) throws DalException { + public int insert(MetricGraph proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { @@ -99,23 +98,23 @@ public int insert(MetricGraph proto) throws DalException { proto.setKeyId(record.getId()); return count; } catch (Exception e) { - throw new DalException("Error when executing insert for MetricGraph.", e); + throw new IllegalStateException("Error when executing insert for MetricGraph.", e); } } - public int updateByPK(MetricGraph proto, Object updateset) throws DalException { + public int updateByPK(MetricGraph proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for MetricGraph.", e); + throw new IllegalStateException("Error when executing updateByPK for MetricGraph.", e); } } - private MetricGraph requireFound(MetricGraphDO record, String field, String value) throws DalNotFoundException { + private MetricGraph requireFound(MetricGraphDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No MetricGraph found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No MetricGraph found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java index c793f58618..cb0b4f5da9 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java @@ -9,8 +9,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; public class MetricScreenRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(MetricScreenRepository.class); @@ -26,48 +25,48 @@ public MetricScreen createLocal() { return new MetricScreen(); } - public int deleteByPK(MetricScreen proto) throws DalException { + public int deleteByPK(MetricScreen proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for MetricScreen.", e); + throw new IllegalStateException("Error when executing deleteByPK for MetricScreen.", e); } } - public int deleteByName(MetricScreen proto) throws DalException { + public int deleteByName(MetricScreen proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByName(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing deleteByName for MetricScreen.", e); + throw new IllegalStateException("Error when executing deleteByName for MetricScreen.", e); } } - public int deleteByNameGraph(MetricScreen proto) throws DalException { + public int deleteByNameGraph(MetricScreen proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByNameGraph(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing deleteByNameGraph for MetricScreen.", e); + throw new IllegalStateException("Error when executing deleteByNameGraph for MetricScreen.", e); } } - public List findAll(Object readset) throws DalException { + public List findAll() { MetricScreenMapper mapper = springMapper(LOGGER); MetricScreenDO record = new MetricScreenDO(); try { return mapper.findAll(record).stream().map(this::toModel).collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing findAll for MetricScreen.", e); + throw new IllegalStateException("Error when executing findAll for MetricScreen.", e); } } - public List findByName(String name, Object readset) throws DalException { + public List findByName(String name) { MetricScreenMapper mapper = springMapper(LOGGER); MetricScreenDO record = new MetricScreenDO(); @@ -75,23 +74,23 @@ public List findByName(String name, Object readset) throws DalExce try { return mapper.findByName(record).stream().map(this::toModel).collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing findByName for MetricScreen.", e); + throw new IllegalStateException("Error when executing findByName for MetricScreen.", e); } } - public MetricScreen findByPK(int keyId, Object readset) throws DalException { + public MetricScreen findByPK(int keyId) { MetricScreenMapper mapper = springMapper(LOGGER); try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for MetricScreen.", e); + throw new IllegalStateException("Error when executing findByPK for MetricScreen.", e); } } - public MetricScreen findByNameGraph(String name, String graphName, Object readset) throws DalException { + public MetricScreen findByNameGraph(String name, String graphName) { MetricScreenMapper mapper = springMapper(LOGGER); MetricScreenDO record = new MetricScreenDO(); @@ -101,14 +100,14 @@ public MetricScreen findByNameGraph(String name, String graphName, Object readse MetricScreenDO result = mapper.findByNameGraph(record).stream().findFirst().orElse(null); return requireFound(result, "findByNameGraph", record.toString()); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByNameGraph for MetricScreen.", e); + throw new IllegalStateException("Error when executing findByNameGraph for MetricScreen.", e); } } - public int insert(MetricScreen proto) throws DalException { + public int insert(MetricScreen proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { @@ -119,33 +118,33 @@ public int insert(MetricScreen proto) throws DalException { proto.setKeyId(record.getId()); return count; } catch (Exception e) { - throw new DalException("Error when executing insert for MetricScreen.", e); + throw new IllegalStateException("Error when executing insert for MetricScreen.", e); } } - public int insertOrUpdateByNameGraph(MetricScreen proto) throws DalException { + public int insertOrUpdateByNameGraph(MetricScreen proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).insertOrUpdateByNameGraph(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing insertOrUpdateByNameGraph for MetricScreen.", e); + throw new IllegalStateException("Error when executing insertOrUpdateByNameGraph for MetricScreen.", e); } } - public int updateByPK(MetricScreen proto, Object updateset) throws DalException { + public int updateByPK(MetricScreen proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for MetricScreen.", e); + throw new IllegalStateException("Error when executing updateByPK for MetricScreen.", e); } } - private MetricScreen requireFound(MetricScreenDO record, String field, String value) throws DalNotFoundException { + private MetricScreen requireFound(MetricScreenDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No MetricScreen found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No MetricScreen found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java index b29b1f2404..75ea3037db 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java @@ -9,8 +9,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; public class OverloadRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(OverloadRepository.class); @@ -25,17 +24,17 @@ public Overload createLocal() { return new Overload(); } - public int deleteByPK(Overload proto) throws DalException { + public int deleteByPK(Overload proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for Overload.", e); + throw new IllegalStateException("Error when executing deleteByPK for Overload.", e); } } - public List findIdAndSizeByDuration(java.util.Date startTime, java.util.Date endTime, Object readset) throws DalException { + public List findIdAndSizeByDuration(java.util.Date startTime, java.util.Date endTime) { OverloadMapper mapper = springMapper(LOGGER); OverloadDO record = new OverloadDO(); @@ -44,23 +43,23 @@ public List findIdAndSizeByDuration(java.util.Date startTime, java.uti try { return mapper.findIdAndSizeByDuration(record).stream().map(this::toModel).collect(Collectors.toList()); } catch (Exception e) { - throw new DalException("Error when executing findIdAndSizeByDuration for Overload.", e); + throw new IllegalStateException("Error when executing findIdAndSizeByDuration for Overload.", e); } } - public Overload findByPK(int keyId, Object readset) throws DalException { + public Overload findByPK(int keyId) { OverloadMapper mapper = springMapper(LOGGER); try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for Overload.", e); + throw new IllegalStateException("Error when executing findByPK for Overload.", e); } } - public Overload findMaxIdByType(int type, Object readset) throws DalException { + public Overload findMaxIdByType(int type) { OverloadMapper mapper = springMapper(LOGGER); OverloadDO record = new OverloadDO(); @@ -69,14 +68,14 @@ public Overload findMaxIdByType(int type, Object readset) throws DalException { OverloadDO result = mapper.findMaxIdByType(record).stream().findFirst().orElse(null); return requireFound(result, "findMaxIdByType", record.toString()); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findMaxIdByType for Overload.", e); + throw new IllegalStateException("Error when executing findMaxIdByType for Overload.", e); } } - public Overload findCount(Object readset) throws DalException { + public Overload findCount() { OverloadMapper mapper = springMapper(LOGGER); OverloadDO record = new OverloadDO(); @@ -84,14 +83,14 @@ public Overload findCount(Object readset) throws DalException { OverloadDO result = mapper.findCount(record).stream().findFirst().orElse(null); return requireFound(result, "findCount", record.toString()); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findCount for Overload.", e); + throw new IllegalStateException("Error when executing findCount for Overload.", e); } } - public int insert(Overload proto) throws DalException { + public int insert(Overload proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { @@ -102,23 +101,23 @@ public int insert(Overload proto) throws DalException { proto.setKeyId(record.getId()); return count; } catch (Exception e) { - throw new DalException("Error when executing insert for Overload.", e); + throw new IllegalStateException("Error when executing insert for Overload.", e); } } - public int updateByPK(Overload proto, Object updateset) throws DalException { + public int updateByPK(Overload proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for Overload.", e); + throw new IllegalStateException("Error when executing updateByPK for Overload.", e); } } - private Overload requireFound(OverloadDO record, String field, String value) throws DalNotFoundException { + private Overload requireFound(OverloadDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No Overload found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No Overload found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java index 76e3676300..205b58558e 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java @@ -7,8 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; public class TopologyGraphRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(TopologyGraphRepository.class); @@ -24,29 +23,29 @@ public TopologyGraph createLocal() { return new TopologyGraph(); } - public int deleteByPK(TopologyGraph proto) throws DalException { + public int deleteByPK(TopologyGraph proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); } catch (Exception e) { - throw new DalException("Error when executing deleteByPK for TopologyGraph.", e); + throw new IllegalStateException("Error when executing deleteByPK for TopologyGraph.", e); } } - public TopologyGraph findByPK(int keyId, Object readset) throws DalException { + public TopologyGraph findByPK(int keyId) { TopologyGraphMapper mapper = springMapper(LOGGER); try { return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPK for TopologyGraph.", e); + throw new IllegalStateException("Error when executing findByPK for TopologyGraph.", e); } } - public TopologyGraph findByPeriod(java.util.Date period, Object readset) throws DalException { + public TopologyGraph findByPeriod(java.util.Date period) { TopologyGraphMapper mapper = springMapper(LOGGER); TopologyGraphDO record = new TopologyGraphDO(); @@ -55,14 +54,14 @@ public TopologyGraph findByPeriod(java.util.Date period, Object readset) throws TopologyGraphDO result = mapper.findByPeriod(record).stream().findFirst().orElse(null); return requireFound(result, "findByPeriod", record.toString()); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { throw e; } catch (Exception e) { - throw new DalException("Error when executing findByPeriod for TopologyGraph.", e); + throw new IllegalStateException("Error when executing findByPeriod for TopologyGraph.", e); } } - public int insert(TopologyGraph proto) throws DalException { + public int insert(TopologyGraph proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { @@ -73,23 +72,23 @@ public int insert(TopologyGraph proto) throws DalException { proto.setKeyId(record.getId()); return count; } catch (Exception e) { - throw new DalException("Error when executing insert for TopologyGraph.", e); + throw new IllegalStateException("Error when executing insert for TopologyGraph.", e); } } - public int updateByPK(TopologyGraph proto, Object updateset) throws DalException { + public int updateByPK(TopologyGraph proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); try { return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); } catch (Exception e) { - throw new DalException("Error when executing updateByPK for TopologyGraph.", e); + throw new IllegalStateException("Error when executing updateByPK for TopologyGraph.", e); } } - private TopologyGraph requireFound(TopologyGraphDO record, String field, String value) throws DalNotFoundException { + private TopologyGraph requireFound(TopologyGraphDO record, String field, String value) { if (record == null) { - throw new DalNotFoundException("No TopologyGraph found by " + field + "(" + value + ")."); + throw new EmptyResultDataAccessException("No TopologyGraph found by " + field + "(" + value + ").", 1); } return toModel(record); diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/BaseEntity.java new file mode 100644 index 0000000000..0b4af4e567 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.alert.summary; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.alert.summary.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/Constants.java new file mode 100644 index 0000000000..c4a08a6c53 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/Constants.java @@ -0,0 +1,30 @@ +package com.dianping.cat.home.alert.summary; + +public class Constants { + + public static final String ATTR_ALERT_DATE = "alert-date"; + + public static final String ATTR_ALERTTIME = "alertTime"; + + public static final String ATTR_CONTEXT = "context"; + + public static final String ATTR_COUNT = "count"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_METRIC = "metric"; + + public static final String ATTR_NAME = "name"; + + public static final String ATTR_TYPE = "type"; + + public static final String ENTITY_ALERT = "alert"; + + public static final String ENTITY_ALERTS = "alerts"; + + public static final String ENTITY_ALERT_SUMMARY = "alert-summary"; + + public static final String ENTITY_CATEGORY = "category"; + + public static final String ENTITY_CATEGORIES = "categories"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/IEntity.java new file mode 100644 index 0000000000..ef510e3ae9 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.alert.summary; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/IVisitor.java new file mode 100644 index 0000000000..6184be251a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.alert.summary; + +import com.dianping.cat.home.alert.summary.entity.Alert; +import com.dianping.cat.home.alert.summary.entity.AlertSummary; +import com.dianping.cat.home.alert.summary.entity.Category; + +public interface IVisitor { + + public void visitAlert(Alert alert); + + public void visitAlertSummary(AlertSummary alertSummary); + + public void visitCategory(Category category); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/entity/Alert.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/entity/Alert.java new file mode 100644 index 0000000000..b898d41875 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/entity/Alert.java @@ -0,0 +1,158 @@ +package com.dianping.cat.home.alert.summary.entity; + +import com.dianping.cat.home.alert.summary.BaseEntity; +import com.dianping.cat.home.alert.summary.IVisitor; + +public class Alert extends BaseEntity { + private java.util.Date m_alertTime; + + private String m_type; + + private String m_metric; + + private String m_context; + + private String m_domain; + + private Integer m_count; + + public Alert() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitAlert(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Alert) { + Alert _o = (Alert) obj; + + if (!equals(getAlertTime(), _o.getAlertTime())) { + return false; + } + + if (!equals(getType(), _o.getType())) { + return false; + } + + if (!equals(getMetric(), _o.getMetric())) { + return false; + } + + if (!equals(getContext(), _o.getContext())) { + return false; + } + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + if (!equals(getCount(), _o.getCount())) { + return false; + } + + + return true; + } + + return false; + } + + public java.util.Date getAlertTime() { + return m_alertTime; + } + + public String getContext() { + return m_context; + } + + public Integer getCount() { + return m_count; + } + + public String getDomain() { + return m_domain; + } + + public String getMetric() { + return m_metric; + } + + public String getType() { + return m_type; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_alertTime == null ? 0 : m_alertTime.hashCode()); + hash = hash * 31 + (m_type == null ? 0 : m_type.hashCode()); + hash = hash * 31 + (m_metric == null ? 0 : m_metric.hashCode()); + hash = hash * 31 + (m_context == null ? 0 : m_context.hashCode()); + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + hash = hash * 31 + (m_count == null ? 0 : m_count.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Alert other) { + if (other.getAlertTime() != null) { + m_alertTime = other.getAlertTime(); + } + + if (other.getType() != null) { + m_type = other.getType(); + } + + if (other.getMetric() != null) { + m_metric = other.getMetric(); + } + + if (other.getContext() != null) { + m_context = other.getContext(); + } + + if (other.getDomain() != null) { + m_domain = other.getDomain(); + } + + if (other.getCount() != null) { + m_count = other.getCount(); + } + } + + public Alert setAlertTime(java.util.Date alertTime) { + m_alertTime = alertTime; + return this; + } + + public Alert setContext(String context) { + m_context = context; + return this; + } + + public Alert setCount(Integer count) { + m_count = count; + return this; + } + + public Alert setDomain(String domain) { + m_domain = domain; + return this; + } + + public Alert setMetric(String metric) { + m_metric = metric; + return this; + } + + public Alert setType(String type) { + m_type = type; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/entity/AlertSummary.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/entity/AlertSummary.java new file mode 100644 index 0000000000..f58e8cbe07 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/entity/AlertSummary.java @@ -0,0 +1,122 @@ +package com.dianping.cat.home.alert.summary.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.alert.summary.BaseEntity; +import com.dianping.cat.home.alert.summary.IVisitor; + +public class AlertSummary extends BaseEntity { + private java.util.Date m_alertDate; + + private String m_domain; + + private Map m_categories = new LinkedHashMap(); + + public AlertSummary() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitAlertSummary(this); + } + + public AlertSummary addCategory(Category category) { + m_categories.put(category.getName(), category); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AlertSummary) { + AlertSummary _o = (AlertSummary) obj; + + if (!equals(getAlertDate(), _o.getAlertDate())) { + return false; + } + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + if (!equals(getCategories(), _o.getCategories())) { + return false; + } + + + return true; + } + + return false; + } + + public Category findCategory(String name) { + return m_categories.get(name); + } + + public Category findOrCreateCategory(String name) { + Category category = m_categories.get(name); + + if (category == null) { + synchronized (m_categories) { + category = m_categories.get(name); + + if (category == null) { + category = new Category(name); + m_categories.put(name, category); + } + } + } + + return category; + } + + public java.util.Date getAlertDate() { + return m_alertDate; + } + + public Map getCategories() { + return m_categories; + } + + public String getDomain() { + return m_domain; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_alertDate == null ? 0 : m_alertDate.hashCode()); + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + hash = hash * 31 + (m_categories == null ? 0 : m_categories.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(AlertSummary other) { + if (other.getAlertDate() != null) { + m_alertDate = other.getAlertDate(); + } + + if (other.getDomain() != null) { + m_domain = other.getDomain(); + } + } + + public Category removeCategory(String name) { + return m_categories.remove(name); + } + + public AlertSummary setAlertDate(java.util.Date alertDate) { + m_alertDate = alertDate; + return this; + } + + public AlertSummary setDomain(String domain) { + m_domain = domain; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/entity/Category.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/entity/Category.java new file mode 100644 index 0000000000..1d77eaaed1 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/entity/Category.java @@ -0,0 +1,77 @@ +package com.dianping.cat.home.alert.summary.entity; + +import static com.dianping.cat.home.alert.summary.Constants.ATTR_NAME; +import static com.dianping.cat.home.alert.summary.Constants.ENTITY_CATEGORY; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.home.alert.summary.BaseEntity; +import com.dianping.cat.home.alert.summary.IVisitor; + +public class Category extends BaseEntity { + private String m_name; + + private List m_alerts = new ArrayList(); + + public Category() { + } + + public Category(String name) { + m_name = name; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitCategory(this); + } + + public Category addAlert(Alert alert) { + m_alerts.add(alert); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Category) { + Category _o = (Category) obj; + + if (!equals(getName(), _o.getName())) { + return false; + } + + return true; + } + + return false; + } + + public List getAlerts() { + return m_alerts; + } + + public String getName() { + return m_name; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_name == null ? 0 : m_name.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Category other) { + assertAttributeEquals(other, ENTITY_CATEGORY, ATTR_NAME, m_name, other.getName()); + + } + + public Category setName(String name) { + m_name = name; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/BaseVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/BaseVisitor.java new file mode 100644 index 0000000000..483adc0004 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/BaseVisitor.java @@ -0,0 +1,26 @@ +package com.dianping.cat.home.alert.summary.transform; + +import com.dianping.cat.home.alert.summary.IVisitor; +import com.dianping.cat.home.alert.summary.entity.Alert; +import com.dianping.cat.home.alert.summary.entity.AlertSummary; +import com.dianping.cat.home.alert.summary.entity.Category; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitAlert(Alert alert) { + } + + @Override + public void visitAlertSummary(AlertSummary alertSummary) { + for (Category category : alertSummary.getCategories().values()) { + visitCategory(category); + } + } + + @Override + public void visitCategory(Category category) { + for (Alert alert : category.getAlerts()) { + visitAlert(alert); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultDomMaker.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultDomMaker.java new file mode 100644 index 0000000000..925052bd89 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultDomMaker.java @@ -0,0 +1,147 @@ +package com.dianping.cat.home.alert.summary.transform; + +import static com.dianping.cat.home.alert.summary.Constants.ATTR_ALERT_DATE; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_ALERTTIME; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_CONTEXT; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_COUNT; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_METRIC; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_NAME; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_TYPE; + +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import com.dianping.cat.home.alert.summary.entity.Alert; +import com.dianping.cat.home.alert.summary.entity.AlertSummary; +import com.dianping.cat.home.alert.summary.entity.Category; + +public class DefaultDomMaker implements IMaker { + + @Override + public Alert buildAlert(Node node) { + String alertTime = getAttribute(node, ATTR_ALERTTIME); + String type = getAttribute(node, ATTR_TYPE); + String metric = getAttribute(node, ATTR_METRIC); + String context = getAttribute(node, ATTR_CONTEXT); + String domain = getAttribute(node, ATTR_DOMAIN); + String count = getAttribute(node, ATTR_COUNT); + + Alert alert = new Alert(); + + if (alertTime != null) { + alert.setAlertTime(toDate(alertTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (type != null) { + alert.setType(type); + } + + if (metric != null) { + alert.setMetric(metric); + } + + if (context != null) { + alert.setContext(context); + } + + if (domain != null) { + alert.setDomain(domain); + } + + if (count != null) { + alert.setCount(convert(Integer.class, count, null)); + } + + return alert; + } + + @Override + public AlertSummary buildAlertSummary(Node node) { + String alertDate = getAttribute(node, ATTR_ALERT_DATE); + String domain = getAttribute(node, ATTR_DOMAIN); + + AlertSummary alertSummary = new AlertSummary(); + + if (alertDate != null) { + alertSummary.setAlertDate(toDate(alertDate, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (domain != null) { + alertSummary.setDomain(domain); + } + + return alertSummary; + } + + @Override + public Category buildCategory(Node node) { + String name = getAttribute(node, ATTR_NAME); + + Category category = new Category(name); + + return category; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected String getAttribute(Node node, String name) { + Node attribute = node.getAttributes().getNamedItem(name); + + return attribute == null ? null : attribute.getNodeValue(); + } + + protected Node getChildTagNode(Node parent, String name) { + NodeList children = parent.getChildNodes(); + int len = children.getLength(); + + for (int i = 0; i < len; i++) { + Node child = children.item(i); + + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (child.getNodeName().equals(name)) { + return child; + } + } + } + + return null; + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultDomParser.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultDomParser.java new file mode 100644 index 0000000000..b4d495a5fa --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultDomParser.java @@ -0,0 +1,137 @@ +package com.dianping.cat.home.alert.summary.transform; + +import static com.dianping.cat.home.alert.summary.Constants.ENTITY_ALERT; +import static com.dianping.cat.home.alert.summary.Constants.ENTITY_ALERT_SUMMARY; +import static com.dianping.cat.home.alert.summary.Constants.ENTITY_CATEGORY; + +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import com.dianping.cat.home.alert.summary.entity.Alert; +import com.dianping.cat.home.alert.summary.entity.AlertSummary; +import com.dianping.cat.home.alert.summary.entity.Category; + +public class DefaultDomParser implements IParser { + + protected Node getChildTagNode(Node parent, String name) { + NodeList children = parent.getChildNodes(); + int len = children.getLength(); + + for (int i = 0; i < len; i++) { + Node child = children.item(i); + + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (child.getNodeName().equals(name)) { + return child; + } + } + } + + return null; + } + + protected List getChildTagNodes(Node parent, String name) { + NodeList children = parent.getChildNodes(); + int len = children.getLength(); + List nodes = new ArrayList(len); + + for (int i = 0; i < len; i++) { + Node child = children.item(i); + + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (name == null || child.getNodeName().equals(name)) { + nodes.add(child); + } + } + } + + return nodes; + } + + protected Node getDocument(String xml) { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + + dbf.setIgnoringElementContentWhitespace(true); + dbf.setIgnoringComments(true); + + try { + DocumentBuilder db = dbf.newDocumentBuilder(); + + return db.parse(new InputSource(new StringReader(xml))); + } catch (Exception x) { + throw new RuntimeException(x); + } + } + + protected List getGrandChildTagNodes(Node parent, String name) { + Node child = getChildTagNode(parent, name); + NodeList children = child == null ? null : child.getChildNodes(); + int len = children == null ? 0 : children.getLength(); + List nodes = new ArrayList(len); + + for (int i = 0; i < len; i++) { + Node grandChild = children.item(i); + + if (grandChild.getNodeType() == Node.ELEMENT_NODE) { + nodes.add(grandChild); + } + } + + return nodes; + } + + public AlertSummary parse(Node node) { + return parse(new DefaultDomMaker(), new DefaultLinker(false), node); + } + + public AlertSummary parse(String xml) throws SAXException, IOException { + Node doc = getDocument(xml); + Node rootNode = getChildTagNode(doc, ENTITY_ALERT_SUMMARY); + + if (rootNode == null) { + throw new RuntimeException(String.format("alert-summary element(%s) is expected!", ENTITY_ALERT_SUMMARY)); + } + + return parse(new DefaultDomMaker(), new DefaultLinker(false), rootNode); + } + + public AlertSummary parse(IMaker maker, ILinker linker, Node node) { + AlertSummary alertSummary = maker.buildAlertSummary(node); + + if (node != null) { + AlertSummary parent = alertSummary; + + for (Node child : getChildTagNodes(node, ENTITY_CATEGORY)) { + Category category = maker.buildCategory(child); + + if (linker.onCategory(parent, category)) { + parseForCategory(maker, linker, category, child); + } + } + } + + return alertSummary; + } + + public void parseForAlert(IMaker maker, ILinker linker, Alert parent, Node node) { + } + + public void parseForCategory(IMaker maker, ILinker linker, Category parent, Node node) { + for (Node child : getChildTagNodes(node, ENTITY_ALERT)) { + Alert alert = maker.buildAlert(child); + + if (linker.onAlert(parent, alert)) { + parseForAlert(maker, linker, alert, child); + } + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultLinker.java new file mode 100644 index 0000000000..71e07c1187 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultLinker.java @@ -0,0 +1,45 @@ +package com.dianping.cat.home.alert.summary.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.alert.summary.entity.Alert; +import com.dianping.cat.home.alert.summary.entity.AlertSummary; +import com.dianping.cat.home.alert.summary.entity.Category; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onAlert(final Category parent, final Alert alert) { + parent.addAlert(alert); + return true; + } + + @Override + public boolean onCategory(final AlertSummary parent, final Category category) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addCategory(category); + } + }); + } else { + parent.addCategory(category); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..9236937edb --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultSaxMaker.java @@ -0,0 +1,120 @@ +package com.dianping.cat.home.alert.summary.transform; + +import static com.dianping.cat.home.alert.summary.Constants.ATTR_ALERT_DATE; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_ALERTTIME; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_CONTEXT; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_COUNT; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_METRIC; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_NAME; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_TYPE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.alert.summary.entity.Alert; +import com.dianping.cat.home.alert.summary.entity.AlertSummary; +import com.dianping.cat.home.alert.summary.entity.Category; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Alert buildAlert(Attributes attributes) { + String alertTime = attributes.getValue(ATTR_ALERTTIME); + String type = attributes.getValue(ATTR_TYPE); + String metric = attributes.getValue(ATTR_METRIC); + String context = attributes.getValue(ATTR_CONTEXT); + String domain = attributes.getValue(ATTR_DOMAIN); + String count = attributes.getValue(ATTR_COUNT); + Alert alert = new Alert(); + + if (alertTime != null) { + alert.setAlertTime(toDate(alertTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (type != null) { + alert.setType(type); + } + + if (metric != null) { + alert.setMetric(metric); + } + + if (context != null) { + alert.setContext(context); + } + + if (domain != null) { + alert.setDomain(domain); + } + + if (count != null) { + alert.setCount(convert(Integer.class, count, null)); + } + + return alert; + } + + @Override + public AlertSummary buildAlertSummary(Attributes attributes) { + String alertDate = attributes.getValue(ATTR_ALERT_DATE); + String domain = attributes.getValue(ATTR_DOMAIN); + AlertSummary alertSummary = new AlertSummary(); + + if (alertDate != null) { + alertSummary.setAlertDate(toDate(alertDate, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (domain != null) { + alertSummary.setDomain(domain); + } + + return alertSummary; + } + + @Override + public Category buildCategory(Attributes attributes) { + String name = attributes.getValue(ATTR_NAME); + Category category = new Category(name); + + return category; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..f71ee8f47e --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultSaxParser.java @@ -0,0 +1,258 @@ +package com.dianping.cat.home.alert.summary.transform; + +import static com.dianping.cat.home.alert.summary.Constants.ENTITY_ALERT; +import static com.dianping.cat.home.alert.summary.Constants.ENTITY_ALERT_SUMMARY; +import static com.dianping.cat.home.alert.summary.Constants.ENTITY_CATEGORY; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.alert.summary.IEntity; +import com.dianping.cat.home.alert.summary.entity.Alert; +import com.dianping.cat.home.alert.summary.entity.AlertSummary; +import com.dianping.cat.home.alert.summary.entity.Category; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static AlertSummary parse(InputStream in) throws SAXException, IOException { + return parseEntity(AlertSummary.class, new InputSource(removeBOM(in))); + } + + public static AlertSummary parse(Reader reader) throws SAXException, IOException { + return parseEntity(AlertSummary.class, new InputSource(removeBOM(reader))); + } + + public static AlertSummary parse(String xml) throws SAXException, IOException { + return parseEntity(AlertSummary.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForAlert(Alert parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForAlertSummary(AlertSummary parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_CATEGORY.equals(qName)) { + Category category = m_maker.buildCategory(attributes); + + m_linker.onCategory(parentObj, category); + m_objs.push(category); + } else { + throw new SAXException(String.format("Element(%s) is not expected under alert-summary!", qName)); + } + + m_tags.push(qName); + } + + private void parseForCategory(Category parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_ALERT.equals(qName)) { + Alert alert = m_maker.buildAlert(attributes); + + m_linker.onAlert(parentObj, alert); + m_objs.push(alert); + } else { + throw new SAXException(String.format("Element(%s) is not expected under category!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_ALERT_SUMMARY.equals(qName)) { + AlertSummary alertSummary = m_maker.buildAlertSummary(attributes); + + m_entity = alertSummary; + m_objs.push(alertSummary); + m_tags.push(qName); + } else if (ENTITY_CATEGORY.equals(qName)) { + Category category = m_maker.buildCategory(attributes); + + m_entity = category; + m_objs.push(category); + m_tags.push(qName); + } else if (ENTITY_ALERT.equals(qName)) { + Alert alert = m_maker.buildAlert(attributes); + + m_entity = alert; + m_objs.push(alert); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof AlertSummary) { + parseForAlertSummary((AlertSummary) parent, tag, qName, attributes); + } else if (parent instanceof Category) { + parseForCategory((Category) parent, tag, qName, attributes); + } else if (parent instanceof Alert) { + parseForAlert((Alert) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..81549b20c6 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/DefaultXmlBuilder.java @@ -0,0 +1,242 @@ +package com.dianping.cat.home.alert.summary.transform; + +import static com.dianping.cat.home.alert.summary.Constants.ATTR_ALERT_DATE; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_ALERTTIME; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_CONTEXT; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_COUNT; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_METRIC; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_NAME; +import static com.dianping.cat.home.alert.summary.Constants.ATTR_TYPE; +import static com.dianping.cat.home.alert.summary.Constants.ENTITY_ALERT; +import static com.dianping.cat.home.alert.summary.Constants.ENTITY_ALERT_SUMMARY; +import static com.dianping.cat.home.alert.summary.Constants.ENTITY_CATEGORY; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.alert.summary.IEntity; +import com.dianping.cat.home.alert.summary.IVisitor; +import com.dianping.cat.home.alert.summary.entity.Alert; +import com.dianping.cat.home.alert.summary.entity.AlertSummary; +import com.dianping.cat.home.alert.summary.entity.Category; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + @Override + public void visitAlert(Alert alert) { + startTag(ENTITY_ALERT, true, null, ATTR_ALERTTIME, toString(alert.getAlertTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_TYPE, alert.getType(), ATTR_METRIC, alert.getMetric(), ATTR_CONTEXT, alert.getContext(), ATTR_DOMAIN, alert.getDomain(), ATTR_COUNT, alert.getCount()); + } + + @Override + public void visitAlertSummary(AlertSummary alertSummary) { + startTag(ENTITY_ALERT_SUMMARY, null, ATTR_ALERT_DATE, toString(alertSummary.getAlertDate(), "yyyy-MM-dd HH:mm:ss"), ATTR_DOMAIN, alertSummary.getDomain()); + + if (!alertSummary.getCategories().isEmpty()) { + for (Category category : alertSummary.getCategories().values()) { + category.accept(m_visitor); + } + } + + endTag(ENTITY_ALERT_SUMMARY); + } + + @Override + public void visitCategory(Category category) { + startTag(ENTITY_CATEGORY, null, ATTR_NAME, category.getName()); + + if (!category.getAlerts().isEmpty()) { + for (Alert alert : category.getAlerts()) { + alert.accept(m_visitor); + } + } + + endTag(ENTITY_CATEGORY); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/ILinker.java new file mode 100644 index 0000000000..7a036d66c0 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.home.alert.summary.transform; + +import com.dianping.cat.home.alert.summary.entity.Alert; +import com.dianping.cat.home.alert.summary.entity.AlertSummary; +import com.dianping.cat.home.alert.summary.entity.Category; + +public interface ILinker { + + public boolean onAlert(Category parent, Alert alert); + + public boolean onCategory(AlertSummary parent, Category category); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/IMaker.java new file mode 100644 index 0000000000..0db0b76686 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/IMaker.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.alert.summary.transform; + +import com.dianping.cat.home.alert.summary.entity.Alert; +import com.dianping.cat.home.alert.summary.entity.AlertSummary; +import com.dianping.cat.home.alert.summary.entity.Category; + +public interface IMaker { + + public Alert buildAlert(T node); + + public AlertSummary buildAlertSummary(T node); + + public Category buildCategory(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/IParser.java new file mode 100644 index 0000000000..27c8059708 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/alert/summary/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.home.alert.summary.transform; + +import com.dianping.cat.home.alert.summary.entity.Alert; +import com.dianping.cat.home.alert.summary.entity.AlertSummary; +import com.dianping.cat.home.alert.summary.entity.Category; + +public interface IParser { + public AlertSummary parse(IMaker maker, ILinker linker, T node); + + public void parseForAlert(IMaker maker, ILinker linker, Alert parent, T node); + + public void parseForCategory(IMaker maker, ILinker linker, Category parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/business/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/business/BaseEntity.java new file mode 100644 index 0000000000..5352edbcea --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/business/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.business; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.business.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/business/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/business/Constants.java new file mode 100644 index 0000000000..b2f91e48ab --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/business/Constants.java @@ -0,0 +1,20 @@ +package com.dianping.cat.home.business; + +public class Constants { + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_ITEM_ID = "item-id"; + + public static final String ENTITY_BUSINESS_ITEM = "business-item"; + + public static final String ENTITY_BUSINESS_ITEMS = "business-items"; + + public static final String ENTITY_BUSINESS_TAG_CONFIG = "business-tag-config"; + + public static final String ENTITY_TAG = "tag"; + + public static final String ENTITY_TAGS = "tags"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/business/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/business/IEntity.java new file mode 100644 index 0000000000..dac1eb842a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/business/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.business; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/business/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/business/IVisitor.java new file mode 100644 index 0000000000..9d17033689 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/business/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.business; + +import com.dianping.cat.home.business.entity.BusinessItem; +import com.dianping.cat.home.business.entity.BusinessTagConfig; +import com.dianping.cat.home.business.entity.Tag; + +public interface IVisitor { + + public void visitBusinessItem(BusinessItem businessItem); + + public void visitBusinessTagConfig(BusinessTagConfig businessTagConfig); + + public void visitTag(Tag tag); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/business/entity/BusinessItem.java b/cat-home/src/main/java/com/dianping/cat/home/business/entity/BusinessItem.java new file mode 100644 index 0000000000..cc75279e58 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/business/entity/BusinessItem.java @@ -0,0 +1,78 @@ +package com.dianping.cat.home.business.entity; + +import com.dianping.cat.home.business.BaseEntity; +import com.dianping.cat.home.business.IVisitor; + +public class BusinessItem extends BaseEntity { + private String m_domain; + + private String m_itemId; + + public BusinessItem() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitBusinessItem(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof BusinessItem) { + BusinessItem _o = (BusinessItem) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + if (!equals(getItemId(), _o.getItemId())) { + return false; + } + + + return true; + } + + return false; + } + + public String getDomain() { + return m_domain; + } + + public String getItemId() { + return m_itemId; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + hash = hash * 31 + (m_itemId == null ? 0 : m_itemId.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(BusinessItem other) { + if (other.getDomain() != null) { + m_domain = other.getDomain(); + } + + if (other.getItemId() != null) { + m_itemId = other.getItemId(); + } + } + + public BusinessItem setDomain(String domain) { + m_domain = domain; + return this; + } + + public BusinessItem setItemId(String itemId) { + m_itemId = itemId; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/business/entity/BusinessTagConfig.java b/cat-home/src/main/java/com/dianping/cat/home/business/entity/BusinessTagConfig.java new file mode 100644 index 0000000000..aa1b392d0f --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/business/entity/BusinessTagConfig.java @@ -0,0 +1,66 @@ +package com.dianping.cat.home.business.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.business.BaseEntity; +import com.dianping.cat.home.business.IVisitor; + +public class BusinessTagConfig extends BaseEntity { + private Map m_tags = new LinkedHashMap(); + + public BusinessTagConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitBusinessTagConfig(this); + } + + public BusinessTagConfig addTag(Tag tag) { + m_tags.put(tag.getId(), tag); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof BusinessTagConfig) { + BusinessTagConfig _o = (BusinessTagConfig) obj; + + if (!equals(getTags(), _o.getTags())) { + return false; + } + + + return true; + } + + return false; + } + + public Tag findTag(String id) { + return m_tags.get(id); + } + + public Map getTags() { + return m_tags; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_tags == null ? 0 : m_tags.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(BusinessTagConfig other) { + } + + public Tag removeTag(String id) { + return m_tags.remove(id); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/business/entity/Tag.java b/cat-home/src/main/java/com/dianping/cat/home/business/entity/Tag.java new file mode 100644 index 0000000000..833765be20 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/business/entity/Tag.java @@ -0,0 +1,77 @@ +package com.dianping.cat.home.business.entity; + +import static com.dianping.cat.home.business.Constants.ATTR_ID; +import static com.dianping.cat.home.business.Constants.ENTITY_TAG; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.home.business.BaseEntity; +import com.dianping.cat.home.business.IVisitor; + +public class Tag extends BaseEntity { + private String m_id; + + private List m_businessItems = new ArrayList(); + + public Tag() { + } + + public Tag(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitTag(this); + } + + public Tag addBusinessItem(BusinessItem businessItem) { + m_businessItems.add(businessItem); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Tag) { + Tag _o = (Tag) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public List getBusinessItems() { + return m_businessItems; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Tag other) { + assertAttributeEquals(other, ENTITY_TAG, ATTR_ID, m_id, other.getId()); + + } + + public Tag setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultLinker.java new file mode 100644 index 0000000000..c54b6fbe12 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultLinker.java @@ -0,0 +1,45 @@ +package com.dianping.cat.home.business.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.business.entity.BusinessItem; +import com.dianping.cat.home.business.entity.BusinessTagConfig; +import com.dianping.cat.home.business.entity.Tag; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onBusinessItem(final Tag parent, final BusinessItem businessItem) { + parent.addBusinessItem(businessItem); + return true; + } + + @Override + public boolean onTag(final BusinessTagConfig parent, final Tag tag) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addTag(tag); + } + }); + } else { + parent.addTag(tag); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..54f7e95a2f --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultSaxMaker.java @@ -0,0 +1,73 @@ +package com.dianping.cat.home.business.transform; + +import static com.dianping.cat.home.business.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.business.Constants.ATTR_ID; +import static com.dianping.cat.home.business.Constants.ATTR_ITEM_ID; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.business.entity.BusinessItem; +import com.dianping.cat.home.business.entity.BusinessTagConfig; +import com.dianping.cat.home.business.entity.Tag; + +public class DefaultSaxMaker implements IMaker { + + @Override + public BusinessItem buildBusinessItem(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String itemId = attributes.getValue(ATTR_ITEM_ID); + BusinessItem businessItem = new BusinessItem(); + + if (domain != null) { + businessItem.setDomain(domain); + } + + if (itemId != null) { + businessItem.setItemId(itemId); + } + + return businessItem; + } + + @Override + public BusinessTagConfig buildBusinessTagConfig(Attributes attributes) { + BusinessTagConfig businessTagConfig = new BusinessTagConfig(); + + return businessTagConfig; + } + + @Override + public Tag buildTag(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Tag tag = new Tag(id); + + return tag; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..2df93e9524 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultSaxParser.java @@ -0,0 +1,250 @@ +package com.dianping.cat.home.business.transform; + +import static com.dianping.cat.home.business.Constants.ENTITY_BUSINESS_ITEM; +import static com.dianping.cat.home.business.Constants.ENTITY_BUSINESS_TAG_CONFIG; +import static com.dianping.cat.home.business.Constants.ENTITY_TAG; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.business.IEntity; +import com.dianping.cat.home.business.entity.BusinessItem; +import com.dianping.cat.home.business.entity.BusinessTagConfig; +import com.dianping.cat.home.business.entity.Tag; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static BusinessTagConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(BusinessTagConfig.class, new InputSource(removeBOM(in))); + } + + public static BusinessTagConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(BusinessTagConfig.class, new InputSource(removeBOM(reader))); + } + + public static BusinessTagConfig parse(String xml) throws SAXException, IOException { + return parseEntity(BusinessTagConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForBusinessItem(BusinessItem parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForBusinessTagConfig(BusinessTagConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_TAG.equals(qName)) { + Tag tag = m_maker.buildTag(attributes); + + m_linker.onTag(parentObj, tag); + m_objs.push(tag); + } else { + throw new SAXException(String.format("Element(%s) is not expected under business-tag-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseForTag(Tag parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_BUSINESS_ITEM.equals(qName)) { + BusinessItem businessItem = m_maker.buildBusinessItem(attributes); + + m_linker.onBusinessItem(parentObj, businessItem); + m_objs.push(businessItem); + } else { + throw new SAXException(String.format("Element(%s) is not expected under tag!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_BUSINESS_TAG_CONFIG.equals(qName)) { + BusinessTagConfig businessTagConfig = m_maker.buildBusinessTagConfig(attributes); + + m_entity = businessTagConfig; + m_objs.push(businessTagConfig); + m_tags.push(qName); + } else if (ENTITY_TAG.equals(qName)) { + Tag tag = m_maker.buildTag(attributes); + + m_entity = tag; + m_objs.push(tag); + m_tags.push(qName); + } else if (ENTITY_BUSINESS_ITEM.equals(qName)) { + BusinessItem businessItem = m_maker.buildBusinessItem(attributes); + + m_entity = businessItem; + m_objs.push(businessItem); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof BusinessTagConfig) { + parseForBusinessTagConfig((BusinessTagConfig) parent, tag, qName, attributes); + } else if (parent instanceof Tag) { + parseForTag((Tag) parent, tag, qName, attributes); + } else if (parent instanceof BusinessItem) { + parseForBusinessItem((BusinessItem) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..72b050b282 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/business/transform/DefaultXmlBuilder.java @@ -0,0 +1,229 @@ +package com.dianping.cat.home.business.transform; + +import static com.dianping.cat.home.business.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.business.Constants.ATTR_ID; +import static com.dianping.cat.home.business.Constants.ATTR_ITEM_ID; +import static com.dianping.cat.home.business.Constants.ENTITY_BUSINESS_ITEM; +import static com.dianping.cat.home.business.Constants.ENTITY_BUSINESS_TAG_CONFIG; +import static com.dianping.cat.home.business.Constants.ENTITY_TAG; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.business.IEntity; +import com.dianping.cat.home.business.IVisitor; +import com.dianping.cat.home.business.entity.BusinessItem; +import com.dianping.cat.home.business.entity.BusinessTagConfig; +import com.dianping.cat.home.business.entity.Tag; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitBusinessItem(BusinessItem businessItem) { + startTag(ENTITY_BUSINESS_ITEM, true, null, ATTR_DOMAIN, businessItem.getDomain(), ATTR_ITEM_ID, businessItem.getItemId()); + } + + @Override + public void visitBusinessTagConfig(BusinessTagConfig businessTagConfig) { + startTag(ENTITY_BUSINESS_TAG_CONFIG, null); + + if (!businessTagConfig.getTags().isEmpty()) { + for (Tag tag : businessTagConfig.getTags().values()) { + tag.accept(m_visitor); + } + } + + endTag(ENTITY_BUSINESS_TAG_CONFIG); + } + + @Override + public void visitTag(Tag tag) { + startTag(ENTITY_TAG, null, ATTR_ID, tag.getId()); + + if (!tag.getBusinessItems().isEmpty()) { + for (BusinessItem businessItem : tag.getBusinessItems()) { + businessItem.accept(m_visitor); + } + } + + endTag(ENTITY_TAG); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/business/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/business/transform/ILinker.java new file mode 100644 index 0000000000..7cf4dfa287 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/business/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.home.business.transform; + +import com.dianping.cat.home.business.entity.BusinessItem; +import com.dianping.cat.home.business.entity.BusinessTagConfig; +import com.dianping.cat.home.business.entity.Tag; + +public interface ILinker { + + public boolean onBusinessItem(Tag parent, BusinessItem businessItem); + + public boolean onTag(BusinessTagConfig parent, Tag tag); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/business/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/business/transform/IMaker.java new file mode 100644 index 0000000000..4ce246ffe6 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/business/transform/IMaker.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.business.transform; + +import com.dianping.cat.home.business.entity.BusinessItem; +import com.dianping.cat.home.business.entity.BusinessTagConfig; +import com.dianping.cat.home.business.entity.Tag; + +public interface IMaker { + + public BusinessItem buildBusinessItem(T node); + + public BusinessTagConfig buildBusinessTagConfig(T node); + + public Tag buildTag(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/business/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/business/transform/IParser.java new file mode 100644 index 0000000000..4ad2a0c5d5 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/business/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.home.business.transform; + +import com.dianping.cat.home.business.entity.BusinessItem; +import com.dianping.cat.home.business.entity.BusinessTagConfig; +import com.dianping.cat.home.business.entity.Tag; + +public interface IParser { + public BusinessTagConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForBusinessItem(IMaker maker, ILinker linker, BusinessItem parent, T node); + + public void parseForTag(IMaker maker, ILinker linker, Tag parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/AlertSummary.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/AlertSummary.java new file mode 100644 index 0000000000..5ead595a55 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/AlertSummary.java @@ -0,0 +1,90 @@ +package com.dianping.cat.home.dal.report; + + +public class AlertSummary { + private int m_id; + + private String m_domain; + + private java.util.Date m_alertTime; + + private String m_content; + + private java.util.Date m_creationDate; + + private int m_keyId; + public void afterLoad() { + m_keyId = m_id; + } + + public java.util.Date getAlertTime() { + return m_alertTime; + } + + public String getContent() { + return m_content; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public String getDomain() { + return m_domain; + } + + public int getId() { + return m_id; + } + + public int getKeyId() { + return m_keyId; + } + + public AlertSummary setAlertTime(java.util.Date alertTime) { + m_alertTime = alertTime; + return this; + } + + public AlertSummary setContent(String content) { + m_content = content; + return this; + } + + public AlertSummary setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public AlertSummary setDomain(String domain) { + m_domain = domain; + return this; + } + + public AlertSummary setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public AlertSummary setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("AlertSummary["); + sb.append("alert-time: ").append(m_alertTime); + sb.append(", content: ").append(m_content); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", domain: ").append(m_domain); + sb.append(", id: ").append(m_id); + sb.append(", key-id: ").append(m_keyId); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/Alteration.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/Alteration.java new file mode 100644 index 0000000000..b778f07b0a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/Alteration.java @@ -0,0 +1,222 @@ +package com.dianping.cat.home.dal.report; + + +public class Alteration { + private int m_id; + + private String m_type; + + private String m_title; + + private String m_domain; + + private String m_hostname; + + private String m_ip; + + private java.util.Date m_date; + + private String m_user; + + private String m_altGroup; + + private String m_content; + + private String m_url; + + private int m_status; + + private java.util.Date m_creationDate; + + private int m_keyId; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private String[] m_types; + public void afterLoad() { + m_keyId = m_id; + } + + public String getAltGroup() { + return m_altGroup; + } + + public String getContent() { + return m_content; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public java.util.Date getDate() { + return m_date; + } + + public String getDomain() { + return m_domain; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public String getHostname() { + return m_hostname; + } + + public int getId() { + return m_id; + } + + public String getIp() { + return m_ip; + } + + public int getKeyId() { + return m_keyId; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + public int getStatus() { + return m_status; + } + + public String getTitle() { + return m_title; + } + + public String getType() { + return m_type; + } + + public String[] getTypes() { + return m_types; + } + + public String getUrl() { + return m_url; + } + + public String getUser() { + return m_user; + } + + public Alteration setAltGroup(String altGroup) { + m_altGroup = altGroup; + return this; + } + + public Alteration setContent(String content) { + m_content = content; + return this; + } + + public Alteration setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public Alteration setDate(java.util.Date date) { + m_date = date; + return this; + } + + public Alteration setDomain(String domain) { + m_domain = domain; + return this; + } + + public Alteration setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public Alteration setHostname(String hostname) { + m_hostname = hostname; + return this; + } + + public Alteration setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public Alteration setIp(String ip) { + m_ip = ip; + return this; + } + + public Alteration setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public Alteration setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + + public Alteration setStatus(int status) { + m_status = status; + return this; + } + + public Alteration setTitle(String title) { + m_title = title; + return this; + } + + public Alteration setType(String type) { + m_type = type; + return this; + } + + public Alteration setTypes(String[] types) { + m_types = types; + return this; + } + + public Alteration setUrl(String url) { + m_url = url; + return this; + } + + public Alteration setUser(String user) { + m_user = user; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("Alteration["); + sb.append("alt-group: ").append(m_altGroup); + sb.append(", content: ").append(m_content); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", date: ").append(m_date); + sb.append(", domain: ").append(m_domain); + sb.append(", end-time: ").append(m_endTime); + sb.append(", hostname: ").append(m_hostname); + sb.append(", id: ").append(m_id); + sb.append(", ip: ").append(m_ip); + sb.append(", key-id: ").append(m_keyId); + sb.append(", start-time: ").append(m_startTime); + sb.append(", status: ").append(m_status); + sb.append(", title: ").append(m_title); + sb.append(", type: ").append(m_type); + sb.append(", types: ").append(m_types == null ? null : java.util.Arrays.asList(m_types)); + sb.append(", url: ").append(m_url); + sb.append(", user: ").append(m_user); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/Baseline.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/Baseline.java new file mode 100644 index 0000000000..5e63a25fa6 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/Baseline.java @@ -0,0 +1,114 @@ +package com.dianping.cat.home.dal.report; + + +public class Baseline { + private int m_id; + + private String m_reportName; + + private String m_indexKey; + + private java.util.Date m_reportPeriod; + + private byte[] m_data; + + private java.util.Date m_creationDate; + + private int m_keyId; + + private double[] m_dataInDoubleArray; + public void afterLoad() { + m_keyId = m_id; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public byte[] getData() { + return m_data; + } + + public double[] getDataInDoubleArray() { + return m_dataInDoubleArray; + } + + public int getId() { + return m_id; + } + + public String getIndexKey() { + return m_indexKey; + } + + public int getKeyId() { + return m_keyId; + } + + public String getReportName() { + return m_reportName; + } + + public java.util.Date getReportPeriod() { + return m_reportPeriod; + } + + public Baseline setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public Baseline setData(byte[] data) { + m_data = data; + return this; + } + + public Baseline setDataInDoubleArray(double[] dataInDoubleArray) { + m_dataInDoubleArray = dataInDoubleArray; + return this; + } + + public Baseline setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public Baseline setIndexKey(String indexKey) { + m_indexKey = indexKey; + return this; + } + + public Baseline setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public Baseline setReportName(String reportName) { + m_reportName = reportName; + return this; + } + + public Baseline setReportPeriod(java.util.Date reportPeriod) { + m_reportPeriod = reportPeriod; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("Baseline["); + sb.append("creation-date: ").append(m_creationDate); + sb.append(", data: ").append(m_data == null ? null : java.util.Arrays.asList(m_data)); + sb.append(", dataInDoubleArray: ").append(m_dataInDoubleArray == null ? null : java.util.Arrays.asList(m_dataInDoubleArray)); + sb.append(", id: ").append(m_id); + sb.append(", index-key: ").append(m_indexKey); + sb.append(", key-id: ").append(m_keyId); + sb.append(", report-name: ").append(m_reportName); + sb.append(", report-period: ").append(m_reportPeriod); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/ConfigModification.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/ConfigModification.java new file mode 100644 index 0000000000..f1122f9700 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/ConfigModification.java @@ -0,0 +1,114 @@ +package com.dianping.cat.home.dal.report; + + +public class ConfigModification { + private int m_id; + + private String m_userName; + + private String m_accountName; + + private String m_actionName; + + private String m_argument; + + private java.util.Date m_date; + + private java.util.Date m_creationDate; + + private int m_keyId; + public void afterLoad() { + m_keyId = m_id; + } + + public String getAccountName() { + return m_accountName; + } + + public String getActionName() { + return m_actionName; + } + + public String getArgument() { + return m_argument; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public java.util.Date getDate() { + return m_date; + } + + public int getId() { + return m_id; + } + + public int getKeyId() { + return m_keyId; + } + + public String getUserName() { + return m_userName; + } + + public ConfigModification setAccountName(String accountName) { + m_accountName = accountName; + return this; + } + + public ConfigModification setActionName(String actionName) { + m_actionName = actionName; + return this; + } + + public ConfigModification setArgument(String argument) { + m_argument = argument; + return this; + } + + public ConfigModification setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public ConfigModification setDate(java.util.Date date) { + m_date = date; + return this; + } + + public ConfigModification setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public ConfigModification setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public ConfigModification setUserName(String userName) { + m_userName = userName; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("ConfigModification["); + sb.append("account-name: ").append(m_accountName); + sb.append(", action-name: ").append(m_actionName); + sb.append(", argument: ").append(m_argument); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", date: ").append(m_date); + sb.append(", id: ").append(m_id); + sb.append(", key-id: ").append(m_keyId); + sb.append(", user-name: ").append(m_userName); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricGraph.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricGraph.java new file mode 100644 index 0000000000..d0e4f7f01d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricGraph.java @@ -0,0 +1,102 @@ +package com.dianping.cat.home.dal.report; + + +public class MetricGraph { + private int m_id; + + private long m_graphId; + + private String m_content; + + private java.util.Date m_creationDate; + + private java.util.Date m_updatetime; + + private int m_keyId; + + private int m_number; + public void afterLoad() { + m_keyId = m_id; + } + + public String getContent() { + return m_content; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public long getGraphId() { + return m_graphId; + } + + public int getId() { + return m_id; + } + + public int getKeyId() { + return m_keyId; + } + + public int getNumber() { + return m_number; + } + + public java.util.Date getUpdatetime() { + return m_updatetime; + } + + public MetricGraph setContent(String content) { + m_content = content; + return this; + } + + public MetricGraph setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public MetricGraph setGraphId(long graphId) { + m_graphId = graphId; + return this; + } + + public MetricGraph setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public MetricGraph setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public MetricGraph setNumber(int number) { + m_number = number; + return this; + } + + public MetricGraph setUpdatetime(java.util.Date updatetime) { + m_updatetime = updatetime; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("MetricGraph["); + sb.append("content: ").append(m_content); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", graph-id: ").append(m_graphId); + sb.append(", id: ").append(m_id); + sb.append(", key-id: ").append(m_keyId); + sb.append(", number: ").append(m_number); + sb.append(", updatetime: ").append(m_updatetime); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricScreen.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricScreen.java new file mode 100644 index 0000000000..89a33fe29b --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricScreen.java @@ -0,0 +1,138 @@ +package com.dianping.cat.home.dal.report; + + +public class MetricScreen { + private int m_id; + + private String m_name; + + private String m_graphName; + + private String m_view; + + private String m_endPoints; + + private String m_measurements; + + private String m_content; + + private java.util.Date m_creationDate; + + private java.util.Date m_updatetime; + + private int m_keyId; + public void afterLoad() { + m_keyId = m_id; + } + + public String getContent() { + return m_content; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public String getEndPoints() { + return m_endPoints; + } + + public String getGraphName() { + return m_graphName; + } + + public int getId() { + return m_id; + } + + public int getKeyId() { + return m_keyId; + } + + public String getMeasurements() { + return m_measurements; + } + + public String getName() { + return m_name; + } + + public java.util.Date getUpdatetime() { + return m_updatetime; + } + + public String getView() { + return m_view; + } + + public MetricScreen setContent(String content) { + m_content = content; + return this; + } + + public MetricScreen setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public MetricScreen setEndPoints(String endPoints) { + m_endPoints = endPoints; + return this; + } + + public MetricScreen setGraphName(String graphName) { + m_graphName = graphName; + return this; + } + + public MetricScreen setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public MetricScreen setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public MetricScreen setMeasurements(String measurements) { + m_measurements = measurements; + return this; + } + + public MetricScreen setName(String name) { + m_name = name; + return this; + } + + public MetricScreen setUpdatetime(java.util.Date updatetime) { + m_updatetime = updatetime; + return this; + } + + public MetricScreen setView(String view) { + m_view = view; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("MetricScreen["); + sb.append("content: ").append(m_content); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", end-points: ").append(m_endPoints); + sb.append(", graph-name: ").append(m_graphName); + sb.append(", id: ").append(m_id); + sb.append(", key-id: ").append(m_keyId); + sb.append(", measurements: ").append(m_measurements); + sb.append(", name: ").append(m_name); + sb.append(", updatetime: ").append(m_updatetime); + sb.append(", view: ").append(m_view); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/Overload.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/Overload.java new file mode 100644 index 0000000000..4065d8d2b3 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/Overload.java @@ -0,0 +1,162 @@ +package com.dianping.cat.home.dal.report; + + +public class Overload { + private int m_id; + + private int m_reportId; + + private int m_reportType; + + private double m_reportSize; + + private java.util.Date m_period; + + private java.util.Date m_creationDate; + + private int m_keyId; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private int m_type; + + private int m_maxId; + + private int m_count; + public void afterLoad() { + m_keyId = m_id; + } + + public int getCount() { + return m_count; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public int getId() { + return m_id; + } + + public int getKeyId() { + return m_keyId; + } + + public int getMaxId() { + return m_maxId; + } + + public java.util.Date getPeriod() { + return m_period; + } + + public int getReportId() { + return m_reportId; + } + + public double getReportSize() { + return m_reportSize; + } + + public int getReportType() { + return m_reportType; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + public int getType() { + return m_type; + } + + public Overload setCount(int count) { + m_count = count; + return this; + } + + public Overload setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public Overload setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public Overload setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public Overload setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public Overload setMaxId(int maxId) { + m_maxId = maxId; + return this; + } + + public Overload setPeriod(java.util.Date period) { + m_period = period; + return this; + } + + public Overload setReportId(int reportId) { + m_reportId = reportId; + return this; + } + + public Overload setReportSize(double reportSize) { + m_reportSize = reportSize; + return this; + } + + public Overload setReportType(int reportType) { + m_reportType = reportType; + return this; + } + + public Overload setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + + public Overload setType(int type) { + m_type = type; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("Overload["); + sb.append("count: ").append(m_count); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", end-time: ").append(m_endTime); + sb.append(", id: ").append(m_id); + sb.append(", key-id: ").append(m_keyId); + sb.append(", max-id: ").append(m_maxId); + sb.append(", period: ").append(m_period); + sb.append(", report-id: ").append(m_reportId); + sb.append(", report-size: ").append(m_reportSize); + sb.append(", report-type: ").append(m_reportType); + sb.append(", start-time: ").append(m_startTime); + sb.append(", type: ").append(m_type); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/TopologyGraph.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/TopologyGraph.java new file mode 100644 index 0000000000..8e0cbf5f82 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/TopologyGraph.java @@ -0,0 +1,102 @@ +package com.dianping.cat.home.dal.report; + + +public class TopologyGraph { + private int m_id; + + private String m_ip; + + private java.util.Date m_period; + + private int m_type; + + private byte[] m_content; + + private java.util.Date m_creationDate; + + private int m_keyId; + public void afterLoad() { + m_keyId = m_id; + } + + public byte[] getContent() { + return m_content; + } + + public java.util.Date getCreationDate() { + return m_creationDate; + } + + public int getId() { + return m_id; + } + + public String getIp() { + return m_ip; + } + + public int getKeyId() { + return m_keyId; + } + + public java.util.Date getPeriod() { + return m_period; + } + + public int getType() { + return m_type; + } + + public TopologyGraph setContent(byte[] content) { + m_content = content; + return this; + } + + public TopologyGraph setCreationDate(java.util.Date creationDate) { + m_creationDate = creationDate; + return this; + } + + public TopologyGraph setId(int id) { + m_id = id; + m_keyId = id; + return this; + } + + public TopologyGraph setIp(String ip) { + m_ip = ip; + return this; + } + + public TopologyGraph setKeyId(int keyId) { + m_keyId = keyId; + return this; + } + + public TopologyGraph setPeriod(java.util.Date period) { + m_period = period; + return this; + } + + public TopologyGraph setType(int type) { + m_type = type; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + + sb.append("TopologyGraph["); + sb.append("content: ").append(m_content == null ? null : java.util.Arrays.asList(m_content)); + sb.append(", creation-date: ").append(m_creationDate); + sb.append(", id: ").append(m_id); + sb.append(", ip: ").append(m_ip); + sb.append(", key-id: ").append(m_keyId); + sb.append(", period: ").append(m_period); + sb.append(", type: ").append(m_type); + sb.append("]"); + return sb.toString(); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/BaseEntity.java new file mode 100644 index 0000000000..b1a0cda1d7 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.dependency.config; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.dependency.config.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/Constants.java new file mode 100644 index 0000000000..922021047f --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/Constants.java @@ -0,0 +1,48 @@ +package com.dianping.cat.home.dependency.config; + +public class Constants { + + public static final String ATTR_DEFAULT_ERROR_RESPONSE_TIME = "default-error-response-time"; + + public static final String ATTR_DEFAULT_ERROR_THRESHOLD = "default-error-threshold"; + + public static final String ATTR_DEFAULT_MIN_COUNT_THRESHOLD = "default-min-count-threshold"; + + public static final String ATTR_DEFAULT_WARNING_RESPONSE_TIME = "default-warning-response-time"; + + public static final String ATTR_DEFAULT_WARNING_THRESHOLD = "default-warning-threshold"; + + public static final String ATTR_ERROR_RESPONSE_TIME = "error-response-time"; + + public static final String ATTR_ERROR_THRESHOLD = "error-threshold"; + + public static final String ATTR_FROM = "from"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_KEY = "key"; + + public static final String ATTR_MIN_COUNT_THRESHOLD = "min-count-threshold"; + + public static final String ATTR_TO = "to"; + + public static final String ATTR_TYPE = "type"; + + public static final String ATTR_WARNING_RESPONSE_TIME = "warning-response-time"; + + public static final String ATTR_WARNING_THRESHOLD = "warning-threshold"; + + public static final String ENTITY_DOMAIN_CONFIG = "domain-config"; + + public static final String ENTITY_DOMAINCONFIGS = "domainConfigs"; + + public static final String ENTITY_EDGE_CONFIG = "edge-config"; + + public static final String ENTITY_EDGE_CONFIGS = "edge-configs"; + + public static final String ENTITY_NODE_CONFIG = "node-config"; + + public static final String ENTITY_NODE_CONFIGS = "node-configs"; + + public static final String ENTITY_TOPOLOGY_GRAPH_CONFIG = "topology-graph-config"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/IEntity.java new file mode 100644 index 0000000000..0cfb6725a4 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.dependency.config; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/IVisitor.java new file mode 100644 index 0000000000..290827bc29 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/IVisitor.java @@ -0,0 +1,17 @@ +package com.dianping.cat.home.dependency.config; + +import com.dianping.cat.home.dependency.config.entity.DomainConfig; +import com.dianping.cat.home.dependency.config.entity.EdgeConfig; +import com.dianping.cat.home.dependency.config.entity.NodeConfig; +import com.dianping.cat.home.dependency.config.entity.TopologyGraphConfig; + +public interface IVisitor { + + public void visitDomainConfig(DomainConfig domainConfig); + + public void visitEdgeConfig(EdgeConfig edgeConfig); + + public void visitNodeConfig(NodeConfig nodeConfig); + + public void visitTopologyGraphConfig(TopologyGraphConfig topologyGraphConfig); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/DomainConfig.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/DomainConfig.java new file mode 100644 index 0000000000..bcfd094ade --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/DomainConfig.java @@ -0,0 +1,127 @@ +package com.dianping.cat.home.dependency.config.entity; + +import static com.dianping.cat.home.dependency.config.Constants.ATTR_ID; +import static com.dianping.cat.home.dependency.config.Constants.ENTITY_DOMAIN_CONFIG; + +import com.dianping.cat.home.dependency.config.BaseEntity; +import com.dianping.cat.home.dependency.config.IVisitor; + +public class DomainConfig extends BaseEntity { + private String m_id; + + private int m_warningThreshold; + + private int m_errorThreshold; + + private double m_warningResponseTime; + + private double m_errorResponseTime; + + private int m_minCountThreshold = 100; + + public DomainConfig() { + } + + public DomainConfig(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomainConfig(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DomainConfig) { + DomainConfig _o = (DomainConfig) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public double getErrorResponseTime() { + return m_errorResponseTime; + } + + public int getErrorThreshold() { + return m_errorThreshold; + } + + public String getId() { + return m_id; + } + + public int getMinCountThreshold() { + return m_minCountThreshold; + } + + public double getWarningResponseTime() { + return m_warningResponseTime; + } + + public int getWarningThreshold() { + return m_warningThreshold; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(DomainConfig other) { + assertAttributeEquals(other, ENTITY_DOMAIN_CONFIG, ATTR_ID, m_id, other.getId()); + + m_warningThreshold = other.getWarningThreshold(); + + m_errorThreshold = other.getErrorThreshold(); + + m_warningResponseTime = other.getWarningResponseTime(); + + m_errorResponseTime = other.getErrorResponseTime(); + + m_minCountThreshold = other.getMinCountThreshold(); + } + + public DomainConfig setErrorResponseTime(double errorResponseTime) { + m_errorResponseTime = errorResponseTime; + return this; + } + + public DomainConfig setErrorThreshold(int errorThreshold) { + m_errorThreshold = errorThreshold; + return this; + } + + public DomainConfig setId(String id) { + m_id = id; + return this; + } + + public DomainConfig setMinCountThreshold(int minCountThreshold) { + m_minCountThreshold = minCountThreshold; + return this; + } + + public DomainConfig setWarningResponseTime(double warningResponseTime) { + m_warningResponseTime = warningResponseTime; + return this; + } + + public DomainConfig setWarningThreshold(int warningThreshold) { + m_warningThreshold = warningThreshold; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/EdgeConfig.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/EdgeConfig.java new file mode 100644 index 0000000000..87165a6915 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/EdgeConfig.java @@ -0,0 +1,172 @@ +package com.dianping.cat.home.dependency.config.entity; + +import static com.dianping.cat.home.dependency.config.Constants.ATTR_KEY; +import static com.dianping.cat.home.dependency.config.Constants.ENTITY_EDGE_CONFIG; + +import com.dianping.cat.home.dependency.config.BaseEntity; +import com.dianping.cat.home.dependency.config.IVisitor; + +public class EdgeConfig extends BaseEntity { + private String m_key; + + private String m_type; + + private String m_from; + + private String m_to; + + private int m_warningThreshold; + + private int m_errorThreshold; + + private double m_warningResponseTime; + + private double m_errorResponseTime; + + private int m_minCountThreshold = 100; + + public EdgeConfig() { + } + + public EdgeConfig(String key) { + m_key = key; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitEdgeConfig(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof EdgeConfig) { + EdgeConfig _o = (EdgeConfig) obj; + + if (!equals(getKey(), _o.getKey())) { + return false; + } + + return true; + } + + return false; + } + + public double getErrorResponseTime() { + return m_errorResponseTime; + } + + public int getErrorThreshold() { + return m_errorThreshold; + } + + public String getFrom() { + return m_from; + } + + public String getKey() { + return m_key; + } + + public int getMinCountThreshold() { + return m_minCountThreshold; + } + + public String getTo() { + return m_to; + } + + public String getType() { + return m_type; + } + + public double getWarningResponseTime() { + return m_warningResponseTime; + } + + public int getWarningThreshold() { + return m_warningThreshold; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_key == null ? 0 : m_key.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(EdgeConfig other) { + assertAttributeEquals(other, ENTITY_EDGE_CONFIG, ATTR_KEY, m_key, other.getKey()); + + if (other.getType() != null) { + m_type = other.getType(); + } + + if (other.getFrom() != null) { + m_from = other.getFrom(); + } + + if (other.getTo() != null) { + m_to = other.getTo(); + } + + m_warningThreshold = other.getWarningThreshold(); + + m_errorThreshold = other.getErrorThreshold(); + + m_warningResponseTime = other.getWarningResponseTime(); + + m_errorResponseTime = other.getErrorResponseTime(); + + m_minCountThreshold = other.getMinCountThreshold(); + } + + public EdgeConfig setErrorResponseTime(double errorResponseTime) { + m_errorResponseTime = errorResponseTime; + return this; + } + + public EdgeConfig setErrorThreshold(int errorThreshold) { + m_errorThreshold = errorThreshold; + return this; + } + + public EdgeConfig setFrom(String from) { + m_from = from; + return this; + } + + public EdgeConfig setKey(String key) { + m_key = key; + return this; + } + + public EdgeConfig setMinCountThreshold(int minCountThreshold) { + m_minCountThreshold = minCountThreshold; + return this; + } + + public EdgeConfig setTo(String to) { + m_to = to; + return this; + } + + public EdgeConfig setType(String type) { + m_type = type; + return this; + } + + public EdgeConfig setWarningResponseTime(double warningResponseTime) { + m_warningResponseTime = warningResponseTime; + return this; + } + + public EdgeConfig setWarningThreshold(int warningThreshold) { + m_warningThreshold = warningThreshold; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/NodeConfig.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/NodeConfig.java new file mode 100644 index 0000000000..87f4410ddc --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/NodeConfig.java @@ -0,0 +1,174 @@ +package com.dianping.cat.home.dependency.config.entity; + +import static com.dianping.cat.home.dependency.config.Constants.ATTR_TYPE; +import static com.dianping.cat.home.dependency.config.Constants.ENTITY_NODE_CONFIG; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.dependency.config.BaseEntity; +import com.dianping.cat.home.dependency.config.IVisitor; + +public class NodeConfig extends BaseEntity { + private String m_type; + + private Integer m_defaultWarningThreshold; + + private Integer m_defaultErrorThreshold; + + private Double m_defaultWarningResponseTime; + + private Double m_defaultErrorResponseTime; + + private Map m_domainConfigs = new LinkedHashMap(); + + private int m_defaultMinCountThreshold = 100; + + public NodeConfig() { + } + + public NodeConfig(String type) { + m_type = type; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitNodeConfig(this); + } + + public NodeConfig addDomainConfig(DomainConfig domainConfig) { + m_domainConfigs.put(domainConfig.getId(), domainConfig); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof NodeConfig) { + NodeConfig _o = (NodeConfig) obj; + + if (!equals(getType(), _o.getType())) { + return false; + } + + return true; + } + + return false; + } + + public DomainConfig findDomainConfig(String id) { + return m_domainConfigs.get(id); + } + + public DomainConfig findOrCreateDomainConfig(String id) { + DomainConfig domainConfig = m_domainConfigs.get(id); + + if (domainConfig == null) { + synchronized (m_domainConfigs) { + domainConfig = m_domainConfigs.get(id); + + if (domainConfig == null) { + domainConfig = new DomainConfig(id); + m_domainConfigs.put(id, domainConfig); + } + } + } + + return domainConfig; + } + + public Double getDefaultErrorResponseTime() { + return m_defaultErrorResponseTime; + } + + public Integer getDefaultErrorThreshold() { + return m_defaultErrorThreshold; + } + + public int getDefaultMinCountThreshold() { + return m_defaultMinCountThreshold; + } + + public Double getDefaultWarningResponseTime() { + return m_defaultWarningResponseTime; + } + + public Integer getDefaultWarningThreshold() { + return m_defaultWarningThreshold; + } + + public Map getDomainConfigs() { + return m_domainConfigs; + } + + public String getType() { + return m_type; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_type == null ? 0 : m_type.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(NodeConfig other) { + assertAttributeEquals(other, ENTITY_NODE_CONFIG, ATTR_TYPE, m_type, other.getType()); + + if (other.getDefaultWarningThreshold() != null) { + m_defaultWarningThreshold = other.getDefaultWarningThreshold(); + } + + if (other.getDefaultErrorThreshold() != null) { + m_defaultErrorThreshold = other.getDefaultErrorThreshold(); + } + + if (other.getDefaultWarningResponseTime() != null) { + m_defaultWarningResponseTime = other.getDefaultWarningResponseTime(); + } + + if (other.getDefaultErrorResponseTime() != null) { + m_defaultErrorResponseTime = other.getDefaultErrorResponseTime(); + } + + m_defaultMinCountThreshold = other.getDefaultMinCountThreshold(); + } + + public DomainConfig removeDomainConfig(String id) { + return m_domainConfigs.remove(id); + } + + public NodeConfig setDefaultErrorResponseTime(Double defaultErrorResponseTime) { + m_defaultErrorResponseTime = defaultErrorResponseTime; + return this; + } + + public NodeConfig setDefaultErrorThreshold(Integer defaultErrorThreshold) { + m_defaultErrorThreshold = defaultErrorThreshold; + return this; + } + + public NodeConfig setDefaultMinCountThreshold(int defaultMinCountThreshold) { + m_defaultMinCountThreshold = defaultMinCountThreshold; + return this; + } + + public NodeConfig setDefaultWarningResponseTime(Double defaultWarningResponseTime) { + m_defaultWarningResponseTime = defaultWarningResponseTime; + return this; + } + + public NodeConfig setDefaultWarningThreshold(Integer defaultWarningThreshold) { + m_defaultWarningThreshold = defaultWarningThreshold; + return this; + } + + public NodeConfig setType(String type) { + m_type = type; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/TopologyGraphConfig.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/TopologyGraphConfig.java new file mode 100644 index 0000000000..c700656b57 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/entity/TopologyGraphConfig.java @@ -0,0 +1,124 @@ +package com.dianping.cat.home.dependency.config.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.dependency.config.BaseEntity; +import com.dianping.cat.home.dependency.config.IVisitor; + +public class TopologyGraphConfig extends BaseEntity { + private Map m_nodeConfigs = new LinkedHashMap(); + + private Map m_edgeConfigs = new LinkedHashMap(); + + public TopologyGraphConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitTopologyGraphConfig(this); + } + + public TopologyGraphConfig addEdgeConfig(EdgeConfig edgeConfig) { + m_edgeConfigs.put(edgeConfig.getKey(), edgeConfig); + return this; + } + + public TopologyGraphConfig addNodeConfig(NodeConfig nodeConfig) { + m_nodeConfigs.put(nodeConfig.getType(), nodeConfig); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TopologyGraphConfig) { + TopologyGraphConfig _o = (TopologyGraphConfig) obj; + + if (!equals(getNodeConfigs(), _o.getNodeConfigs())) { + return false; + } + + if (!equals(getEdgeConfigs(), _o.getEdgeConfigs())) { + return false; + } + + + return true; + } + + return false; + } + + public EdgeConfig findEdgeConfig(String key) { + return m_edgeConfigs.get(key); + } + + public NodeConfig findNodeConfig(String type) { + return m_nodeConfigs.get(type); + } + + public EdgeConfig findOrCreateEdgeConfig(String key) { + EdgeConfig edgeConfig = m_edgeConfigs.get(key); + + if (edgeConfig == null) { + synchronized (m_edgeConfigs) { + edgeConfig = m_edgeConfigs.get(key); + + if (edgeConfig == null) { + edgeConfig = new EdgeConfig(key); + m_edgeConfigs.put(key, edgeConfig); + } + } + } + + return edgeConfig; + } + + public NodeConfig findOrCreateNodeConfig(String type) { + NodeConfig nodeConfig = m_nodeConfigs.get(type); + + if (nodeConfig == null) { + synchronized (m_nodeConfigs) { + nodeConfig = m_nodeConfigs.get(type); + + if (nodeConfig == null) { + nodeConfig = new NodeConfig(type); + m_nodeConfigs.put(type, nodeConfig); + } + } + } + + return nodeConfig; + } + + public Map getEdgeConfigs() { + return m_edgeConfigs; + } + + public Map getNodeConfigs() { + return m_nodeConfigs; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_nodeConfigs == null ? 0 : m_nodeConfigs.hashCode()); + hash = hash * 31 + (m_edgeConfigs == null ? 0 : m_edgeConfigs.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(TopologyGraphConfig other) { + } + + public EdgeConfig removeEdgeConfig(String key) { + return m_edgeConfigs.remove(key); + } + + public NodeConfig removeNodeConfig(String type) { + return m_nodeConfigs.remove(type); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/BaseVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/BaseVisitor.java new file mode 100644 index 0000000000..d73f64494f --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/BaseVisitor.java @@ -0,0 +1,35 @@ +package com.dianping.cat.home.dependency.config.transform; + +import com.dianping.cat.home.dependency.config.IVisitor; +import com.dianping.cat.home.dependency.config.entity.DomainConfig; +import com.dianping.cat.home.dependency.config.entity.EdgeConfig; +import com.dianping.cat.home.dependency.config.entity.NodeConfig; +import com.dianping.cat.home.dependency.config.entity.TopologyGraphConfig; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitDomainConfig(DomainConfig domainConfig) { + } + + @Override + public void visitEdgeConfig(EdgeConfig edgeConfig) { + } + + @Override + public void visitNodeConfig(NodeConfig nodeConfig) { + for (DomainConfig domainConfig : nodeConfig.getDomainConfigs().values()) { + visitDomainConfig(domainConfig); + } + } + + @Override + public void visitTopologyGraphConfig(TopologyGraphConfig topologyGraphConfig) { + for (NodeConfig nodeConfig : topologyGraphConfig.getNodeConfigs().values()) { + visitNodeConfig(nodeConfig); + } + + for (EdgeConfig edgeConfig : topologyGraphConfig.getEdgeConfigs().values()) { + visitEdgeConfig(edgeConfig); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultLinker.java new file mode 100644 index 0000000000..adf93b2eed --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultLinker.java @@ -0,0 +1,72 @@ +package com.dianping.cat.home.dependency.config.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.dependency.config.entity.DomainConfig; +import com.dianping.cat.home.dependency.config.entity.EdgeConfig; +import com.dianping.cat.home.dependency.config.entity.NodeConfig; +import com.dianping.cat.home.dependency.config.entity.TopologyGraphConfig; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDomainConfig(final NodeConfig parent, final DomainConfig domainConfig) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDomainConfig(domainConfig); + } + }); + } else { + parent.addDomainConfig(domainConfig); + } + + return true; + } + + @Override + public boolean onEdgeConfig(final TopologyGraphConfig parent, final EdgeConfig edgeConfig) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addEdgeConfig(edgeConfig); + } + }); + } else { + parent.addEdgeConfig(edgeConfig); + } + + return true; + } + + @Override + public boolean onNodeConfig(final TopologyGraphConfig parent, final NodeConfig nodeConfig) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addNodeConfig(nodeConfig); + } + }); + } else { + parent.addNodeConfig(nodeConfig); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultMerger.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultMerger.java new file mode 100644 index 0000000000..906d873c70 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultMerger.java @@ -0,0 +1,136 @@ +package com.dianping.cat.home.dependency.config.transform; + +import java.util.Stack; + +import com.dianping.cat.home.dependency.config.IEntity; +import com.dianping.cat.home.dependency.config.IVisitor; +import com.dianping.cat.home.dependency.config.entity.DomainConfig; +import com.dianping.cat.home.dependency.config.entity.EdgeConfig; +import com.dianping.cat.home.dependency.config.entity.NodeConfig; +import com.dianping.cat.home.dependency.config.entity.TopologyGraphConfig; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private TopologyGraphConfig m_topologyGraphConfig; + + public DefaultMerger() { + } + + public DefaultMerger(TopologyGraphConfig topologyGraphConfig) { + m_topologyGraphConfig = topologyGraphConfig; + m_objs.push(topologyGraphConfig); + } + + public TopologyGraphConfig getTopologyGraphConfig() { + return m_topologyGraphConfig; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeDomainConfig(DomainConfig to, DomainConfig from) { + to.mergeAttributes(from); + } + + protected void mergeEdgeConfig(EdgeConfig to, EdgeConfig from) { + to.mergeAttributes(from); + } + + protected void mergeNodeConfig(NodeConfig to, NodeConfig from) { + to.mergeAttributes(from); + } + + protected void mergeTopologyGraphConfig(TopologyGraphConfig to, TopologyGraphConfig from) { + to.mergeAttributes(from); + } + + @Override + public void visitDomainConfig(DomainConfig from) { + DomainConfig to = (DomainConfig) m_objs.peek(); + + mergeDomainConfig(to, from); + visitDomainConfigChildren(to, from); + } + + protected void visitDomainConfigChildren(DomainConfig to, DomainConfig from) { + } + + @Override + public void visitEdgeConfig(EdgeConfig from) { + EdgeConfig to = (EdgeConfig) m_objs.peek(); + + mergeEdgeConfig(to, from); + visitEdgeConfigChildren(to, from); + } + + protected void visitEdgeConfigChildren(EdgeConfig to, EdgeConfig from) { + } + + @Override + public void visitNodeConfig(NodeConfig from) { + NodeConfig to = (NodeConfig) m_objs.peek(); + + mergeNodeConfig(to, from); + visitNodeConfigChildren(to, from); + } + + protected void visitNodeConfigChildren(NodeConfig to, NodeConfig from) { + for (DomainConfig source : from.getDomainConfigs().values()) { + DomainConfig target = to.findDomainConfig(source.getId()); + + if (target == null) { + target = new DomainConfig(source.getId()); + to.addDomainConfig(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitTopologyGraphConfig(TopologyGraphConfig from) { + TopologyGraphConfig to = (TopologyGraphConfig) m_objs.peek(); + + mergeTopologyGraphConfig(to, from); + visitTopologyGraphConfigChildren(to, from); + } + + protected void visitTopologyGraphConfigChildren(TopologyGraphConfig to, TopologyGraphConfig from) { + for (NodeConfig source : from.getNodeConfigs().values()) { + NodeConfig target = to.findNodeConfig(source.getType()); + + if (target == null) { + target = new NodeConfig(source.getType()); + to.addNodeConfig(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (EdgeConfig source : from.getEdgeConfigs().values()) { + EdgeConfig target = to.findEdgeConfig(source.getKey()); + + if (target == null) { + target = new EdgeConfig(source.getKey()); + to.addEdgeConfig(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..f8aa0c150f --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultSaxMaker.java @@ -0,0 +1,175 @@ +package com.dianping.cat.home.dependency.config.transform; + +import static com.dianping.cat.home.dependency.config.Constants.ATTR_DEFAULT_ERROR_RESPONSE_TIME; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_DEFAULT_ERROR_THRESHOLD; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_DEFAULT_MIN_COUNT_THRESHOLD; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_DEFAULT_WARNING_RESPONSE_TIME; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_DEFAULT_WARNING_THRESHOLD; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_ERROR_RESPONSE_TIME; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_ERROR_THRESHOLD; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_FROM; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_ID; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_KEY; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_MIN_COUNT_THRESHOLD; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_TO; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_TYPE; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_WARNING_RESPONSE_TIME; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_WARNING_THRESHOLD; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.dependency.config.entity.DomainConfig; +import com.dianping.cat.home.dependency.config.entity.EdgeConfig; +import com.dianping.cat.home.dependency.config.entity.NodeConfig; +import com.dianping.cat.home.dependency.config.entity.TopologyGraphConfig; + +public class DefaultSaxMaker implements IMaker { + + @Override + public DomainConfig buildDomainConfig(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String warningThreshold = attributes.getValue(ATTR_WARNING_THRESHOLD); + String errorThreshold = attributes.getValue(ATTR_ERROR_THRESHOLD); + String warningResponseTime = attributes.getValue(ATTR_WARNING_RESPONSE_TIME); + String errorResponseTime = attributes.getValue(ATTR_ERROR_RESPONSE_TIME); + String minCountThreshold = attributes.getValue(ATTR_MIN_COUNT_THRESHOLD); + DomainConfig domainConfig = new DomainConfig(id); + + if (warningThreshold != null) { + domainConfig.setWarningThreshold(convert(Integer.class, warningThreshold, 0)); + } + + if (errorThreshold != null) { + domainConfig.setErrorThreshold(convert(Integer.class, errorThreshold, 0)); + } + + if (warningResponseTime != null) { + domainConfig.setWarningResponseTime(convert(Double.class, warningResponseTime, 0.0)); + } + + if (errorResponseTime != null) { + domainConfig.setErrorResponseTime(convert(Double.class, errorResponseTime, 0.0)); + } + + if (minCountThreshold != null) { + domainConfig.setMinCountThreshold(convert(Integer.class, minCountThreshold, 0)); + } + + return domainConfig; + } + + @Override + public EdgeConfig buildEdgeConfig(Attributes attributes) { + String key = attributes.getValue(ATTR_KEY); + String type = attributes.getValue(ATTR_TYPE); + String from = attributes.getValue(ATTR_FROM); + String to = attributes.getValue(ATTR_TO); + String warningThreshold = attributes.getValue(ATTR_WARNING_THRESHOLD); + String errorThreshold = attributes.getValue(ATTR_ERROR_THRESHOLD); + String warningResponseTime = attributes.getValue(ATTR_WARNING_RESPONSE_TIME); + String errorResponseTime = attributes.getValue(ATTR_ERROR_RESPONSE_TIME); + String minCountThreshold = attributes.getValue(ATTR_MIN_COUNT_THRESHOLD); + EdgeConfig edgeConfig = new EdgeConfig(key); + + if (type != null) { + edgeConfig.setType(type); + } + + if (from != null) { + edgeConfig.setFrom(from); + } + + if (to != null) { + edgeConfig.setTo(to); + } + + if (warningThreshold != null) { + edgeConfig.setWarningThreshold(convert(Integer.class, warningThreshold, 0)); + } + + if (errorThreshold != null) { + edgeConfig.setErrorThreshold(convert(Integer.class, errorThreshold, 0)); + } + + if (warningResponseTime != null) { + edgeConfig.setWarningResponseTime(convert(Double.class, warningResponseTime, 0.0)); + } + + if (errorResponseTime != null) { + edgeConfig.setErrorResponseTime(convert(Double.class, errorResponseTime, 0.0)); + } + + if (minCountThreshold != null) { + edgeConfig.setMinCountThreshold(convert(Integer.class, minCountThreshold, 0)); + } + + return edgeConfig; + } + + @Override + public NodeConfig buildNodeConfig(Attributes attributes) { + String type = attributes.getValue(ATTR_TYPE); + String defaultWarningThreshold = attributes.getValue(ATTR_DEFAULT_WARNING_THRESHOLD); + String defaultErrorThreshold = attributes.getValue(ATTR_DEFAULT_ERROR_THRESHOLD); + String defaultWarningResponseTime = attributes.getValue(ATTR_DEFAULT_WARNING_RESPONSE_TIME); + String defaultErrorResponseTime = attributes.getValue(ATTR_DEFAULT_ERROR_RESPONSE_TIME); + String defaultMinCountThreshold = attributes.getValue(ATTR_DEFAULT_MIN_COUNT_THRESHOLD); + NodeConfig nodeConfig = new NodeConfig(type); + + if (defaultWarningThreshold != null) { + nodeConfig.setDefaultWarningThreshold(convert(Integer.class, defaultWarningThreshold, null)); + } + + if (defaultErrorThreshold != null) { + nodeConfig.setDefaultErrorThreshold(convert(Integer.class, defaultErrorThreshold, null)); + } + + if (defaultWarningResponseTime != null) { + nodeConfig.setDefaultWarningResponseTime(convert(Double.class, defaultWarningResponseTime, null)); + } + + if (defaultErrorResponseTime != null) { + nodeConfig.setDefaultErrorResponseTime(convert(Double.class, defaultErrorResponseTime, null)); + } + + if (defaultMinCountThreshold != null) { + nodeConfig.setDefaultMinCountThreshold(convert(Integer.class, defaultMinCountThreshold, 0)); + } + + return nodeConfig; + } + + @Override + public TopologyGraphConfig buildTopologyGraphConfig(Attributes attributes) { + TopologyGraphConfig topologyGraphConfig = new TopologyGraphConfig(); + + return topologyGraphConfig; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..4ad46876aa --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultSaxParser.java @@ -0,0 +1,270 @@ +package com.dianping.cat.home.dependency.config.transform; + +import static com.dianping.cat.home.dependency.config.Constants.ENTITY_DOMAIN_CONFIG; +import static com.dianping.cat.home.dependency.config.Constants.ENTITY_EDGE_CONFIG; +import static com.dianping.cat.home.dependency.config.Constants.ENTITY_NODE_CONFIG; +import static com.dianping.cat.home.dependency.config.Constants.ENTITY_TOPOLOGY_GRAPH_CONFIG; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.dependency.config.IEntity; +import com.dianping.cat.home.dependency.config.entity.DomainConfig; +import com.dianping.cat.home.dependency.config.entity.EdgeConfig; +import com.dianping.cat.home.dependency.config.entity.NodeConfig; +import com.dianping.cat.home.dependency.config.entity.TopologyGraphConfig; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static TopologyGraphConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(TopologyGraphConfig.class, new InputSource(removeBOM(in))); + } + + public static TopologyGraphConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(TopologyGraphConfig.class, new InputSource(removeBOM(reader))); + } + + public static TopologyGraphConfig parse(String xml) throws SAXException, IOException { + return parseEntity(TopologyGraphConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForDomainConfig(DomainConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForEdgeConfig(EdgeConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForNodeConfig(NodeConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DOMAIN_CONFIG.equals(qName)) { + DomainConfig domainConfig = m_maker.buildDomainConfig(attributes); + + m_linker.onDomainConfig(parentObj, domainConfig); + m_objs.push(domainConfig); + } else { + throw new SAXException(String.format("Element(%s) is not expected under node-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseForTopologyGraphConfig(TopologyGraphConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_NODE_CONFIG.equals(qName)) { + NodeConfig nodeConfig = m_maker.buildNodeConfig(attributes); + + m_linker.onNodeConfig(parentObj, nodeConfig); + m_objs.push(nodeConfig); + } else if (ENTITY_EDGE_CONFIG.equals(qName)) { + EdgeConfig edgeConfig = m_maker.buildEdgeConfig(attributes); + + m_linker.onEdgeConfig(parentObj, edgeConfig); + m_objs.push(edgeConfig); + } else { + throw new SAXException(String.format("Element(%s) is not expected under topology-graph-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_TOPOLOGY_GRAPH_CONFIG.equals(qName)) { + TopologyGraphConfig topologyGraphConfig = m_maker.buildTopologyGraphConfig(attributes); + + m_entity = topologyGraphConfig; + m_objs.push(topologyGraphConfig); + m_tags.push(qName); + } else if (ENTITY_NODE_CONFIG.equals(qName)) { + NodeConfig nodeConfig = m_maker.buildNodeConfig(attributes); + + m_entity = nodeConfig; + m_objs.push(nodeConfig); + m_tags.push(qName); + } else if (ENTITY_DOMAIN_CONFIG.equals(qName)) { + DomainConfig domainConfig = m_maker.buildDomainConfig(attributes); + + m_entity = domainConfig; + m_objs.push(domainConfig); + m_tags.push(qName); + } else if (ENTITY_EDGE_CONFIG.equals(qName)) { + EdgeConfig edgeConfig = m_maker.buildEdgeConfig(attributes); + + m_entity = edgeConfig; + m_objs.push(edgeConfig); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof TopologyGraphConfig) { + parseForTopologyGraphConfig((TopologyGraphConfig) parent, tag, qName, attributes); + } else if (parent instanceof NodeConfig) { + parseForNodeConfig((NodeConfig) parent, tag, qName, attributes); + } else if (parent instanceof DomainConfig) { + parseForDomainConfig((DomainConfig) parent, tag, qName, attributes); + } else if (parent instanceof EdgeConfig) { + parseForEdgeConfig((EdgeConfig) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..259953220c --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/DefaultXmlBuilder.java @@ -0,0 +1,254 @@ +package com.dianping.cat.home.dependency.config.transform; + +import static com.dianping.cat.home.dependency.config.Constants.ATTR_DEFAULT_ERROR_RESPONSE_TIME; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_DEFAULT_ERROR_THRESHOLD; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_DEFAULT_MIN_COUNT_THRESHOLD; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_DEFAULT_WARNING_RESPONSE_TIME; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_DEFAULT_WARNING_THRESHOLD; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_ERROR_RESPONSE_TIME; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_ERROR_THRESHOLD; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_FROM; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_ID; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_KEY; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_MIN_COUNT_THRESHOLD; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_TO; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_TYPE; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_WARNING_RESPONSE_TIME; +import static com.dianping.cat.home.dependency.config.Constants.ATTR_WARNING_THRESHOLD; +import static com.dianping.cat.home.dependency.config.Constants.ENTITY_DOMAIN_CONFIG; +import static com.dianping.cat.home.dependency.config.Constants.ENTITY_EDGE_CONFIG; +import static com.dianping.cat.home.dependency.config.Constants.ENTITY_NODE_CONFIG; +import static com.dianping.cat.home.dependency.config.Constants.ENTITY_TOPOLOGY_GRAPH_CONFIG; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.dependency.config.IEntity; +import com.dianping.cat.home.dependency.config.IVisitor; +import com.dianping.cat.home.dependency.config.entity.DomainConfig; +import com.dianping.cat.home.dependency.config.entity.EdgeConfig; +import com.dianping.cat.home.dependency.config.entity.NodeConfig; +import com.dianping.cat.home.dependency.config.entity.TopologyGraphConfig; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitDomainConfig(DomainConfig domainConfig) { + startTag(ENTITY_DOMAIN_CONFIG, true, null, ATTR_ID, domainConfig.getId(), ATTR_WARNING_THRESHOLD, domainConfig.getWarningThreshold(), ATTR_ERROR_THRESHOLD, domainConfig.getErrorThreshold(), ATTR_WARNING_RESPONSE_TIME, domainConfig.getWarningResponseTime(), ATTR_ERROR_RESPONSE_TIME, domainConfig.getErrorResponseTime(), ATTR_MIN_COUNT_THRESHOLD, domainConfig.getMinCountThreshold()); + } + + @Override + public void visitEdgeConfig(EdgeConfig edgeConfig) { + startTag(ENTITY_EDGE_CONFIG, true, null, ATTR_KEY, edgeConfig.getKey(), ATTR_TYPE, edgeConfig.getType(), ATTR_FROM, edgeConfig.getFrom(), ATTR_TO, edgeConfig.getTo(), ATTR_WARNING_THRESHOLD, edgeConfig.getWarningThreshold(), ATTR_ERROR_THRESHOLD, edgeConfig.getErrorThreshold(), ATTR_WARNING_RESPONSE_TIME, edgeConfig.getWarningResponseTime(), ATTR_ERROR_RESPONSE_TIME, edgeConfig.getErrorResponseTime(), ATTR_MIN_COUNT_THRESHOLD, edgeConfig.getMinCountThreshold()); + } + + @Override + public void visitNodeConfig(NodeConfig nodeConfig) { + startTag(ENTITY_NODE_CONFIG, null, ATTR_TYPE, nodeConfig.getType(), ATTR_DEFAULT_WARNING_THRESHOLD, nodeConfig.getDefaultWarningThreshold(), ATTR_DEFAULT_ERROR_THRESHOLD, nodeConfig.getDefaultErrorThreshold(), ATTR_DEFAULT_WARNING_RESPONSE_TIME, nodeConfig.getDefaultWarningResponseTime(), ATTR_DEFAULT_ERROR_RESPONSE_TIME, nodeConfig.getDefaultErrorResponseTime(), ATTR_DEFAULT_MIN_COUNT_THRESHOLD, nodeConfig.getDefaultMinCountThreshold()); + + if (!nodeConfig.getDomainConfigs().isEmpty()) { + for (DomainConfig domainConfig : nodeConfig.getDomainConfigs().values()) { + domainConfig.accept(m_visitor); + } + } + + endTag(ENTITY_NODE_CONFIG); + } + + @Override + public void visitTopologyGraphConfig(TopologyGraphConfig topologyGraphConfig) { + startTag(ENTITY_TOPOLOGY_GRAPH_CONFIG, null); + + if (!topologyGraphConfig.getNodeConfigs().isEmpty()) { + for (NodeConfig nodeConfig : topologyGraphConfig.getNodeConfigs().values()) { + nodeConfig.accept(m_visitor); + } + } + + if (!topologyGraphConfig.getEdgeConfigs().isEmpty()) { + for (EdgeConfig edgeConfig : topologyGraphConfig.getEdgeConfigs().values()) { + edgeConfig.accept(m_visitor); + } + } + + endTag(ENTITY_TOPOLOGY_GRAPH_CONFIG); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/ILinker.java new file mode 100644 index 0000000000..c35a2cb237 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/ILinker.java @@ -0,0 +1,15 @@ +package com.dianping.cat.home.dependency.config.transform; + +import com.dianping.cat.home.dependency.config.entity.DomainConfig; +import com.dianping.cat.home.dependency.config.entity.EdgeConfig; +import com.dianping.cat.home.dependency.config.entity.NodeConfig; +import com.dianping.cat.home.dependency.config.entity.TopologyGraphConfig; + +public interface ILinker { + + public boolean onDomainConfig(NodeConfig parent, DomainConfig domainConfig); + + public boolean onEdgeConfig(TopologyGraphConfig parent, EdgeConfig edgeConfig); + + public boolean onNodeConfig(TopologyGraphConfig parent, NodeConfig nodeConfig); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/IMaker.java new file mode 100644 index 0000000000..d28897389c --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/IMaker.java @@ -0,0 +1,17 @@ +package com.dianping.cat.home.dependency.config.transform; + +import com.dianping.cat.home.dependency.config.entity.DomainConfig; +import com.dianping.cat.home.dependency.config.entity.EdgeConfig; +import com.dianping.cat.home.dependency.config.entity.NodeConfig; +import com.dianping.cat.home.dependency.config.entity.TopologyGraphConfig; + +public interface IMaker { + + public DomainConfig buildDomainConfig(T node); + + public EdgeConfig buildEdgeConfig(T node); + + public NodeConfig buildNodeConfig(T node); + + public TopologyGraphConfig buildTopologyGraphConfig(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/IParser.java new file mode 100644 index 0000000000..110671624b --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/config/transform/IParser.java @@ -0,0 +1,16 @@ +package com.dianping.cat.home.dependency.config.transform; + +import com.dianping.cat.home.dependency.config.entity.DomainConfig; +import com.dianping.cat.home.dependency.config.entity.EdgeConfig; +import com.dianping.cat.home.dependency.config.entity.NodeConfig; +import com.dianping.cat.home.dependency.config.entity.TopologyGraphConfig; + +public interface IParser { + public TopologyGraphConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForDomainConfig(IMaker maker, ILinker linker, DomainConfig parent, T node); + + public void parseForEdgeConfig(IMaker maker, ILinker linker, EdgeConfig parent, T node); + + public void parseForNodeConfig(IMaker maker, ILinker linker, NodeConfig parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/format/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/BaseEntity.java new file mode 100644 index 0000000000..cf103993d0 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.dependency.format; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.dependency.format.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/format/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/Constants.java new file mode 100644 index 0000000000..a1ff429fbc --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/Constants.java @@ -0,0 +1,18 @@ +package com.dianping.cat.home.dependency.format; + +public class Constants { + + public static final String ATTR_COLINSIDE = "colInside"; + + public static final String ATTR_ID = "id"; + + public static final String ENTITY_DOMAIN = "domain"; + + public static final String ENTITY_DOMAINS = "domains"; + + public static final String ENTITY_PRODUCTLINE = "productLine"; + + public static final String ENTITY_PRODUCTLINES = "productLines"; + + public static final String ENTITY_TOPOGRAPH_FORMAT_CONFIG = "topoGraph-format-config"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/format/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/IEntity.java new file mode 100644 index 0000000000..6a7cf8d607 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.dependency.format; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/format/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/IVisitor.java new file mode 100644 index 0000000000..72ffc48cc7 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.dependency.format; + +import com.dianping.cat.home.dependency.format.entity.Domain; +import com.dianping.cat.home.dependency.format.entity.ProductLine; +import com.dianping.cat.home.dependency.format.entity.TopoGraphFormatConfig; + +public interface IVisitor { + + public void visitDomain(Domain domain); + + public void visitProductLine(ProductLine productLine); + + public void visitTopoGraphFormatConfig(TopoGraphFormatConfig topoGraphFormatConfig); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/format/entity/Domain.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/entity/Domain.java new file mode 100644 index 0000000000..8e63b11f04 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/entity/Domain.java @@ -0,0 +1,78 @@ +package com.dianping.cat.home.dependency.format.entity; + +import com.dianping.cat.home.dependency.format.BaseEntity; +import com.dianping.cat.home.dependency.format.IVisitor; + +public class Domain extends BaseEntity { + private String m_id; + + private Integer m_colInside; + + public Domain() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomain(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Domain) { + Domain _o = (Domain) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + if (!equals(getColInside(), _o.getColInside())) { + return false; + } + + + return true; + } + + return false; + } + + public Integer getColInside() { + return m_colInside; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + hash = hash * 31 + (m_colInside == null ? 0 : m_colInside.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Domain other) { + if (other.getId() != null) { + m_id = other.getId(); + } + + if (other.getColInside() != null) { + m_colInside = other.getColInside(); + } + } + + public Domain setColInside(Integer colInside) { + m_colInside = colInside; + return this; + } + + public Domain setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/format/entity/ProductLine.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/entity/ProductLine.java new file mode 100644 index 0000000000..caa16ef713 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/entity/ProductLine.java @@ -0,0 +1,100 @@ +package com.dianping.cat.home.dependency.format.entity; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.home.dependency.format.BaseEntity; +import com.dianping.cat.home.dependency.format.IVisitor; + +public class ProductLine extends BaseEntity { + private String m_id; + + private Integer m_colInside; + + private List m_domains = new ArrayList(); + + public ProductLine() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitProductLine(this); + } + + public ProductLine addDomain(Domain domain) { + m_domains.add(domain); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ProductLine) { + ProductLine _o = (ProductLine) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + if (!equals(getColInside(), _o.getColInside())) { + return false; + } + + if (!equals(getDomains(), _o.getDomains())) { + return false; + } + + + return true; + } + + return false; + } + + public Integer getColInside() { + return m_colInside; + } + + public List getDomains() { + return m_domains; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + hash = hash * 31 + (m_colInside == null ? 0 : m_colInside.hashCode()); + for (Domain e : m_domains) { + hash = hash * 31 + (e == null ? 0 :e.hashCode()); + } + + + return hash; + } + + @Override + public void mergeAttributes(ProductLine other) { + if (other.getId() != null) { + m_id = other.getId(); + } + + if (other.getColInside() != null) { + m_colInside = other.getColInside(); + } + } + + public ProductLine setColInside(Integer colInside) { + m_colInside = colInside; + return this; + } + + public ProductLine setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/format/entity/TopoGraphFormatConfig.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/entity/TopoGraphFormatConfig.java new file mode 100644 index 0000000000..5955057f63 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/entity/TopoGraphFormatConfig.java @@ -0,0 +1,61 @@ +package com.dianping.cat.home.dependency.format.entity; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.home.dependency.format.BaseEntity; +import com.dianping.cat.home.dependency.format.IVisitor; + +public class TopoGraphFormatConfig extends BaseEntity { + private List m_productLines = new ArrayList(); + + public TopoGraphFormatConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitTopoGraphFormatConfig(this); + } + + public TopoGraphFormatConfig addProductLine(ProductLine productLine) { + m_productLines.add(productLine); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TopoGraphFormatConfig) { + TopoGraphFormatConfig _o = (TopoGraphFormatConfig) obj; + + if (!equals(getProductLines(), _o.getProductLines())) { + return false; + } + + + return true; + } + + return false; + } + + public List getProductLines() { + return m_productLines; + } + + @Override + public int hashCode() { + int hash = 0; + + for (ProductLine e : m_productLines) { + hash = hash * 31 + (e == null ? 0 :e.hashCode()); + } + + + return hash; + } + + @Override + public void mergeAttributes(TopoGraphFormatConfig other) { + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultLinker.java new file mode 100644 index 0000000000..cf29247d02 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultLinker.java @@ -0,0 +1,36 @@ +package com.dianping.cat.home.dependency.format.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.dependency.format.entity.Domain; +import com.dianping.cat.home.dependency.format.entity.ProductLine; +import com.dianping.cat.home.dependency.format.entity.TopoGraphFormatConfig; + +public class DefaultLinker implements ILinker { + @SuppressWarnings("unused") + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDomain(final ProductLine parent, final Domain domain) { + parent.addDomain(domain); + return true; + } + + @Override + public boolean onProductLine(final TopoGraphFormatConfig parent, final ProductLine productLine) { + parent.addProductLine(productLine); + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..67561e9b4d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultSaxMaker.java @@ -0,0 +1,81 @@ +package com.dianping.cat.home.dependency.format.transform; + +import static com.dianping.cat.home.dependency.format.Constants.ATTR_COLINSIDE; +import static com.dianping.cat.home.dependency.format.Constants.ATTR_ID; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.dependency.format.entity.Domain; +import com.dianping.cat.home.dependency.format.entity.ProductLine; +import com.dianping.cat.home.dependency.format.entity.TopoGraphFormatConfig; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Domain buildDomain(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String colInside = attributes.getValue(ATTR_COLINSIDE); + Domain domain = new Domain(); + + if (id != null) { + domain.setId(id); + } + + if (colInside != null) { + domain.setColInside(convert(Integer.class, colInside, null)); + } + + return domain; + } + + @Override + public ProductLine buildProductLine(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String colInside = attributes.getValue(ATTR_COLINSIDE); + ProductLine productLine = new ProductLine(); + + if (id != null) { + productLine.setId(id); + } + + if (colInside != null) { + productLine.setColInside(convert(Integer.class, colInside, null)); + } + + return productLine; + } + + @Override + public TopoGraphFormatConfig buildTopoGraphFormatConfig(Attributes attributes) { + TopoGraphFormatConfig topoGraphFormatConfig = new TopoGraphFormatConfig(); + + return topoGraphFormatConfig; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..6934ee6e55 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultSaxParser.java @@ -0,0 +1,250 @@ +package com.dianping.cat.home.dependency.format.transform; + +import static com.dianping.cat.home.dependency.format.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.home.dependency.format.Constants.ENTITY_PRODUCTLINE; +import static com.dianping.cat.home.dependency.format.Constants.ENTITY_TOPOGRAPH_FORMAT_CONFIG; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.dependency.format.IEntity; +import com.dianping.cat.home.dependency.format.entity.Domain; +import com.dianping.cat.home.dependency.format.entity.ProductLine; +import com.dianping.cat.home.dependency.format.entity.TopoGraphFormatConfig; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static TopoGraphFormatConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(TopoGraphFormatConfig.class, new InputSource(removeBOM(in))); + } + + public static TopoGraphFormatConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(TopoGraphFormatConfig.class, new InputSource(removeBOM(reader))); + } + + public static TopoGraphFormatConfig parse(String xml) throws SAXException, IOException { + return parseEntity(TopoGraphFormatConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForDomain(Domain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForProductLine(ProductLine parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_linker.onDomain(parentObj, domain); + m_objs.push(domain); + } else { + throw new SAXException(String.format("Element(%s) is not expected under productLine!", qName)); + } + + m_tags.push(qName); + } + + private void parseForTopoGraphFormatConfig(TopoGraphFormatConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_PRODUCTLINE.equals(qName)) { + ProductLine productLine = m_maker.buildProductLine(attributes); + + m_linker.onProductLine(parentObj, productLine); + m_objs.push(productLine); + } else { + throw new SAXException(String.format("Element(%s) is not expected under topoGraph-format-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_TOPOGRAPH_FORMAT_CONFIG.equals(qName)) { + TopoGraphFormatConfig topoGraphFormatConfig = m_maker.buildTopoGraphFormatConfig(attributes); + + m_entity = topoGraphFormatConfig; + m_objs.push(topoGraphFormatConfig); + m_tags.push(qName); + } else if (ENTITY_PRODUCTLINE.equals(qName)) { + ProductLine productLine = m_maker.buildProductLine(attributes); + + m_entity = productLine; + m_objs.push(productLine); + m_tags.push(qName); + } else if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_entity = domain; + m_objs.push(domain); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof TopoGraphFormatConfig) { + parseForTopoGraphFormatConfig((TopoGraphFormatConfig) parent, tag, qName, attributes); + } else if (parent instanceof ProductLine) { + parseForProductLine((ProductLine) parent, tag, qName, attributes); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..d80d64ce95 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/DefaultXmlBuilder.java @@ -0,0 +1,228 @@ +package com.dianping.cat.home.dependency.format.transform; + +import static com.dianping.cat.home.dependency.format.Constants.ATTR_COLINSIDE; +import static com.dianping.cat.home.dependency.format.Constants.ATTR_ID; +import static com.dianping.cat.home.dependency.format.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.home.dependency.format.Constants.ENTITY_PRODUCTLINE; +import static com.dianping.cat.home.dependency.format.Constants.ENTITY_TOPOGRAPH_FORMAT_CONFIG; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.dependency.format.IEntity; +import com.dianping.cat.home.dependency.format.IVisitor; +import com.dianping.cat.home.dependency.format.entity.Domain; +import com.dianping.cat.home.dependency.format.entity.ProductLine; +import com.dianping.cat.home.dependency.format.entity.TopoGraphFormatConfig; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitDomain(Domain domain) { + startTag(ENTITY_DOMAIN, true, null, ATTR_ID, domain.getId(), ATTR_COLINSIDE, domain.getColInside()); + } + + @Override + public void visitProductLine(ProductLine productLine) { + startTag(ENTITY_PRODUCTLINE, null, ATTR_ID, productLine.getId(), ATTR_COLINSIDE, productLine.getColInside()); + + if (!productLine.getDomains().isEmpty()) { + for (Domain domain : productLine.getDomains()) { + domain.accept(m_visitor); + } + } + + endTag(ENTITY_PRODUCTLINE); + } + + @Override + public void visitTopoGraphFormatConfig(TopoGraphFormatConfig topoGraphFormatConfig) { + startTag(ENTITY_TOPOGRAPH_FORMAT_CONFIG, null); + + if (!topoGraphFormatConfig.getProductLines().isEmpty()) { + for (ProductLine productLine : topoGraphFormatConfig.getProductLines()) { + productLine.accept(m_visitor); + } + } + + endTag(ENTITY_TOPOGRAPH_FORMAT_CONFIG); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/ILinker.java new file mode 100644 index 0000000000..c5b4090353 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.home.dependency.format.transform; + +import com.dianping.cat.home.dependency.format.entity.Domain; +import com.dianping.cat.home.dependency.format.entity.ProductLine; +import com.dianping.cat.home.dependency.format.entity.TopoGraphFormatConfig; + +public interface ILinker { + + public boolean onDomain(ProductLine parent, Domain domain); + + public boolean onProductLine(TopoGraphFormatConfig parent, ProductLine productLine); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/IMaker.java new file mode 100644 index 0000000000..67af9e9a0f --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/IMaker.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.dependency.format.transform; + +import com.dianping.cat.home.dependency.format.entity.Domain; +import com.dianping.cat.home.dependency.format.entity.ProductLine; +import com.dianping.cat.home.dependency.format.entity.TopoGraphFormatConfig; + +public interface IMaker { + + public Domain buildDomain(T node); + + public ProductLine buildProductLine(T node); + + public TopoGraphFormatConfig buildTopoGraphFormatConfig(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/IParser.java new file mode 100644 index 0000000000..fa692fcff1 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/format/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.home.dependency.format.transform; + +import com.dianping.cat.home.dependency.format.entity.Domain; +import com.dianping.cat.home.dependency.format.entity.ProductLine; +import com.dianping.cat.home.dependency.format.entity.TopoGraphFormatConfig; + +public interface IParser { + public TopoGraphFormatConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForDomain(IMaker maker, ILinker linker, Domain parent, T node); + + public void parseForProductLine(IMaker maker, ILinker linker, ProductLine parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/BaseEntity.java new file mode 100644 index 0000000000..f6162b0197 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/BaseEntity.java @@ -0,0 +1,56 @@ +package com.dianping.cat.home.dependency.graph; + +import java.util.Formattable; +import java.util.FormattableFlags; +import java.util.Formatter; + +import com.dianping.cat.home.dependency.graph.transform.DefaultXmlBuilder; +import com.dianping.cat.home.dependency.graph.transform.DefaultJsonBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String JSON = "%#.3s"; + + public static final String JSON_COMPACT = "%#s"; + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean useJson = (flags & FormattableFlags.ALTERNATE) == FormattableFlags.ALTERNATE; + boolean compact = (precision <= 0); + + if (useJson) { + DefaultJsonBuilder builder = new DefaultJsonBuilder(compact); + + formatter.format("%s", builder.build(this)); + } else { + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/Constants.java new file mode 100644 index 0000000000..e8602def12 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/Constants.java @@ -0,0 +1,36 @@ +package com.dianping.cat.home.dependency.graph; + +public class Constants { + + public static final String ATTR_DASHED = "dashed"; + + public static final String ATTR_DES = "des"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_KEY = "key"; + + public static final String ATTR_LINK = "link"; + + public static final String ATTR_OPPOSITE = "opposite"; + + public static final String ATTR_SELF = "self"; + + public static final String ATTR_STATUS = "status"; + + public static final String ATTR_TARGET = "target"; + + public static final String ATTR_TYPE = "type"; + + public static final String ATTR_WEIGHT = "weight"; + + public static final String ENTITY_TOPOLOGY_EDGE = "topology-edge"; + + public static final String ENTITY_EDGES = "edges"; + + public static final String ENTITY_TOPOLOGY_GRAPH = "topology-graph"; + + public static final String ENTITY_TOPOLOGY_NODE = "topology-node"; + + public static final String ENTITY_NODES = "nodes"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/IEntity.java new file mode 100644 index 0000000000..f590067b02 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.dependency.graph; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/IVisitor.java new file mode 100644 index 0000000000..b96090b5df --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.dependency.graph; + +import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; +import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; +import com.dianping.cat.home.dependency.graph.entity.TopologyNode; + +public interface IVisitor { + + public void visitTopologyEdge(TopologyEdge topologyEdge); + + public void visitTopologyGraph(TopologyGraph topologyGraph); + + public void visitTopologyNode(TopologyNode topologyNode); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/entity/TopologyEdge.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/entity/TopologyEdge.java new file mode 100644 index 0000000000..3386e6e785 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/entity/TopologyEdge.java @@ -0,0 +1,197 @@ +package com.dianping.cat.home.dependency.graph.entity; + +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_KEY; +import static com.dianping.cat.home.dependency.graph.Constants.ENTITY_TOPOLOGY_EDGE; + +import com.dianping.cat.home.dependency.graph.BaseEntity; +import com.dianping.cat.home.dependency.graph.IVisitor; + +public class TopologyEdge extends BaseEntity { + private String m_key; + + private String m_type; + + private String m_target; + + private boolean m_opposite; + + private int m_weight; + + private int m_status; + + private String m_des = ""; + + private String m_link = ""; + + private String m_self; + + private boolean m_dashed = false; + + public TopologyEdge() { + } + + public TopologyEdge(String key) { + m_key = key; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitTopologyEdge(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TopologyEdge) { + TopologyEdge _o = (TopologyEdge) obj; + + if (!equals(getKey(), _o.getKey())) { + return false; + } + + return true; + } + + return false; + } + + public boolean getDashed() { + return m_dashed; + } + + public String getDes() { + return m_des; + } + + public String getKey() { + return m_key; + } + + public String getLink() { + return m_link; + } + + public boolean getOpposite() { + return m_opposite; + } + + public String getSelf() { + return m_self; + } + + public int getStatus() { + return m_status; + } + + public String getTarget() { + return m_target; + } + + public String getType() { + return m_type; + } + + public int getWeight() { + return m_weight; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_key == null ? 0 : m_key.hashCode()); + + return hash; + } + + public boolean isDashed() { + return m_dashed; + } + + public boolean isOpposite() { + return m_opposite; + } + + @Override + public void mergeAttributes(TopologyEdge other) { + assertAttributeEquals(other, ENTITY_TOPOLOGY_EDGE, ATTR_KEY, m_key, other.getKey()); + + if (other.getType() != null) { + m_type = other.getType(); + } + + if (other.getTarget() != null) { + m_target = other.getTarget(); + } + + m_opposite = other.getOpposite(); + + m_weight = other.getWeight(); + + m_status = other.getStatus(); + + if (other.getDes() != null) { + m_des = other.getDes(); + } + + if (other.getLink() != null) { + m_link = other.getLink(); + } + + if (other.getSelf() != null) { + m_self = other.getSelf(); + } + + m_dashed = other.getDashed(); + } + + public TopologyEdge setDashed(boolean dashed) { + m_dashed = dashed; + return this; + } + + public TopologyEdge setDes(String des) { + m_des = des; + return this; + } + + public TopologyEdge setKey(String key) { + m_key = key; + return this; + } + + public TopologyEdge setLink(String link) { + m_link = link; + return this; + } + + public TopologyEdge setOpposite(boolean opposite) { + m_opposite = opposite; + return this; + } + + public TopologyEdge setSelf(String self) { + m_self = self; + return this; + } + + public TopologyEdge setStatus(int status) { + m_status = status; + return this; + } + + public TopologyEdge setTarget(String target) { + m_target = target; + return this; + } + + public TopologyEdge setType(String type) { + m_type = type; + return this; + } + + public TopologyEdge setWeight(int weight) { + m_weight = weight; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/entity/TopologyGraph.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/entity/TopologyGraph.java new file mode 100644 index 0000000000..33d2445279 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/entity/TopologyGraph.java @@ -0,0 +1,201 @@ +package com.dianping.cat.home.dependency.graph.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.dependency.graph.BaseEntity; +import com.dianping.cat.home.dependency.graph.IVisitor; + +public class TopologyGraph extends BaseEntity { + private String m_id; + + private String m_type; + + private int m_status; + + private String m_des; + + private Map m_nodes = new LinkedHashMap(); + + private Map m_edges = new LinkedHashMap(); + + public TopologyGraph() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitTopologyGraph(this); + } + + public TopologyGraph addTopologyEdge(TopologyEdge topologyEdge) { + m_edges.put(topologyEdge.getKey(), topologyEdge); + return this; + } + + public TopologyGraph addTopologyNode(TopologyNode topologyNode) { + m_nodes.put(topologyNode.getId(), topologyNode); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TopologyGraph) { + TopologyGraph _o = (TopologyGraph) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + if (!equals(getType(), _o.getType())) { + return false; + } + + if (getStatus() != _o.getStatus()) { + return false; + } + + if (!equals(getDes(), _o.getDes())) { + return false; + } + + if (!equals(getNodes(), _o.getNodes())) { + return false; + } + + if (!equals(getEdges(), _o.getEdges())) { + return false; + } + + + return true; + } + + return false; + } + + public TopologyEdge findTopologyEdge(String key) { + return m_edges.get(key); + } + + public TopologyNode findTopologyNode(String id) { + return m_nodes.get(id); + } + + public TopologyEdge findOrCreateTopologyEdge(String key) { + TopologyEdge topologyEdge = m_edges.get(key); + + if (topologyEdge == null) { + synchronized (m_edges) { + topologyEdge = m_edges.get(key); + + if (topologyEdge == null) { + topologyEdge = new TopologyEdge(key); + m_edges.put(key, topologyEdge); + } + } + } + + return topologyEdge; + } + + public TopologyNode findOrCreateTopologyNode(String id) { + TopologyNode topologyNode = m_nodes.get(id); + + if (topologyNode == null) { + synchronized (m_nodes) { + topologyNode = m_nodes.get(id); + + if (topologyNode == null) { + topologyNode = new TopologyNode(id); + m_nodes.put(id, topologyNode); + } + } + } + + return topologyNode; + } + + public String getDes() { + return m_des; + } + + public Map getEdges() { + return m_edges; + } + + public String getId() { + return m_id; + } + + public Map getNodes() { + return m_nodes; + } + + public int getStatus() { + return m_status; + } + + public String getType() { + return m_type; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + hash = hash * 31 + (m_type == null ? 0 : m_type.hashCode()); + hash = hash * 31 + m_status; + hash = hash * 31 + (m_des == null ? 0 : m_des.hashCode()); + hash = hash * 31 + (m_nodes == null ? 0 : m_nodes.hashCode()); + hash = hash * 31 + (m_edges == null ? 0 : m_edges.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(TopologyGraph other) { + if (other.getId() != null) { + m_id = other.getId(); + } + + if (other.getType() != null) { + m_type = other.getType(); + } + + m_status = other.getStatus(); + + if (other.getDes() != null) { + m_des = other.getDes(); + } + } + + public TopologyEdge removeTopologyEdge(String key) { + return m_edges.remove(key); + } + + public TopologyNode removeTopologyNode(String id) { + return m_nodes.remove(id); + } + + public TopologyGraph setDes(String des) { + m_des = des; + return this; + } + + public TopologyGraph setId(String id) { + m_id = id; + return this; + } + + public TopologyGraph setStatus(int status) { + m_status = status; + return this; + } + + public TopologyGraph setType(String type) { + m_type = type; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/entity/TopologyNode.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/entity/TopologyNode.java new file mode 100644 index 0000000000..3c7a512c2e --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/entity/TopologyNode.java @@ -0,0 +1,133 @@ +package com.dianping.cat.home.dependency.graph.entity; + +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_ID; +import static com.dianping.cat.home.dependency.graph.Constants.ENTITY_TOPOLOGY_NODE; + +import com.dianping.cat.home.dependency.graph.BaseEntity; +import com.dianping.cat.home.dependency.graph.IVisitor; + +public class TopologyNode extends BaseEntity { + private String m_id; + + private String m_type; + + private int m_status; + + private String m_des = ""; + + private String m_link = ""; + + private int m_weight; + + public TopologyNode() { + } + + public TopologyNode(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitTopologyNode(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TopologyNode) { + TopologyNode _o = (TopologyNode) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getDes() { + return m_des; + } + + public String getId() { + return m_id; + } + + public String getLink() { + return m_link; + } + + public int getStatus() { + return m_status; + } + + public String getType() { + return m_type; + } + + public int getWeight() { + return m_weight; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(TopologyNode other) { + assertAttributeEquals(other, ENTITY_TOPOLOGY_NODE, ATTR_ID, m_id, other.getId()); + + if (other.getType() != null) { + m_type = other.getType(); + } + + m_status = other.getStatus(); + + if (other.getDes() != null) { + m_des = other.getDes(); + } + + if (other.getLink() != null) { + m_link = other.getLink(); + } + + m_weight = other.getWeight(); + } + + public TopologyNode setDes(String des) { + m_des = des; + return this; + } + + public TopologyNode setId(String id) { + m_id = id; + return this; + } + + public TopologyNode setLink(String link) { + m_link = link; + return this; + } + + public TopologyNode setStatus(int status) { + m_status = status; + return this; + } + + public TopologyNode setType(String type) { + m_type = type; + return this; + } + + public TopologyNode setWeight(int weight) { + m_weight = weight; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/BaseVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/BaseVisitor.java new file mode 100644 index 0000000000..dfc81337c2 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/BaseVisitor.java @@ -0,0 +1,27 @@ +package com.dianping.cat.home.dependency.graph.transform; + +import com.dianping.cat.home.dependency.graph.IVisitor; +import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; +import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; +import com.dianping.cat.home.dependency.graph.entity.TopologyNode; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitTopologyEdge(TopologyEdge topologyEdge) { + } + + @Override + public void visitTopologyGraph(TopologyGraph topologyGraph) { + for (TopologyNode topologyNode : topologyGraph.getNodes().values()) { + visitTopologyNode(topologyNode); + } + + for (TopologyEdge topologyEdge : topologyGraph.getEdges().values()) { + visitTopologyEdge(topologyEdge); + } + } + + @Override + public void visitTopologyNode(TopologyNode topologyNode) { + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultJsonBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultJsonBuilder.java new file mode 100644 index 0000000000..01816c4d66 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultJsonBuilder.java @@ -0,0 +1,288 @@ +package com.dianping.cat.home.dependency.graph.transform; + +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_DASHED; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_DES; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_ID; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_KEY; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_LINK; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_OPPOSITE; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_SELF; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_STATUS; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_TARGET; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_TYPE; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_WEIGHT; +import static com.dianping.cat.home.dependency.graph.Constants.ENTITY_EDGES; +import static com.dianping.cat.home.dependency.graph.Constants.ENTITY_NODES; + +import java.lang.reflect.Array; +import java.util.Collection; +import java.util.Map; + +import com.dianping.cat.home.dependency.graph.IEntity; +import com.dianping.cat.home.dependency.graph.IVisitor; +import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; +import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; +import com.dianping.cat.home.dependency.graph.entity.TopologyNode; + +public class DefaultJsonBuilder implements IVisitor { + + private IVisitor m_visitor; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultJsonBuilder() { + this(false); + } + + public DefaultJsonBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultJsonBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_visitor = this; + } + + protected void arrayBegin(String name) { + indent(); + m_sb.append('"').append(name).append(m_compact ? "\":[" : "\": [\r\n"); + m_level++; + } + + protected void arrayEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append("],").append(m_compact ? "" : "\r\n"); + } + + protected void attributes(Map dynamicAttributes, Object... nameValues) { + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + if (attrValue instanceof Collection) { + @SuppressWarnings("unchecked") + Collection items = (Collection) attrValue; + + if (!items.isEmpty()) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (Object item : items) { + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else if (attrValue.getClass().isArray()) { + int length = Array.getLength(attrValue); + + if (length > 0) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (int j = 0; j < length; j++) { + Object item = Array.get(attrValue, j); + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else { + if (m_compact) { + m_sb.append('"').append(attrName).append("\":"); + toString(m_sb, attrValue); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(attrName).append("\": "); + toString(m_sb, attrValue); + m_sb.append(",\r\n"); + } + } + } + } + + if (dynamicAttributes != null) { + for (Map.Entry e : dynamicAttributes.entrySet()) { + if (m_compact) { + m_sb.append('"').append(e.getKey()).append("\":"); + toString(m_sb, e.getValue()); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(e.getKey()).append("\": "); + toString(m_sb, e.getValue()); + m_sb.append(",\r\n"); + } + } + } + } + + public String build(IEntity entity) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + trimComma(); + + return m_sb.toString(); + } + + public String buildArray(Collection> entities) { + m_sb.append('['); + + if (entities != null) { + for (IEntity entity : entities) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + } + + trimComma(); + } + + m_sb.append(']'); + + return m_sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void objectBegin(String name) { + indent(); + + if (name == null) { + m_sb.append("{").append(m_compact ? "" : "\r\n"); + } else { + m_sb.append('"').append(name).append(m_compact ? "\":{" : "\": {\r\n"); + } + + m_level++; + } + + protected void objectEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append(m_compact ? "}," : "},\r\n"); + } + + protected void toString(StringBuilder sb, Object value) { + if (value == null) { + sb.append("null"); + } else if (value instanceof Boolean || value instanceof Number) { + sb.append(value); + } else { + String val = value.toString(); + int len = val.length(); + + sb.append('"'); + + for (int i = 0; i < len; i++) { + char ch = val.charAt(i); + + switch (ch) { + case '\\': + case '/': + case '"': + sb.append('\\').append(ch); + break; + case '\t': + sb.append("\\t"); + break; + case '\r': + sb.append("\\r"); + break; + case '\n': + sb.append("\\n"); + break; + default: + sb.append(ch); + break; + } + } + + sb.append('"'); + } + } + + protected void trimComma() { + int len = m_sb.length(); + + if (m_compact) { + if (len > 1 && m_sb.charAt(len - 1) == ',') { + m_sb.replace(len - 1, len, ""); + } + } else { + if (len > 3 && m_sb.charAt(len - 3) == ',') { + m_sb.replace(len - 3, len - 2, ""); + } + } + } + + @Override + public void visitTopologyEdge(TopologyEdge topologyEdge) { + attributes(null, ATTR_KEY, topologyEdge.getKey(), ATTR_TYPE, topologyEdge.getType(), ATTR_TARGET, topologyEdge.getTarget(), ATTR_OPPOSITE, topologyEdge.isOpposite(), ATTR_WEIGHT, topologyEdge.getWeight(), ATTR_STATUS, topologyEdge.getStatus(), ATTR_DES, topologyEdge.getDes(), ATTR_LINK, topologyEdge.getLink(), ATTR_SELF, topologyEdge.getSelf(), ATTR_DASHED, topologyEdge.isDashed()); + } + + @Override + public void visitTopologyGraph(TopologyGraph topologyGraph) { + attributes(null, ATTR_ID, topologyGraph.getId(), ATTR_TYPE, topologyGraph.getType(), ATTR_STATUS, topologyGraph.getStatus(), ATTR_DES, topologyGraph.getDes()); + + if (!topologyGraph.getNodes().isEmpty()) { + objectBegin(ENTITY_NODES); + + for (Map.Entry e : topologyGraph.getNodes().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_NODES); + } + + if (!topologyGraph.getEdges().isEmpty()) { + objectBegin(ENTITY_EDGES); + + for (Map.Entry e : topologyGraph.getEdges().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_EDGES); + } + } + + @Override + public void visitTopologyNode(TopologyNode topologyNode) { + attributes(null, ATTR_ID, topologyNode.getId(), ATTR_TYPE, topologyNode.getType(), ATTR_STATUS, topologyNode.getStatus(), ATTR_DES, topologyNode.getDes(), ATTR_LINK, topologyNode.getLink(), ATTR_WEIGHT, topologyNode.getWeight()); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultJsonParser.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultJsonParser.java new file mode 100644 index 0000000000..7d0ad89d90 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultJsonParser.java @@ -0,0 +1,404 @@ +package com.dianping.cat.home.dependency.graph.transform; + +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_DASHED; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_DES; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_ID; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_KEY; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_LINK; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_OPPOSITE; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_SELF; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_STATUS; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_TARGET; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_TYPE; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_WEIGHT; +import static com.dianping.cat.home.dependency.graph.Constants.ENTITY_EDGES; +import static com.dianping.cat.home.dependency.graph.Constants.ENTITY_NODES; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.dianping.cat.home.dependency.graph.IEntity; +import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; +import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; +import com.dianping.cat.home.dependency.graph.entity.TopologyNode; + +public class DefaultJsonParser { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private List m_entities = new ArrayList(); + + private Class m_entityClass; + + private DefaultJsonParser(Class entityClass) { + m_entityClass = entityClass; + } + + public static > T parse(Class entityClass, InputStream in) throws IOException { + return parse(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > T parse(Class entityClass, Reader reader) throws IOException { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.onArrayBegin(); + parser.parse(new JsonReader(reader)); + parser.onArrayEnd(); + + if (parser.m_entities.isEmpty()) { + return null; + } else { + return (T) parser.m_entities.get(0); + } + } + + public static > T parse(Class entityClass, String json) throws IOException { + return parse(entityClass, new StringReader(json)); + } + + public static > List parseArray(Class entityClass, InputStream in) throws Exception { + return parseArray(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > List parseArray(Class entityClass, Reader reader) throws Exception { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.parse(new JsonReader(reader)); + return (List) (List) parser.m_entities; + } + + public static > List parseArray(Class entityClass, String json) throws Exception { + return parseArray(entityClass, new StringReader(json)); + } + + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + private Object createRootEntity() { + try { + Object entity = m_entityClass.newInstance(); + + return entity; + } catch (Exception e) { + throw new RuntimeException(String.format("Unable to create entity(%s) instance!", m_entityClass.getName()), e); + } + } + + private boolean isTopLevel() { + return m_objs.size() == 1; + } + + protected void onArrayBegin() { + if (m_objs.isEmpty()) { + m_objs.push(m_entities); + m_tags.push(""); + } } + + protected void onArrayEnd() { + m_objs.pop(); + m_tags.pop(); + + } + protected void onName(String name) { + m_tags.push(name); + } + + protected void onObjectBegin() { + if (isTopLevel()) { + m_objs.push(createRootEntity()); + m_tags.push(""); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof TopologyGraph) { + if (ENTITY_NODES.equals(tag) || ENTITY_EDGES.equals(tag)) { + m_objs.push(parent); + } else { + String parentTag = m_tags.size() >= 2 ? m_tags.get(m_tags.size() - 2) : null; + + if (ENTITY_NODES.equals(parentTag)) { + TopologyNode nodes = new TopologyNode(); + + m_linker.onTopologyNode((TopologyGraph) parent, nodes); + m_objs.push(nodes); + } else if (ENTITY_EDGES.equals(parentTag)) { + TopologyEdge edges = new TopologyEdge(); + + m_linker.onTopologyEdge((TopologyGraph) parent, edges); + m_objs.push(edges); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } + + protected void onObjectEnd() { + m_tags.pop(); + + Object entity = m_objs.pop(); + + if (isTopLevel()) { + m_entities.add(entity); + } + } + + protected void onValue(String value) { + Object parent = m_objs.peek(); + String tag = m_tags.pop(); + + if (parent instanceof TopologyGraph) { + parseForTopologyGraph((TopologyGraph) parent, tag, value); + } else if (parent instanceof TopologyNode) { + parseForTopologyNode((TopologyNode) parent, tag, value); + } else if (parent instanceof TopologyEdge) { + parseForTopologyEdge((TopologyEdge) parent, tag, value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) under %s!", tag, parent)); + } + } + + private void parse(JsonReader reader) throws IOException { + try { + reader.parse(this); + } catch (EOFException e) { + if (m_objs.size() > 1) { + throw new EOFException(String.format("Unexpected end while parsing json! tags: %s.", m_tags)); + } + } + + m_linker.finish(); + } + + public void parseForTopologyEdge(TopologyEdge topologyEdge, String tag, String value) { + if (ATTR_KEY.equals(tag)) { + topologyEdge.setKey(value); + } else if (ATTR_TYPE.equals(tag)) { + topologyEdge.setType(value); + } else if (ATTR_TARGET.equals(tag)) { + topologyEdge.setTarget(value); + } else if (ATTR_OPPOSITE.equals(tag)) { + topologyEdge.setOpposite(convert(Boolean.class, value, false)); + } else if (ATTR_WEIGHT.equals(tag)) { + topologyEdge.setWeight(convert(Integer.class, value, 0)); + } else if (ATTR_STATUS.equals(tag)) { + topologyEdge.setStatus(convert(Integer.class, value, 0)); + } else if (ATTR_DES.equals(tag)) { + topologyEdge.setDes(value); + } else if (ATTR_LINK.equals(tag)) { + topologyEdge.setLink(value); + } else if (ATTR_SELF.equals(tag)) { + topologyEdge.setSelf(value); + } else if (ATTR_DASHED.equals(tag)) { + topologyEdge.setDashed(convert(Boolean.class, value, false)); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, topologyEdge, m_tags)); + } + } + + public void parseForTopologyGraph(TopologyGraph topologyGraph, String tag, String value) { + if (ENTITY_NODES.equals(tag) || ENTITY_EDGES.equals(tag)) { + // do nothing here + } else if (ATTR_ID.equals(tag)) { + topologyGraph.setId(value); + } else if (ATTR_TYPE.equals(tag)) { + topologyGraph.setType(value); + } else if (ATTR_STATUS.equals(tag)) { + topologyGraph.setStatus(convert(Integer.class, value, 0)); + } else if (ATTR_DES.equals(tag)) { + topologyGraph.setDes(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, topologyGraph, m_tags)); + } + } + + public void parseForTopologyNode(TopologyNode topologyNode, String tag, String value) { + if (ATTR_ID.equals(tag)) { + topologyNode.setId(value); + } else if (ATTR_TYPE.equals(tag)) { + topologyNode.setType(value); + } else if (ATTR_STATUS.equals(tag)) { + topologyNode.setStatus(convert(Integer.class, value, 0)); + } else if (ATTR_DES.equals(tag)) { + topologyNode.setDes(value); + } else if (ATTR_LINK.equals(tag)) { + topologyNode.setLink(value); + } else if (ATTR_WEIGHT.equals(tag)) { + topologyNode.setWeight(convert(Integer.class, value, 0)); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, topologyNode, m_tags)); + } + } + + + static class JsonReader { + private Reader m_reader; + + private char[] m_buffer = new char[2048]; + + private int m_size; + + private int m_index; + + public JsonReader(Reader reader) { + m_reader = reader; + } + + private char next() throws IOException { + if (m_index >= m_size) { + m_size = m_reader.read(m_buffer); + m_index = 0; + + if (m_size == -1) { + throw new EOFException(); + } + } + + return m_buffer[m_index++]; + } + + public void parse(DefaultJsonParser parser) throws IOException { + StringBuilder sb = new StringBuilder(); + boolean flag = false; + + while (true) { + char ch = next(); + + switch (ch) { + case ' ': + case '\t': + case '\r': + case '\n': + break; + case '{': + parser.onObjectBegin(); + flag = false; + break; + case '}': + if (flag) { // have value + parser.onValue(sb.toString()); + sb.setLength(0); + } + + parser.onObjectEnd(); + flag = false; + break; + case '\'': + case '"': + while (true) { + char ch2 = next(); + + if (ch2 != ch) { + if (ch2 == '\\') { + char ch3 = next(); + + switch (ch3) { + case 't': + sb.append('\t'); + break; + case 'r': + sb.append('\r'); + break; + case 'n': + sb.append('\n'); + break; + default: + sb.append(ch3); + break; + } + } else { + sb.append(ch2); + } + } else { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + flag = false; + } + + sb.setLength(0); + break; + } + } + + break; + case ':': + if (sb.length() != 0) { + parser.onName(sb.toString()); + sb.setLength(0); + } + + flag = true; + break; + case ',': + if (sb.length() != 0) { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + } + + sb.setLength(0); + } + + flag = false; + break; + case '[': + parser.onArrayBegin(); + flag = false; + break; + case ']': + parser.onArrayEnd(); + flag = false; + break; + default: + sb.append(ch); + break; + } + } + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultLinker.java new file mode 100644 index 0000000000..b6187351f7 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultLinker.java @@ -0,0 +1,55 @@ +package com.dianping.cat.home.dependency.graph.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; +import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; +import com.dianping.cat.home.dependency.graph.entity.TopologyNode; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onTopologyEdge(final TopologyGraph parent, final TopologyEdge topologyEdge) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addTopologyEdge(topologyEdge); + } + }); + } else { + parent.addTopologyEdge(topologyEdge); + } + + return true; + } + + @Override + public boolean onTopologyNode(final TopologyGraph parent, final TopologyNode topologyNode) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addTopologyNode(topologyNode); + } + }); + } else { + parent.addTopologyNode(topologyNode); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultMerger.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultMerger.java new file mode 100644 index 0000000000..c311428482 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultMerger.java @@ -0,0 +1,108 @@ +package com.dianping.cat.home.dependency.graph.transform; + +import java.util.Stack; + +import com.dianping.cat.home.dependency.graph.IEntity; +import com.dianping.cat.home.dependency.graph.IVisitor; +import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; +import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; +import com.dianping.cat.home.dependency.graph.entity.TopologyNode; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private TopologyGraph m_topologyGraph; + + public DefaultMerger() { + } + + public DefaultMerger(TopologyGraph topologyGraph) { + m_topologyGraph = topologyGraph; + m_objs.push(topologyGraph); + } + + public TopologyGraph getTopologyGraph() { + return m_topologyGraph; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeTopologyEdge(TopologyEdge to, TopologyEdge from) { + to.mergeAttributes(from); + } + + protected void mergeTopologyGraph(TopologyGraph to, TopologyGraph from) { + to.mergeAttributes(from); + } + + protected void mergeTopologyNode(TopologyNode to, TopologyNode from) { + to.mergeAttributes(from); + } + + @Override + public void visitTopologyEdge(TopologyEdge from) { + TopologyEdge to = (TopologyEdge) m_objs.peek(); + + mergeTopologyEdge(to, from); + visitTopologyEdgeChildren(to, from); + } + + protected void visitTopologyEdgeChildren(TopologyEdge to, TopologyEdge from) { + } + + @Override + public void visitTopologyGraph(TopologyGraph from) { + TopologyGraph to = (TopologyGraph) m_objs.peek(); + + mergeTopologyGraph(to, from); + visitTopologyGraphChildren(to, from); + } + + protected void visitTopologyGraphChildren(TopologyGraph to, TopologyGraph from) { + for (TopologyNode source : from.getNodes().values()) { + TopologyNode target = to.findTopologyNode(source.getId()); + + if (target == null) { + target = new TopologyNode(source.getId()); + to.addTopologyNode(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (TopologyEdge source : from.getEdges().values()) { + TopologyEdge target = to.findTopologyEdge(source.getKey()); + + if (target == null) { + target = new TopologyEdge(source.getKey()); + to.addTopologyEdge(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitTopologyNode(TopologyNode from) { + TopologyNode to = (TopologyNode) m_objs.peek(); + + mergeTopologyNode(to, from); + visitTopologyNodeChildren(to, from); + } + + protected void visitTopologyNodeChildren(TopologyNode to, TopologyNode from) { + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultNativeBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..09d7713e93 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultNativeBuilder.java @@ -0,0 +1,203 @@ +package com.dianping.cat.home.dependency.graph.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.home.dependency.graph.IVisitor; +import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; +import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; +import com.dianping.cat.home.dependency.graph.entity.TopologyNode; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(TopologyGraph topologyGraph) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(topologyGraph, out); + return out.toByteArray(); + } + + public static void build(TopologyGraph topologyGraph, OutputStream out) { + topologyGraph.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitTopologyEdge(TopologyEdge topologyEdge) { + if (topologyEdge.getKey() != null) { + writeTag(1, 1); + writeString(topologyEdge.getKey()); + } + + if (topologyEdge.getType() != null) { + writeTag(2, 1); + writeString(topologyEdge.getType()); + } + + if (topologyEdge.getTarget() != null) { + writeTag(3, 1); + writeString(topologyEdge.getTarget()); + } + + writeTag(4, 0); + writeBoolean(topologyEdge.getOpposite()); + + writeTag(5, 0); + writeInt(topologyEdge.getWeight()); + + writeTag(6, 0); + writeInt(topologyEdge.getStatus()); + + if (topologyEdge.getDes() != null) { + writeTag(7, 1); + writeString(topologyEdge.getDes()); + } + + if (topologyEdge.getLink() != null) { + writeTag(8, 1); + writeString(topologyEdge.getLink()); + } + + if (topologyEdge.getSelf() != null) { + writeTag(9, 1); + writeString(topologyEdge.getSelf()); + } + + writeTag(10, 0); + writeBoolean(topologyEdge.getDashed()); + + writeTag(63, 3); + } + + @Override + public void visitTopologyGraph(TopologyGraph topologyGraph) { + writeTag(63, 0); + + if (topologyGraph.getId() != null) { + writeTag(1, 1); + writeString(topologyGraph.getId()); + } + + if (topologyGraph.getType() != null) { + writeTag(2, 1); + writeString(topologyGraph.getType()); + } + + writeTag(3, 0); + writeInt(topologyGraph.getStatus()); + + if (topologyGraph.getDes() != null) { + writeTag(4, 1); + writeString(topologyGraph.getDes()); + } + + if (!topologyGraph.getNodes().isEmpty()) { + writeTag(33, 2); + writeInt(topologyGraph.getNodes().size()); + + for (TopologyNode topologyNode : topologyGraph.getNodes().values()) { + topologyNode.accept(m_visitor); + } + } + + if (!topologyGraph.getEdges().isEmpty()) { + writeTag(34, 2); + writeInt(topologyGraph.getEdges().size()); + + for (TopologyEdge topologyEdge : topologyGraph.getEdges().values()) { + topologyEdge.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitTopologyNode(TopologyNode topologyNode) { + if (topologyNode.getId() != null) { + writeTag(1, 1); + writeString(topologyNode.getId()); + } + + if (topologyNode.getType() != null) { + writeTag(2, 1); + writeString(topologyNode.getType()); + } + + writeTag(3, 0); + writeInt(topologyNode.getStatus()); + + if (topologyNode.getDes() != null) { + writeTag(4, 1); + writeString(topologyNode.getDes()); + } + + if (topologyNode.getLink() != null) { + writeTag(5, 1); + writeString(topologyNode.getLink()); + } + + writeTag(6, 0); + writeInt(topologyNode.getWeight()); + + writeTag(63, 3); + } + + private void writeBoolean(boolean value) { + try { + m_out.writeByte(value ? 1 : 0); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultNativeParser.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..9f088a3490 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultNativeParser.java @@ -0,0 +1,228 @@ +package com.dianping.cat.home.dependency.graph.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.home.dependency.graph.IVisitor; +import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; +import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; +import com.dianping.cat.home.dependency.graph.entity.TopologyNode; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static TopologyGraph parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static TopologyGraph parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + TopologyGraph topologyGraph = new TopologyGraph(); + + try { + topologyGraph.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return topologyGraph; + } + + @Override + public void visitTopologyEdge(TopologyEdge topologyEdge) { + byte tag; + + while ((tag = readTag()) != -1) { + visitTopologyEdgeChildren(topologyEdge, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitTopologyEdgeChildren(TopologyEdge topologyEdge, int _field, int _type) { + switch (_field) { + case 1: + topologyEdge.setKey(readString()); + break; + case 2: + topologyEdge.setType(readString()); + break; + case 3: + topologyEdge.setTarget(readString()); + break; + case 4: + topologyEdge.setOpposite(readBoolean()); + break; + case 5: + topologyEdge.setWeight(readInt()); + break; + case 6: + topologyEdge.setStatus(readInt()); + break; + case 7: + topologyEdge.setDes(readString()); + break; + case 8: + topologyEdge.setLink(readString()); + break; + case 9: + topologyEdge.setSelf(readString()); + break; + case 10: + topologyEdge.setDashed(readBoolean()); + break; + } + } + + @Override + public void visitTopologyGraph(TopologyGraph topologyGraph) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitTopologyGraphChildren(topologyGraph, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitTopologyGraphChildren(TopologyGraph topologyGraph, int _field, int _type) { + switch (_field) { + case 1: + topologyGraph.setId(readString()); + break; + case 2: + topologyGraph.setType(readString()); + break; + case 3: + topologyGraph.setStatus(readInt()); + break; + case 4: + topologyGraph.setDes(readString()); + break; + case 33: + if (_type == 1) { + TopologyNode topologyNode = new TopologyNode(); + + visitTopologyNode(topologyNode); + m_linker.onTopologyNode(topologyGraph, topologyNode); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + TopologyNode topologyNode = new TopologyNode(); + + visitTopologyNode(topologyNode); + m_linker.onTopologyNode(topologyGraph, topologyNode); + } + } + break; + case 34: + if (_type == 1) { + TopologyEdge topologyEdge = new TopologyEdge(); + + visitTopologyEdge(topologyEdge); + m_linker.onTopologyEdge(topologyGraph, topologyEdge); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + TopologyEdge topologyEdge = new TopologyEdge(); + + visitTopologyEdge(topologyEdge); + m_linker.onTopologyEdge(topologyGraph, topologyEdge); + } + } + break; + } + } + + @Override + public void visitTopologyNode(TopologyNode topologyNode) { + byte tag; + + while ((tag = readTag()) != -1) { + visitTopologyNodeChildren(topologyNode, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitTopologyNodeChildren(TopologyNode topologyNode, int _field, int _type) { + switch (_field) { + case 1: + topologyNode.setId(readString()); + break; + case 2: + topologyNode.setType(readString()); + break; + case 3: + topologyNode.setStatus(readInt()); + break; + case 4: + topologyNode.setDes(readString()); + break; + case 5: + topologyNode.setLink(readString()); + break; + case 6: + topologyNode.setWeight(readInt()); + break; + } + } + + private boolean readBoolean() { + try { + return m_in.readByte() == 1 ? Boolean.TRUE : Boolean.FALSE; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..4a7325cefb --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultSaxMaker.java @@ -0,0 +1,162 @@ +package com.dianping.cat.home.dependency.graph.transform; + +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_DASHED; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_DES; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_ID; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_KEY; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_LINK; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_OPPOSITE; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_SELF; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_STATUS; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_TARGET; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_TYPE; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_WEIGHT; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; +import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; +import com.dianping.cat.home.dependency.graph.entity.TopologyNode; + +public class DefaultSaxMaker implements IMaker { + + @Override + public TopologyEdge buildTopologyEdge(Attributes attributes) { + String key = attributes.getValue(ATTR_KEY); + String type = attributes.getValue(ATTR_TYPE); + String target = attributes.getValue(ATTR_TARGET); + String opposite = attributes.getValue(ATTR_OPPOSITE); + String weight = attributes.getValue(ATTR_WEIGHT); + String status = attributes.getValue(ATTR_STATUS); + String des = attributes.getValue(ATTR_DES); + String link = attributes.getValue(ATTR_LINK); + String self = attributes.getValue(ATTR_SELF); + String dashed = attributes.getValue(ATTR_DASHED); + TopologyEdge topologyEdge = new TopologyEdge(key); + + if (type != null) { + topologyEdge.setType(type); + } + + if (target != null) { + topologyEdge.setTarget(target); + } + + if (opposite != null) { + topologyEdge.setOpposite(convert(Boolean.class, opposite, false)); + } + + if (weight != null) { + topologyEdge.setWeight(convert(Integer.class, weight, 0)); + } + + if (status != null) { + topologyEdge.setStatus(convert(Integer.class, status, 0)); + } + + if (des != null) { + topologyEdge.setDes(des); + } + + if (link != null) { + topologyEdge.setLink(link); + } + + if (self != null) { + topologyEdge.setSelf(self); + } + + if (dashed != null) { + topologyEdge.setDashed(convert(Boolean.class, dashed, false)); + } + + return topologyEdge; + } + + @Override + public TopologyGraph buildTopologyGraph(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String type = attributes.getValue(ATTR_TYPE); + String status = attributes.getValue(ATTR_STATUS); + String des = attributes.getValue(ATTR_DES); + TopologyGraph topologyGraph = new TopologyGraph(); + + if (id != null) { + topologyGraph.setId(id); + } + + if (type != null) { + topologyGraph.setType(type); + } + + if (status != null) { + topologyGraph.setStatus(convert(Integer.class, status, 0)); + } + + if (des != null) { + topologyGraph.setDes(des); + } + + return topologyGraph; + } + + @Override + public TopologyNode buildTopologyNode(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String type = attributes.getValue(ATTR_TYPE); + String status = attributes.getValue(ATTR_STATUS); + String des = attributes.getValue(ATTR_DES); + String link = attributes.getValue(ATTR_LINK); + String weight = attributes.getValue(ATTR_WEIGHT); + TopologyNode topologyNode = new TopologyNode(id); + + if (type != null) { + topologyNode.setType(type); + } + + if (status != null) { + topologyNode.setStatus(convert(Integer.class, status, 0)); + } + + if (des != null) { + topologyNode.setDes(des); + } + + if (link != null) { + topologyNode.setLink(link); + } + + if (weight != null) { + topologyNode.setWeight(convert(Integer.class, weight, 0)); + } + + return topologyNode; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..ce4c453804 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultSaxParser.java @@ -0,0 +1,247 @@ +package com.dianping.cat.home.dependency.graph.transform; + +import static com.dianping.cat.home.dependency.graph.Constants.ENTITY_TOPOLOGY_EDGE; +import static com.dianping.cat.home.dependency.graph.Constants.ENTITY_TOPOLOGY_GRAPH; +import static com.dianping.cat.home.dependency.graph.Constants.ENTITY_TOPOLOGY_NODE; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.dependency.graph.IEntity; +import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; +import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; +import com.dianping.cat.home.dependency.graph.entity.TopologyNode; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static TopologyGraph parse(InputStream in) throws SAXException, IOException { + return parseEntity(TopologyGraph.class, new InputSource(removeBOM(in))); + } + + public static TopologyGraph parse(Reader reader) throws SAXException, IOException { + return parseEntity(TopologyGraph.class, new InputSource(removeBOM(reader))); + } + + public static TopologyGraph parse(String xml) throws SAXException, IOException { + return parseEntity(TopologyGraph.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForTopologyEdge(TopologyEdge parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForTopologyGraph(TopologyGraph parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_TOPOLOGY_NODE.equals(qName)) { + TopologyNode topologyNode = m_maker.buildTopologyNode(attributes); + + m_linker.onTopologyNode(parentObj, topologyNode); + m_objs.push(topologyNode); + } else if (ENTITY_TOPOLOGY_EDGE.equals(qName)) { + TopologyEdge topologyEdge = m_maker.buildTopologyEdge(attributes); + + m_linker.onTopologyEdge(parentObj, topologyEdge); + m_objs.push(topologyEdge); + } else { + throw new SAXException(String.format("Element(%s) is not expected under topology-graph!", qName)); + } + + m_tags.push(qName); + } + + private void parseForTopologyNode(TopologyNode parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_TOPOLOGY_GRAPH.equals(qName)) { + TopologyGraph topologyGraph = m_maker.buildTopologyGraph(attributes); + + m_entity = topologyGraph; + m_objs.push(topologyGraph); + m_tags.push(qName); + } else if (ENTITY_TOPOLOGY_NODE.equals(qName)) { + TopologyNode topologyNode = m_maker.buildTopologyNode(attributes); + + m_entity = topologyNode; + m_objs.push(topologyNode); + m_tags.push(qName); + } else if (ENTITY_TOPOLOGY_EDGE.equals(qName)) { + TopologyEdge topologyEdge = m_maker.buildTopologyEdge(attributes); + + m_entity = topologyEdge; + m_objs.push(topologyEdge); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof TopologyGraph) { + parseForTopologyGraph((TopologyGraph) parent, tag, qName, attributes); + } else if (parent instanceof TopologyNode) { + parseForTopologyNode((TopologyNode) parent, tag, qName, attributes); + } else if (parent instanceof TopologyEdge) { + parseForTopologyEdge((TopologyEdge) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..d3bd22d5ad --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/DefaultXmlBuilder.java @@ -0,0 +1,235 @@ +package com.dianping.cat.home.dependency.graph.transform; + +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_DASHED; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_DES; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_ID; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_KEY; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_LINK; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_OPPOSITE; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_SELF; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_STATUS; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_TARGET; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_TYPE; +import static com.dianping.cat.home.dependency.graph.Constants.ATTR_WEIGHT; +import static com.dianping.cat.home.dependency.graph.Constants.ENTITY_TOPOLOGY_EDGE; +import static com.dianping.cat.home.dependency.graph.Constants.ENTITY_TOPOLOGY_GRAPH; +import static com.dianping.cat.home.dependency.graph.Constants.ENTITY_TOPOLOGY_NODE; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.dependency.graph.IEntity; +import com.dianping.cat.home.dependency.graph.IVisitor; +import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; +import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; +import com.dianping.cat.home.dependency.graph.entity.TopologyNode; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitTopologyEdge(TopologyEdge topologyEdge) { + startTag(ENTITY_TOPOLOGY_EDGE, true, null, ATTR_KEY, topologyEdge.getKey(), ATTR_TYPE, topologyEdge.getType(), ATTR_TARGET, topologyEdge.getTarget(), ATTR_OPPOSITE, topologyEdge.isOpposite(), ATTR_WEIGHT, topologyEdge.getWeight(), ATTR_STATUS, topologyEdge.getStatus(), ATTR_DES, topologyEdge.getDes(), ATTR_LINK, topologyEdge.getLink(), ATTR_SELF, topologyEdge.getSelf(), ATTR_DASHED, topologyEdge.isDashed()); + } + + @Override + public void visitTopologyGraph(TopologyGraph topologyGraph) { + startTag(ENTITY_TOPOLOGY_GRAPH, null, ATTR_ID, topologyGraph.getId(), ATTR_TYPE, topologyGraph.getType(), ATTR_STATUS, topologyGraph.getStatus(), ATTR_DES, topologyGraph.getDes()); + + if (!topologyGraph.getNodes().isEmpty()) { + for (TopologyNode topologyNode : topologyGraph.getNodes().values()) { + topologyNode.accept(m_visitor); + } + } + + if (!topologyGraph.getEdges().isEmpty()) { + for (TopologyEdge topologyEdge : topologyGraph.getEdges().values()) { + topologyEdge.accept(m_visitor); + } + } + + endTag(ENTITY_TOPOLOGY_GRAPH); + } + + @Override + public void visitTopologyNode(TopologyNode topologyNode) { + startTag(ENTITY_TOPOLOGY_NODE, true, null, ATTR_ID, topologyNode.getId(), ATTR_TYPE, topologyNode.getType(), ATTR_STATUS, topologyNode.getStatus(), ATTR_DES, topologyNode.getDes(), ATTR_LINK, topologyNode.getLink(), ATTR_WEIGHT, topologyNode.getWeight()); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/ILinker.java new file mode 100644 index 0000000000..a3e87c5d4e --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.home.dependency.graph.transform; + +import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; +import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; +import com.dianping.cat.home.dependency.graph.entity.TopologyNode; + +public interface ILinker { + + public boolean onTopologyEdge(TopologyGraph parent, TopologyEdge topologyEdge); + + public boolean onTopologyNode(TopologyGraph parent, TopologyNode topologyNode); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/IMaker.java new file mode 100644 index 0000000000..74b342264d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/IMaker.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.dependency.graph.transform; + +import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; +import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; +import com.dianping.cat.home.dependency.graph.entity.TopologyNode; + +public interface IMaker { + + public TopologyEdge buildTopologyEdge(T node); + + public TopologyGraph buildTopologyGraph(T node); + + public TopologyNode buildTopologyNode(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/IParser.java new file mode 100644 index 0000000000..b85a579dc3 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/dependency/graph/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.home.dependency.graph.transform; + +import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; +import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; +import com.dianping.cat.home.dependency.graph.entity.TopologyNode; + +public interface IParser { + public TopologyGraph parse(IMaker maker, ILinker linker, T node); + + public void parseForTopologyEdge(IMaker maker, ILinker linker, TopologyEdge parent, T node); + + public void parseForTopologyNode(IMaker maker, ILinker linker, TopologyNode parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/exception/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/exception/BaseEntity.java new file mode 100644 index 0000000000..194671a88b --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/exception/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.exception; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.exception.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/exception/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/exception/Constants.java new file mode 100644 index 0000000000..4213b886b6 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/exception/Constants.java @@ -0,0 +1,26 @@ +package com.dianping.cat.home.exception; + +public class Constants { + + public static final String ATTR_AVAILABLE = "available"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_ERROR = "error"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_NAME = "name"; + + public static final String ATTR_WARNING = "warning"; + + public static final String ENTITY_EXCEPTION_EXCLUDE = "exception-exclude"; + + public static final String ENTITY_EXCEPTION_EXCLUDES = "exception-excludes"; + + public static final String ENTITY_EXCEPTION_LIMIT = "exception-limit"; + + public static final String ENTITY_EXCEPTION_LIMITS = "exception-limits"; + + public static final String ENTITY_EXCEPTION_RULE_CONFIG = "exception-rule-config"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/exception/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/exception/IEntity.java new file mode 100644 index 0000000000..c91919a278 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/exception/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.exception; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/exception/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/exception/IVisitor.java new file mode 100644 index 0000000000..9f01f2a939 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/exception/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.exception; + +import com.dianping.cat.home.exception.entity.ExceptionExclude; +import com.dianping.cat.home.exception.entity.ExceptionLimit; +import com.dianping.cat.home.exception.entity.ExceptionRuleConfig; + +public interface IVisitor { + + public void visitExceptionExclude(ExceptionExclude exceptionExclude); + + public void visitExceptionLimit(ExceptionLimit exceptionLimit); + + public void visitExceptionRuleConfig(ExceptionRuleConfig exceptionRuleConfig); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/exception/entity/ExceptionExclude.java b/cat-home/src/main/java/com/dianping/cat/home/exception/entity/ExceptionExclude.java new file mode 100644 index 0000000000..34014fb69e --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/exception/entity/ExceptionExclude.java @@ -0,0 +1,92 @@ +package com.dianping.cat.home.exception.entity; + +import static com.dianping.cat.home.exception.Constants.ATTR_ID; +import static com.dianping.cat.home.exception.Constants.ENTITY_EXCEPTION_EXCLUDE; + +import com.dianping.cat.home.exception.BaseEntity; +import com.dianping.cat.home.exception.IVisitor; + +public class ExceptionExclude extends BaseEntity { + private String m_id; + + private String m_domain; + + private String m_name; + + public ExceptionExclude() { + } + + public ExceptionExclude(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitExceptionExclude(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ExceptionExclude) { + ExceptionExclude _o = (ExceptionExclude) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getDomain() { + return m_domain; + } + + public String getId() { + return m_id; + } + + public String getName() { + return m_name; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ExceptionExclude other) { + assertAttributeEquals(other, ENTITY_EXCEPTION_EXCLUDE, ATTR_ID, m_id, other.getId()); + + if (other.getDomain() != null) { + m_domain = other.getDomain(); + } + + if (other.getName() != null) { + m_name = other.getName(); + } + } + + public ExceptionExclude setDomain(String domain) { + m_domain = domain; + return this; + } + + public ExceptionExclude setId(String id) { + m_id = id; + return this; + } + + public ExceptionExclude setName(String name) { + m_name = name; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/exception/entity/ExceptionLimit.java b/cat-home/src/main/java/com/dianping/cat/home/exception/entity/ExceptionLimit.java new file mode 100644 index 0000000000..69ab672bcf --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/exception/entity/ExceptionLimit.java @@ -0,0 +1,137 @@ +package com.dianping.cat.home.exception.entity; + +import static com.dianping.cat.home.exception.Constants.ATTR_ID; +import static com.dianping.cat.home.exception.Constants.ENTITY_EXCEPTION_LIMIT; + +import com.dianping.cat.home.exception.BaseEntity; +import com.dianping.cat.home.exception.IVisitor; + +public class ExceptionLimit extends BaseEntity { + private String m_id; + + private String m_domain; + + private String m_name; + + private int m_warning; + + private int m_error; + + private Boolean m_available; + + public ExceptionLimit() { + } + + public ExceptionLimit(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitExceptionLimit(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ExceptionLimit) { + ExceptionLimit _o = (ExceptionLimit) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Boolean getAvailable() { + return m_available; + } + + public String getDomain() { + return m_domain; + } + + public int getError() { + return m_error; + } + + public String getId() { + return m_id; + } + + public String getName() { + return m_name; + } + + public int getWarning() { + return m_warning; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public boolean isAvailable() { + return m_available != null && m_available.booleanValue(); + } + + @Override + public void mergeAttributes(ExceptionLimit other) { + assertAttributeEquals(other, ENTITY_EXCEPTION_LIMIT, ATTR_ID, m_id, other.getId()); + + if (other.getDomain() != null) { + m_domain = other.getDomain(); + } + + if (other.getName() != null) { + m_name = other.getName(); + } + + m_warning = other.getWarning(); + + m_error = other.getError(); + + if (other.getAvailable() != null) { + m_available = other.getAvailable(); + } + } + + public ExceptionLimit setAvailable(Boolean available) { + m_available = available; + return this; + } + + public ExceptionLimit setDomain(String domain) { + m_domain = domain; + return this; + } + + public ExceptionLimit setError(int error) { + m_error = error; + return this; + } + + public ExceptionLimit setId(String id) { + m_id = id; + return this; + } + + public ExceptionLimit setName(String name) { + m_name = name; + return this; + } + + public ExceptionLimit setWarning(int warning) { + m_warning = warning; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/exception/entity/ExceptionRuleConfig.java b/cat-home/src/main/java/com/dianping/cat/home/exception/entity/ExceptionRuleConfig.java new file mode 100644 index 0000000000..6128505e74 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/exception/entity/ExceptionRuleConfig.java @@ -0,0 +1,124 @@ +package com.dianping.cat.home.exception.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.exception.BaseEntity; +import com.dianping.cat.home.exception.IVisitor; + +public class ExceptionRuleConfig extends BaseEntity { + private Map m_exceptionLimits = new LinkedHashMap(); + + private Map m_exceptionExcludes = new LinkedHashMap(); + + public ExceptionRuleConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitExceptionRuleConfig(this); + } + + public ExceptionRuleConfig addExceptionExclude(ExceptionExclude exceptionExclude) { + m_exceptionExcludes.put(exceptionExclude.getId(), exceptionExclude); + return this; + } + + public ExceptionRuleConfig addExceptionLimit(ExceptionLimit exceptionLimit) { + m_exceptionLimits.put(exceptionLimit.getId(), exceptionLimit); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ExceptionRuleConfig) { + ExceptionRuleConfig _o = (ExceptionRuleConfig) obj; + + if (!equals(getExceptionLimits(), _o.getExceptionLimits())) { + return false; + } + + if (!equals(getExceptionExcludes(), _o.getExceptionExcludes())) { + return false; + } + + + return true; + } + + return false; + } + + public ExceptionExclude findExceptionExclude(String id) { + return m_exceptionExcludes.get(id); + } + + public ExceptionLimit findExceptionLimit(String id) { + return m_exceptionLimits.get(id); + } + + public ExceptionExclude findOrCreateExceptionExclude(String id) { + ExceptionExclude exceptionExclude = m_exceptionExcludes.get(id); + + if (exceptionExclude == null) { + synchronized (m_exceptionExcludes) { + exceptionExclude = m_exceptionExcludes.get(id); + + if (exceptionExclude == null) { + exceptionExclude = new ExceptionExclude(id); + m_exceptionExcludes.put(id, exceptionExclude); + } + } + } + + return exceptionExclude; + } + + public ExceptionLimit findOrCreateExceptionLimit(String id) { + ExceptionLimit exceptionLimit = m_exceptionLimits.get(id); + + if (exceptionLimit == null) { + synchronized (m_exceptionLimits) { + exceptionLimit = m_exceptionLimits.get(id); + + if (exceptionLimit == null) { + exceptionLimit = new ExceptionLimit(id); + m_exceptionLimits.put(id, exceptionLimit); + } + } + } + + return exceptionLimit; + } + + public Map getExceptionExcludes() { + return m_exceptionExcludes; + } + + public Map getExceptionLimits() { + return m_exceptionLimits; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_exceptionLimits == null ? 0 : m_exceptionLimits.hashCode()); + hash = hash * 31 + (m_exceptionExcludes == null ? 0 : m_exceptionExcludes.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ExceptionRuleConfig other) { + } + + public ExceptionExclude removeExceptionExclude(String id) { + return m_exceptionExcludes.remove(id); + } + + public ExceptionLimit removeExceptionLimit(String id) { + return m_exceptionLimits.remove(id); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultLinker.java new file mode 100644 index 0000000000..1ee8e4ac31 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultLinker.java @@ -0,0 +1,55 @@ +package com.dianping.cat.home.exception.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.exception.entity.ExceptionExclude; +import com.dianping.cat.home.exception.entity.ExceptionLimit; +import com.dianping.cat.home.exception.entity.ExceptionRuleConfig; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onExceptionExclude(final ExceptionRuleConfig parent, final ExceptionExclude exceptionExclude) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addExceptionExclude(exceptionExclude); + } + }); + } else { + parent.addExceptionExclude(exceptionExclude); + } + + return true; + } + + @Override + public boolean onExceptionLimit(final ExceptionRuleConfig parent, final ExceptionLimit exceptionLimit) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addExceptionLimit(exceptionLimit); + } + }); + } else { + parent.addExceptionLimit(exceptionLimit); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..30f1ffc9cd --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultSaxMaker.java @@ -0,0 +1,102 @@ +package com.dianping.cat.home.exception.transform; + +import static com.dianping.cat.home.exception.Constants.ATTR_AVAILABLE; +import static com.dianping.cat.home.exception.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.exception.Constants.ATTR_ERROR; +import static com.dianping.cat.home.exception.Constants.ATTR_ID; +import static com.dianping.cat.home.exception.Constants.ATTR_NAME; +import static com.dianping.cat.home.exception.Constants.ATTR_WARNING; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.exception.entity.ExceptionExclude; +import com.dianping.cat.home.exception.entity.ExceptionLimit; +import com.dianping.cat.home.exception.entity.ExceptionRuleConfig; + +public class DefaultSaxMaker implements IMaker { + + @Override + public ExceptionExclude buildExceptionExclude(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String domain = attributes.getValue(ATTR_DOMAIN); + String name = attributes.getValue(ATTR_NAME); + ExceptionExclude exceptionExclude = new ExceptionExclude(id); + + if (domain != null) { + exceptionExclude.setDomain(domain); + } + + if (name != null) { + exceptionExclude.setName(name); + } + + return exceptionExclude; + } + + @Override + public ExceptionLimit buildExceptionLimit(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String domain = attributes.getValue(ATTR_DOMAIN); + String name = attributes.getValue(ATTR_NAME); + String warning = attributes.getValue(ATTR_WARNING); + String error = attributes.getValue(ATTR_ERROR); + String available = attributes.getValue(ATTR_AVAILABLE); + ExceptionLimit exceptionLimit = new ExceptionLimit(id); + + if (domain != null) { + exceptionLimit.setDomain(domain); + } + + if (name != null) { + exceptionLimit.setName(name); + } + + if (warning != null) { + exceptionLimit.setWarning(convert(Integer.class, warning, 0)); + } + + if (error != null) { + exceptionLimit.setError(convert(Integer.class, error, 0)); + } + + if (available != null) { + exceptionLimit.setAvailable(convert(Boolean.class, available, null)); + } + + return exceptionLimit; + } + + @Override + public ExceptionRuleConfig buildExceptionRuleConfig(Attributes attributes) { + ExceptionRuleConfig exceptionRuleConfig = new ExceptionRuleConfig(); + + return exceptionRuleConfig; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..219d5b9663 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultSaxParser.java @@ -0,0 +1,247 @@ +package com.dianping.cat.home.exception.transform; + +import static com.dianping.cat.home.exception.Constants.ENTITY_EXCEPTION_EXCLUDE; +import static com.dianping.cat.home.exception.Constants.ENTITY_EXCEPTION_LIMIT; +import static com.dianping.cat.home.exception.Constants.ENTITY_EXCEPTION_RULE_CONFIG; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.exception.IEntity; +import com.dianping.cat.home.exception.entity.ExceptionExclude; +import com.dianping.cat.home.exception.entity.ExceptionLimit; +import com.dianping.cat.home.exception.entity.ExceptionRuleConfig; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static ExceptionRuleConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(ExceptionRuleConfig.class, new InputSource(removeBOM(in))); + } + + public static ExceptionRuleConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(ExceptionRuleConfig.class, new InputSource(removeBOM(reader))); + } + + public static ExceptionRuleConfig parse(String xml) throws SAXException, IOException { + return parseEntity(ExceptionRuleConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForExceptionExclude(ExceptionExclude parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForExceptionLimit(ExceptionLimit parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForExceptionRuleConfig(ExceptionRuleConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_EXCEPTION_LIMIT.equals(qName)) { + ExceptionLimit exceptionLimit = m_maker.buildExceptionLimit(attributes); + + m_linker.onExceptionLimit(parentObj, exceptionLimit); + m_objs.push(exceptionLimit); + } else if (ENTITY_EXCEPTION_EXCLUDE.equals(qName)) { + ExceptionExclude exceptionExclude = m_maker.buildExceptionExclude(attributes); + + m_linker.onExceptionExclude(parentObj, exceptionExclude); + m_objs.push(exceptionExclude); + } else { + throw new SAXException(String.format("Element(%s) is not expected under exception-rule-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_EXCEPTION_RULE_CONFIG.equals(qName)) { + ExceptionRuleConfig exceptionRuleConfig = m_maker.buildExceptionRuleConfig(attributes); + + m_entity = exceptionRuleConfig; + m_objs.push(exceptionRuleConfig); + m_tags.push(qName); + } else if (ENTITY_EXCEPTION_LIMIT.equals(qName)) { + ExceptionLimit exceptionLimit = m_maker.buildExceptionLimit(attributes); + + m_entity = exceptionLimit; + m_objs.push(exceptionLimit); + m_tags.push(qName); + } else if (ENTITY_EXCEPTION_EXCLUDE.equals(qName)) { + ExceptionExclude exceptionExclude = m_maker.buildExceptionExclude(attributes); + + m_entity = exceptionExclude; + m_objs.push(exceptionExclude); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof ExceptionRuleConfig) { + parseForExceptionRuleConfig((ExceptionRuleConfig) parent, tag, qName, attributes); + } else if (parent instanceof ExceptionLimit) { + parseForExceptionLimit((ExceptionLimit) parent, tag, qName, attributes); + } else if (parent instanceof ExceptionExclude) { + parseForExceptionExclude((ExceptionExclude) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..0f8ddd7b1b --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/exception/transform/DefaultXmlBuilder.java @@ -0,0 +1,230 @@ +package com.dianping.cat.home.exception.transform; + +import static com.dianping.cat.home.exception.Constants.ATTR_AVAILABLE; +import static com.dianping.cat.home.exception.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.exception.Constants.ATTR_ERROR; +import static com.dianping.cat.home.exception.Constants.ATTR_ID; +import static com.dianping.cat.home.exception.Constants.ATTR_NAME; +import static com.dianping.cat.home.exception.Constants.ATTR_WARNING; +import static com.dianping.cat.home.exception.Constants.ENTITY_EXCEPTION_EXCLUDE; +import static com.dianping.cat.home.exception.Constants.ENTITY_EXCEPTION_LIMIT; +import static com.dianping.cat.home.exception.Constants.ENTITY_EXCEPTION_RULE_CONFIG; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.exception.IEntity; +import com.dianping.cat.home.exception.IVisitor; +import com.dianping.cat.home.exception.entity.ExceptionExclude; +import com.dianping.cat.home.exception.entity.ExceptionLimit; +import com.dianping.cat.home.exception.entity.ExceptionRuleConfig; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitExceptionExclude(ExceptionExclude exceptionExclude) { + startTag(ENTITY_EXCEPTION_EXCLUDE, true, null, ATTR_ID, exceptionExclude.getId(), ATTR_DOMAIN, exceptionExclude.getDomain(), ATTR_NAME, exceptionExclude.getName()); + } + + @Override + public void visitExceptionLimit(ExceptionLimit exceptionLimit) { + startTag(ENTITY_EXCEPTION_LIMIT, true, null, ATTR_ID, exceptionLimit.getId(), ATTR_DOMAIN, exceptionLimit.getDomain(), ATTR_NAME, exceptionLimit.getName(), ATTR_WARNING, exceptionLimit.getWarning(), ATTR_ERROR, exceptionLimit.getError(), ATTR_AVAILABLE, exceptionLimit.getAvailable()); + } + + @Override + public void visitExceptionRuleConfig(ExceptionRuleConfig exceptionRuleConfig) { + startTag(ENTITY_EXCEPTION_RULE_CONFIG, null); + + if (!exceptionRuleConfig.getExceptionLimits().isEmpty()) { + for (ExceptionLimit exceptionLimit : exceptionRuleConfig.getExceptionLimits().values()) { + exceptionLimit.accept(m_visitor); + } + } + + if (!exceptionRuleConfig.getExceptionExcludes().isEmpty()) { + for (ExceptionExclude exceptionExclude : exceptionRuleConfig.getExceptionExcludes().values()) { + exceptionExclude.accept(m_visitor); + } + } + + endTag(ENTITY_EXCEPTION_RULE_CONFIG); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/exception/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/exception/transform/ILinker.java new file mode 100644 index 0000000000..f23f00fc54 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/exception/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.home.exception.transform; + +import com.dianping.cat.home.exception.entity.ExceptionExclude; +import com.dianping.cat.home.exception.entity.ExceptionLimit; +import com.dianping.cat.home.exception.entity.ExceptionRuleConfig; + +public interface ILinker { + + public boolean onExceptionExclude(ExceptionRuleConfig parent, ExceptionExclude exceptionExclude); + + public boolean onExceptionLimit(ExceptionRuleConfig parent, ExceptionLimit exceptionLimit); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/exception/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/exception/transform/IMaker.java new file mode 100644 index 0000000000..70160641ed --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/exception/transform/IMaker.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.exception.transform; + +import com.dianping.cat.home.exception.entity.ExceptionExclude; +import com.dianping.cat.home.exception.entity.ExceptionLimit; +import com.dianping.cat.home.exception.entity.ExceptionRuleConfig; + +public interface IMaker { + + public ExceptionExclude buildExceptionExclude(T node); + + public ExceptionLimit buildExceptionLimit(T node); + + public ExceptionRuleConfig buildExceptionRuleConfig(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/exception/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/exception/transform/IParser.java new file mode 100644 index 0000000000..5056d17ff7 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/exception/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.home.exception.transform; + +import com.dianping.cat.home.exception.entity.ExceptionExclude; +import com.dianping.cat.home.exception.entity.ExceptionLimit; +import com.dianping.cat.home.exception.entity.ExceptionRuleConfig; + +public interface IParser { + public ExceptionRuleConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForExceptionExclude(IMaker maker, ILinker linker, ExceptionExclude parent, T node); + + public void parseForExceptionLimit(IMaker maker, ILinker linker, ExceptionLimit parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/graph/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/graph/BaseEntity.java new file mode 100644 index 0000000000..5af0d28768 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/graph/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.graph; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.graph.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/graph/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/graph/Constants.java new file mode 100644 index 0000000000..48f1c710ad --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/graph/Constants.java @@ -0,0 +1,28 @@ +package com.dianping.cat.home.graph; + +public class Constants { + + public static final String ATTR_CATEGORY = "category"; + + public static final String ATTR_ENDPOINT = "endPoint"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_MEASURE = "measure"; + + public static final String ATTR_TAGS = "tags"; + + public static final String ATTR_TYPE = "type"; + + public static final String ATTR_VIEW = "view"; + + public static final String ENTITY_GRAPH = "graph"; + + public static final String ENTITY_ITEM = "item"; + + public static final String ENTITY_ITEMS = "items"; + + public static final String ENTITY_SEGMENT = "segment"; + + public static final String ENTITY_SEGMENTS = "segments"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/graph/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/graph/IEntity.java new file mode 100644 index 0000000000..3d70a3900f --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/graph/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.graph; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/graph/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/graph/IVisitor.java new file mode 100644 index 0000000000..aa5663ce5d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/graph/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.graph; + +import com.dianping.cat.home.graph.entity.Graph; +import com.dianping.cat.home.graph.entity.Item; +import com.dianping.cat.home.graph.entity.Segment; + +public interface IVisitor { + + public void visitGraph(Graph graph); + + public void visitItem(Item item); + + public void visitSegment(Segment segment); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/graph/entity/Graph.java b/cat-home/src/main/java/com/dianping/cat/home/graph/entity/Graph.java new file mode 100644 index 0000000000..92ee1fe539 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/graph/entity/Graph.java @@ -0,0 +1,85 @@ +package com.dianping.cat.home.graph.entity; + +import static com.dianping.cat.home.graph.Constants.ATTR_ID; +import static com.dianping.cat.home.graph.Constants.ENTITY_GRAPH; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.graph.BaseEntity; +import com.dianping.cat.home.graph.IVisitor; + +public class Graph extends BaseEntity { + private String m_id; + + private Map m_items = new LinkedHashMap(); + + public Graph() { + } + + public Graph(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitGraph(this); + } + + public Graph addItem(Item item) { + m_items.put(item.getId(), item); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Graph) { + Graph _o = (Graph) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Item findItem(String id) { + return m_items.get(id); + } + + public String getId() { + return m_id; + } + + public Map getItems() { + return m_items; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Graph other) { + assertAttributeEquals(other, ENTITY_GRAPH, ATTR_ID, m_id, other.getId()); + + } + + public Item removeItem(String id) { + return m_items.remove(id); + } + + public Graph setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/graph/entity/Item.java b/cat-home/src/main/java/com/dianping/cat/home/graph/entity/Item.java new file mode 100644 index 0000000000..5639de3373 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/graph/entity/Item.java @@ -0,0 +1,99 @@ +package com.dianping.cat.home.graph.entity; + +import static com.dianping.cat.home.graph.Constants.ATTR_ID; +import static com.dianping.cat.home.graph.Constants.ENTITY_ITEM; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.graph.BaseEntity; +import com.dianping.cat.home.graph.IVisitor; + +public class Item extends BaseEntity { + private String m_id; + + private String m_view; + + private Map m_segments = new LinkedHashMap(); + + public Item() { + } + + public Item(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitItem(this); + } + + public Item addSegment(Segment segment) { + m_segments.put(segment.getId(), segment); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Item) { + Item _o = (Item) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Segment findSegment(String id) { + return m_segments.get(id); + } + + public String getId() { + return m_id; + } + + public Map getSegments() { + return m_segments; + } + + public String getView() { + return m_view; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Item other) { + assertAttributeEquals(other, ENTITY_ITEM, ATTR_ID, m_id, other.getId()); + + if (other.getView() != null) { + m_view = other.getView(); + } + } + + public Segment removeSegment(String id) { + return m_segments.remove(id); + } + + public Item setId(String id) { + m_id = id; + return this; + } + + public Item setView(String view) { + m_view = view; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/graph/entity/Segment.java b/cat-home/src/main/java/com/dianping/cat/home/graph/entity/Segment.java new file mode 100644 index 0000000000..e8132a7f30 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/graph/entity/Segment.java @@ -0,0 +1,137 @@ +package com.dianping.cat.home.graph.entity; + +import static com.dianping.cat.home.graph.Constants.ATTR_ID; +import static com.dianping.cat.home.graph.Constants.ENTITY_SEGMENT; + +import com.dianping.cat.home.graph.BaseEntity; +import com.dianping.cat.home.graph.IVisitor; + +public class Segment extends BaseEntity { + private String m_id; + + private String m_category; + + private String m_measure; + + private String m_endPoint; + + private String m_tags; + + private String m_type; + + public Segment() { + } + + public Segment(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitSegment(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Segment) { + Segment _o = (Segment) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getCategory() { + return m_category; + } + + public String getEndPoint() { + return m_endPoint; + } + + public String getId() { + return m_id; + } + + public String getMeasure() { + return m_measure; + } + + public String getTags() { + return m_tags; + } + + public String getType() { + return m_type; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Segment other) { + assertAttributeEquals(other, ENTITY_SEGMENT, ATTR_ID, m_id, other.getId()); + + if (other.getCategory() != null) { + m_category = other.getCategory(); + } + + if (other.getMeasure() != null) { + m_measure = other.getMeasure(); + } + + if (other.getEndPoint() != null) { + m_endPoint = other.getEndPoint(); + } + + if (other.getTags() != null) { + m_tags = other.getTags(); + } + + if (other.getType() != null) { + m_type = other.getType(); + } + } + + public Segment setCategory(String category) { + m_category = category; + return this; + } + + public Segment setEndPoint(String endPoint) { + m_endPoint = endPoint; + return this; + } + + public Segment setId(String id) { + m_id = id; + return this; + } + + public Segment setMeasure(String measure) { + m_measure = measure; + return this; + } + + public Segment setTags(String tags) { + m_tags = tags; + return this; + } + + public Segment setType(String type) { + m_type = type; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultLinker.java new file mode 100644 index 0000000000..a2cac6d966 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultLinker.java @@ -0,0 +1,55 @@ +package com.dianping.cat.home.graph.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.graph.entity.Graph; +import com.dianping.cat.home.graph.entity.Item; +import com.dianping.cat.home.graph.entity.Segment; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onItem(final Graph parent, final Item item) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addItem(item); + } + }); + } else { + parent.addItem(item); + } + + return true; + } + + @Override + public boolean onSegment(final Item parent, final Segment segment) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addSegment(segment); + } + }); + } else { + parent.addSegment(segment); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..1d34feef8b --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultSaxMaker.java @@ -0,0 +1,99 @@ +package com.dianping.cat.home.graph.transform; + +import static com.dianping.cat.home.graph.Constants.ATTR_CATEGORY; +import static com.dianping.cat.home.graph.Constants.ATTR_ENDPOINT; +import static com.dianping.cat.home.graph.Constants.ATTR_ID; +import static com.dianping.cat.home.graph.Constants.ATTR_MEASURE; +import static com.dianping.cat.home.graph.Constants.ATTR_TAGS; +import static com.dianping.cat.home.graph.Constants.ATTR_TYPE; +import static com.dianping.cat.home.graph.Constants.ATTR_VIEW; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.graph.entity.Graph; +import com.dianping.cat.home.graph.entity.Item; +import com.dianping.cat.home.graph.entity.Segment; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Graph buildGraph(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Graph graph = new Graph(id); + + return graph; + } + + @Override + public Item buildItem(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String view = attributes.getValue(ATTR_VIEW); + Item item = new Item(id); + + if (view != null) { + item.setView(view); + } + + return item; + } + + @Override + public Segment buildSegment(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String category = attributes.getValue(ATTR_CATEGORY); + String measure = attributes.getValue(ATTR_MEASURE); + String endPoint = attributes.getValue(ATTR_ENDPOINT); + String tags = attributes.getValue(ATTR_TAGS); + String type = attributes.getValue(ATTR_TYPE); + Segment segment = new Segment(id); + + if (category != null) { + segment.setCategory(category); + } + + if (measure != null) { + segment.setMeasure(measure); + } + + if (endPoint != null) { + segment.setEndPoint(endPoint); + } + + if (tags != null) { + segment.setTags(tags); + } + + if (type != null) { + segment.setType(type); + } + + return segment; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..6d9f7922d6 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultSaxParser.java @@ -0,0 +1,250 @@ +package com.dianping.cat.home.graph.transform; + +import static com.dianping.cat.home.graph.Constants.ENTITY_GRAPH; +import static com.dianping.cat.home.graph.Constants.ENTITY_ITEM; +import static com.dianping.cat.home.graph.Constants.ENTITY_SEGMENT; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.graph.IEntity; +import com.dianping.cat.home.graph.entity.Graph; +import com.dianping.cat.home.graph.entity.Item; +import com.dianping.cat.home.graph.entity.Segment; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static Graph parse(InputStream in) throws SAXException, IOException { + return parseEntity(Graph.class, new InputSource(removeBOM(in))); + } + + public static Graph parse(Reader reader) throws SAXException, IOException { + return parseEntity(Graph.class, new InputSource(removeBOM(reader))); + } + + public static Graph parse(String xml) throws SAXException, IOException { + return parseEntity(Graph.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForGraph(Graph parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_ITEM.equals(qName)) { + Item item = m_maker.buildItem(attributes); + + m_linker.onItem(parentObj, item); + m_objs.push(item); + } else { + throw new SAXException(String.format("Element(%s) is not expected under graph!", qName)); + } + + m_tags.push(qName); + } + + private void parseForItem(Item parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_SEGMENT.equals(qName)) { + Segment segment = m_maker.buildSegment(attributes); + + m_linker.onSegment(parentObj, segment); + m_objs.push(segment); + } else { + throw new SAXException(String.format("Element(%s) is not expected under item!", qName)); + } + + m_tags.push(qName); + } + + private void parseForSegment(Segment parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_GRAPH.equals(qName)) { + Graph graph = m_maker.buildGraph(attributes); + + m_entity = graph; + m_objs.push(graph); + m_tags.push(qName); + } else if (ENTITY_ITEM.equals(qName)) { + Item item = m_maker.buildItem(attributes); + + m_entity = item; + m_objs.push(item); + m_tags.push(qName); + } else if (ENTITY_SEGMENT.equals(qName)) { + Segment segment = m_maker.buildSegment(attributes); + + m_entity = segment; + m_objs.push(segment); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof Graph) { + parseForGraph((Graph) parent, tag, qName, attributes); + } else if (parent instanceof Item) { + parseForItem((Item) parent, tag, qName, attributes); + } else if (parent instanceof Segment) { + parseForSegment((Segment) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..dcf8f3fd72 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/graph/transform/DefaultXmlBuilder.java @@ -0,0 +1,233 @@ +package com.dianping.cat.home.graph.transform; + +import static com.dianping.cat.home.graph.Constants.ATTR_CATEGORY; +import static com.dianping.cat.home.graph.Constants.ATTR_ENDPOINT; +import static com.dianping.cat.home.graph.Constants.ATTR_ID; +import static com.dianping.cat.home.graph.Constants.ATTR_MEASURE; +import static com.dianping.cat.home.graph.Constants.ATTR_TAGS; +import static com.dianping.cat.home.graph.Constants.ATTR_TYPE; +import static com.dianping.cat.home.graph.Constants.ATTR_VIEW; +import static com.dianping.cat.home.graph.Constants.ENTITY_GRAPH; +import static com.dianping.cat.home.graph.Constants.ENTITY_ITEM; +import static com.dianping.cat.home.graph.Constants.ENTITY_SEGMENT; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.graph.IEntity; +import com.dianping.cat.home.graph.IVisitor; +import com.dianping.cat.home.graph.entity.Graph; +import com.dianping.cat.home.graph.entity.Item; +import com.dianping.cat.home.graph.entity.Segment; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitGraph(Graph graph) { + startTag(ENTITY_GRAPH, null, ATTR_ID, graph.getId()); + + if (!graph.getItems().isEmpty()) { + for (Item item : graph.getItems().values()) { + item.accept(m_visitor); + } + } + + endTag(ENTITY_GRAPH); + } + + @Override + public void visitItem(Item item) { + startTag(ENTITY_ITEM, null, ATTR_ID, item.getId(), ATTR_VIEW, item.getView()); + + if (!item.getSegments().isEmpty()) { + for (Segment segment : item.getSegments().values()) { + segment.accept(m_visitor); + } + } + + endTag(ENTITY_ITEM); + } + + @Override + public void visitSegment(Segment segment) { + startTag(ENTITY_SEGMENT, true, null, ATTR_ID, segment.getId(), ATTR_CATEGORY, segment.getCategory(), ATTR_MEASURE, segment.getMeasure(), ATTR_ENDPOINT, segment.getEndPoint(), ATTR_TAGS, segment.getTags(), ATTR_TYPE, segment.getType()); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/graph/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/graph/transform/ILinker.java new file mode 100644 index 0000000000..12fec86c85 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/graph/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.home.graph.transform; + +import com.dianping.cat.home.graph.entity.Graph; +import com.dianping.cat.home.graph.entity.Item; +import com.dianping.cat.home.graph.entity.Segment; + +public interface ILinker { + + public boolean onItem(Graph parent, Item item); + + public boolean onSegment(Item parent, Segment segment); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/graph/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/graph/transform/IMaker.java new file mode 100644 index 0000000000..99f54c9763 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/graph/transform/IMaker.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.graph.transform; + +import com.dianping.cat.home.graph.entity.Graph; +import com.dianping.cat.home.graph.entity.Item; +import com.dianping.cat.home.graph.entity.Segment; + +public interface IMaker { + + public Graph buildGraph(T node); + + public Item buildItem(T node); + + public Segment buildSegment(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/graph/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/graph/transform/IParser.java new file mode 100644 index 0000000000..fed751a12b --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/graph/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.home.graph.transform; + +import com.dianping.cat.home.graph.entity.Graph; +import com.dianping.cat.home.graph.entity.Item; +import com.dianping.cat.home.graph.entity.Segment; + +public interface IParser { + public Graph parse(IMaker maker, ILinker linker, T node); + + public void parseForItem(IMaker maker, ILinker linker, Item parent, T node); + + public void parseForSegment(IMaker maker, ILinker linker, Segment parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/group/BaseEntity.java new file mode 100644 index 0000000000..10273b7eda --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/BaseEntity.java @@ -0,0 +1,56 @@ +package com.dianping.cat.home.group; + +import java.util.Formattable; +import java.util.FormattableFlags; +import java.util.Formatter; + +import com.dianping.cat.home.group.transform.DefaultXmlBuilder; +import com.dianping.cat.home.group.transform.DefaultJsonBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String JSON = "%#.3s"; + + public static final String JSON_COMPACT = "%#s"; + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean useJson = (flags & FormattableFlags.ALTERNATE) == FormattableFlags.ALTERNATE; + boolean compact = (precision <= 0); + + if (useJson) { + DefaultJsonBuilder builder = new DefaultJsonBuilder(compact); + + formatter.format("%s", builder.build(this)); + } else { + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/group/Constants.java new file mode 100644 index 0000000000..f33bb46a6a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/Constants.java @@ -0,0 +1,20 @@ +package com.dianping.cat.home.group; + +public class Constants { + + public static final String ATTR_ID = "id"; + + public static final String ELEMENT_IP = "ip"; + + public static final String ELEMENT_IPS = "ips"; + + public static final String ENTITY_DOMAIN = "domain"; + + public static final String ENTITY_DOMAINS = "domains"; + + public static final String ENTITY_DOMAIN_GROUP = "domain-group"; + + public static final String ENTITY_GROUP = "group"; + + public static final String ENTITY_GROUPS = "groups"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/group/IEntity.java new file mode 100644 index 0000000000..8724b087cf --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.group; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/group/IVisitor.java new file mode 100644 index 0000000000..cb20b99726 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.group; + +import com.dianping.cat.home.group.entity.Domain; +import com.dianping.cat.home.group.entity.DomainGroup; +import com.dianping.cat.home.group.entity.Group; + +public interface IVisitor { + + public void visitDomain(Domain domain); + + public void visitDomainGroup(DomainGroup domainGroup); + + public void visitGroup(Group group); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/entity/Domain.java b/cat-home/src/main/java/com/dianping/cat/home/group/entity/Domain.java new file mode 100644 index 0000000000..f7a9d15f05 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/entity/Domain.java @@ -0,0 +1,85 @@ +package com.dianping.cat.home.group.entity; + +import static com.dianping.cat.home.group.Constants.ATTR_ID; +import static com.dianping.cat.home.group.Constants.ENTITY_DOMAIN; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.group.BaseEntity; +import com.dianping.cat.home.group.IVisitor; + +public class Domain extends BaseEntity { + private String m_id; + + private Map m_groups = new LinkedHashMap(); + + public Domain() { + } + + public Domain(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomain(this); + } + + public Domain addGroup(Group group) { + m_groups.put(group.getId(), group); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Domain) { + Domain _o = (Domain) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Group findGroup(String id) { + return m_groups.get(id); + } + + public Map getGroups() { + return m_groups; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Domain other) { + assertAttributeEquals(other, ENTITY_DOMAIN, ATTR_ID, m_id, other.getId()); + + } + + public Group removeGroup(String id) { + return m_groups.remove(id); + } + + public Domain setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/entity/DomainGroup.java b/cat-home/src/main/java/com/dianping/cat/home/group/entity/DomainGroup.java new file mode 100644 index 0000000000..019c294987 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/entity/DomainGroup.java @@ -0,0 +1,66 @@ +package com.dianping.cat.home.group.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.group.BaseEntity; +import com.dianping.cat.home.group.IVisitor; + +public class DomainGroup extends BaseEntity { + private Map m_domains = new LinkedHashMap(); + + public DomainGroup() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomainGroup(this); + } + + public DomainGroup addDomain(Domain domain) { + m_domains.put(domain.getId(), domain); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DomainGroup) { + DomainGroup _o = (DomainGroup) obj; + + if (!equals(getDomains(), _o.getDomains())) { + return false; + } + + + return true; + } + + return false; + } + + public Domain findDomain(String id) { + return m_domains.get(id); + } + + public Map getDomains() { + return m_domains; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domains == null ? 0 : m_domains.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(DomainGroup other) { + } + + public Domain removeDomain(String id) { + return m_domains.remove(id); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/entity/Group.java b/cat-home/src/main/java/com/dianping/cat/home/group/entity/Group.java new file mode 100644 index 0000000000..ef653953ea --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/entity/Group.java @@ -0,0 +1,77 @@ +package com.dianping.cat.home.group.entity; + +import static com.dianping.cat.home.group.Constants.ATTR_ID; +import static com.dianping.cat.home.group.Constants.ENTITY_GROUP; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.home.group.BaseEntity; +import com.dianping.cat.home.group.IVisitor; + +public class Group extends BaseEntity { + private String m_id; + + private List m_ips = new ArrayList(); + + public Group() { + } + + public Group(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitGroup(this); + } + + public Group addIp(String ip) { + m_ips.add(ip); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Group) { + Group _o = (Group) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + public List getIps() { + return m_ips; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Group other) { + assertAttributeEquals(other, ENTITY_GROUP, ATTR_ID, m_id, other.getId()); + + } + + public Group setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/transform/BaseVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/group/transform/BaseVisitor.java new file mode 100644 index 0000000000..eb7abe5627 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/transform/BaseVisitor.java @@ -0,0 +1,26 @@ +package com.dianping.cat.home.group.transform; + +import com.dianping.cat.home.group.IVisitor; +import com.dianping.cat.home.group.entity.Domain; +import com.dianping.cat.home.group.entity.DomainGroup; +import com.dianping.cat.home.group.entity.Group; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitDomain(Domain domain) { + for (Group group : domain.getGroups().values()) { + visitGroup(group); + } + } + + @Override + public void visitDomainGroup(DomainGroup domainGroup) { + for (Domain domain : domainGroup.getDomains().values()) { + visitDomain(domain); + } + } + + @Override + public void visitGroup(Group group) { + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultJsonBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultJsonBuilder.java new file mode 100644 index 0000000000..f7e6c9acce --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultJsonBuilder.java @@ -0,0 +1,289 @@ +package com.dianping.cat.home.group.transform; + +import static com.dianping.cat.home.group.Constants.ATTR_ID; +import static com.dianping.cat.home.group.Constants.ELEMENT_IPS; +import static com.dianping.cat.home.group.Constants.ENTITY_DOMAINS; +import static com.dianping.cat.home.group.Constants.ENTITY_GROUPS; + +import java.lang.reflect.Array; +import java.util.Collection; +import java.util.Map; + +import com.dianping.cat.home.group.IEntity; +import com.dianping.cat.home.group.IVisitor; +import com.dianping.cat.home.group.entity.Domain; +import com.dianping.cat.home.group.entity.DomainGroup; +import com.dianping.cat.home.group.entity.Group; + +public class DefaultJsonBuilder implements IVisitor { + + private IVisitor m_visitor; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultJsonBuilder() { + this(false); + } + + public DefaultJsonBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultJsonBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_visitor = this; + } + + protected void arrayBegin(String name) { + indent(); + m_sb.append('"').append(name).append(m_compact ? "\":[" : "\": [\r\n"); + m_level++; + } + + protected void arrayEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append("],").append(m_compact ? "" : "\r\n"); + } + + protected void attributes(Map dynamicAttributes, Object... nameValues) { + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + if (attrValue instanceof Collection) { + @SuppressWarnings("unchecked") + Collection items = (Collection) attrValue; + + if (!items.isEmpty()) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (Object item : items) { + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else if (attrValue.getClass().isArray()) { + int length = Array.getLength(attrValue); + + if (length > 0) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (int j = 0; j < length; j++) { + Object item = Array.get(attrValue, j); + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else { + if (m_compact) { + m_sb.append('"').append(attrName).append("\":"); + toString(m_sb, attrValue); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(attrName).append("\": "); + toString(m_sb, attrValue); + m_sb.append(",\r\n"); + } + } + } + } + + if (dynamicAttributes != null) { + for (Map.Entry e : dynamicAttributes.entrySet()) { + if (m_compact) { + m_sb.append('"').append(e.getKey()).append("\":"); + toString(m_sb, e.getValue()); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(e.getKey()).append("\": "); + toString(m_sb, e.getValue()); + m_sb.append(",\r\n"); + } + } + } + } + + public String build(IEntity entity) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + trimComma(); + + return m_sb.toString(); + } + + public String buildArray(Collection> entities) { + m_sb.append('['); + + if (entities != null) { + for (IEntity entity : entities) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + } + + trimComma(); + } + + m_sb.append(']'); + + return m_sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void objectBegin(String name) { + indent(); + + if (name == null) { + m_sb.append("{").append(m_compact ? "" : "\r\n"); + } else { + m_sb.append('"').append(name).append(m_compact ? "\":{" : "\": {\r\n"); + } + + m_level++; + } + + protected void objectEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append(m_compact ? "}," : "},\r\n"); + } + + protected void toString(StringBuilder sb, Object value) { + if (value == null) { + sb.append("null"); + } else if (value instanceof Boolean || value instanceof Number) { + sb.append(value); + } else { + String val = value.toString(); + int len = val.length(); + + sb.append('"'); + + for (int i = 0; i < len; i++) { + char ch = val.charAt(i); + + switch (ch) { + case '\\': + case '/': + case '"': + sb.append('\\').append(ch); + break; + case '\t': + sb.append("\\t"); + break; + case '\r': + sb.append("\\r"); + break; + case '\n': + sb.append("\\n"); + break; + default: + sb.append(ch); + break; + } + } + + sb.append('"'); + } + } + + protected void trimComma() { + int len = m_sb.length(); + + if (m_compact) { + if (len > 1 && m_sb.charAt(len - 1) == ',') { + m_sb.replace(len - 1, len, ""); + } + } else { + if (len > 3 && m_sb.charAt(len - 3) == ',') { + m_sb.replace(len - 3, len - 2, ""); + } + } + } + + @Override + public void visitDomain(Domain domain) { + attributes(null, ATTR_ID, domain.getId()); + + if (!domain.getGroups().isEmpty()) { + objectBegin(ENTITY_GROUPS); + + for (Map.Entry e : domain.getGroups().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_GROUPS); + } + } + + @Override + public void visitDomainGroup(DomainGroup domainGroup) { + + if (!domainGroup.getDomains().isEmpty()) { + objectBegin(ENTITY_DOMAINS); + + for (Map.Entry e : domainGroup.getDomains().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_DOMAINS); + } + } + + @Override + public void visitGroup(Group group) { + attributes(null, ATTR_ID, group.getId()); + + if (!group.getIps().isEmpty()) { + arrayBegin(ELEMENT_IPS); + + for (String ip : group.getIps()) { + indent(); + m_sb.append('"').append(ip).append(m_compact ? "\"," : "\",\r\n"); + } + + arrayEnd(ELEMENT_IPS); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultJsonParser.java b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultJsonParser.java new file mode 100644 index 0000000000..457ed02f12 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultJsonParser.java @@ -0,0 +1,373 @@ +package com.dianping.cat.home.group.transform; + +import static com.dianping.cat.home.group.Constants.ATTR_ID; +import static com.dianping.cat.home.group.Constants.ELEMENT_IPS; +import static com.dianping.cat.home.group.Constants.ENTITY_DOMAINS; +import static com.dianping.cat.home.group.Constants.ENTITY_GROUPS; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.dianping.cat.home.group.IEntity; +import com.dianping.cat.home.group.entity.Domain; +import com.dianping.cat.home.group.entity.DomainGroup; +import com.dianping.cat.home.group.entity.Group; + +public class DefaultJsonParser { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private List m_entities = new ArrayList(); + + private Class m_entityClass; + + private DefaultJsonParser(Class entityClass) { + m_entityClass = entityClass; + } + + public static > T parse(Class entityClass, InputStream in) throws IOException { + return parse(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > T parse(Class entityClass, Reader reader) throws IOException { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.onArrayBegin(); + parser.parse(new JsonReader(reader)); + parser.onArrayEnd(); + + if (parser.m_entities.isEmpty()) { + return null; + } else { + return (T) parser.m_entities.get(0); + } + } + + public static > T parse(Class entityClass, String json) throws IOException { + return parse(entityClass, new StringReader(json)); + } + + public static > List parseArray(Class entityClass, InputStream in) throws Exception { + return parseArray(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > List parseArray(Class entityClass, Reader reader) throws Exception { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.parse(new JsonReader(reader)); + return (List) (List) parser.m_entities; + } + + public static > List parseArray(Class entityClass, String json) throws Exception { + return parseArray(entityClass, new StringReader(json)); + } + + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + private Object createRootEntity() { + try { + Object entity = m_entityClass.newInstance(); + + return entity; + } catch (Exception e) { + throw new RuntimeException(String.format("Unable to create entity(%s) instance!", m_entityClass.getName()), e); + } + } + + private boolean isTopLevel() { + return m_objs.size() == 1; + } + + protected void onArrayBegin() { + if (m_objs.isEmpty()) { + m_objs.push(m_entities); + m_tags.push(""); + } } + + protected void onArrayEnd() { + m_objs.pop(); + m_tags.pop(); + + } + protected void onName(String name) { + m_tags.push(name); + } + + protected void onObjectBegin() { + if (isTopLevel()) { + m_objs.push(createRootEntity()); + m_tags.push(""); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof DomainGroup) { + if (ENTITY_DOMAINS.equals(tag)) { + m_objs.push(parent); + } else { + String parentTag = m_tags.size() >= 2 ? m_tags.get(m_tags.size() - 2) : null; + + if (ENTITY_DOMAINS.equals(parentTag)) { + Domain domains = new Domain(); + + m_linker.onDomain((DomainGroup) parent, domains); + m_objs.push(domains); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } else if (parent instanceof Domain) { + if (ENTITY_GROUPS.equals(tag)) { + m_objs.push(parent); + } else { + String parentTag = m_tags.size() >= 2 ? m_tags.get(m_tags.size() - 2) : null; + + if (ENTITY_GROUPS.equals(parentTag)) { + Group groups = new Group(); + + m_linker.onGroup((Domain) parent, groups); + m_objs.push(groups); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } + + protected void onObjectEnd() { + m_tags.pop(); + + Object entity = m_objs.pop(); + + if (isTopLevel()) { + m_entities.add(entity); + } + } + + protected void onValue(String value) { + Object parent = m_objs.peek(); + String tag = m_tags.pop(); + + if (parent instanceof DomainGroup) { + parseForDomainGroup((DomainGroup) parent, tag, value); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, value); + } else if (parent instanceof Group) { + parseForGroup((Group) parent, tag, value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) under %s!", tag, parent)); + } + } + + private void parse(JsonReader reader) throws IOException { + try { + reader.parse(this); + } catch (EOFException e) { + if (m_objs.size() > 1) { + throw new EOFException(String.format("Unexpected end while parsing json! tags: %s.", m_tags)); + } + } + + m_linker.finish(); + } + + public void parseForDomain(Domain domain, String tag, String value) { + if (ENTITY_GROUPS.equals(tag)) { + // do nothing here + } else if (ATTR_ID.equals(tag)) { + domain.setId(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, domain, m_tags)); + } + } + + public void parseForDomainGroup(DomainGroup domainGroup, String tag, String value) { + if (ENTITY_DOMAINS.equals(tag)) { + // do nothing here + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, domainGroup, m_tags)); + } + } + + public void parseForGroup(Group group, String tag, String value) { + if (ATTR_ID.equals(tag)) { + group.setId(value); + } else if (ELEMENT_IPS.equals(tag)) { + group.addIp(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, group, m_tags)); + } + } + + + static class JsonReader { + private Reader m_reader; + + private char[] m_buffer = new char[2048]; + + private int m_size; + + private int m_index; + + public JsonReader(Reader reader) { + m_reader = reader; + } + + private char next() throws IOException { + if (m_index >= m_size) { + m_size = m_reader.read(m_buffer); + m_index = 0; + + if (m_size == -1) { + throw new EOFException(); + } + } + + return m_buffer[m_index++]; + } + + public void parse(DefaultJsonParser parser) throws IOException { + StringBuilder sb = new StringBuilder(); + boolean flag = false; + + while (true) { + char ch = next(); + + switch (ch) { + case ' ': + case '\t': + case '\r': + case '\n': + break; + case '{': + parser.onObjectBegin(); + flag = false; + break; + case '}': + if (flag) { // have value + parser.onValue(sb.toString()); + sb.setLength(0); + } + + parser.onObjectEnd(); + flag = false; + break; + case '\'': + case '"': + while (true) { + char ch2 = next(); + + if (ch2 != ch) { + if (ch2 == '\\') { + char ch3 = next(); + + switch (ch3) { + case 't': + sb.append('\t'); + break; + case 'r': + sb.append('\r'); + break; + case 'n': + sb.append('\n'); + break; + default: + sb.append(ch3); + break; + } + } else { + sb.append(ch2); + } + } else { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + flag = false; + } + + sb.setLength(0); + break; + } + } + + break; + case ':': + if (sb.length() != 0) { + parser.onName(sb.toString()); + sb.setLength(0); + } + + flag = true; + break; + case ',': + if (sb.length() != 0) { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + } + + sb.setLength(0); + } + + flag = false; + break; + case '[': + parser.onArrayBegin(); + flag = false; + break; + case ']': + parser.onArrayEnd(); + flag = false; + break; + default: + sb.append(ch); + break; + } + } + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultLinker.java new file mode 100644 index 0000000000..760a15df0d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultLinker.java @@ -0,0 +1,55 @@ +package com.dianping.cat.home.group.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.group.entity.Domain; +import com.dianping.cat.home.group.entity.DomainGroup; +import com.dianping.cat.home.group.entity.Group; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDomain(final DomainGroup parent, final Domain domain) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDomain(domain); + } + }); + } else { + parent.addDomain(domain); + } + + return true; + } + + @Override + public boolean onGroup(final Domain parent, final Group group) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addGroup(group); + } + }); + } else { + parent.addGroup(group); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultMerger.java b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultMerger.java new file mode 100644 index 0000000000..cc036c786e --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultMerger.java @@ -0,0 +1,108 @@ +package com.dianping.cat.home.group.transform; + +import java.util.Stack; + +import com.dianping.cat.home.group.IEntity; +import com.dianping.cat.home.group.IVisitor; +import com.dianping.cat.home.group.entity.Domain; +import com.dianping.cat.home.group.entity.DomainGroup; +import com.dianping.cat.home.group.entity.Group; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private DomainGroup m_domainGroup; + + public DefaultMerger() { + } + + public DefaultMerger(DomainGroup domainGroup) { + m_domainGroup = domainGroup; + m_objs.push(domainGroup); + } + + public DomainGroup getDomainGroup() { + return m_domainGroup; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeDomain(Domain to, Domain from) { + to.mergeAttributes(from); + } + + protected void mergeDomainGroup(DomainGroup to, DomainGroup from) { + to.mergeAttributes(from); + } + + protected void mergeGroup(Group to, Group from) { + to.mergeAttributes(from); + to.getIps().addAll(from.getIps()); + } + + @Override + public void visitDomain(Domain from) { + Domain to = (Domain) m_objs.peek(); + + mergeDomain(to, from); + visitDomainChildren(to, from); + } + + protected void visitDomainChildren(Domain to, Domain from) { + for (Group source : from.getGroups().values()) { + Group target = to.findGroup(source.getId()); + + if (target == null) { + target = new Group(source.getId()); + to.addGroup(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitDomainGroup(DomainGroup from) { + DomainGroup to = (DomainGroup) m_objs.peek(); + + mergeDomainGroup(to, from); + visitDomainGroupChildren(to, from); + } + + protected void visitDomainGroupChildren(DomainGroup to, DomainGroup from) { + for (Domain source : from.getDomains().values()) { + Domain target = to.findDomain(source.getId()); + + if (target == null) { + target = new Domain(source.getId()); + to.addDomain(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitGroup(Group from) { + Group to = (Group) m_objs.peek(); + + mergeGroup(to, from); + visitGroupChildren(to, from); + } + + protected void visitGroupChildren(Group to, Group from) { + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultNativeBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..4dca980e53 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultNativeBuilder.java @@ -0,0 +1,128 @@ +package com.dianping.cat.home.group.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.home.group.IVisitor; +import com.dianping.cat.home.group.entity.Domain; +import com.dianping.cat.home.group.entity.DomainGroup; +import com.dianping.cat.home.group.entity.Group; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(DomainGroup domainGroup) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(domainGroup, out); + return out.toByteArray(); + } + + public static void build(DomainGroup domainGroup, OutputStream out) { + domainGroup.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitDomain(Domain domain) { + if (domain.getId() != null) { + writeTag(1, 1); + writeString(domain.getId()); + } + + if (!domain.getGroups().isEmpty()) { + writeTag(33, 2); + writeInt(domain.getGroups().size()); + + for (Group group : domain.getGroups().values()) { + group.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitDomainGroup(DomainGroup domainGroup) { + writeTag(63, 0); + + if (!domainGroup.getDomains().isEmpty()) { + writeTag(33, 2); + writeInt(domainGroup.getDomains().size()); + + for (Domain domain : domainGroup.getDomains().values()) { + domain.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitGroup(Group group) { + if (group.getId() != null) { + writeTag(1, 1); + writeString(group.getId()); + } + + if (group.getIps() != null) { + writeTag(2, 2); + writeInt(group.getIps().size()); + + for (String ip : group.getIps()) { + writeString(ip); + } + } + + writeTag(63, 3); + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultNativeParser.java b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..188493633e --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultNativeParser.java @@ -0,0 +1,175 @@ +package com.dianping.cat.home.group.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.home.group.IVisitor; +import com.dianping.cat.home.group.entity.Domain; +import com.dianping.cat.home.group.entity.DomainGroup; +import com.dianping.cat.home.group.entity.Group; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static DomainGroup parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static DomainGroup parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + DomainGroup domainGroup = new DomainGroup(); + + try { + domainGroup.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return domainGroup; + } + + @Override + public void visitDomain(Domain domain) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDomainChildren(domain, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDomainChildren(Domain domain, int _field, int _type) { + switch (_field) { + case 1: + domain.setId(readString()); + break; + case 33: + if (_type == 1) { + Group group = new Group(); + + visitGroup(group); + m_linker.onGroup(domain, group); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Group group = new Group(); + + visitGroup(group); + m_linker.onGroup(domain, group); + } + } + break; + } + } + + @Override + public void visitDomainGroup(DomainGroup domainGroup) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitDomainGroupChildren(domainGroup, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDomainGroupChildren(DomainGroup domainGroup, int _field, int _type) { + switch (_field) { + case 33: + if (_type == 1) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(domainGroup, domain); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(domainGroup, domain); + } + } + break; + } + } + + @Override + public void visitGroup(Group group) { + byte tag; + + while ((tag = readTag()) != -1) { + visitGroupChildren(group, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitGroupChildren(Group group, int _field, int _type) { + switch (_field) { + case 1: + group.setId(readString()); + break; + case 2: + if (_type == 1) { + group.addIp(readString()); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + group.addIp(readString()); + } + } + break; + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..b21b853c6c --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultSaxMaker.java @@ -0,0 +1,67 @@ +package com.dianping.cat.home.group.transform; + +import static com.dianping.cat.home.group.Constants.ATTR_ID; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.group.entity.Domain; +import com.dianping.cat.home.group.entity.DomainGroup; +import com.dianping.cat.home.group.entity.Group; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Domain buildDomain(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Domain domain = new Domain(id); + + return domain; + } + + @Override + public DomainGroup buildDomainGroup(Attributes attributes) { + DomainGroup domainGroup = new DomainGroup(); + + return domainGroup; + } + + @Override + public Group buildGroup(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Group group = new Group(id); + + return group; + } + + @Override + public String buildIp(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..b8f314fb72 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultSaxParser.java @@ -0,0 +1,265 @@ +package com.dianping.cat.home.group.transform; + +import static com.dianping.cat.home.group.Constants.ELEMENT_IP; +import static com.dianping.cat.home.group.Constants.ELEMENT_IPS; + +import static com.dianping.cat.home.group.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.home.group.Constants.ENTITY_DOMAIN_GROUP; +import static com.dianping.cat.home.group.Constants.ENTITY_GROUP; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.group.IEntity; +import com.dianping.cat.home.group.entity.Domain; +import com.dianping.cat.home.group.entity.DomainGroup; +import com.dianping.cat.home.group.entity.Group; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static DomainGroup parse(InputStream in) throws SAXException, IOException { + return parseEntity(DomainGroup.class, new InputSource(removeBOM(in))); + } + + public static DomainGroup parse(Reader reader) throws SAXException, IOException { + return parseEntity(DomainGroup.class, new InputSource(removeBOM(reader))); + } + + public static DomainGroup parse(String xml) throws SAXException, IOException { + return parseEntity(DomainGroup.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof Group) { + Group group = (Group) currentObj; + + if (ELEMENT_IP.equals(currentTag)) { + group.addIp(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForDomain(Domain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_GROUP.equals(qName)) { + Group group = m_maker.buildGroup(attributes); + + m_linker.onGroup(parentObj, group); + m_objs.push(group); + } else { + throw new SAXException(String.format("Element(%s) is not expected under domain!", qName)); + } + + m_tags.push(qName); + } + + private void parseForDomainGroup(DomainGroup parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_linker.onDomain(parentObj, domain); + m_objs.push(domain); + } else { + throw new SAXException(String.format("Element(%s) is not expected under domain-group!", qName)); + } + + m_tags.push(qName); + } + + private void parseForGroup(Group parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_IPS.equals(qName) || ELEMENT_IP.equals(qName)) { + m_objs.push(parentObj); + } else { + throw new SAXException(String.format("Element(%s) is not expected under group!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_DOMAIN_GROUP.equals(qName)) { + DomainGroup domainGroup = m_maker.buildDomainGroup(attributes); + + m_entity = domainGroup; + m_objs.push(domainGroup); + m_tags.push(qName); + } else if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_entity = domain; + m_objs.push(domain); + m_tags.push(qName); + } else if (ENTITY_GROUP.equals(qName)) { + Group group = m_maker.buildGroup(attributes); + + m_entity = group; + m_objs.push(group); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof DomainGroup) { + parseForDomainGroup((DomainGroup) parent, tag, qName, attributes); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, qName, attributes); + } else if (parent instanceof Group) { + parseForGroup((Group) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..8cd05d9dda --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/transform/DefaultXmlBuilder.java @@ -0,0 +1,279 @@ +package com.dianping.cat.home.group.transform; + +import static com.dianping.cat.home.group.Constants.ATTR_ID; +import static com.dianping.cat.home.group.Constants.ELEMENT_IP; +import static com.dianping.cat.home.group.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.home.group.Constants.ENTITY_DOMAIN_GROUP; +import static com.dianping.cat.home.group.Constants.ENTITY_GROUP; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.group.IEntity; +import com.dianping.cat.home.group.IVisitor; +import com.dianping.cat.home.group.entity.Domain; +import com.dianping.cat.home.group.entity.DomainGroup; +import com.dianping.cat.home.group.entity.Group; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + @Override + public void visitDomain(Domain domain) { + startTag(ENTITY_DOMAIN, null, ATTR_ID, domain.getId()); + + if (!domain.getGroups().isEmpty()) { + for (Group group : domain.getGroups().values()) { + group.accept(m_visitor); + } + } + + endTag(ENTITY_DOMAIN); + } + + @Override + public void visitDomainGroup(DomainGroup domainGroup) { + startTag(ENTITY_DOMAIN_GROUP, null); + + if (!domainGroup.getDomains().isEmpty()) { + for (Domain domain : domainGroup.getDomains().values()) { + domain.accept(m_visitor); + } + } + + endTag(ENTITY_DOMAIN_GROUP); + } + + @Override + public void visitGroup(Group group) { + startTag(ENTITY_GROUP, null, ATTR_ID, group.getId()); + + if (!group.getIps().isEmpty()) { + for (String ip : group.getIps()) { + tagWithText(ELEMENT_IP, ip); + } + } + + endTag(ENTITY_GROUP); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/group/transform/ILinker.java new file mode 100644 index 0000000000..d0641a9779 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.home.group.transform; + +import com.dianping.cat.home.group.entity.Domain; +import com.dianping.cat.home.group.entity.DomainGroup; +import com.dianping.cat.home.group.entity.Group; + +public interface ILinker { + + public boolean onDomain(DomainGroup parent, Domain domain); + + public boolean onGroup(Domain parent, Group group); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/group/transform/IMaker.java new file mode 100644 index 0000000000..86c8858d6c --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/transform/IMaker.java @@ -0,0 +1,16 @@ +package com.dianping.cat.home.group.transform; + +import com.dianping.cat.home.group.entity.Domain; +import com.dianping.cat.home.group.entity.DomainGroup; +import com.dianping.cat.home.group.entity.Group; + +public interface IMaker { + + public Domain buildDomain(T node); + + public DomainGroup buildDomainGroup(T node); + + public Group buildGroup(T node); + + public String buildIp(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/group/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/group/transform/IParser.java new file mode 100644 index 0000000000..2283a27c62 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/group/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.home.group.transform; + +import com.dianping.cat.home.group.entity.Domain; +import com.dianping.cat.home.group.entity.DomainGroup; +import com.dianping.cat.home.group.entity.Group; + +public interface IParser { + public DomainGroup parse(IMaker maker, ILinker linker, T node); + + public void parseForDomain(IMaker maker, ILinker linker, Domain parent, T node); + + public void parseForGroup(IMaker maker, ILinker linker, Group parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heartbeat/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/BaseEntity.java new file mode 100644 index 0000000000..4dde863189 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.heartbeat; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.heartbeat.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heartbeat/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/Constants.java new file mode 100644 index 0000000000..dc11f623d5 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/Constants.java @@ -0,0 +1,28 @@ +package com.dianping.cat.home.heartbeat; + +public class Constants { + + public static final String ATTR_ALERT = "alert"; + + public static final String ATTR_DELTA = "delta"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_LABLE = "lable"; + + public static final String ATTR_ORDER = "order"; + + public static final String ATTR_TITLE = "title"; + + public static final String ATTR_UNIT = "unit"; + + public static final String ENTITY_GROUP = "group"; + + public static final String ENTITY_GROUPS = "groups"; + + public static final String ENTITY_HEARTBEAT_DISPLAY_POLICY = "heartbeat-display-policy"; + + public static final String ENTITY_METRIC = "metric"; + + public static final String ENTITY_METRICS = "metrics"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heartbeat/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/IEntity.java new file mode 100644 index 0000000000..7654baef90 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.heartbeat; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heartbeat/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/IVisitor.java new file mode 100644 index 0000000000..2c79ee7301 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.heartbeat; + +import com.dianping.cat.home.heartbeat.entity.Group; +import com.dianping.cat.home.heartbeat.entity.HeartbeatDisplayPolicy; +import com.dianping.cat.home.heartbeat.entity.Metric; + +public interface IVisitor { + + public void visitGroup(Group group); + + public void visitHeartbeatDisplayPolicy(HeartbeatDisplayPolicy heartbeatDisplayPolicy); + + public void visitMetric(Metric metric); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heartbeat/entity/Group.java b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/entity/Group.java new file mode 100644 index 0000000000..0f2638fdb8 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/entity/Group.java @@ -0,0 +1,97 @@ +package com.dianping.cat.home.heartbeat.entity; + +import static com.dianping.cat.home.heartbeat.Constants.ATTR_ID; +import static com.dianping.cat.home.heartbeat.Constants.ENTITY_GROUP; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.heartbeat.BaseEntity; +import com.dianping.cat.home.heartbeat.IVisitor; + +public class Group extends BaseEntity { + private String m_id; + + private int m_order; + + private Map m_metrics = new LinkedHashMap(); + + public Group() { + } + + public Group(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitGroup(this); + } + + public Group addMetric(Metric metric) { + m_metrics.put(metric.getId(), metric); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Group) { + Group _o = (Group) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Metric findMetric(String id) { + return m_metrics.get(id); + } + + public String getId() { + return m_id; + } + + public Map getMetrics() { + return m_metrics; + } + + public int getOrder() { + return m_order; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Group other) { + assertAttributeEquals(other, ENTITY_GROUP, ATTR_ID, m_id, other.getId()); + + m_order = other.getOrder(); + } + + public Metric removeMetric(String id) { + return m_metrics.remove(id); + } + + public Group setId(String id) { + m_id = id; + return this; + } + + public Group setOrder(int order) { + m_order = order; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heartbeat/entity/HeartbeatDisplayPolicy.java b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/entity/HeartbeatDisplayPolicy.java new file mode 100644 index 0000000000..d30708b9f8 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/entity/HeartbeatDisplayPolicy.java @@ -0,0 +1,66 @@ +package com.dianping.cat.home.heartbeat.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.heartbeat.BaseEntity; +import com.dianping.cat.home.heartbeat.IVisitor; + +public class HeartbeatDisplayPolicy extends BaseEntity { + private Map m_groups = new LinkedHashMap(); + + public HeartbeatDisplayPolicy() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitHeartbeatDisplayPolicy(this); + } + + public HeartbeatDisplayPolicy addGroup(Group group) { + m_groups.put(group.getId(), group); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof HeartbeatDisplayPolicy) { + HeartbeatDisplayPolicy _o = (HeartbeatDisplayPolicy) obj; + + if (!equals(getGroups(), _o.getGroups())) { + return false; + } + + + return true; + } + + return false; + } + + public Group findGroup(String id) { + return m_groups.get(id); + } + + public Map getGroups() { + return m_groups; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_groups == null ? 0 : m_groups.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(HeartbeatDisplayPolicy other) { + } + + public Group removeGroup(String id) { + return m_groups.remove(id); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heartbeat/entity/Metric.java b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/entity/Metric.java new file mode 100644 index 0000000000..d2c1387638 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/entity/Metric.java @@ -0,0 +1,154 @@ +package com.dianping.cat.home.heartbeat.entity; + +import static com.dianping.cat.home.heartbeat.Constants.ATTR_ID; +import static com.dianping.cat.home.heartbeat.Constants.ENTITY_METRIC; + +import com.dianping.cat.home.heartbeat.BaseEntity; +import com.dianping.cat.home.heartbeat.IVisitor; + +public class Metric extends BaseEntity { + private String m_id; + + private String m_unit = "1"; + + private boolean m_delta = false; + + private int m_order; + + private String m_title; + + private String m_lable = "MB"; + + private boolean m_alert = false; + + public Metric() { + } + + public Metric(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMetric(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Metric) { + Metric _o = (Metric) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public boolean getAlert() { + return m_alert; + } + + public boolean getDelta() { + return m_delta; + } + + public String getId() { + return m_id; + } + + public String getLable() { + return m_lable; + } + + public int getOrder() { + return m_order; + } + + public String getTitle() { + return m_title; + } + + public String getUnit() { + return m_unit; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public boolean isAlert() { + return m_alert; + } + + public boolean isDelta() { + return m_delta; + } + + @Override + public void mergeAttributes(Metric other) { + assertAttributeEquals(other, ENTITY_METRIC, ATTR_ID, m_id, other.getId()); + + if (other.getUnit() != null) { + m_unit = other.getUnit(); + } + + m_delta = other.getDelta(); + + m_order = other.getOrder(); + + if (other.getTitle() != null) { + m_title = other.getTitle(); + } + + if (other.getLable() != null) { + m_lable = other.getLable(); + } + + m_alert = other.getAlert(); + } + + public Metric setAlert(boolean alert) { + m_alert = alert; + return this; + } + + public Metric setDelta(boolean delta) { + m_delta = delta; + return this; + } + + public Metric setId(String id) { + m_id = id; + return this; + } + + public Metric setLable(String lable) { + m_lable = lable; + return this; + } + + public Metric setOrder(int order) { + m_order = order; + return this; + } + + public Metric setTitle(String title) { + m_title = title; + return this; + } + + public Metric setUnit(String unit) { + m_unit = unit; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultLinker.java new file mode 100644 index 0000000000..98118b0cf3 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultLinker.java @@ -0,0 +1,55 @@ +package com.dianping.cat.home.heartbeat.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.heartbeat.entity.Group; +import com.dianping.cat.home.heartbeat.entity.HeartbeatDisplayPolicy; +import com.dianping.cat.home.heartbeat.entity.Metric; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onGroup(final HeartbeatDisplayPolicy parent, final Group group) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addGroup(group); + } + }); + } else { + parent.addGroup(group); + } + + return true; + } + + @Override + public boolean onMetric(final Group parent, final Metric metric) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addMetric(metric); + } + }); + } else { + parent.addMetric(metric); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..a301b279e3 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultSaxMaker.java @@ -0,0 +1,103 @@ +package com.dianping.cat.home.heartbeat.transform; + +import static com.dianping.cat.home.heartbeat.Constants.ATTR_ALERT; +import static com.dianping.cat.home.heartbeat.Constants.ATTR_DELTA; +import static com.dianping.cat.home.heartbeat.Constants.ATTR_ID; +import static com.dianping.cat.home.heartbeat.Constants.ATTR_LABLE; +import static com.dianping.cat.home.heartbeat.Constants.ATTR_ORDER; +import static com.dianping.cat.home.heartbeat.Constants.ATTR_TITLE; +import static com.dianping.cat.home.heartbeat.Constants.ATTR_UNIT; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.heartbeat.entity.Group; +import com.dianping.cat.home.heartbeat.entity.HeartbeatDisplayPolicy; +import com.dianping.cat.home.heartbeat.entity.Metric; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Group buildGroup(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String order = attributes.getValue(ATTR_ORDER); + Group group = new Group(id); + + if (order != null) { + group.setOrder(convert(Integer.class, order, 0)); + } + + return group; + } + + @Override + public HeartbeatDisplayPolicy buildHeartbeatDisplayPolicy(Attributes attributes) { + HeartbeatDisplayPolicy heartbeatDisplayPolicy = new HeartbeatDisplayPolicy(); + + return heartbeatDisplayPolicy; + } + + @Override + public Metric buildMetric(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String unit = attributes.getValue(ATTR_UNIT); + String delta = attributes.getValue(ATTR_DELTA); + String order = attributes.getValue(ATTR_ORDER); + String title = attributes.getValue(ATTR_TITLE); + String lable = attributes.getValue(ATTR_LABLE); + String alert = attributes.getValue(ATTR_ALERT); + Metric metric = new Metric(id); + + if (unit != null) { + metric.setUnit(unit); + } + + if (delta != null) { + metric.setDelta(convert(Boolean.class, delta, false)); + } + + if (order != null) { + metric.setOrder(convert(Integer.class, order, 0)); + } + + if (title != null) { + metric.setTitle(title); + } + + if (lable != null) { + metric.setLable(lable); + } + + if (alert != null) { + metric.setAlert(convert(Boolean.class, alert, false)); + } + + return metric; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..78763aac09 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultSaxParser.java @@ -0,0 +1,250 @@ +package com.dianping.cat.home.heartbeat.transform; + +import static com.dianping.cat.home.heartbeat.Constants.ENTITY_GROUP; +import static com.dianping.cat.home.heartbeat.Constants.ENTITY_HEARTBEAT_DISPLAY_POLICY; +import static com.dianping.cat.home.heartbeat.Constants.ENTITY_METRIC; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.heartbeat.IEntity; +import com.dianping.cat.home.heartbeat.entity.Group; +import com.dianping.cat.home.heartbeat.entity.HeartbeatDisplayPolicy; +import com.dianping.cat.home.heartbeat.entity.Metric; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static HeartbeatDisplayPolicy parse(InputStream in) throws SAXException, IOException { + return parseEntity(HeartbeatDisplayPolicy.class, new InputSource(removeBOM(in))); + } + + public static HeartbeatDisplayPolicy parse(Reader reader) throws SAXException, IOException { + return parseEntity(HeartbeatDisplayPolicy.class, new InputSource(removeBOM(reader))); + } + + public static HeartbeatDisplayPolicy parse(String xml) throws SAXException, IOException { + return parseEntity(HeartbeatDisplayPolicy.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForGroup(Group parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_METRIC.equals(qName)) { + Metric metric = m_maker.buildMetric(attributes); + + m_linker.onMetric(parentObj, metric); + m_objs.push(metric); + } else { + throw new SAXException(String.format("Element(%s) is not expected under group!", qName)); + } + + m_tags.push(qName); + } + + private void parseForHeartbeatDisplayPolicy(HeartbeatDisplayPolicy parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_GROUP.equals(qName)) { + Group group = m_maker.buildGroup(attributes); + + m_linker.onGroup(parentObj, group); + m_objs.push(group); + } else { + throw new SAXException(String.format("Element(%s) is not expected under heartbeat-display-policy!", qName)); + } + + m_tags.push(qName); + } + + private void parseForMetric(Metric parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_HEARTBEAT_DISPLAY_POLICY.equals(qName)) { + HeartbeatDisplayPolicy heartbeatDisplayPolicy = m_maker.buildHeartbeatDisplayPolicy(attributes); + + m_entity = heartbeatDisplayPolicy; + m_objs.push(heartbeatDisplayPolicy); + m_tags.push(qName); + } else if (ENTITY_GROUP.equals(qName)) { + Group group = m_maker.buildGroup(attributes); + + m_entity = group; + m_objs.push(group); + m_tags.push(qName); + } else if (ENTITY_METRIC.equals(qName)) { + Metric metric = m_maker.buildMetric(attributes); + + m_entity = metric; + m_objs.push(metric); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof HeartbeatDisplayPolicy) { + parseForHeartbeatDisplayPolicy((HeartbeatDisplayPolicy) parent, tag, qName, attributes); + } else if (parent instanceof Group) { + parseForGroup((Group) parent, tag, qName, attributes); + } else if (parent instanceof Metric) { + parseForMetric((Metric) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..4724241de2 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/DefaultXmlBuilder.java @@ -0,0 +1,233 @@ +package com.dianping.cat.home.heartbeat.transform; + +import static com.dianping.cat.home.heartbeat.Constants.ATTR_ALERT; +import static com.dianping.cat.home.heartbeat.Constants.ATTR_DELTA; +import static com.dianping.cat.home.heartbeat.Constants.ATTR_ID; +import static com.dianping.cat.home.heartbeat.Constants.ATTR_LABLE; +import static com.dianping.cat.home.heartbeat.Constants.ATTR_ORDER; +import static com.dianping.cat.home.heartbeat.Constants.ATTR_TITLE; +import static com.dianping.cat.home.heartbeat.Constants.ATTR_UNIT; +import static com.dianping.cat.home.heartbeat.Constants.ENTITY_GROUP; +import static com.dianping.cat.home.heartbeat.Constants.ENTITY_HEARTBEAT_DISPLAY_POLICY; +import static com.dianping.cat.home.heartbeat.Constants.ENTITY_METRIC; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.heartbeat.IEntity; +import com.dianping.cat.home.heartbeat.IVisitor; +import com.dianping.cat.home.heartbeat.entity.Group; +import com.dianping.cat.home.heartbeat.entity.HeartbeatDisplayPolicy; +import com.dianping.cat.home.heartbeat.entity.Metric; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitGroup(Group group) { + startTag(ENTITY_GROUP, null, ATTR_ID, group.getId(), ATTR_ORDER, group.getOrder()); + + if (!group.getMetrics().isEmpty()) { + for (Metric metric : group.getMetrics().values()) { + metric.accept(m_visitor); + } + } + + endTag(ENTITY_GROUP); + } + + @Override + public void visitHeartbeatDisplayPolicy(HeartbeatDisplayPolicy heartbeatDisplayPolicy) { + startTag(ENTITY_HEARTBEAT_DISPLAY_POLICY, null); + + if (!heartbeatDisplayPolicy.getGroups().isEmpty()) { + for (Group group : heartbeatDisplayPolicy.getGroups().values()) { + group.accept(m_visitor); + } + } + + endTag(ENTITY_HEARTBEAT_DISPLAY_POLICY); + } + + @Override + public void visitMetric(Metric metric) { + startTag(ENTITY_METRIC, true, null, ATTR_ID, metric.getId(), ATTR_UNIT, metric.getUnit(), ATTR_DELTA, metric.isDelta(), ATTR_ORDER, metric.getOrder(), ATTR_TITLE, metric.getTitle(), ATTR_LABLE, metric.getLable(), ATTR_ALERT, metric.isAlert()); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/ILinker.java new file mode 100644 index 0000000000..4860b9e523 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.home.heartbeat.transform; + +import com.dianping.cat.home.heartbeat.entity.Group; +import com.dianping.cat.home.heartbeat.entity.HeartbeatDisplayPolicy; +import com.dianping.cat.home.heartbeat.entity.Metric; + +public interface ILinker { + + public boolean onGroup(HeartbeatDisplayPolicy parent, Group group); + + public boolean onMetric(Group parent, Metric metric); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/IMaker.java new file mode 100644 index 0000000000..ba6b6a29ca --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/IMaker.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.heartbeat.transform; + +import com.dianping.cat.home.heartbeat.entity.Group; +import com.dianping.cat.home.heartbeat.entity.HeartbeatDisplayPolicy; +import com.dianping.cat.home.heartbeat.entity.Metric; + +public interface IMaker { + + public Group buildGroup(T node); + + public HeartbeatDisplayPolicy buildHeartbeatDisplayPolicy(T node); + + public Metric buildMetric(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/IParser.java new file mode 100644 index 0000000000..47e1d06d8f --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heartbeat/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.home.heartbeat.transform; + +import com.dianping.cat.home.heartbeat.entity.Group; +import com.dianping.cat.home.heartbeat.entity.HeartbeatDisplayPolicy; +import com.dianping.cat.home.heartbeat.entity.Metric; + +public interface IParser { + public HeartbeatDisplayPolicy parse(IMaker maker, ILinker linker, T node); + + public void parseForGroup(IMaker maker, ILinker linker, Group parent, T node); + + public void parseForMetric(IMaker maker, ILinker linker, Metric parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/BaseEntity.java new file mode 100644 index 0000000000..870b3dfe69 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.heavy; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.heavy.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/Constants.java new file mode 100644 index 0000000000..51cee0d3d4 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/Constants.java @@ -0,0 +1,34 @@ +package com.dianping.cat.home.heavy; + +public class Constants { + + public static final String ATTR_COUNT = "count"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_KEY = "key"; + + public static final String ATTR_LOGVIEW = "logview"; + + public static final String ATTR_NAME = "name"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ENTITY_HEAVY_CACHE = "heavy-cache"; + + public static final String ENTITY_HEAVY_CALL = "heavy-call"; + + public static final String ENTITY_HEAVY_REPORT = "heavy-report"; + + public static final String ENTITY_HEAVY_SQL = "heavy-sql"; + + public static final String ENTITY_SERVICE = "service"; + + public static final String ENTITY_SERVICES = "services"; + + public static final String ENTITY_URL = "url"; + + public static final String ENTITY_URLS = "urls"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/IEntity.java new file mode 100644 index 0000000000..a600118cf9 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.heavy; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/IVisitor.java new file mode 100644 index 0000000000..3ec4c5b572 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/IVisitor.java @@ -0,0 +1,23 @@ +package com.dianping.cat.home.heavy; + +import com.dianping.cat.home.heavy.entity.HeavyCache; +import com.dianping.cat.home.heavy.entity.HeavyCall; +import com.dianping.cat.home.heavy.entity.HeavyReport; +import com.dianping.cat.home.heavy.entity.HeavySql; +import com.dianping.cat.home.heavy.entity.Service; +import com.dianping.cat.home.heavy.entity.Url; + +public interface IVisitor { + + public void visitHeavyCache(HeavyCache heavyCache); + + public void visitHeavyCall(HeavyCall heavyCall); + + public void visitHeavyReport(HeavyReport heavyReport); + + public void visitHeavySql(HeavySql heavySql); + + public void visitService(Service service); + + public void visitUrl(Url url); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavyCache.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavyCache.java new file mode 100644 index 0000000000..7c04d962a6 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavyCache.java @@ -0,0 +1,124 @@ +package com.dianping.cat.home.heavy.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.heavy.BaseEntity; +import com.dianping.cat.home.heavy.IVisitor; + +public class HeavyCache extends BaseEntity { + private Map m_urls = new LinkedHashMap(); + + private Map m_services = new LinkedHashMap(); + + public HeavyCache() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitHeavyCache(this); + } + + public HeavyCache addService(Service service) { + m_services.put(service.getKey(), service); + return this; + } + + public HeavyCache addUrl(Url url) { + m_urls.put(url.getKey(), url); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof HeavyCache) { + HeavyCache _o = (HeavyCache) obj; + + if (!equals(getUrls(), _o.getUrls())) { + return false; + } + + if (!equals(getServices(), _o.getServices())) { + return false; + } + + + return true; + } + + return false; + } + + public Service findService(String key) { + return m_services.get(key); + } + + public Url findUrl(String key) { + return m_urls.get(key); + } + + public Service findOrCreateService(String key) { + Service service = m_services.get(key); + + if (service == null) { + synchronized (m_services) { + service = m_services.get(key); + + if (service == null) { + service = new Service(key); + m_services.put(key, service); + } + } + } + + return service; + } + + public Url findOrCreateUrl(String key) { + Url url = m_urls.get(key); + + if (url == null) { + synchronized (m_urls) { + url = m_urls.get(key); + + if (url == null) { + url = new Url(key); + m_urls.put(key, url); + } + } + } + + return url; + } + + public Map getServices() { + return m_services; + } + + public Map getUrls() { + return m_urls; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_urls == null ? 0 : m_urls.hashCode()); + hash = hash * 31 + (m_services == null ? 0 : m_services.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(HeavyCache other) { + } + + public Service removeService(String key) { + return m_services.remove(key); + } + + public Url removeUrl(String key) { + return m_urls.remove(key); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavyCall.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavyCall.java new file mode 100644 index 0000000000..95f3a73102 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavyCall.java @@ -0,0 +1,124 @@ +package com.dianping.cat.home.heavy.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.heavy.BaseEntity; +import com.dianping.cat.home.heavy.IVisitor; + +public class HeavyCall extends BaseEntity { + private Map m_urls = new LinkedHashMap(); + + private Map m_services = new LinkedHashMap(); + + public HeavyCall() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitHeavyCall(this); + } + + public HeavyCall addService(Service service) { + m_services.put(service.getKey(), service); + return this; + } + + public HeavyCall addUrl(Url url) { + m_urls.put(url.getKey(), url); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof HeavyCall) { + HeavyCall _o = (HeavyCall) obj; + + if (!equals(getUrls(), _o.getUrls())) { + return false; + } + + if (!equals(getServices(), _o.getServices())) { + return false; + } + + + return true; + } + + return false; + } + + public Service findService(String key) { + return m_services.get(key); + } + + public Url findUrl(String key) { + return m_urls.get(key); + } + + public Service findOrCreateService(String key) { + Service service = m_services.get(key); + + if (service == null) { + synchronized (m_services) { + service = m_services.get(key); + + if (service == null) { + service = new Service(key); + m_services.put(key, service); + } + } + } + + return service; + } + + public Url findOrCreateUrl(String key) { + Url url = m_urls.get(key); + + if (url == null) { + synchronized (m_urls) { + url = m_urls.get(key); + + if (url == null) { + url = new Url(key); + m_urls.put(key, url); + } + } + } + + return url; + } + + public Map getServices() { + return m_services; + } + + public Map getUrls() { + return m_urls; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_urls == null ? 0 : m_urls.hashCode()); + hash = hash * 31 + (m_services == null ? 0 : m_services.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(HeavyCall other) { + } + + public Service removeService(String key) { + return m_services.remove(key); + } + + public Url removeUrl(String key) { + return m_urls.remove(key); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavyReport.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavyReport.java new file mode 100644 index 0000000000..e3a883ae7a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavyReport.java @@ -0,0 +1,125 @@ +package com.dianping.cat.home.heavy.entity; + +import static com.dianping.cat.home.heavy.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.heavy.Constants.ENTITY_HEAVY_REPORT; + +import com.dianping.cat.home.heavy.BaseEntity; +import com.dianping.cat.home.heavy.IVisitor; + +public class HeavyReport extends BaseEntity { + private String m_domain; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private HeavySql m_heavySql; + + private HeavyCall m_heavyCall; + + private HeavyCache m_heavyCache; + + public HeavyReport() { + } + + public HeavyReport(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitHeavyReport(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof HeavyReport) { + HeavyReport _o = (HeavyReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public String getDomain() { + return m_domain; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public HeavyCache getHeavyCache() { + return m_heavyCache; + } + + public HeavyCall getHeavyCall() { + return m_heavyCall; + } + + public HeavySql getHeavySql() { + return m_heavySql; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(HeavyReport other) { + assertAttributeEquals(other, ENTITY_HEAVY_REPORT, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public HeavyReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public HeavyReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public HeavyReport setHeavyCache(HeavyCache heavyCache) { + m_heavyCache = heavyCache; + return this; + } + + public HeavyReport setHeavyCall(HeavyCall heavyCall) { + m_heavyCall = heavyCall; + return this; + } + + public HeavyReport setHeavySql(HeavySql heavySql) { + m_heavySql = heavySql; + return this; + } + + public HeavyReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavySql.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavySql.java new file mode 100644 index 0000000000..76cf371ae9 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/HeavySql.java @@ -0,0 +1,124 @@ +package com.dianping.cat.home.heavy.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.heavy.BaseEntity; +import com.dianping.cat.home.heavy.IVisitor; + +public class HeavySql extends BaseEntity { + private Map m_urls = new LinkedHashMap(); + + private Map m_services = new LinkedHashMap(); + + public HeavySql() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitHeavySql(this); + } + + public HeavySql addService(Service service) { + m_services.put(service.getKey(), service); + return this; + } + + public HeavySql addUrl(Url url) { + m_urls.put(url.getKey(), url); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof HeavySql) { + HeavySql _o = (HeavySql) obj; + + if (!equals(getUrls(), _o.getUrls())) { + return false; + } + + if (!equals(getServices(), _o.getServices())) { + return false; + } + + + return true; + } + + return false; + } + + public Service findService(String key) { + return m_services.get(key); + } + + public Url findUrl(String key) { + return m_urls.get(key); + } + + public Service findOrCreateService(String key) { + Service service = m_services.get(key); + + if (service == null) { + synchronized (m_services) { + service = m_services.get(key); + + if (service == null) { + service = new Service(key); + m_services.put(key, service); + } + } + } + + return service; + } + + public Url findOrCreateUrl(String key) { + Url url = m_urls.get(key); + + if (url == null) { + synchronized (m_urls) { + url = m_urls.get(key); + + if (url == null) { + url = new Url(key); + m_urls.put(key, url); + } + } + } + + return url; + } + + public Map getServices() { + return m_services; + } + + public Map getUrls() { + return m_urls; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_urls == null ? 0 : m_urls.hashCode()); + hash = hash * 31 + (m_services == null ? 0 : m_services.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(HeavySql other) { + } + + public Service removeService(String key) { + return m_services.remove(key); + } + + public Url removeUrl(String key) { + return m_urls.remove(key); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/Service.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/Service.java new file mode 100644 index 0000000000..e1d74e46a7 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/Service.java @@ -0,0 +1,120 @@ +package com.dianping.cat.home.heavy.entity; + +import static com.dianping.cat.home.heavy.Constants.ATTR_KEY; +import static com.dianping.cat.home.heavy.Constants.ENTITY_SERVICE; + +import com.dianping.cat.home.heavy.BaseEntity; +import com.dianping.cat.home.heavy.IVisitor; + +public class Service extends BaseEntity { + private String m_domain; + + private String m_name; + + private String m_logview; + + private long m_count; + + private String m_key; + + public Service() { + } + + public Service(String key) { + m_key = key; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitService(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Service) { + Service _o = (Service) obj; + + if (!equals(getKey(), _o.getKey())) { + return false; + } + + return true; + } + + return false; + } + + public long getCount() { + return m_count; + } + + public String getDomain() { + return m_domain; + } + + public String getKey() { + return m_key; + } + + public String getLogview() { + return m_logview; + } + + public String getName() { + return m_name; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_key == null ? 0 : m_key.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Service other) { + assertAttributeEquals(other, ENTITY_SERVICE, ATTR_KEY, m_key, other.getKey()); + + if (other.getDomain() != null) { + m_domain = other.getDomain(); + } + + if (other.getName() != null) { + m_name = other.getName(); + } + + if (other.getLogview() != null) { + m_logview = other.getLogview(); + } + + m_count = other.getCount(); + } + + public Service setCount(long count) { + m_count = count; + return this; + } + + public Service setDomain(String domain) { + m_domain = domain; + return this; + } + + public Service setKey(String key) { + m_key = key; + return this; + } + + public Service setLogview(String logview) { + m_logview = logview; + return this; + } + + public Service setName(String name) { + m_name = name; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/Url.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/Url.java new file mode 100644 index 0000000000..bc7a4e875e --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/entity/Url.java @@ -0,0 +1,120 @@ +package com.dianping.cat.home.heavy.entity; + +import static com.dianping.cat.home.heavy.Constants.ATTR_KEY; +import static com.dianping.cat.home.heavy.Constants.ENTITY_URL; + +import com.dianping.cat.home.heavy.BaseEntity; +import com.dianping.cat.home.heavy.IVisitor; + +public class Url extends BaseEntity { + private String m_domain; + + private String m_name; + + private String m_logview; + + private long m_count; + + private String m_key; + + public Url() { + } + + public Url(String key) { + m_key = key; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitUrl(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Url) { + Url _o = (Url) obj; + + if (!equals(getKey(), _o.getKey())) { + return false; + } + + return true; + } + + return false; + } + + public long getCount() { + return m_count; + } + + public String getDomain() { + return m_domain; + } + + public String getKey() { + return m_key; + } + + public String getLogview() { + return m_logview; + } + + public String getName() { + return m_name; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_key == null ? 0 : m_key.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Url other) { + assertAttributeEquals(other, ENTITY_URL, ATTR_KEY, m_key, other.getKey()); + + if (other.getDomain() != null) { + m_domain = other.getDomain(); + } + + if (other.getName() != null) { + m_name = other.getName(); + } + + if (other.getLogview() != null) { + m_logview = other.getLogview(); + } + + m_count = other.getCount(); + } + + public Url setCount(long count) { + m_count = count; + return this; + } + + public Url setDomain(String domain) { + m_domain = domain; + return this; + } + + public Url setKey(String key) { + m_key = key; + return this; + } + + public Url setLogview(String logview) { + m_logview = logview; + return this; + } + + public Url setName(String name) { + m_name = name; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/BaseVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/BaseVisitor.java new file mode 100644 index 0000000000..cb8c87c726 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/BaseVisitor.java @@ -0,0 +1,67 @@ +package com.dianping.cat.home.heavy.transform; + +import com.dianping.cat.home.heavy.IVisitor; +import com.dianping.cat.home.heavy.entity.HeavyCache; +import com.dianping.cat.home.heavy.entity.HeavyCall; +import com.dianping.cat.home.heavy.entity.HeavyReport; +import com.dianping.cat.home.heavy.entity.HeavySql; +import com.dianping.cat.home.heavy.entity.Service; +import com.dianping.cat.home.heavy.entity.Url; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitHeavyCache(HeavyCache heavyCache) { + for (Url url : heavyCache.getUrls().values()) { + visitUrl(url); + } + + for (Service service : heavyCache.getServices().values()) { + visitService(service); + } + } + + @Override + public void visitHeavyCall(HeavyCall heavyCall) { + for (Url url : heavyCall.getUrls().values()) { + visitUrl(url); + } + + for (Service service : heavyCall.getServices().values()) { + visitService(service); + } + } + + @Override + public void visitHeavyReport(HeavyReport heavyReport) { + if (heavyReport.getHeavySql() != null) { + visitHeavySql(heavyReport.getHeavySql()); + } + + if (heavyReport.getHeavyCall() != null) { + visitHeavyCall(heavyReport.getHeavyCall()); + } + + if (heavyReport.getHeavyCache() != null) { + visitHeavyCache(heavyReport.getHeavyCache()); + } + } + + @Override + public void visitHeavySql(HeavySql heavySql) { + for (Url url : heavySql.getUrls().values()) { + visitUrl(url); + } + + for (Service service : heavySql.getServices().values()) { + visitService(service); + } + } + + @Override + public void visitService(Service service) { + } + + @Override + public void visitUrl(Url url) { + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultLinker.java new file mode 100644 index 0000000000..34ef6840df --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultLinker.java @@ -0,0 +1,140 @@ +package com.dianping.cat.home.heavy.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.heavy.entity.HeavyCache; +import com.dianping.cat.home.heavy.entity.HeavyCall; +import com.dianping.cat.home.heavy.entity.HeavyReport; +import com.dianping.cat.home.heavy.entity.HeavySql; +import com.dianping.cat.home.heavy.entity.Service; +import com.dianping.cat.home.heavy.entity.Url; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onHeavyCache(final HeavyReport parent, final HeavyCache heavyCache) { + parent.setHeavyCache(heavyCache); + return true; + } + + @Override + public boolean onHeavyCall(final HeavyReport parent, final HeavyCall heavyCall) { + parent.setHeavyCall(heavyCall); + return true; + } + + @Override + public boolean onHeavySql(final HeavyReport parent, final HeavySql heavySql) { + parent.setHeavySql(heavySql); + return true; + } + + @Override + public boolean onService(final HeavySql parent, final Service service) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addService(service); + } + }); + } else { + parent.addService(service); + } + + return true; + } + + @Override + public boolean onService(final HeavyCall parent, final Service service) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addService(service); + } + }); + } else { + parent.addService(service); + } + + return true; + } + + @Override + public boolean onService(final HeavyCache parent, final Service service) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addService(service); + } + }); + } else { + parent.addService(service); + } + + return true; + } + + @Override + public boolean onUrl(final HeavySql parent, final Url url) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addUrl(url); + } + }); + } else { + parent.addUrl(url); + } + + return true; + } + + @Override + public boolean onUrl(final HeavyCall parent, final Url url) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addUrl(url); + } + }); + } else { + parent.addUrl(url); + } + + return true; + } + + @Override + public boolean onUrl(final HeavyCache parent, final Url url) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addUrl(url); + } + }); + } else { + parent.addUrl(url); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultMerger.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultMerger.java new file mode 100644 index 0000000000..e46c23b56a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultMerger.java @@ -0,0 +1,244 @@ +package com.dianping.cat.home.heavy.transform; + +import java.util.Stack; + +import com.dianping.cat.home.heavy.IEntity; +import com.dianping.cat.home.heavy.IVisitor; +import com.dianping.cat.home.heavy.entity.HeavyCache; +import com.dianping.cat.home.heavy.entity.HeavyCall; +import com.dianping.cat.home.heavy.entity.HeavyReport; +import com.dianping.cat.home.heavy.entity.HeavySql; +import com.dianping.cat.home.heavy.entity.Service; +import com.dianping.cat.home.heavy.entity.Url; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private HeavyReport m_heavyReport; + + public DefaultMerger() { + } + + public DefaultMerger(HeavyReport heavyReport) { + m_heavyReport = heavyReport; + m_objs.push(heavyReport); + } + + public HeavyReport getHeavyReport() { + return m_heavyReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeHeavyCache(HeavyCache to, HeavyCache from) { + to.mergeAttributes(from); + } + + protected void mergeHeavyCall(HeavyCall to, HeavyCall from) { + to.mergeAttributes(from); + } + + protected void mergeHeavyReport(HeavyReport to, HeavyReport from) { + to.mergeAttributes(from); + } + + protected void mergeHeavySql(HeavySql to, HeavySql from) { + to.mergeAttributes(from); + } + + protected void mergeService(Service to, Service from) { + to.mergeAttributes(from); + } + + protected void mergeUrl(Url to, Url from) { + to.mergeAttributes(from); + } + + @Override + public void visitHeavyCache(HeavyCache from) { + HeavyCache to = (HeavyCache) m_objs.peek(); + + mergeHeavyCache(to, from); + visitHeavyCacheChildren(to, from); + } + + protected void visitHeavyCacheChildren(HeavyCache to, HeavyCache from) { + for (Url source : from.getUrls().values()) { + Url target = to.findUrl(source.getKey()); + + if (target == null) { + target = new Url(source.getKey()); + to.addUrl(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Service source : from.getServices().values()) { + Service target = to.findService(source.getKey()); + + if (target == null) { + target = new Service(source.getKey()); + to.addService(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitHeavyCall(HeavyCall from) { + HeavyCall to = (HeavyCall) m_objs.peek(); + + mergeHeavyCall(to, from); + visitHeavyCallChildren(to, from); + } + + protected void visitHeavyCallChildren(HeavyCall to, HeavyCall from) { + for (Url source : from.getUrls().values()) { + Url target = to.findUrl(source.getKey()); + + if (target == null) { + target = new Url(source.getKey()); + to.addUrl(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Service source : from.getServices().values()) { + Service target = to.findService(source.getKey()); + + if (target == null) { + target = new Service(source.getKey()); + to.addService(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitHeavyReport(HeavyReport from) { + HeavyReport to = (HeavyReport) m_objs.peek(); + + mergeHeavyReport(to, from); + visitHeavyReportChildren(to, from); + } + + protected void visitHeavyReportChildren(HeavyReport to, HeavyReport from) { + if (from.getHeavySql() != null) { + HeavySql target = to.getHeavySql(); + + if (target == null) { + target = new HeavySql(); + to.setHeavySql(target); + } + + m_objs.push(target); + from.getHeavySql().accept(this); + m_objs.pop(); + } + + if (from.getHeavyCall() != null) { + HeavyCall target = to.getHeavyCall(); + + if (target == null) { + target = new HeavyCall(); + to.setHeavyCall(target); + } + + m_objs.push(target); + from.getHeavyCall().accept(this); + m_objs.pop(); + } + + if (from.getHeavyCache() != null) { + HeavyCache target = to.getHeavyCache(); + + if (target == null) { + target = new HeavyCache(); + to.setHeavyCache(target); + } + + m_objs.push(target); + from.getHeavyCache().accept(this); + m_objs.pop(); + } + } + + @Override + public void visitHeavySql(HeavySql from) { + HeavySql to = (HeavySql) m_objs.peek(); + + mergeHeavySql(to, from); + visitHeavySqlChildren(to, from); + } + + protected void visitHeavySqlChildren(HeavySql to, HeavySql from) { + for (Url source : from.getUrls().values()) { + Url target = to.findUrl(source.getKey()); + + if (target == null) { + target = new Url(source.getKey()); + to.addUrl(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Service source : from.getServices().values()) { + Service target = to.findService(source.getKey()); + + if (target == null) { + target = new Service(source.getKey()); + to.addService(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitService(Service from) { + Service to = (Service) m_objs.peek(); + + mergeService(to, from); + visitServiceChildren(to, from); + } + + protected void visitServiceChildren(Service to, Service from) { + } + + @Override + public void visitUrl(Url from) { + Url to = (Url) m_objs.peek(); + + mergeUrl(to, from); + visitUrlChildren(to, from); + } + + protected void visitUrlChildren(Url to, Url from) { + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultNativeBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..889a8bb92c --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultNativeBuilder.java @@ -0,0 +1,255 @@ +package com.dianping.cat.home.heavy.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.home.heavy.IVisitor; +import com.dianping.cat.home.heavy.entity.HeavyCache; +import com.dianping.cat.home.heavy.entity.HeavyCall; +import com.dianping.cat.home.heavy.entity.HeavyReport; +import com.dianping.cat.home.heavy.entity.HeavySql; +import com.dianping.cat.home.heavy.entity.Service; +import com.dianping.cat.home.heavy.entity.Url; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(HeavyReport heavyReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(heavyReport, out); + return out.toByteArray(); + } + + public static void build(HeavyReport heavyReport, OutputStream out) { + heavyReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitHeavyCache(HeavyCache heavyCache) { + if (!heavyCache.getUrls().isEmpty()) { + writeTag(33, 2); + writeInt(heavyCache.getUrls().size()); + + for (Url url : heavyCache.getUrls().values()) { + url.accept(m_visitor); + } + } + + if (!heavyCache.getServices().isEmpty()) { + writeTag(34, 2); + writeInt(heavyCache.getServices().size()); + + for (Service service : heavyCache.getServices().values()) { + service.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitHeavyCall(HeavyCall heavyCall) { + if (!heavyCall.getUrls().isEmpty()) { + writeTag(33, 2); + writeInt(heavyCall.getUrls().size()); + + for (Url url : heavyCall.getUrls().values()) { + url.accept(m_visitor); + } + } + + if (!heavyCall.getServices().isEmpty()) { + writeTag(34, 2); + writeInt(heavyCall.getServices().size()); + + for (Service service : heavyCall.getServices().values()) { + service.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitHeavyReport(HeavyReport heavyReport) { + writeTag(63, 0); + + if (heavyReport.getDomain() != null) { + writeTag(1, 1); + writeString(heavyReport.getDomain()); + } + + if (heavyReport.getStartTime() != null) { + writeTag(2, 1); + writeDate(heavyReport.getStartTime()); + } + + if (heavyReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(heavyReport.getEndTime()); + } + + if (heavyReport.getHeavySql() != null) { + writeTag(33, 1); + heavyReport.getHeavySql().accept(m_visitor); + } + + if (heavyReport.getHeavyCall() != null) { + writeTag(34, 1); + heavyReport.getHeavyCall().accept(m_visitor); + } + + if (heavyReport.getHeavyCache() != null) { + writeTag(35, 1); + heavyReport.getHeavyCache().accept(m_visitor); + } + + writeTag(63, 3); + } + + @Override + public void visitHeavySql(HeavySql heavySql) { + if (!heavySql.getUrls().isEmpty()) { + writeTag(33, 2); + writeInt(heavySql.getUrls().size()); + + for (Url url : heavySql.getUrls().values()) { + url.accept(m_visitor); + } + } + + if (!heavySql.getServices().isEmpty()) { + writeTag(34, 2); + writeInt(heavySql.getServices().size()); + + for (Service service : heavySql.getServices().values()) { + service.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitService(Service service) { + if (service.getDomain() != null) { + writeTag(1, 1); + writeString(service.getDomain()); + } + + if (service.getName() != null) { + writeTag(2, 1); + writeString(service.getName()); + } + + if (service.getLogview() != null) { + writeTag(3, 1); + writeString(service.getLogview()); + } + + writeTag(4, 0); + writeLong(service.getCount()); + + if (service.getKey() != null) { + writeTag(5, 1); + writeString(service.getKey()); + } + + writeTag(63, 3); + } + + @Override + public void visitUrl(Url url) { + if (url.getDomain() != null) { + writeTag(1, 1); + writeString(url.getDomain()); + } + + if (url.getName() != null) { + writeTag(2, 1); + writeString(url.getName()); + } + + if (url.getLogview() != null) { + writeTag(3, 1); + writeString(url.getLogview()); + } + + writeTag(4, 0); + writeLong(url.getCount()); + + if (url.getKey() != null) { + writeTag(5, 1); + writeString(url.getKey()); + } + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeLong(long value) { + try { + writeVarint(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultNativeParser.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..796a789a73 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultNativeParser.java @@ -0,0 +1,338 @@ +package com.dianping.cat.home.heavy.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.home.heavy.IVisitor; +import com.dianping.cat.home.heavy.entity.HeavyCache; +import com.dianping.cat.home.heavy.entity.HeavyCall; +import com.dianping.cat.home.heavy.entity.HeavyReport; +import com.dianping.cat.home.heavy.entity.HeavySql; +import com.dianping.cat.home.heavy.entity.Service; +import com.dianping.cat.home.heavy.entity.Url; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static HeavyReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static HeavyReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + HeavyReport heavyReport = new HeavyReport(); + + try { + heavyReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return heavyReport; + } + + @Override + public void visitHeavyCache(HeavyCache heavyCache) { + byte tag; + + while ((tag = readTag()) != -1) { + visitHeavyCacheChildren(heavyCache, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitHeavyCacheChildren(HeavyCache heavyCache, int _field, int _type) { + switch (_field) { + case 33: + if (_type == 1) { + Url url = new Url(); + + visitUrl(url); + m_linker.onUrl(heavyCache, url); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Url url = new Url(); + + visitUrl(url); + m_linker.onUrl(heavyCache, url); + } + } + break; + case 34: + if (_type == 1) { + Service service = new Service(); + + visitService(service); + m_linker.onService(heavyCache, service); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Service service = new Service(); + + visitService(service); + m_linker.onService(heavyCache, service); + } + } + break; + } + } + + @Override + public void visitHeavyCall(HeavyCall heavyCall) { + byte tag; + + while ((tag = readTag()) != -1) { + visitHeavyCallChildren(heavyCall, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitHeavyCallChildren(HeavyCall heavyCall, int _field, int _type) { + switch (_field) { + case 33: + if (_type == 1) { + Url url = new Url(); + + visitUrl(url); + m_linker.onUrl(heavyCall, url); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Url url = new Url(); + + visitUrl(url); + m_linker.onUrl(heavyCall, url); + } + } + break; + case 34: + if (_type == 1) { + Service service = new Service(); + + visitService(service); + m_linker.onService(heavyCall, service); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Service service = new Service(); + + visitService(service); + m_linker.onService(heavyCall, service); + } + } + break; + } + } + + @Override + public void visitHeavyReport(HeavyReport heavyReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitHeavyReportChildren(heavyReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitHeavyReportChildren(HeavyReport heavyReport, int _field, int _type) { + switch (_field) { + case 1: + heavyReport.setDomain(readString()); + break; + case 2: + heavyReport.setStartTime(readDate()); + break; + case 3: + heavyReport.setEndTime(readDate()); + break; + case 33: + HeavySql heavySql = new HeavySql(); + + visitHeavySql(heavySql); + m_linker.onHeavySql(heavyReport, heavySql); + break; + case 34: + HeavyCall heavyCall = new HeavyCall(); + + visitHeavyCall(heavyCall); + m_linker.onHeavyCall(heavyReport, heavyCall); + break; + case 35: + HeavyCache heavyCache = new HeavyCache(); + + visitHeavyCache(heavyCache); + m_linker.onHeavyCache(heavyReport, heavyCache); + break; + } + } + + @Override + public void visitHeavySql(HeavySql heavySql) { + byte tag; + + while ((tag = readTag()) != -1) { + visitHeavySqlChildren(heavySql, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitHeavySqlChildren(HeavySql heavySql, int _field, int _type) { + switch (_field) { + case 33: + if (_type == 1) { + Url url = new Url(); + + visitUrl(url); + m_linker.onUrl(heavySql, url); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Url url = new Url(); + + visitUrl(url); + m_linker.onUrl(heavySql, url); + } + } + break; + case 34: + if (_type == 1) { + Service service = new Service(); + + visitService(service); + m_linker.onService(heavySql, service); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Service service = new Service(); + + visitService(service); + m_linker.onService(heavySql, service); + } + } + break; + } + } + + @Override + public void visitService(Service service) { + byte tag; + + while ((tag = readTag()) != -1) { + visitServiceChildren(service, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitServiceChildren(Service service, int _field, int _type) { + switch (_field) { + case 1: + service.setDomain(readString()); + break; + case 2: + service.setName(readString()); + break; + case 3: + service.setLogview(readString()); + break; + case 4: + service.setCount(readLong()); + break; + case 5: + service.setKey(readString()); + break; + } + } + + @Override + public void visitUrl(Url url) { + byte tag; + + while ((tag = readTag()) != -1) { + visitUrlChildren(url, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitUrlChildren(Url url, int _field, int _type) { + switch (_field) { + case 1: + url.setDomain(readString()); + break; + case 2: + url.setName(readString()); + break; + case 3: + url.setLogview(readString()); + break; + case 4: + url.setCount(readLong()); + break; + case 5: + url.setKey(readString()); + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private long readLong() { + try { + return readVarint(64); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..98cfdde35d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultSaxMaker.java @@ -0,0 +1,155 @@ +package com.dianping.cat.home.heavy.transform; + +import static com.dianping.cat.home.heavy.Constants.ATTR_COUNT; +import static com.dianping.cat.home.heavy.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.heavy.Constants.ATTR_ENDTIME; +import static com.dianping.cat.home.heavy.Constants.ATTR_KEY; +import static com.dianping.cat.home.heavy.Constants.ATTR_LOGVIEW; +import static com.dianping.cat.home.heavy.Constants.ATTR_NAME; +import static com.dianping.cat.home.heavy.Constants.ATTR_STARTTIME; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.heavy.entity.HeavyCache; +import com.dianping.cat.home.heavy.entity.HeavyCall; +import com.dianping.cat.home.heavy.entity.HeavyReport; +import com.dianping.cat.home.heavy.entity.HeavySql; +import com.dianping.cat.home.heavy.entity.Service; +import com.dianping.cat.home.heavy.entity.Url; + +public class DefaultSaxMaker implements IMaker { + + @Override + public HeavyCache buildHeavyCache(Attributes attributes) { + HeavyCache heavyCache = new HeavyCache(); + + return heavyCache; + } + + @Override + public HeavyCall buildHeavyCall(Attributes attributes) { + HeavyCall heavyCall = new HeavyCall(); + + return heavyCall; + } + + @Override + public HeavyReport buildHeavyReport(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String startTime = attributes.getValue(ATTR_STARTTIME); + String endTime = attributes.getValue(ATTR_ENDTIME); + HeavyReport heavyReport = new HeavyReport(domain); + + if (startTime != null) { + heavyReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + heavyReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return heavyReport; + } + + @Override + public HeavySql buildHeavySql(Attributes attributes) { + HeavySql heavySql = new HeavySql(); + + return heavySql; + } + + @Override + public Service buildService(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String name = attributes.getValue(ATTR_NAME); + String logview = attributes.getValue(ATTR_LOGVIEW); + String count = attributes.getValue(ATTR_COUNT); + String key = attributes.getValue(ATTR_KEY); + Service service = new Service(key); + + if (domain != null) { + service.setDomain(domain); + } + + if (name != null) { + service.setName(name); + } + + if (logview != null) { + service.setLogview(logview); + } + + if (count != null) { + service.setCount(convert(Long.class, count, 0L)); + } + + return service; + } + + @Override + public Url buildUrl(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String name = attributes.getValue(ATTR_NAME); + String logview = attributes.getValue(ATTR_LOGVIEW); + String count = attributes.getValue(ATTR_COUNT); + String key = attributes.getValue(ATTR_KEY); + Url url = new Url(key); + + if (domain != null) { + url.setDomain(domain); + } + + if (name != null) { + url.setName(name); + } + + if (logview != null) { + url.setLogview(logview); + } + + if (count != null) { + url.setCount(convert(Long.class, count, 0L)); + } + + return url; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..a77cb64961 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultSaxParser.java @@ -0,0 +1,344 @@ +package com.dianping.cat.home.heavy.transform; + +import static com.dianping.cat.home.heavy.Constants.ENTITY_HEAVY_CACHE; +import static com.dianping.cat.home.heavy.Constants.ENTITY_HEAVY_CALL; +import static com.dianping.cat.home.heavy.Constants.ENTITY_HEAVY_REPORT; +import static com.dianping.cat.home.heavy.Constants.ENTITY_HEAVY_SQL; +import static com.dianping.cat.home.heavy.Constants.ENTITY_SERVICE; +import static com.dianping.cat.home.heavy.Constants.ENTITY_URL; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.heavy.IEntity; +import com.dianping.cat.home.heavy.entity.HeavyCache; +import com.dianping.cat.home.heavy.entity.HeavyCall; +import com.dianping.cat.home.heavy.entity.HeavyReport; +import com.dianping.cat.home.heavy.entity.HeavySql; +import com.dianping.cat.home.heavy.entity.Service; +import com.dianping.cat.home.heavy.entity.Url; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static HeavyReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(HeavyReport.class, new InputSource(removeBOM(in))); + } + + public static HeavyReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(HeavyReport.class, new InputSource(removeBOM(reader))); + } + + public static HeavyReport parse(String xml) throws SAXException, IOException { + return parseEntity(HeavyReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForHeavyCache(HeavyCache parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_URL.equals(qName)) { + Url url = m_maker.buildUrl(attributes); + + m_linker.onUrl(parentObj, url); + m_objs.push(url); + } else if (ENTITY_SERVICE.equals(qName)) { + Service service = m_maker.buildService(attributes); + + m_linker.onService(parentObj, service); + m_objs.push(service); + } else { + throw new SAXException(String.format("Element(%s) is not expected under heavy-cache!", qName)); + } + + m_tags.push(qName); + } + + private void parseForHeavyCall(HeavyCall parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_URL.equals(qName)) { + Url url = m_maker.buildUrl(attributes); + + m_linker.onUrl(parentObj, url); + m_objs.push(url); + } else if (ENTITY_SERVICE.equals(qName)) { + Service service = m_maker.buildService(attributes); + + m_linker.onService(parentObj, service); + m_objs.push(service); + } else { + throw new SAXException(String.format("Element(%s) is not expected under heavy-call!", qName)); + } + + m_tags.push(qName); + } + + private void parseForHeavyReport(HeavyReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_HEAVY_SQL.equals(qName)) { + HeavySql heavySql = m_maker.buildHeavySql(attributes); + + m_linker.onHeavySql(parentObj, heavySql); + m_objs.push(heavySql); + } else if (ENTITY_HEAVY_CALL.equals(qName)) { + HeavyCall heavyCall = m_maker.buildHeavyCall(attributes); + + m_linker.onHeavyCall(parentObj, heavyCall); + m_objs.push(heavyCall); + } else if (ENTITY_HEAVY_CACHE.equals(qName)) { + HeavyCache heavyCache = m_maker.buildHeavyCache(attributes); + + m_linker.onHeavyCache(parentObj, heavyCache); + m_objs.push(heavyCache); + } else { + throw new SAXException(String.format("Element(%s) is not expected under heavy-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseForHeavySql(HeavySql parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_URL.equals(qName)) { + Url url = m_maker.buildUrl(attributes); + + m_linker.onUrl(parentObj, url); + m_objs.push(url); + } else if (ENTITY_SERVICE.equals(qName)) { + Service service = m_maker.buildService(attributes); + + m_linker.onService(parentObj, service); + m_objs.push(service); + } else { + throw new SAXException(String.format("Element(%s) is not expected under heavy-sql!", qName)); + } + + m_tags.push(qName); + } + + private void parseForService(Service parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForUrl(Url parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_HEAVY_REPORT.equals(qName)) { + HeavyReport heavyReport = m_maker.buildHeavyReport(attributes); + + m_entity = heavyReport; + m_objs.push(heavyReport); + m_tags.push(qName); + } else if (ENTITY_HEAVY_SQL.equals(qName)) { + HeavySql heavySql = m_maker.buildHeavySql(attributes); + + m_entity = heavySql; + m_objs.push(heavySql); + m_tags.push(qName); + } else if (ENTITY_URL.equals(qName)) { + Url url = m_maker.buildUrl(attributes); + + m_entity = url; + m_objs.push(url); + m_tags.push(qName); + } else if (ENTITY_SERVICE.equals(qName)) { + Service service = m_maker.buildService(attributes); + + m_entity = service; + m_objs.push(service); + m_tags.push(qName); + } else if (ENTITY_HEAVY_CALL.equals(qName)) { + HeavyCall heavyCall = m_maker.buildHeavyCall(attributes); + + m_entity = heavyCall; + m_objs.push(heavyCall); + m_tags.push(qName); + } else if (ENTITY_HEAVY_CACHE.equals(qName)) { + HeavyCache heavyCache = m_maker.buildHeavyCache(attributes); + + m_entity = heavyCache; + m_objs.push(heavyCache); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof HeavyReport) { + parseForHeavyReport((HeavyReport) parent, tag, qName, attributes); + } else if (parent instanceof HeavySql) { + parseForHeavySql((HeavySql) parent, tag, qName, attributes); + } else if (parent instanceof Url) { + parseForUrl((Url) parent, tag, qName, attributes); + } else if (parent instanceof Service) { + parseForService((Service) parent, tag, qName, attributes); + } else if (parent instanceof HeavyCall) { + parseForHeavyCall((HeavyCall) parent, tag, qName, attributes); + } else if (parent instanceof HeavyCache) { + parseForHeavyCache((HeavyCache) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..7bc65e3c63 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/DefaultXmlBuilder.java @@ -0,0 +1,302 @@ +package com.dianping.cat.home.heavy.transform; + +import static com.dianping.cat.home.heavy.Constants.ATTR_COUNT; +import static com.dianping.cat.home.heavy.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.heavy.Constants.ATTR_ENDTIME; +import static com.dianping.cat.home.heavy.Constants.ATTR_KEY; +import static com.dianping.cat.home.heavy.Constants.ATTR_LOGVIEW; +import static com.dianping.cat.home.heavy.Constants.ATTR_NAME; +import static com.dianping.cat.home.heavy.Constants.ATTR_STARTTIME; +import static com.dianping.cat.home.heavy.Constants.ENTITY_HEAVY_CACHE; +import static com.dianping.cat.home.heavy.Constants.ENTITY_HEAVY_CALL; +import static com.dianping.cat.home.heavy.Constants.ENTITY_HEAVY_REPORT; +import static com.dianping.cat.home.heavy.Constants.ENTITY_HEAVY_SQL; +import static com.dianping.cat.home.heavy.Constants.ENTITY_SERVICE; +import static com.dianping.cat.home.heavy.Constants.ENTITY_URL; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.heavy.IEntity; +import com.dianping.cat.home.heavy.IVisitor; +import com.dianping.cat.home.heavy.entity.HeavyCache; +import com.dianping.cat.home.heavy.entity.HeavyCall; +import com.dianping.cat.home.heavy.entity.HeavyReport; +import com.dianping.cat.home.heavy.entity.HeavySql; +import com.dianping.cat.home.heavy.entity.Service; +import com.dianping.cat.home.heavy.entity.Url; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + @Override + public void visitHeavyCache(HeavyCache heavyCache) { + startTag(ENTITY_HEAVY_CACHE, null); + + if (!heavyCache.getUrls().isEmpty()) { + for (Url url : heavyCache.getUrls().values()) { + url.accept(m_visitor); + } + } + + if (!heavyCache.getServices().isEmpty()) { + for (Service service : heavyCache.getServices().values()) { + service.accept(m_visitor); + } + } + + endTag(ENTITY_HEAVY_CACHE); + } + + @Override + public void visitHeavyCall(HeavyCall heavyCall) { + startTag(ENTITY_HEAVY_CALL, null); + + if (!heavyCall.getUrls().isEmpty()) { + for (Url url : heavyCall.getUrls().values()) { + url.accept(m_visitor); + } + } + + if (!heavyCall.getServices().isEmpty()) { + for (Service service : heavyCall.getServices().values()) { + service.accept(m_visitor); + } + } + + endTag(ENTITY_HEAVY_CALL); + } + + @Override + public void visitHeavyReport(HeavyReport heavyReport) { + startTag(ENTITY_HEAVY_REPORT, null, ATTR_DOMAIN, heavyReport.getDomain(), ATTR_STARTTIME, toString(heavyReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_ENDTIME, toString(heavyReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (heavyReport.getHeavySql() != null) { + heavyReport.getHeavySql().accept(m_visitor); + } + + if (heavyReport.getHeavyCall() != null) { + heavyReport.getHeavyCall().accept(m_visitor); + } + + if (heavyReport.getHeavyCache() != null) { + heavyReport.getHeavyCache().accept(m_visitor); + } + + endTag(ENTITY_HEAVY_REPORT); + } + + @Override + public void visitHeavySql(HeavySql heavySql) { + startTag(ENTITY_HEAVY_SQL, null); + + if (!heavySql.getUrls().isEmpty()) { + for (Url url : heavySql.getUrls().values()) { + url.accept(m_visitor); + } + } + + if (!heavySql.getServices().isEmpty()) { + for (Service service : heavySql.getServices().values()) { + service.accept(m_visitor); + } + } + + endTag(ENTITY_HEAVY_SQL); + } + + @Override + public void visitService(Service service) { + startTag(ENTITY_SERVICE, true, null, ATTR_DOMAIN, service.getDomain(), ATTR_NAME, service.getName(), ATTR_LOGVIEW, service.getLogview(), ATTR_COUNT, service.getCount(), ATTR_KEY, service.getKey()); + } + + @Override + public void visitUrl(Url url) { + startTag(ENTITY_URL, true, null, ATTR_DOMAIN, url.getDomain(), ATTR_NAME, url.getName(), ATTR_LOGVIEW, url.getLogview(), ATTR_COUNT, url.getCount(), ATTR_KEY, url.getKey()); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/ILinker.java new file mode 100644 index 0000000000..8786abc39b --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/ILinker.java @@ -0,0 +1,29 @@ +package com.dianping.cat.home.heavy.transform; + +import com.dianping.cat.home.heavy.entity.HeavyCache; +import com.dianping.cat.home.heavy.entity.HeavyCall; +import com.dianping.cat.home.heavy.entity.HeavyReport; +import com.dianping.cat.home.heavy.entity.HeavySql; +import com.dianping.cat.home.heavy.entity.Service; +import com.dianping.cat.home.heavy.entity.Url; + +public interface ILinker { + + public boolean onHeavyCache(HeavyReport parent, HeavyCache heavyCache); + + public boolean onHeavyCall(HeavyReport parent, HeavyCall heavyCall); + + public boolean onHeavySql(HeavyReport parent, HeavySql heavySql); + + public boolean onService(HeavySql parent, Service service); + + public boolean onService(HeavyCall parent, Service service); + + public boolean onService(HeavyCache parent, Service service); + + public boolean onUrl(HeavySql parent, Url url); + + public boolean onUrl(HeavyCall parent, Url url); + + public boolean onUrl(HeavyCache parent, Url url); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/IMaker.java new file mode 100644 index 0000000000..2f5e1f0315 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/IMaker.java @@ -0,0 +1,23 @@ +package com.dianping.cat.home.heavy.transform; + +import com.dianping.cat.home.heavy.entity.HeavyCache; +import com.dianping.cat.home.heavy.entity.HeavyCall; +import com.dianping.cat.home.heavy.entity.HeavyReport; +import com.dianping.cat.home.heavy.entity.HeavySql; +import com.dianping.cat.home.heavy.entity.Service; +import com.dianping.cat.home.heavy.entity.Url; + +public interface IMaker { + + public HeavyCache buildHeavyCache(T node); + + public HeavyCall buildHeavyCall(T node); + + public HeavyReport buildHeavyReport(T node); + + public HeavySql buildHeavySql(T node); + + public Service buildService(T node); + + public Url buildUrl(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/IParser.java new file mode 100644 index 0000000000..7c3dfc7c78 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/heavy/transform/IParser.java @@ -0,0 +1,22 @@ +package com.dianping.cat.home.heavy.transform; + +import com.dianping.cat.home.heavy.entity.HeavyCache; +import com.dianping.cat.home.heavy.entity.HeavyCall; +import com.dianping.cat.home.heavy.entity.HeavyReport; +import com.dianping.cat.home.heavy.entity.HeavySql; +import com.dianping.cat.home.heavy.entity.Service; +import com.dianping.cat.home.heavy.entity.Url; + +public interface IParser { + public HeavyReport parse(IMaker maker, ILinker linker, T node); + + public void parseForHeavyCache(IMaker maker, ILinker linker, HeavyCache parent, T node); + + public void parseForHeavyCall(IMaker maker, ILinker linker, HeavyCall parent, T node); + + public void parseForHeavySql(IMaker maker, ILinker linker, HeavySql parent, T node); + + public void parseForService(IMaker maker, ILinker linker, Service parent, T node); + + public void parseForUrl(IMaker maker, ILinker linker, Url parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/jar/BaseEntity.java new file mode 100644 index 0000000000..88405b9134 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.jar; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.jar.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/jar/Constants.java new file mode 100644 index 0000000000..519422dd51 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/Constants.java @@ -0,0 +1,28 @@ +package com.dianping.cat.home.jar; + +public class Constants { + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ATTR_VERSION = "version"; + + public static final String ENTITY_DOMAIN = "domain"; + + public static final String ENTITY_DOMAINS = "domains"; + + public static final String ENTITY_JAR = "jar"; + + public static final String ENTITY_JARS = "jars"; + + public static final String ENTITY_JAR_REPORT = "jar-report"; + + public static final String ENTITY_MACHINE = "machine"; + + public static final String ENTITY_MACHINES = "machines"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/jar/IEntity.java new file mode 100644 index 0000000000..fc9431d2ca --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.jar; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/jar/IVisitor.java new file mode 100644 index 0000000000..dcdc377ebf --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/IVisitor.java @@ -0,0 +1,17 @@ +package com.dianping.cat.home.jar; + +import com.dianping.cat.home.jar.entity.Domain; +import com.dianping.cat.home.jar.entity.Jar; +import com.dianping.cat.home.jar.entity.JarReport; +import com.dianping.cat.home.jar.entity.Machine; + +public interface IVisitor { + + public void visitDomain(Domain domain); + + public void visitJar(Jar jar); + + public void visitJarReport(JarReport jarReport); + + public void visitMachine(Machine machine); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/entity/Domain.java b/cat-home/src/main/java/com/dianping/cat/home/jar/entity/Domain.java new file mode 100644 index 0000000000..ec4e018e18 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/entity/Domain.java @@ -0,0 +1,102 @@ +package com.dianping.cat.home.jar.entity; + +import static com.dianping.cat.home.jar.Constants.ATTR_ID; +import static com.dianping.cat.home.jar.Constants.ENTITY_DOMAIN; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.jar.BaseEntity; +import com.dianping.cat.home.jar.IVisitor; + +public class Domain extends BaseEntity { + private String m_id; + + private Map m_machines = new LinkedHashMap(); + + public Domain() { + } + + public Domain(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomain(this); + } + + public Domain addMachine(Machine machine) { + m_machines.put(machine.getId(), machine); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Domain) { + Domain _o = (Domain) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Machine findMachine(String id) { + return m_machines.get(id); + } + + public Machine findOrCreateMachine(String id) { + Machine machine = m_machines.get(id); + + if (machine == null) { + synchronized (m_machines) { + machine = m_machines.get(id); + + if (machine == null) { + machine = new Machine(id); + m_machines.put(id, machine); + } + } + } + + return machine; + } + + public String getId() { + return m_id; + } + + public Map getMachines() { + return m_machines; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Domain other) { + assertAttributeEquals(other, ENTITY_DOMAIN, ATTR_ID, m_id, other.getId()); + + } + + public Machine removeMachine(String id) { + return m_machines.remove(id); + } + + public Domain setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/entity/Jar.java b/cat-home/src/main/java/com/dianping/cat/home/jar/entity/Jar.java new file mode 100644 index 0000000000..b4869dc3c8 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/entity/Jar.java @@ -0,0 +1,78 @@ +package com.dianping.cat.home.jar.entity; + +import com.dianping.cat.home.jar.BaseEntity; +import com.dianping.cat.home.jar.IVisitor; + +public class Jar extends BaseEntity { + private String m_id; + + private String m_version; + + public Jar() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitJar(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Jar) { + Jar _o = (Jar) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + if (!equals(getVersion(), _o.getVersion())) { + return false; + } + + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + public String getVersion() { + return m_version; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + hash = hash * 31 + (m_version == null ? 0 : m_version.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Jar other) { + if (other.getId() != null) { + m_id = other.getId(); + } + + if (other.getVersion() != null) { + m_version = other.getVersion(); + } + } + + public Jar setId(String id) { + m_id = id; + return this; + } + + public Jar setVersion(String version) { + m_version = version; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/entity/JarReport.java b/cat-home/src/main/java/com/dianping/cat/home/jar/entity/JarReport.java new file mode 100644 index 0000000000..dd7b286007 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/entity/JarReport.java @@ -0,0 +1,142 @@ +package com.dianping.cat.home.jar.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.jar.BaseEntity; +import com.dianping.cat.home.jar.IVisitor; + +public class JarReport extends BaseEntity { + private String m_domain; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Map m_domains = new LinkedHashMap(); + + public JarReport() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitJarReport(this); + } + + public JarReport addDomain(Domain domain) { + m_domains.put(domain.getId(), domain); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof JarReport) { + JarReport _o = (JarReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + if (!equals(getStartTime(), _o.getStartTime())) { + return false; + } + + if (!equals(getEndTime(), _o.getEndTime())) { + return false; + } + + if (!equals(getDomains(), _o.getDomains())) { + return false; + } + + + return true; + } + + return false; + } + + public Domain findDomain(String id) { + return m_domains.get(id); + } + + public Domain findOrCreateDomain(String id) { + Domain domain = m_domains.get(id); + + if (domain == null) { + synchronized (m_domains) { + domain = m_domains.get(id); + + if (domain == null) { + domain = new Domain(id); + m_domains.put(id, domain); + } + } + } + + return domain; + } + + public String getDomain() { + return m_domain; + } + + public Map getDomains() { + return m_domains; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + hash = hash * 31 + (m_startTime == null ? 0 : m_startTime.hashCode()); + hash = hash * 31 + (m_endTime == null ? 0 : m_endTime.hashCode()); + hash = hash * 31 + (m_domains == null ? 0 : m_domains.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(JarReport other) { + if (other.getDomain() != null) { + m_domain = other.getDomain(); + } + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Domain removeDomain(String id) { + return m_domains.remove(id); + } + + public JarReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public JarReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public JarReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/entity/Machine.java b/cat-home/src/main/java/com/dianping/cat/home/jar/entity/Machine.java new file mode 100644 index 0000000000..532fc5cdad --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/entity/Machine.java @@ -0,0 +1,77 @@ +package com.dianping.cat.home.jar.entity; + +import static com.dianping.cat.home.jar.Constants.ATTR_ID; +import static com.dianping.cat.home.jar.Constants.ENTITY_MACHINE; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.home.jar.BaseEntity; +import com.dianping.cat.home.jar.IVisitor; + +public class Machine extends BaseEntity { + private String m_id; + + private List m_jars = new ArrayList(); + + public Machine() { + } + + public Machine(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMachine(this); + } + + public Machine addJar(Jar jar) { + m_jars.add(jar); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Machine) { + Machine _o = (Machine) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + public List getJars() { + return m_jars; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Machine other) { + assertAttributeEquals(other, ENTITY_MACHINE, ATTR_ID, m_id, other.getId()); + + } + + public Machine setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/transform/BaseVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/BaseVisitor.java new file mode 100644 index 0000000000..d574345498 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/BaseVisitor.java @@ -0,0 +1,34 @@ +package com.dianping.cat.home.jar.transform; + +import com.dianping.cat.home.jar.IVisitor; +import com.dianping.cat.home.jar.entity.Domain; +import com.dianping.cat.home.jar.entity.Jar; +import com.dianping.cat.home.jar.entity.JarReport; +import com.dianping.cat.home.jar.entity.Machine; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitDomain(Domain domain) { + for (Machine machine : domain.getMachines().values()) { + visitMachine(machine); + } + } + + @Override + public void visitJar(Jar jar) { + } + + @Override + public void visitJarReport(JarReport jarReport) { + for (Domain domain : jarReport.getDomains().values()) { + visitDomain(domain); + } + } + + @Override + public void visitMachine(Machine machine) { + for (Jar jar : machine.getJars()) { + visitJar(jar); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultLinker.java new file mode 100644 index 0000000000..c8e79e85e7 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultLinker.java @@ -0,0 +1,62 @@ +package com.dianping.cat.home.jar.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.jar.entity.Domain; +import com.dianping.cat.home.jar.entity.Jar; +import com.dianping.cat.home.jar.entity.JarReport; +import com.dianping.cat.home.jar.entity.Machine; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDomain(final JarReport parent, final Domain domain) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDomain(domain); + } + }); + } else { + parent.addDomain(domain); + } + + return true; + } + + @Override + public boolean onJar(final Machine parent, final Jar jar) { + parent.addJar(jar); + return true; + } + + @Override + public boolean onMachine(final Domain parent, final Machine machine) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addMachine(machine); + } + }); + } else { + parent.addMachine(machine); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultMerger.java b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultMerger.java new file mode 100644 index 0000000000..3caced7da6 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultMerger.java @@ -0,0 +1,135 @@ +package com.dianping.cat.home.jar.transform; + +import java.util.Stack; + +import com.dianping.cat.home.jar.IEntity; +import com.dianping.cat.home.jar.IVisitor; +import com.dianping.cat.home.jar.entity.Domain; +import com.dianping.cat.home.jar.entity.Jar; +import com.dianping.cat.home.jar.entity.JarReport; +import com.dianping.cat.home.jar.entity.Machine; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private JarReport m_jarReport; + + public DefaultMerger() { + } + + public DefaultMerger(JarReport jarReport) { + m_jarReport = jarReport; + m_objs.push(jarReport); + } + + public JarReport getJarReport() { + return m_jarReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeDomain(Domain to, Domain from) { + to.mergeAttributes(from); + } + + protected void mergeJar(Jar to, Jar from) { + to.mergeAttributes(from); + } + + protected void mergeJarReport(JarReport to, JarReport from) { + to.mergeAttributes(from); + } + + protected void mergeMachine(Machine to, Machine from) { + to.mergeAttributes(from); + } + + @Override + public void visitDomain(Domain from) { + Domain to = (Domain) m_objs.peek(); + + mergeDomain(to, from); + visitDomainChildren(to, from); + } + + protected void visitDomainChildren(Domain to, Domain from) { + for (Machine source : from.getMachines().values()) { + Machine target = to.findMachine(source.getId()); + + if (target == null) { + target = new Machine(source.getId()); + to.addMachine(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitJar(Jar from) { + Jar to = (Jar) m_objs.peek(); + + mergeJar(to, from); + visitJarChildren(to, from); + } + + protected void visitJarChildren(Jar to, Jar from) { + } + + @Override + public void visitJarReport(JarReport from) { + JarReport to = (JarReport) m_objs.peek(); + + mergeJarReport(to, from); + visitJarReportChildren(to, from); + } + + protected void visitJarReportChildren(JarReport to, JarReport from) { + for (Domain source : from.getDomains().values()) { + Domain target = to.findDomain(source.getId()); + + if (target == null) { + target = new Domain(source.getId()); + to.addDomain(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitMachine(Machine from) { + Machine to = (Machine) m_objs.peek(); + + mergeMachine(to, from); + visitMachineChildren(to, from); + } + + protected void visitMachineChildren(Machine to, Machine from) { + for (Jar source : from.getJars()) { + Jar target = null; + + if (target == null) { + target = new Jar(); + to.addJar(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultNativeBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..f51f06e7e5 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultNativeBuilder.java @@ -0,0 +1,167 @@ +package com.dianping.cat.home.jar.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.home.jar.IVisitor; +import com.dianping.cat.home.jar.entity.Domain; +import com.dianping.cat.home.jar.entity.Jar; +import com.dianping.cat.home.jar.entity.JarReport; +import com.dianping.cat.home.jar.entity.Machine; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(JarReport jarReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(jarReport, out); + return out.toByteArray(); + } + + public static void build(JarReport jarReport, OutputStream out) { + jarReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitDomain(Domain domain) { + if (domain.getId() != null) { + writeTag(1, 1); + writeString(domain.getId()); + } + + if (!domain.getMachines().isEmpty()) { + writeTag(33, 2); + writeInt(domain.getMachines().size()); + + for (Machine machine : domain.getMachines().values()) { + machine.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitJar(Jar jar) { + if (jar.getId() != null) { + writeTag(1, 1); + writeString(jar.getId()); + } + + if (jar.getVersion() != null) { + writeTag(2, 1); + writeString(jar.getVersion()); + } + + writeTag(63, 3); + } + + @Override + public void visitJarReport(JarReport jarReport) { + writeTag(63, 0); + + if (jarReport.getDomain() != null) { + writeTag(1, 1); + writeString(jarReport.getDomain()); + } + + if (jarReport.getStartTime() != null) { + writeTag(2, 1); + writeDate(jarReport.getStartTime()); + } + + if (jarReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(jarReport.getEndTime()); + } + + if (!jarReport.getDomains().isEmpty()) { + writeTag(33, 2); + writeInt(jarReport.getDomains().size()); + + for (Domain domain : jarReport.getDomains().values()) { + domain.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitMachine(Machine machine) { + if (machine.getId() != null) { + writeTag(1, 1); + writeString(machine.getId()); + } + + if (!machine.getJars().isEmpty()) { + writeTag(33, 2); + writeInt(machine.getJars().size()); + + for (Jar jar : machine.getJars()) { + jar.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultNativeParser.java b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..92dd5994ca --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultNativeParser.java @@ -0,0 +1,219 @@ +package com.dianping.cat.home.jar.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.home.jar.IVisitor; +import com.dianping.cat.home.jar.entity.Domain; +import com.dianping.cat.home.jar.entity.Jar; +import com.dianping.cat.home.jar.entity.JarReport; +import com.dianping.cat.home.jar.entity.Machine; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static JarReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static JarReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + JarReport jarReport = new JarReport(); + + try { + jarReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return jarReport; + } + + @Override + public void visitDomain(Domain domain) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDomainChildren(domain, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDomainChildren(Domain domain, int _field, int _type) { + switch (_field) { + case 1: + domain.setId(readString()); + break; + case 33: + if (_type == 1) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(domain, machine); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Machine machine = new Machine(); + + visitMachine(machine); + m_linker.onMachine(domain, machine); + } + } + break; + } + } + + @Override + public void visitJar(Jar jar) { + byte tag; + + while ((tag = readTag()) != -1) { + visitJarChildren(jar, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitJarChildren(Jar jar, int _field, int _type) { + switch (_field) { + case 1: + jar.setId(readString()); + break; + case 2: + jar.setVersion(readString()); + break; + } + } + + @Override + public void visitJarReport(JarReport jarReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitJarReportChildren(jarReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitJarReportChildren(JarReport jarReport, int _field, int _type) { + switch (_field) { + case 1: + jarReport.setDomain(readString()); + break; + case 2: + jarReport.setStartTime(readDate()); + break; + case 3: + jarReport.setEndTime(readDate()); + break; + case 33: + if (_type == 1) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(jarReport, domain); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(jarReport, domain); + } + } + break; + } + } + + @Override + public void visitMachine(Machine machine) { + byte tag; + + while ((tag = readTag()) != -1) { + visitMachineChildren(machine, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitMachineChildren(Machine machine, int _field, int _type) { + switch (_field) { + case 1: + machine.setId(readString()); + break; + case 33: + if (_type == 1) { + Jar jar = new Jar(); + + visitJar(jar); + m_linker.onJar(machine, jar); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Jar jar = new Jar(); + + visitJar(jar); + m_linker.onJar(machine, jar); + } + } + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..3cfccb5fe9 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultSaxMaker.java @@ -0,0 +1,111 @@ +package com.dianping.cat.home.jar.transform; + +import static com.dianping.cat.home.jar.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.jar.Constants.ATTR_ENDTIME; +import static com.dianping.cat.home.jar.Constants.ATTR_ID; +import static com.dianping.cat.home.jar.Constants.ATTR_STARTTIME; +import static com.dianping.cat.home.jar.Constants.ATTR_VERSION; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.jar.entity.Domain; +import com.dianping.cat.home.jar.entity.Jar; +import com.dianping.cat.home.jar.entity.JarReport; +import com.dianping.cat.home.jar.entity.Machine; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Domain buildDomain(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Domain domain = new Domain(id); + + return domain; + } + + @Override + public Jar buildJar(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String version = attributes.getValue(ATTR_VERSION); + Jar jar = new Jar(); + + if (id != null) { + jar.setId(id); + } + + if (version != null) { + jar.setVersion(version); + } + + return jar; + } + + @Override + public JarReport buildJarReport(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String startTime = attributes.getValue(ATTR_STARTTIME); + String endTime = attributes.getValue(ATTR_ENDTIME); + JarReport jarReport = new JarReport(); + + if (domain != null) { + jarReport.setDomain(domain); + } + + if (startTime != null) { + jarReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + jarReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return jarReport; + } + + @Override + public Machine buildMachine(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Machine machine = new Machine(id); + + return machine; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..d903cfca81 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultSaxParser.java @@ -0,0 +1,281 @@ +package com.dianping.cat.home.jar.transform; + +import static com.dianping.cat.home.jar.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.home.jar.Constants.ENTITY_JAR; +import static com.dianping.cat.home.jar.Constants.ENTITY_JAR_REPORT; +import static com.dianping.cat.home.jar.Constants.ENTITY_MACHINE; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.jar.IEntity; +import com.dianping.cat.home.jar.entity.Domain; +import com.dianping.cat.home.jar.entity.Jar; +import com.dianping.cat.home.jar.entity.JarReport; +import com.dianping.cat.home.jar.entity.Machine; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static JarReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(JarReport.class, new InputSource(removeBOM(in))); + } + + public static JarReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(JarReport.class, new InputSource(removeBOM(reader))); + } + + public static JarReport parse(String xml) throws SAXException, IOException { + return parseEntity(JarReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForDomain(Domain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_linker.onMachine(parentObj, machine); + m_objs.push(machine); + } else { + throw new SAXException(String.format("Element(%s) is not expected under domain!", qName)); + } + + m_tags.push(qName); + } + + private void parseForJar(Jar parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForJarReport(JarReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_linker.onDomain(parentObj, domain); + m_objs.push(domain); + } else { + throw new SAXException(String.format("Element(%s) is not expected under jar-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseForMachine(Machine parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_JAR.equals(qName)) { + Jar jar = m_maker.buildJar(attributes); + + m_linker.onJar(parentObj, jar); + m_objs.push(jar); + } else { + throw new SAXException(String.format("Element(%s) is not expected under machine!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_JAR_REPORT.equals(qName)) { + JarReport jarReport = m_maker.buildJarReport(attributes); + + m_entity = jarReport; + m_objs.push(jarReport); + m_tags.push(qName); + } else if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_entity = domain; + m_objs.push(domain); + m_tags.push(qName); + } else if (ENTITY_MACHINE.equals(qName)) { + Machine machine = m_maker.buildMachine(attributes); + + m_entity = machine; + m_objs.push(machine); + m_tags.push(qName); + } else if (ENTITY_JAR.equals(qName)) { + Jar jar = m_maker.buildJar(attributes); + + m_entity = jar; + m_objs.push(jar); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof JarReport) { + parseForJarReport((JarReport) parent, tag, qName, attributes); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, qName, attributes); + } else if (parent instanceof Machine) { + parseForMachine((Machine) parent, tag, qName, attributes); + } else if (parent instanceof Jar) { + parseForJar((Jar) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..7a1b2b0672 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/DefaultXmlBuilder.java @@ -0,0 +1,254 @@ +package com.dianping.cat.home.jar.transform; + +import static com.dianping.cat.home.jar.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.jar.Constants.ATTR_ENDTIME; +import static com.dianping.cat.home.jar.Constants.ATTR_ID; +import static com.dianping.cat.home.jar.Constants.ATTR_STARTTIME; +import static com.dianping.cat.home.jar.Constants.ATTR_VERSION; +import static com.dianping.cat.home.jar.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.home.jar.Constants.ENTITY_JAR; +import static com.dianping.cat.home.jar.Constants.ENTITY_JAR_REPORT; +import static com.dianping.cat.home.jar.Constants.ENTITY_MACHINE; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.jar.IEntity; +import com.dianping.cat.home.jar.IVisitor; +import com.dianping.cat.home.jar.entity.Domain; +import com.dianping.cat.home.jar.entity.Jar; +import com.dianping.cat.home.jar.entity.JarReport; +import com.dianping.cat.home.jar.entity.Machine; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + @Override + public void visitDomain(Domain domain) { + startTag(ENTITY_DOMAIN, null, ATTR_ID, domain.getId()); + + if (!domain.getMachines().isEmpty()) { + for (Machine machine : domain.getMachines().values()) { + machine.accept(m_visitor); + } + } + + endTag(ENTITY_DOMAIN); + } + + @Override + public void visitJar(Jar jar) { + startTag(ENTITY_JAR, true, null, ATTR_ID, jar.getId(), ATTR_VERSION, jar.getVersion()); + } + + @Override + public void visitJarReport(JarReport jarReport) { + startTag(ENTITY_JAR_REPORT, null, ATTR_DOMAIN, jarReport.getDomain(), ATTR_STARTTIME, toString(jarReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_ENDTIME, toString(jarReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!jarReport.getDomains().isEmpty()) { + for (Domain domain : jarReport.getDomains().values()) { + domain.accept(m_visitor); + } + } + + endTag(ENTITY_JAR_REPORT); + } + + @Override + public void visitMachine(Machine machine) { + startTag(ENTITY_MACHINE, null, ATTR_ID, machine.getId()); + + if (!machine.getJars().isEmpty()) { + for (Jar jar : machine.getJars()) { + jar.accept(m_visitor); + } + } + + endTag(ENTITY_MACHINE); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/ILinker.java new file mode 100644 index 0000000000..2f2cb42ecb --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/ILinker.java @@ -0,0 +1,15 @@ +package com.dianping.cat.home.jar.transform; + +import com.dianping.cat.home.jar.entity.Domain; +import com.dianping.cat.home.jar.entity.Jar; +import com.dianping.cat.home.jar.entity.JarReport; +import com.dianping.cat.home.jar.entity.Machine; + +public interface ILinker { + + public boolean onDomain(JarReport parent, Domain domain); + + public boolean onJar(Machine parent, Jar jar); + + public boolean onMachine(Domain parent, Machine machine); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/IMaker.java new file mode 100644 index 0000000000..c2d04a9b00 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/IMaker.java @@ -0,0 +1,17 @@ +package com.dianping.cat.home.jar.transform; + +import com.dianping.cat.home.jar.entity.Domain; +import com.dianping.cat.home.jar.entity.Jar; +import com.dianping.cat.home.jar.entity.JarReport; +import com.dianping.cat.home.jar.entity.Machine; + +public interface IMaker { + + public Domain buildDomain(T node); + + public Jar buildJar(T node); + + public JarReport buildJarReport(T node); + + public Machine buildMachine(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/jar/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/IParser.java new file mode 100644 index 0000000000..1370a2f191 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/jar/transform/IParser.java @@ -0,0 +1,16 @@ +package com.dianping.cat.home.jar.transform; + +import com.dianping.cat.home.jar.entity.Domain; +import com.dianping.cat.home.jar.entity.Jar; +import com.dianping.cat.home.jar.entity.JarReport; +import com.dianping.cat.home.jar.entity.Machine; + +public interface IParser { + public JarReport parse(IMaker maker, ILinker linker, T node); + + public void parseForDomain(IMaker maker, ILinker linker, Domain parent, T node); + + public void parseForJar(IMaker maker, ILinker linker, Jar parent, T node); + + public void parseForMachine(IMaker maker, ILinker linker, Machine parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/resource/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/resource/BaseEntity.java new file mode 100644 index 0000000000..df339f2903 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/resource/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.resource; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.resource.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/resource/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/resource/Constants.java new file mode 100644 index 0000000000..6a7f5829ee --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/resource/Constants.java @@ -0,0 +1,16 @@ +package com.dianping.cat.home.resource; + +public class Constants { + + public static final String ATTR_OP = "op"; + + public static final String ATTR_PATH = "path"; + + public static final String ATTR_ROLE = "role"; + + public static final String ENTITY_RESOURCE = "resource"; + + public static final String ENTITY_RESOURCES = "resources"; + + public static final String ENTITY_RESOURCE_CONFIG = "resource-config"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/resource/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/resource/IEntity.java new file mode 100644 index 0000000000..abcbfe6dd9 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/resource/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.resource; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/resource/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/resource/IVisitor.java new file mode 100644 index 0000000000..4e83e2aec5 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/resource/IVisitor.java @@ -0,0 +1,11 @@ +package com.dianping.cat.home.resource; + +import com.dianping.cat.home.resource.entity.Resource; +import com.dianping.cat.home.resource.entity.ResourceConfig; + +public interface IVisitor { + + public void visitResource(Resource resource); + + public void visitResourceConfig(ResourceConfig resourceConfig); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/resource/entity/Resource.java b/cat-home/src/main/java/com/dianping/cat/home/resource/entity/Resource.java new file mode 100644 index 0000000000..f35835c270 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/resource/entity/Resource.java @@ -0,0 +1,96 @@ +package com.dianping.cat.home.resource.entity; + +import com.dianping.cat.home.resource.BaseEntity; +import com.dianping.cat.home.resource.IVisitor; + +public class Resource extends BaseEntity { + private String m_path; + + private String m_op; + + private int m_role; + + public Resource() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitResource(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Resource) { + Resource _o = (Resource) obj; + + if (!equals(getPath(), _o.getPath())) { + return false; + } + + if (!equals(getOp(), _o.getOp())) { + return false; + } + + if (getRole() != _o.getRole()) { + return false; + } + + + return true; + } + + return false; + } + + public String getOp() { + return m_op; + } + + public String getPath() { + return m_path; + } + + public int getRole() { + return m_role; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_path == null ? 0 : m_path.hashCode()); + hash = hash * 31 + (m_op == null ? 0 : m_op.hashCode()); + hash = hash * 31 + m_role; + + return hash; + } + + @Override + public void mergeAttributes(Resource other) { + if (other.getPath() != null) { + m_path = other.getPath(); + } + + if (other.getOp() != null) { + m_op = other.getOp(); + } + + m_role = other.getRole(); + } + + public Resource setOp(String op) { + m_op = op; + return this; + } + + public Resource setPath(String path) { + m_path = path; + return this; + } + + public Resource setRole(int role) { + m_role = role; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/resource/entity/ResourceConfig.java b/cat-home/src/main/java/com/dianping/cat/home/resource/entity/ResourceConfig.java new file mode 100644 index 0000000000..59fdb1ddaf --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/resource/entity/ResourceConfig.java @@ -0,0 +1,61 @@ +package com.dianping.cat.home.resource.entity; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.home.resource.BaseEntity; +import com.dianping.cat.home.resource.IVisitor; + +public class ResourceConfig extends BaseEntity { + private List m_resources = new ArrayList(); + + public ResourceConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitResourceConfig(this); + } + + public ResourceConfig addResource(Resource resource) { + m_resources.add(resource); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ResourceConfig) { + ResourceConfig _o = (ResourceConfig) obj; + + if (!equals(getResources(), _o.getResources())) { + return false; + } + + + return true; + } + + return false; + } + + public List getResources() { + return m_resources; + } + + @Override + public int hashCode() { + int hash = 0; + + for (Resource e : m_resources) { + hash = hash * 31 + (e == null ? 0 :e.hashCode()); + } + + + return hash; + } + + @Override + public void mergeAttributes(ResourceConfig other) { + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultLinker.java new file mode 100644 index 0000000000..3a165c1bcb --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultLinker.java @@ -0,0 +1,29 @@ +package com.dianping.cat.home.resource.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.resource.entity.Resource; +import com.dianping.cat.home.resource.entity.ResourceConfig; + +public class DefaultLinker implements ILinker { + @SuppressWarnings("unused") + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onResource(final ResourceConfig parent, final Resource resource) { + parent.addResource(resource); + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..7bbaa333eb --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultSaxMaker.java @@ -0,0 +1,69 @@ +package com.dianping.cat.home.resource.transform; + +import static com.dianping.cat.home.resource.Constants.ATTR_OP; +import static com.dianping.cat.home.resource.Constants.ATTR_PATH; +import static com.dianping.cat.home.resource.Constants.ATTR_ROLE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.resource.entity.Resource; +import com.dianping.cat.home.resource.entity.ResourceConfig; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Resource buildResource(Attributes attributes) { + String path = attributes.getValue(ATTR_PATH); + String op = attributes.getValue(ATTR_OP); + String role = attributes.getValue(ATTR_ROLE); + Resource resource = new Resource(); + + if (path != null) { + resource.setPath(path); + } + + if (op != null) { + resource.setOp(op); + } + + if (role != null) { + resource.setRole(convert(Integer.class, role, 0)); + } + + return resource; + } + + @Override + public ResourceConfig buildResourceConfig(Attributes attributes) { + ResourceConfig resourceConfig = new ResourceConfig(); + + return resourceConfig; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..e578019fc1 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultSaxParser.java @@ -0,0 +1,227 @@ +package com.dianping.cat.home.resource.transform; + +import static com.dianping.cat.home.resource.Constants.ENTITY_RESOURCE; +import static com.dianping.cat.home.resource.Constants.ENTITY_RESOURCE_CONFIG; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.resource.IEntity; +import com.dianping.cat.home.resource.entity.Resource; +import com.dianping.cat.home.resource.entity.ResourceConfig; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static ResourceConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(ResourceConfig.class, new InputSource(removeBOM(in))); + } + + public static ResourceConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(ResourceConfig.class, new InputSource(removeBOM(reader))); + } + + public static ResourceConfig parse(String xml) throws SAXException, IOException { + return parseEntity(ResourceConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForResource(Resource parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForResourceConfig(ResourceConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_RESOURCE.equals(qName)) { + Resource resource = m_maker.buildResource(attributes); + + m_linker.onResource(parentObj, resource); + m_objs.push(resource); + } else { + throw new SAXException(String.format("Element(%s) is not expected under resource-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_RESOURCE_CONFIG.equals(qName)) { + ResourceConfig resourceConfig = m_maker.buildResourceConfig(attributes); + + m_entity = resourceConfig; + m_objs.push(resourceConfig); + m_tags.push(qName); + } else if (ENTITY_RESOURCE.equals(qName)) { + Resource resource = m_maker.buildResource(attributes); + + m_entity = resource; + m_objs.push(resource); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof ResourceConfig) { + parseForResourceConfig((ResourceConfig) parent, tag, qName, attributes); + } else if (parent instanceof Resource) { + parseForResource((Resource) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..a278c50ada --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/resource/transform/DefaultXmlBuilder.java @@ -0,0 +1,214 @@ +package com.dianping.cat.home.resource.transform; + +import static com.dianping.cat.home.resource.Constants.ATTR_OP; +import static com.dianping.cat.home.resource.Constants.ATTR_PATH; +import static com.dianping.cat.home.resource.Constants.ATTR_ROLE; +import static com.dianping.cat.home.resource.Constants.ENTITY_RESOURCE; +import static com.dianping.cat.home.resource.Constants.ENTITY_RESOURCE_CONFIG; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.resource.IEntity; +import com.dianping.cat.home.resource.IVisitor; +import com.dianping.cat.home.resource.entity.Resource; +import com.dianping.cat.home.resource.entity.ResourceConfig; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitResource(Resource resource) { + startTag(ENTITY_RESOURCE, true, null, ATTR_PATH, resource.getPath(), ATTR_OP, resource.getOp(), ATTR_ROLE, resource.getRole()); + } + + @Override + public void visitResourceConfig(ResourceConfig resourceConfig) { + startTag(ENTITY_RESOURCE_CONFIG, null); + + if (!resourceConfig.getResources().isEmpty()) { + for (Resource resource : resourceConfig.getResources()) { + resource.accept(m_visitor); + } + } + + endTag(ENTITY_RESOURCE_CONFIG); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/resource/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/resource/transform/ILinker.java new file mode 100644 index 0000000000..bd684dd653 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/resource/transform/ILinker.java @@ -0,0 +1,9 @@ +package com.dianping.cat.home.resource.transform; + +import com.dianping.cat.home.resource.entity.Resource; +import com.dianping.cat.home.resource.entity.ResourceConfig; + +public interface ILinker { + + public boolean onResource(ResourceConfig parent, Resource resource); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/resource/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/resource/transform/IMaker.java new file mode 100644 index 0000000000..f592dd5dc5 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/resource/transform/IMaker.java @@ -0,0 +1,11 @@ +package com.dianping.cat.home.resource.transform; + +import com.dianping.cat.home.resource.entity.Resource; +import com.dianping.cat.home.resource.entity.ResourceConfig; + +public interface IMaker { + + public Resource buildResource(T node); + + public ResourceConfig buildResourceConfig(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/resource/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/resource/transform/IParser.java new file mode 100644 index 0000000000..c5031c6fd5 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/resource/transform/IParser.java @@ -0,0 +1,10 @@ +package com.dianping.cat.home.resource.transform; + +import com.dianping.cat.home.resource.entity.Resource; +import com.dianping.cat.home.resource.entity.ResourceConfig; + +public interface IParser { + public ResourceConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForResource(IMaker maker, ILinker linker, Resource parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/router/BaseEntity.java new file mode 100644 index 0000000000..31f2de83d6 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/BaseEntity.java @@ -0,0 +1,56 @@ +package com.dianping.cat.home.router; + +import java.util.Formattable; +import java.util.FormattableFlags; +import java.util.Formatter; + +import com.dianping.cat.home.router.transform.DefaultXmlBuilder; +import com.dianping.cat.home.router.transform.DefaultJsonBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String JSON = "%#.3s"; + + public static final String JSON_COMPACT = "%#s"; + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean useJson = (flags & FormattableFlags.ALTERNATE) == FormattableFlags.ALTERNATE; + boolean compact = (precision <= 0); + + if (useJson) { + DefaultJsonBuilder builder = new DefaultJsonBuilder(compact); + + formatter.format("%s", builder.build(this)); + } else { + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/router/Constants.java new file mode 100644 index 0000000000..a458f2af2d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/Constants.java @@ -0,0 +1,62 @@ +package com.dianping.cat.home.router; + +public class Constants { + + public static final String ATTR_BACKUP_SERVER = "backup-server"; + + public static final String ATTR_BACKUP_SERVER_PORT = "backup-server-port"; + + public static final String ATTR_BLOCK = "block"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_ENABLE = "enable"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_PORT = "port"; + + public static final String ATTR_SERVER_GROUP = "server-group"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ATTR_TITLE = "title"; + + public static final String ATTR_WEIGHT = "weight"; + + public static final String ENTITY_DEFAULT_SERVER = "default-server"; + + public static final String ENTITY_DEFAULT_SERVERS = "default-servers"; + + public static final String ENTITY_DOMAIN = "domain"; + + public static final String ENTITY_DOMAINS = "domains"; + + public static final String ENTITY_GROUP = "group"; + + public static final String ENTITY_GROUPS = "groups"; + + public static final String ENTITY_GROUP_SERVER = "group-server"; + + public static final String ENTITY_GROUP_SERVERS = "group-servers"; + + public static final String ENTITY_NETWORK = "network"; + + public static final String ENTITY_NETWORKS = "networks"; + + public static final String ENTITY_NETWORK_POLICY = "network-policy"; + + public static final String ENTITY_NETWORK_POLICIES = "network-policies"; + + public static final String ENTITY_ROUTER_CONFIG = "router-config"; + + public static final String ENTITY_SERVER = "server"; + + public static final String ENTITY_SERVERS = "servers"; + + public static final String ENTITY_SERVER_GROUP = "server-group"; + + public static final String ENTITY_SERVER_GROUPS = "server-groups"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/router/IEntity.java new file mode 100644 index 0000000000..191c298d7d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.router; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/router/IVisitor.java new file mode 100644 index 0000000000..2f595eb4b4 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/IVisitor.java @@ -0,0 +1,32 @@ +package com.dianping.cat.home.router; + +import com.dianping.cat.home.router.entity.DefaultServer; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.Group; +import com.dianping.cat.home.router.entity.GroupServer; +import com.dianping.cat.home.router.entity.Network; +import com.dianping.cat.home.router.entity.NetworkPolicy; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.home.router.entity.ServerGroup; + +public interface IVisitor { + + public void visitDefaultServer(DefaultServer defaultServer); + + public void visitDomain(Domain domain); + + public void visitGroup(Group group); + + public void visitGroupServer(GroupServer groupServer); + + public void visitNetwork(Network network); + + public void visitNetworkPolicy(NetworkPolicy networkPolicy); + + public void visitRouterConfig(RouterConfig routerConfig); + + public void visitServer(Server server); + + public void visitServerGroup(ServerGroup serverGroup); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/entity/DefaultServer.java b/cat-home/src/main/java/com/dianping/cat/home/router/entity/DefaultServer.java new file mode 100644 index 0000000000..52582aeb3b --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/entity/DefaultServer.java @@ -0,0 +1,105 @@ +package com.dianping.cat.home.router.entity; + +import static com.dianping.cat.home.router.Constants.ATTR_ID; +import static com.dianping.cat.home.router.Constants.ENTITY_DEFAULT_SERVER; + +import com.dianping.cat.home.router.BaseEntity; +import com.dianping.cat.home.router.IVisitor; + +public class DefaultServer extends BaseEntity { + private String m_id; + + private double m_weight = 1d; + + private int m_port; + + private boolean m_enable; + + public DefaultServer() { + } + + public DefaultServer(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDefaultServer(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DefaultServer) { + DefaultServer _o = (DefaultServer) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public boolean getEnable() { + return m_enable; + } + + public String getId() { + return m_id; + } + + public int getPort() { + return m_port; + } + + public double getWeight() { + return m_weight; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public boolean isEnable() { + return m_enable; + } + + @Override + public void mergeAttributes(DefaultServer other) { + assertAttributeEquals(other, ENTITY_DEFAULT_SERVER, ATTR_ID, m_id, other.getId()); + + m_weight = other.getWeight(); + + m_port = other.getPort(); + + m_enable = other.getEnable(); + } + + public DefaultServer setEnable(boolean enable) { + m_enable = enable; + return this; + } + + public DefaultServer setId(String id) { + m_id = id; + return this; + } + + public DefaultServer setPort(int port) { + m_port = port; + return this; + } + + public DefaultServer setWeight(double weight) { + m_weight = weight; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/entity/Domain.java b/cat-home/src/main/java/com/dianping/cat/home/router/entity/Domain.java new file mode 100644 index 0000000000..465ce1a496 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/entity/Domain.java @@ -0,0 +1,102 @@ +package com.dianping.cat.home.router.entity; + +import static com.dianping.cat.home.router.Constants.ATTR_ID; +import static com.dianping.cat.home.router.Constants.ENTITY_DOMAIN; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.router.BaseEntity; +import com.dianping.cat.home.router.IVisitor; + +public class Domain extends BaseEntity { + private String m_id; + + private Map m_groups = new LinkedHashMap(); + + public Domain() { + } + + public Domain(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomain(this); + } + + public Domain addGroup(Group group) { + m_groups.put(group.getId(), group); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Domain) { + Domain _o = (Domain) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Group findGroup(String id) { + return m_groups.get(id); + } + + public Group findOrCreateGroup(String id) { + Group group = m_groups.get(id); + + if (group == null) { + synchronized (m_groups) { + group = m_groups.get(id); + + if (group == null) { + group = new Group(id); + m_groups.put(id, group); + } + } + } + + return group; + } + + public Map getGroups() { + return m_groups; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Domain other) { + assertAttributeEquals(other, ENTITY_DOMAIN, ATTR_ID, m_id, other.getId()); + + } + + public Group removeGroup(String id) { + return m_groups.remove(id); + } + + public Domain setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/entity/Group.java b/cat-home/src/main/java/com/dianping/cat/home/router/entity/Group.java new file mode 100644 index 0000000000..7e1bb2bf31 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/entity/Group.java @@ -0,0 +1,77 @@ +package com.dianping.cat.home.router.entity; + +import static com.dianping.cat.home.router.Constants.ATTR_ID; +import static com.dianping.cat.home.router.Constants.ENTITY_GROUP; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.home.router.BaseEntity; +import com.dianping.cat.home.router.IVisitor; + +public class Group extends BaseEntity { + private String m_id; + + private List m_servers = new ArrayList(); + + public Group() { + } + + public Group(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitGroup(this); + } + + public Group addServer(Server server) { + m_servers.add(server); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Group) { + Group _o = (Group) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + public List getServers() { + return m_servers; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Group other) { + assertAttributeEquals(other, ENTITY_GROUP, ATTR_ID, m_id, other.getId()); + + } + + public Group setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/entity/GroupServer.java b/cat-home/src/main/java/com/dianping/cat/home/router/entity/GroupServer.java new file mode 100644 index 0000000000..8518dd4f9a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/entity/GroupServer.java @@ -0,0 +1,63 @@ +package com.dianping.cat.home.router.entity; + +import static com.dianping.cat.home.router.Constants.ATTR_ID; +import static com.dianping.cat.home.router.Constants.ENTITY_GROUP_SERVER; + +import com.dianping.cat.home.router.BaseEntity; +import com.dianping.cat.home.router.IVisitor; + +public class GroupServer extends BaseEntity { + private String m_id; + + public GroupServer() { + } + + public GroupServer(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitGroupServer(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof GroupServer) { + GroupServer _o = (GroupServer) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(GroupServer other) { + assertAttributeEquals(other, ENTITY_GROUP_SERVER, ATTR_ID, m_id, other.getId()); + + } + + public GroupServer setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/entity/Network.java b/cat-home/src/main/java/com/dianping/cat/home/router/entity/Network.java new file mode 100644 index 0000000000..0ea2efbd69 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/entity/Network.java @@ -0,0 +1,63 @@ +package com.dianping.cat.home.router.entity; + +import static com.dianping.cat.home.router.Constants.ATTR_ID; +import static com.dianping.cat.home.router.Constants.ENTITY_NETWORK; + +import com.dianping.cat.home.router.BaseEntity; +import com.dianping.cat.home.router.IVisitor; + +public class Network extends BaseEntity { + private String m_id; + + public Network() { + } + + public Network(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitNetwork(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Network) { + Network _o = (Network) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Network other) { + assertAttributeEquals(other, ENTITY_NETWORK, ATTR_ID, m_id, other.getId()); + + } + + public Network setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/entity/NetworkPolicy.java b/cat-home/src/main/java/com/dianping/cat/home/router/entity/NetworkPolicy.java new file mode 100644 index 0000000000..30975d96f9 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/entity/NetworkPolicy.java @@ -0,0 +1,148 @@ +package com.dianping.cat.home.router.entity; + +import static com.dianping.cat.home.router.Constants.ATTR_ID; +import static com.dianping.cat.home.router.Constants.ENTITY_NETWORK_POLICY; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.router.BaseEntity; +import com.dianping.cat.home.router.IVisitor; + +public class NetworkPolicy extends BaseEntity { + private String m_id; + + private String m_title; + + private boolean m_block = false; + + private String m_serverGroup; + + private Map m_networks = new LinkedHashMap(); + + public NetworkPolicy() { + } + + public NetworkPolicy(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitNetworkPolicy(this); + } + + public NetworkPolicy addNetwork(Network network) { + m_networks.put(network.getId(), network); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof NetworkPolicy) { + NetworkPolicy _o = (NetworkPolicy) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Network findNetwork(String id) { + return m_networks.get(id); + } + + public Network findOrCreateNetwork(String id) { + Network network = m_networks.get(id); + + if (network == null) { + synchronized (m_networks) { + network = m_networks.get(id); + + if (network == null) { + network = new Network(id); + m_networks.put(id, network); + } + } + } + + return network; + } + + public boolean getBlock() { + return m_block; + } + + public String getId() { + return m_id; + } + + public Map getNetworks() { + return m_networks; + } + + public String getServerGroup() { + return m_serverGroup; + } + + public String getTitle() { + return m_title; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public boolean isBlock() { + return m_block; + } + + @Override + public void mergeAttributes(NetworkPolicy other) { + assertAttributeEquals(other, ENTITY_NETWORK_POLICY, ATTR_ID, m_id, other.getId()); + + if (other.getTitle() != null) { + m_title = other.getTitle(); + } + + m_block = other.getBlock(); + + if (other.getServerGroup() != null) { + m_serverGroup = other.getServerGroup(); + } + } + + public Network removeNetwork(String id) { + return m_networks.remove(id); + } + + public NetworkPolicy setBlock(boolean block) { + m_block = block; + return this; + } + + public NetworkPolicy setId(String id) { + m_id = id; + return this; + } + + public NetworkPolicy setServerGroup(String serverGroup) { + m_serverGroup = serverGroup; + return this; + } + + public NetworkPolicy setTitle(String title) { + m_title = title; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/entity/RouterConfig.java b/cat-home/src/main/java/com/dianping/cat/home/router/entity/RouterConfig.java new file mode 100644 index 0000000000..ee4517d469 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/entity/RouterConfig.java @@ -0,0 +1,250 @@ +package com.dianping.cat.home.router.entity; + +import static com.dianping.cat.home.router.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.router.Constants.ENTITY_ROUTER_CONFIG; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.router.BaseEntity; +import com.dianping.cat.home.router.IVisitor; + +public class RouterConfig extends BaseEntity { + private String m_backupServer; + + private int m_backupServerPort; + + private Map m_defaultServers = new LinkedHashMap(); + + private Map m_networkPolicies = new LinkedHashMap(); + + private Map m_serverGroups = new LinkedHashMap(); + + private Map m_domains = new LinkedHashMap(); + + private java.util.Date m_startTime; + + private String m_domain; + + private java.util.Date m_endTime; + + public RouterConfig() { + } + + public RouterConfig(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitRouterConfig(this); + } + + public RouterConfig addDefaultServer(DefaultServer defaultServer) { + m_defaultServers.put(defaultServer.getId(), defaultServer); + return this; + } + + public RouterConfig addDomain(Domain domain) { + m_domains.put(domain.getId(), domain); + return this; + } + + public RouterConfig addNetworkPolicy(NetworkPolicy networkPolicy) { + m_networkPolicies.put(networkPolicy.getId(), networkPolicy); + return this; + } + + public RouterConfig addServerGroup(ServerGroup serverGroup) { + m_serverGroups.put(serverGroup.getId(), serverGroup); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RouterConfig) { + RouterConfig _o = (RouterConfig) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public DefaultServer findDefaultServer(String id) { + return m_defaultServers.get(id); + } + + public Domain findDomain(String id) { + return m_domains.get(id); + } + + public NetworkPolicy findNetworkPolicy(String id) { + return m_networkPolicies.get(id); + } + + public ServerGroup findServerGroup(String id) { + return m_serverGroups.get(id); + } + + public Domain findOrCreateDomain(String id) { + Domain domain = m_domains.get(id); + + if (domain == null) { + synchronized (m_domains) { + domain = m_domains.get(id); + + if (domain == null) { + domain = new Domain(id); + m_domains.put(id, domain); + } + } + } + + return domain; + } + + public NetworkPolicy findOrCreateNetworkPolicy(String id) { + NetworkPolicy networkPolicy = m_networkPolicies.get(id); + + if (networkPolicy == null) { + synchronized (m_networkPolicies) { + networkPolicy = m_networkPolicies.get(id); + + if (networkPolicy == null) { + networkPolicy = new NetworkPolicy(id); + m_networkPolicies.put(id, networkPolicy); + } + } + } + + return networkPolicy; + } + + public ServerGroup findOrCreateServerGroup(String id) { + ServerGroup serverGroup = m_serverGroups.get(id); + + if (serverGroup == null) { + synchronized (m_serverGroups) { + serverGroup = m_serverGroups.get(id); + + if (serverGroup == null) { + serverGroup = new ServerGroup(id); + m_serverGroups.put(id, serverGroup); + } + } + } + + return serverGroup; + } + + public String getBackupServer() { + return m_backupServer; + } + + public int getBackupServerPort() { + return m_backupServerPort; + } + + public Map getDefaultServers() { + return m_defaultServers; + } + + public String getDomain() { + return m_domain; + } + + public Map getDomains() { + return m_domains; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public Map getNetworkPolicies() { + return m_networkPolicies; + } + + public Map getServerGroups() { + return m_serverGroups; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(RouterConfig other) { + assertAttributeEquals(other, ENTITY_ROUTER_CONFIG, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getBackupServer() != null) { + m_backupServer = other.getBackupServer(); + } + + m_backupServerPort = other.getBackupServerPort(); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public DefaultServer removeDefaultServer(String id) { + return m_defaultServers.remove(id); + } + + public Domain removeDomain(String id) { + return m_domains.remove(id); + } + + public NetworkPolicy removeNetworkPolicy(String id) { + return m_networkPolicies.remove(id); + } + + public ServerGroup removeServerGroup(String id) { + return m_serverGroups.remove(id); + } + + public RouterConfig setBackupServer(String backupServer) { + m_backupServer = backupServer; + return this; + } + + public RouterConfig setBackupServerPort(int backupServerPort) { + m_backupServerPort = backupServerPort; + return this; + } + + public RouterConfig setDomain(String domain) { + m_domain = domain; + return this; + } + + public RouterConfig setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public RouterConfig setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/entity/Server.java b/cat-home/src/main/java/com/dianping/cat/home/router/entity/Server.java new file mode 100644 index 0000000000..9b958c3753 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/entity/Server.java @@ -0,0 +1,94 @@ +package com.dianping.cat.home.router.entity; + +import com.dianping.cat.home.router.BaseEntity; +import com.dianping.cat.home.router.IVisitor; + +public class Server extends BaseEntity { + private String m_id; + + private int m_port; + + private double m_weight = 1d; + + public Server() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitServer(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Server) { + Server _o = (Server) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + if (getPort() != _o.getPort()) { + return false; + } + + if (getWeight() != _o.getWeight()) { + return false; + } + + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + public int getPort() { + return m_port; + } + + public double getWeight() { + return m_weight; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + hash = hash * 31 + m_port; + hash = hash * 31 + (int) (Double.doubleToLongBits(m_weight) ^ (Double.doubleToLongBits(m_weight) >>> 32)); + + return hash; + } + + @Override + public void mergeAttributes(Server other) { + if (other.getId() != null) { + m_id = other.getId(); + } + + m_port = other.getPort(); + + m_weight = other.getWeight(); + } + + public Server setId(String id) { + m_id = id; + return this; + } + + public Server setPort(int port) { + m_port = port; + return this; + } + + public Server setWeight(double weight) { + m_weight = weight; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/entity/ServerGroup.java b/cat-home/src/main/java/com/dianping/cat/home/router/entity/ServerGroup.java new file mode 100644 index 0000000000..5b72b37690 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/entity/ServerGroup.java @@ -0,0 +1,116 @@ +package com.dianping.cat.home.router.entity; + +import static com.dianping.cat.home.router.Constants.ATTR_ID; +import static com.dianping.cat.home.router.Constants.ENTITY_SERVER_GROUP; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.router.BaseEntity; +import com.dianping.cat.home.router.IVisitor; + +public class ServerGroup extends BaseEntity { + private String m_id; + + private String m_title; + + private Map m_groupServers = new LinkedHashMap(); + + public ServerGroup() { + } + + public ServerGroup(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitServerGroup(this); + } + + public ServerGroup addGroupServer(GroupServer groupServer) { + m_groupServers.put(groupServer.getId(), groupServer); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ServerGroup) { + ServerGroup _o = (ServerGroup) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public GroupServer findGroupServer(String id) { + return m_groupServers.get(id); + } + + public GroupServer findOrCreateGroupServer(String id) { + GroupServer groupServer = m_groupServers.get(id); + + if (groupServer == null) { + synchronized (m_groupServers) { + groupServer = m_groupServers.get(id); + + if (groupServer == null) { + groupServer = new GroupServer(id); + m_groupServers.put(id, groupServer); + } + } + } + + return groupServer; + } + + public Map getGroupServers() { + return m_groupServers; + } + + public String getId() { + return m_id; + } + + public String getTitle() { + return m_title; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ServerGroup other) { + assertAttributeEquals(other, ENTITY_SERVER_GROUP, ATTR_ID, m_id, other.getId()); + + if (other.getTitle() != null) { + m_title = other.getTitle(); + } + } + + public GroupServer removeGroupServer(String id) { + return m_groupServers.remove(id); + } + + public ServerGroup setId(String id) { + m_id = id; + return this; + } + + public ServerGroup setTitle(String title) { + m_title = title; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/transform/BaseVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/router/transform/BaseVisitor.java new file mode 100644 index 0000000000..b1ba9f1ccd --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/transform/BaseVisitor.java @@ -0,0 +1,77 @@ +package com.dianping.cat.home.router.transform; + +import com.dianping.cat.home.router.IVisitor; +import com.dianping.cat.home.router.entity.DefaultServer; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.Group; +import com.dianping.cat.home.router.entity.GroupServer; +import com.dianping.cat.home.router.entity.Network; +import com.dianping.cat.home.router.entity.NetworkPolicy; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.home.router.entity.ServerGroup; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitDefaultServer(DefaultServer defaultServer) { + } + + @Override + public void visitDomain(Domain domain) { + for (Group group : domain.getGroups().values()) { + visitGroup(group); + } + } + + @Override + public void visitGroup(Group group) { + for (Server server : group.getServers()) { + visitServer(server); + } + } + + @Override + public void visitGroupServer(GroupServer groupServer) { + } + + @Override + public void visitNetwork(Network network) { + } + + @Override + public void visitNetworkPolicy(NetworkPolicy networkPolicy) { + for (Network network : networkPolicy.getNetworks().values()) { + visitNetwork(network); + } + } + + @Override + public void visitRouterConfig(RouterConfig routerConfig) { + for (DefaultServer defaultServer : routerConfig.getDefaultServers().values()) { + visitDefaultServer(defaultServer); + } + + for (NetworkPolicy networkPolicy : routerConfig.getNetworkPolicies().values()) { + visitNetworkPolicy(networkPolicy); + } + + for (ServerGroup serverGroup : routerConfig.getServerGroups().values()) { + visitServerGroup(serverGroup); + } + + for (Domain domain : routerConfig.getDomains().values()) { + visitDomain(domain); + } + } + + @Override + public void visitServer(Server server) { + } + + @Override + public void visitServerGroup(ServerGroup serverGroup) { + for (GroupServer groupServer : serverGroup.getGroupServers().values()) { + visitGroupServer(groupServer); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultJsonBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultJsonBuilder.java new file mode 100644 index 0000000000..8ac7833d36 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultJsonBuilder.java @@ -0,0 +1,421 @@ +package com.dianping.cat.home.router.transform; + +import static com.dianping.cat.home.router.Constants.ATTR_BACKUP_SERVER; +import static com.dianping.cat.home.router.Constants.ATTR_BACKUP_SERVER_PORT; +import static com.dianping.cat.home.router.Constants.ATTR_BLOCK; +import static com.dianping.cat.home.router.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.router.Constants.ATTR_ENABLE; +import static com.dianping.cat.home.router.Constants.ATTR_ENDTIME; +import static com.dianping.cat.home.router.Constants.ATTR_ID; +import static com.dianping.cat.home.router.Constants.ATTR_PORT; +import static com.dianping.cat.home.router.Constants.ATTR_SERVER_GROUP; +import static com.dianping.cat.home.router.Constants.ATTR_STARTTIME; +import static com.dianping.cat.home.router.Constants.ATTR_TITLE; +import static com.dianping.cat.home.router.Constants.ATTR_WEIGHT; +import static com.dianping.cat.home.router.Constants.ENTITY_DEFAULT_SERVERS; +import static com.dianping.cat.home.router.Constants.ENTITY_DOMAINS; +import static com.dianping.cat.home.router.Constants.ENTITY_GROUPS; +import static com.dianping.cat.home.router.Constants.ENTITY_GROUP_SERVERS; +import static com.dianping.cat.home.router.Constants.ENTITY_NETWORKS; +import static com.dianping.cat.home.router.Constants.ENTITY_NETWORK_POLICIES; +import static com.dianping.cat.home.router.Constants.ENTITY_SERVERS; +import static com.dianping.cat.home.router.Constants.ENTITY_SERVER_GROUPS; + +import java.lang.reflect.Array; +import java.util.Collection; +import java.util.Map; + +import com.dianping.cat.home.router.IEntity; +import com.dianping.cat.home.router.IVisitor; +import com.dianping.cat.home.router.entity.DefaultServer; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.Group; +import com.dianping.cat.home.router.entity.GroupServer; +import com.dianping.cat.home.router.entity.Network; +import com.dianping.cat.home.router.entity.NetworkPolicy; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.home.router.entity.ServerGroup; + +public class DefaultJsonBuilder implements IVisitor { + + private IVisitor m_visitor; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultJsonBuilder() { + this(false); + } + + public DefaultJsonBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultJsonBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_visitor = this; + } + + protected void arrayBegin(String name) { + indent(); + m_sb.append('"').append(name).append(m_compact ? "\":[" : "\": [\r\n"); + m_level++; + } + + protected void arrayEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append("],").append(m_compact ? "" : "\r\n"); + } + + protected void attributes(Map dynamicAttributes, Object... nameValues) { + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + if (attrValue instanceof Collection) { + @SuppressWarnings("unchecked") + Collection items = (Collection) attrValue; + + if (!items.isEmpty()) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (Object item : items) { + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else if (attrValue.getClass().isArray()) { + int length = Array.getLength(attrValue); + + if (length > 0) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (int j = 0; j < length; j++) { + Object item = Array.get(attrValue, j); + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else { + if (m_compact) { + m_sb.append('"').append(attrName).append("\":"); + toString(m_sb, attrValue); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(attrName).append("\": "); + toString(m_sb, attrValue); + m_sb.append(",\r\n"); + } + } + } + } + + if (dynamicAttributes != null) { + for (Map.Entry e : dynamicAttributes.entrySet()) { + if (m_compact) { + m_sb.append('"').append(e.getKey()).append("\":"); + toString(m_sb, e.getValue()); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(e.getKey()).append("\": "); + toString(m_sb, e.getValue()); + m_sb.append(",\r\n"); + } + } + } + } + + public String build(IEntity entity) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + trimComma(); + + return m_sb.toString(); + } + + public String buildArray(Collection> entities) { + m_sb.append('['); + + if (entities != null) { + for (IEntity entity : entities) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + } + + trimComma(); + } + + m_sb.append(']'); + + return m_sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void objectBegin(String name) { + indent(); + + if (name == null) { + m_sb.append("{").append(m_compact ? "" : "\r\n"); + } else { + m_sb.append('"').append(name).append(m_compact ? "\":{" : "\": {\r\n"); + } + + m_level++; + } + + protected void objectEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append(m_compact ? "}," : "},\r\n"); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + protected void toString(StringBuilder sb, Object value) { + if (value == null) { + sb.append("null"); + } else if (value instanceof Boolean || value instanceof Number) { + sb.append(value); + } else { + String val = value.toString(); + int len = val.length(); + + sb.append('"'); + + for (int i = 0; i < len; i++) { + char ch = val.charAt(i); + + switch (ch) { + case '\\': + case '/': + case '"': + sb.append('\\').append(ch); + break; + case '\t': + sb.append("\\t"); + break; + case '\r': + sb.append("\\r"); + break; + case '\n': + sb.append("\\n"); + break; + default: + sb.append(ch); + break; + } + } + + sb.append('"'); + } + } + + protected void trimComma() { + int len = m_sb.length(); + + if (m_compact) { + if (len > 1 && m_sb.charAt(len - 1) == ',') { + m_sb.replace(len - 1, len, ""); + } + } else { + if (len > 3 && m_sb.charAt(len - 3) == ',') { + m_sb.replace(len - 3, len - 2, ""); + } + } + } + + @Override + public void visitDefaultServer(DefaultServer defaultServer) { + attributes(null, ATTR_ID, defaultServer.getId(), ATTR_WEIGHT, defaultServer.getWeight(), ATTR_PORT, defaultServer.getPort(), ATTR_ENABLE, defaultServer.isEnable()); + } + + @Override + public void visitDomain(Domain domain) { + attributes(null, ATTR_ID, domain.getId()); + + if (!domain.getGroups().isEmpty()) { + objectBegin(ENTITY_GROUPS); + + for (Map.Entry e : domain.getGroups().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_GROUPS); + } + } + + @Override + public void visitGroup(Group group) { + attributes(null, ATTR_ID, group.getId()); + + if (!group.getServers().isEmpty()) { + arrayBegin(ENTITY_SERVERS); + + for (Server server : group.getServers()) { + objectBegin(null); + server.accept(m_visitor); + objectEnd(null); + } + + arrayEnd(ENTITY_SERVERS); + } + } + + @Override + public void visitGroupServer(GroupServer groupServer) { + attributes(null, ATTR_ID, groupServer.getId()); + } + + @Override + public void visitNetwork(Network network) { + attributes(null, ATTR_ID, network.getId()); + } + + @Override + public void visitNetworkPolicy(NetworkPolicy networkPolicy) { + attributes(null, ATTR_ID, networkPolicy.getId(), ATTR_TITLE, networkPolicy.getTitle(), ATTR_BLOCK, networkPolicy.isBlock(), ATTR_SERVER_GROUP, networkPolicy.getServerGroup()); + + if (!networkPolicy.getNetworks().isEmpty()) { + objectBegin(ENTITY_NETWORKS); + + for (Map.Entry e : networkPolicy.getNetworks().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_NETWORKS); + } + } + + @Override + public void visitRouterConfig(RouterConfig routerConfig) { + attributes(null, ATTR_BACKUP_SERVER, routerConfig.getBackupServer(), ATTR_BACKUP_SERVER_PORT, routerConfig.getBackupServerPort(), ATTR_STARTTIME, toString(routerConfig.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_DOMAIN, routerConfig.getDomain(), ATTR_ENDTIME, toString(routerConfig.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!routerConfig.getDefaultServers().isEmpty()) { + objectBegin(ENTITY_DEFAULT_SERVERS); + + for (Map.Entry e : routerConfig.getDefaultServers().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_DEFAULT_SERVERS); + } + + if (!routerConfig.getNetworkPolicies().isEmpty()) { + objectBegin(ENTITY_NETWORK_POLICIES); + + for (Map.Entry e : routerConfig.getNetworkPolicies().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_NETWORK_POLICIES); + } + + if (!routerConfig.getServerGroups().isEmpty()) { + objectBegin(ENTITY_SERVER_GROUPS); + + for (Map.Entry e : routerConfig.getServerGroups().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_SERVER_GROUPS); + } + + if (!routerConfig.getDomains().isEmpty()) { + objectBegin(ENTITY_DOMAINS); + + for (Map.Entry e : routerConfig.getDomains().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_DOMAINS); + } + } + + @Override + public void visitServer(Server server) { + attributes(null, ATTR_ID, server.getId(), ATTR_PORT, server.getPort(), ATTR_WEIGHT, server.getWeight()); + } + + @Override + public void visitServerGroup(ServerGroup serverGroup) { + attributes(null, ATTR_ID, serverGroup.getId(), ATTR_TITLE, serverGroup.getTitle()); + + if (!serverGroup.getGroupServers().isEmpty()) { + objectBegin(ENTITY_GROUP_SERVERS); + + for (Map.Entry e : serverGroup.getGroupServers().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_GROUP_SERVERS); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultJsonParser.java b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultJsonParser.java new file mode 100644 index 0000000000..ff796c045d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultJsonParser.java @@ -0,0 +1,563 @@ +package com.dianping.cat.home.router.transform; + +import static com.dianping.cat.home.router.Constants.ATTR_BACKUP_SERVER; +import static com.dianping.cat.home.router.Constants.ATTR_BACKUP_SERVER_PORT; +import static com.dianping.cat.home.router.Constants.ATTR_BLOCK; +import static com.dianping.cat.home.router.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.router.Constants.ATTR_ENABLE; +import static com.dianping.cat.home.router.Constants.ATTR_ENDTIME; +import static com.dianping.cat.home.router.Constants.ATTR_ID; +import static com.dianping.cat.home.router.Constants.ATTR_PORT; +import static com.dianping.cat.home.router.Constants.ATTR_SERVER_GROUP; +import static com.dianping.cat.home.router.Constants.ATTR_STARTTIME; +import static com.dianping.cat.home.router.Constants.ATTR_TITLE; +import static com.dianping.cat.home.router.Constants.ATTR_WEIGHT; +import static com.dianping.cat.home.router.Constants.ENTITY_DEFAULT_SERVERS; +import static com.dianping.cat.home.router.Constants.ENTITY_DOMAINS; +import static com.dianping.cat.home.router.Constants.ENTITY_GROUPS; +import static com.dianping.cat.home.router.Constants.ENTITY_GROUP_SERVERS; +import static com.dianping.cat.home.router.Constants.ENTITY_NETWORKS; +import static com.dianping.cat.home.router.Constants.ENTITY_NETWORK_POLICIES; +import static com.dianping.cat.home.router.Constants.ENTITY_SERVERS; +import static com.dianping.cat.home.router.Constants.ENTITY_SERVER_GROUPS; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.dianping.cat.home.router.IEntity; +import com.dianping.cat.home.router.entity.DefaultServer; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.Group; +import com.dianping.cat.home.router.entity.GroupServer; +import com.dianping.cat.home.router.entity.Network; +import com.dianping.cat.home.router.entity.NetworkPolicy; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.home.router.entity.ServerGroup; + +public class DefaultJsonParser { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private List m_entities = new ArrayList(); + + private Class m_entityClass; + + private DefaultJsonParser(Class entityClass) { + m_entityClass = entityClass; + } + + public static > T parse(Class entityClass, InputStream in) throws IOException { + return parse(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > T parse(Class entityClass, Reader reader) throws IOException { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.onArrayBegin(); + parser.parse(new JsonReader(reader)); + parser.onArrayEnd(); + + if (parser.m_entities.isEmpty()) { + return null; + } else { + return (T) parser.m_entities.get(0); + } + } + + public static > T parse(Class entityClass, String json) throws IOException { + return parse(entityClass, new StringReader(json)); + } + + public static > List parseArray(Class entityClass, InputStream in) throws Exception { + return parseArray(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > List parseArray(Class entityClass, Reader reader) throws Exception { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.parse(new JsonReader(reader)); + return (List) (List) parser.m_entities; + } + + public static > List parseArray(Class entityClass, String json) throws Exception { + return parseArray(entityClass, new StringReader(json)); + } + + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + private Object createRootEntity() { + try { + Object entity = m_entityClass.newInstance(); + + return entity; + } catch (Exception e) { + throw new RuntimeException(String.format("Unable to create entity(%s) instance!", m_entityClass.getName()), e); + } + } + + private boolean isTopLevel() { + return m_objs.size() == 1; + } + + protected void onArrayBegin() { + if (m_objs.isEmpty()) { + m_objs.push(m_entities); + m_tags.push(""); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof Group) { + if (ENTITY_SERVERS.equals(tag)) { + m_objs.push(parent); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } } + + protected void onArrayEnd() { + m_objs.pop(); + m_tags.pop(); + + } + protected void onName(String name) { + m_tags.push(name); + } + + protected void onObjectBegin() { + if (isTopLevel()) { + m_objs.push(createRootEntity()); + m_tags.push(""); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof RouterConfig) { + if (ENTITY_DEFAULT_SERVERS.equals(tag) || ENTITY_NETWORK_POLICIES.equals(tag) || ENTITY_SERVER_GROUPS.equals(tag) || ENTITY_DOMAINS.equals(tag)) { + m_objs.push(parent); + } else { + String parentTag = m_tags.size() >= 2 ? m_tags.get(m_tags.size() - 2) : null; + + if (ENTITY_DEFAULT_SERVERS.equals(parentTag)) { + DefaultServer defaultServers = new DefaultServer(); + + m_linker.onDefaultServer((RouterConfig) parent, defaultServers); + m_objs.push(defaultServers); + } else if (ENTITY_NETWORK_POLICIES.equals(parentTag)) { + NetworkPolicy networkPolicies = new NetworkPolicy(); + + m_linker.onNetworkPolicy((RouterConfig) parent, networkPolicies); + m_objs.push(networkPolicies); + } else if (ENTITY_SERVER_GROUPS.equals(parentTag)) { + ServerGroup serverGroups = new ServerGroup(); + + m_linker.onServerGroup((RouterConfig) parent, serverGroups); + m_objs.push(serverGroups); + } else if (ENTITY_DOMAINS.equals(parentTag)) { + Domain domains = new Domain(); + + m_linker.onDomain((RouterConfig) parent, domains); + m_objs.push(domains); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } else if (parent instanceof NetworkPolicy) { + if (ENTITY_NETWORKS.equals(tag)) { + m_objs.push(parent); + } else { + String parentTag = m_tags.size() >= 2 ? m_tags.get(m_tags.size() - 2) : null; + + if (ENTITY_NETWORKS.equals(parentTag)) { + Network networks = new Network(); + + m_linker.onNetwork((NetworkPolicy) parent, networks); + m_objs.push(networks); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } else if (parent instanceof ServerGroup) { + if (ENTITY_GROUP_SERVERS.equals(tag)) { + m_objs.push(parent); + } else { + String parentTag = m_tags.size() >= 2 ? m_tags.get(m_tags.size() - 2) : null; + + if (ENTITY_GROUP_SERVERS.equals(parentTag)) { + GroupServer groupServers = new GroupServer(); + + m_linker.onGroupServer((ServerGroup) parent, groupServers); + m_objs.push(groupServers); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } else if (parent instanceof Domain) { + if (ENTITY_GROUPS.equals(tag)) { + m_objs.push(parent); + } else { + String parentTag = m_tags.size() >= 2 ? m_tags.get(m_tags.size() - 2) : null; + + if (ENTITY_GROUPS.equals(parentTag)) { + Group groups = new Group(); + + m_linker.onGroup((Domain) parent, groups); + m_objs.push(groups); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } else if (parent instanceof Group) { + if (ENTITY_SERVERS.equals(tag)) { + Server servers = new Server(); + + m_linker.onServer((Group) parent, servers); + m_objs.push(servers); + m_tags.push(""); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); /// + } + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } + + protected void onObjectEnd() { + m_tags.pop(); + + Object entity = m_objs.pop(); + + if (isTopLevel()) { + m_entities.add(entity); + } + } + + protected void onValue(String value) { + Object parent = m_objs.peek(); + String tag = m_tags.pop(); + + if (parent instanceof RouterConfig) { + parseForRouterConfig((RouterConfig) parent, tag, value); + } else if (parent instanceof DefaultServer) { + parseForDefaultServer((DefaultServer) parent, tag, value); + } else if (parent instanceof NetworkPolicy) { + parseForNetworkPolicy((NetworkPolicy) parent, tag, value); + } else if (parent instanceof Network) { + parseForNetwork((Network) parent, tag, value); + } else if (parent instanceof ServerGroup) { + parseForServerGroup((ServerGroup) parent, tag, value); + } else if (parent instanceof GroupServer) { + parseForGroupServer((GroupServer) parent, tag, value); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, value); + } else if (parent instanceof Group) { + parseForGroup((Group) parent, tag, value); + } else if (parent instanceof Server) { + parseForServer((Server) parent, tag, value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) under %s!", tag, parent)); + } + } + + private void parse(JsonReader reader) throws IOException { + try { + reader.parse(this); + } catch (EOFException e) { + if (m_objs.size() > 1) { + throw new EOFException(String.format("Unexpected end while parsing json! tags: %s.", m_tags)); + } + } + + m_linker.finish(); + } + + public void parseForDefaultServer(DefaultServer defaultServer, String tag, String value) { + if (ATTR_ID.equals(tag)) { + defaultServer.setId(value); + } else if (ATTR_WEIGHT.equals(tag)) { + defaultServer.setWeight(convert(Double.class, value, 0.0)); + } else if (ATTR_PORT.equals(tag)) { + defaultServer.setPort(convert(Integer.class, value, 0)); + } else if (ATTR_ENABLE.equals(tag)) { + defaultServer.setEnable(convert(Boolean.class, value, false)); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, defaultServer, m_tags)); + } + } + + public void parseForDomain(Domain domain, String tag, String value) { + if (ENTITY_GROUPS.equals(tag)) { + // do nothing here + } else if (ATTR_ID.equals(tag)) { + domain.setId(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, domain, m_tags)); + } + } + + public void parseForGroup(Group group, String tag, String value) { + if (ENTITY_SERVERS.equals(tag)) { + // do nothing here + } else if (ATTR_ID.equals(tag)) { + group.setId(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, group, m_tags)); + } + } + + public void parseForGroupServer(GroupServer groupServer, String tag, String value) { + if (ATTR_ID.equals(tag)) { + groupServer.setId(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, groupServer, m_tags)); + } + } + + public void parseForNetwork(Network network, String tag, String value) { + if (ATTR_ID.equals(tag)) { + network.setId(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, network, m_tags)); + } + } + + public void parseForNetworkPolicy(NetworkPolicy networkPolicy, String tag, String value) { + if (ENTITY_NETWORKS.equals(tag)) { + // do nothing here + } else if (ATTR_ID.equals(tag)) { + networkPolicy.setId(value); + } else if (ATTR_TITLE.equals(tag)) { + networkPolicy.setTitle(value); + } else if (ATTR_BLOCK.equals(tag)) { + networkPolicy.setBlock(convert(Boolean.class, value, false)); + } else if (ATTR_SERVER_GROUP.equals(tag)) { + networkPolicy.setServerGroup(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, networkPolicy, m_tags)); + } + } + + public void parseForRouterConfig(RouterConfig routerConfig, String tag, String value) { + if (ENTITY_DEFAULT_SERVERS.equals(tag) || ENTITY_NETWORK_POLICIES.equals(tag) || ENTITY_SERVER_GROUPS.equals(tag) || ENTITY_DOMAINS.equals(tag)) { + // do nothing here + } else if (ATTR_BACKUP_SERVER.equals(tag)) { + routerConfig.setBackupServer(value); + } else if (ATTR_BACKUP_SERVER_PORT.equals(tag)) { + routerConfig.setBackupServerPort(convert(Integer.class, value, 0)); + } else if (ATTR_STARTTIME.equals(tag)) { + routerConfig.setStartTime(toDate(value, "yyyy-MM-dd HH:mm:ss")); + } else if (ATTR_DOMAIN.equals(tag)) { + routerConfig.setDomain(value); + } else if (ATTR_ENDTIME.equals(tag)) { + routerConfig.setEndTime(toDate(value, "yyyy-MM-dd HH:mm:ss")); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, routerConfig, m_tags)); + } + } + + public void parseForServer(Server server, String tag, String value) { + if (ATTR_ID.equals(tag)) { + server.setId(value); + } else if (ATTR_PORT.equals(tag)) { + server.setPort(convert(Integer.class, value, 0)); + } else if (ATTR_WEIGHT.equals(tag)) { + server.setWeight(convert(Double.class, value, 0.0)); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, server, m_tags)); + } + } + + public void parseForServerGroup(ServerGroup serverGroup, String tag, String value) { + if (ENTITY_GROUP_SERVERS.equals(tag)) { + // do nothing here + } else if (ATTR_ID.equals(tag)) { + serverGroup.setId(value); + } else if (ATTR_TITLE.equals(tag)) { + serverGroup.setTitle(value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, serverGroup, m_tags)); + } + } + + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + static class JsonReader { + private Reader m_reader; + + private char[] m_buffer = new char[2048]; + + private int m_size; + + private int m_index; + + public JsonReader(Reader reader) { + m_reader = reader; + } + + private char next() throws IOException { + if (m_index >= m_size) { + m_size = m_reader.read(m_buffer); + m_index = 0; + + if (m_size == -1) { + throw new EOFException(); + } + } + + return m_buffer[m_index++]; + } + + public void parse(DefaultJsonParser parser) throws IOException { + StringBuilder sb = new StringBuilder(); + boolean flag = false; + + while (true) { + char ch = next(); + + switch (ch) { + case ' ': + case '\t': + case '\r': + case '\n': + break; + case '{': + parser.onObjectBegin(); + flag = false; + break; + case '}': + if (flag) { // have value + parser.onValue(sb.toString()); + sb.setLength(0); + } + + parser.onObjectEnd(); + flag = false; + break; + case '\'': + case '"': + while (true) { + char ch2 = next(); + + if (ch2 != ch) { + if (ch2 == '\\') { + char ch3 = next(); + + switch (ch3) { + case 't': + sb.append('\t'); + break; + case 'r': + sb.append('\r'); + break; + case 'n': + sb.append('\n'); + break; + default: + sb.append(ch3); + break; + } + } else { + sb.append(ch2); + } + } else { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + flag = false; + } + + sb.setLength(0); + break; + } + } + + break; + case ':': + if (sb.length() != 0) { + parser.onName(sb.toString()); + sb.setLength(0); + } + + flag = true; + break; + case ',': + if (sb.length() != 0) { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + } + + sb.setLength(0); + } + + flag = false; + break; + case '[': + parser.onArrayBegin(); + flag = false; + break; + case ']': + parser.onArrayEnd(); + flag = false; + break; + default: + sb.append(ch); + break; + } + } + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultLinker.java new file mode 100644 index 0000000000..e23f76b180 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultLinker.java @@ -0,0 +1,147 @@ +package com.dianping.cat.home.router.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.router.entity.DefaultServer; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.Group; +import com.dianping.cat.home.router.entity.GroupServer; +import com.dianping.cat.home.router.entity.Network; +import com.dianping.cat.home.router.entity.NetworkPolicy; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.home.router.entity.ServerGroup; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDefaultServer(final RouterConfig parent, final DefaultServer defaultServer) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDefaultServer(defaultServer); + } + }); + } else { + parent.addDefaultServer(defaultServer); + } + + return true; + } + + @Override + public boolean onDomain(final RouterConfig parent, final Domain domain) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDomain(domain); + } + }); + } else { + parent.addDomain(domain); + } + + return true; + } + + @Override + public boolean onGroup(final Domain parent, final Group group) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addGroup(group); + } + }); + } else { + parent.addGroup(group); + } + + return true; + } + + @Override + public boolean onGroupServer(final ServerGroup parent, final GroupServer groupServer) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addGroupServer(groupServer); + } + }); + } else { + parent.addGroupServer(groupServer); + } + + return true; + } + + @Override + public boolean onNetwork(final NetworkPolicy parent, final Network network) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addNetwork(network); + } + }); + } else { + parent.addNetwork(network); + } + + return true; + } + + @Override + public boolean onNetworkPolicy(final RouterConfig parent, final NetworkPolicy networkPolicy) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addNetworkPolicy(networkPolicy); + } + }); + } else { + parent.addNetworkPolicy(networkPolicy); + } + + return true; + } + + @Override + public boolean onServer(final Group parent, final Server server) { + parent.addServer(server); + return true; + } + + @Override + public boolean onServerGroup(final RouterConfig parent, final ServerGroup serverGroup) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addServerGroup(serverGroup); + } + }); + } else { + parent.addServerGroup(serverGroup); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultMerger.java b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultMerger.java new file mode 100644 index 0000000000..c28f3cfbfd --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultMerger.java @@ -0,0 +1,278 @@ +package com.dianping.cat.home.router.transform; + +import java.util.Stack; + +import com.dianping.cat.home.router.IEntity; +import com.dianping.cat.home.router.IVisitor; +import com.dianping.cat.home.router.entity.DefaultServer; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.Group; +import com.dianping.cat.home.router.entity.GroupServer; +import com.dianping.cat.home.router.entity.Network; +import com.dianping.cat.home.router.entity.NetworkPolicy; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.home.router.entity.ServerGroup; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private RouterConfig m_routerConfig; + + public DefaultMerger() { + } + + public DefaultMerger(RouterConfig routerConfig) { + m_routerConfig = routerConfig; + m_objs.push(routerConfig); + } + + public RouterConfig getRouterConfig() { + return m_routerConfig; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeDefaultServer(DefaultServer to, DefaultServer from) { + to.mergeAttributes(from); + } + + protected void mergeDomain(Domain to, Domain from) { + to.mergeAttributes(from); + } + + protected void mergeGroup(Group to, Group from) { + to.mergeAttributes(from); + } + + protected void mergeGroupServer(GroupServer to, GroupServer from) { + to.mergeAttributes(from); + } + + protected void mergeNetwork(Network to, Network from) { + to.mergeAttributes(from); + } + + protected void mergeNetworkPolicy(NetworkPolicy to, NetworkPolicy from) { + to.mergeAttributes(from); + } + + protected void mergeRouterConfig(RouterConfig to, RouterConfig from) { + to.mergeAttributes(from); + } + + protected void mergeServer(Server to, Server from) { + to.mergeAttributes(from); + } + + protected void mergeServerGroup(ServerGroup to, ServerGroup from) { + to.mergeAttributes(from); + } + + @Override + public void visitDefaultServer(DefaultServer from) { + DefaultServer to = (DefaultServer) m_objs.peek(); + + mergeDefaultServer(to, from); + visitDefaultServerChildren(to, from); + } + + protected void visitDefaultServerChildren(DefaultServer to, DefaultServer from) { + } + + @Override + public void visitDomain(Domain from) { + Domain to = (Domain) m_objs.peek(); + + mergeDomain(to, from); + visitDomainChildren(to, from); + } + + protected void visitDomainChildren(Domain to, Domain from) { + for (Group source : from.getGroups().values()) { + Group target = to.findGroup(source.getId()); + + if (target == null) { + target = new Group(source.getId()); + to.addGroup(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitGroup(Group from) { + Group to = (Group) m_objs.peek(); + + mergeGroup(to, from); + visitGroupChildren(to, from); + } + + protected void visitGroupChildren(Group to, Group from) { + for (Server source : from.getServers()) { + Server target = null; + + if (target == null) { + target = new Server(); + to.addServer(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitGroupServer(GroupServer from) { + GroupServer to = (GroupServer) m_objs.peek(); + + mergeGroupServer(to, from); + visitGroupServerChildren(to, from); + } + + protected void visitGroupServerChildren(GroupServer to, GroupServer from) { + } + + @Override + public void visitNetwork(Network from) { + Network to = (Network) m_objs.peek(); + + mergeNetwork(to, from); + visitNetworkChildren(to, from); + } + + protected void visitNetworkChildren(Network to, Network from) { + } + + @Override + public void visitNetworkPolicy(NetworkPolicy from) { + NetworkPolicy to = (NetworkPolicy) m_objs.peek(); + + mergeNetworkPolicy(to, from); + visitNetworkPolicyChildren(to, from); + } + + protected void visitNetworkPolicyChildren(NetworkPolicy to, NetworkPolicy from) { + for (Network source : from.getNetworks().values()) { + Network target = to.findNetwork(source.getId()); + + if (target == null) { + target = new Network(source.getId()); + to.addNetwork(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitRouterConfig(RouterConfig from) { + RouterConfig to = (RouterConfig) m_objs.peek(); + + mergeRouterConfig(to, from); + visitRouterConfigChildren(to, from); + } + + protected void visitRouterConfigChildren(RouterConfig to, RouterConfig from) { + for (DefaultServer source : from.getDefaultServers().values()) { + DefaultServer target = to.findDefaultServer(source.getId()); + + if (target == null) { + target = new DefaultServer(source.getId()); + to.addDefaultServer(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (NetworkPolicy source : from.getNetworkPolicies().values()) { + NetworkPolicy target = to.findNetworkPolicy(source.getId()); + + if (target == null) { + target = new NetworkPolicy(source.getId()); + to.addNetworkPolicy(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (ServerGroup source : from.getServerGroups().values()) { + ServerGroup target = to.findServerGroup(source.getId()); + + if (target == null) { + target = new ServerGroup(source.getId()); + to.addServerGroup(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (Domain source : from.getDomains().values()) { + Domain target = to.findDomain(source.getId()); + + if (target == null) { + target = new Domain(source.getId()); + to.addDomain(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitServer(Server from) { + Server to = (Server) m_objs.peek(); + + mergeServer(to, from); + visitServerChildren(to, from); + } + + protected void visitServerChildren(Server to, Server from) { + } + + @Override + public void visitServerGroup(ServerGroup from) { + ServerGroup to = (ServerGroup) m_objs.peek(); + + mergeServerGroup(to, from); + visitServerGroupChildren(to, from); + } + + protected void visitServerGroupChildren(ServerGroup to, ServerGroup from) { + for (GroupServer source : from.getGroupServers().values()) { + GroupServer target = to.findGroupServer(source.getId()); + + if (target == null) { + target = new GroupServer(source.getId()); + to.addGroupServer(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultNativeBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..96cd711df5 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultNativeBuilder.java @@ -0,0 +1,319 @@ +package com.dianping.cat.home.router.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.home.router.IVisitor; +import com.dianping.cat.home.router.entity.DefaultServer; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.Group; +import com.dianping.cat.home.router.entity.GroupServer; +import com.dianping.cat.home.router.entity.Network; +import com.dianping.cat.home.router.entity.NetworkPolicy; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.home.router.entity.ServerGroup; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(RouterConfig routerConfig) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(routerConfig, out); + return out.toByteArray(); + } + + public static void build(RouterConfig routerConfig, OutputStream out) { + routerConfig.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitDefaultServer(DefaultServer defaultServer) { + if (defaultServer.getId() != null) { + writeTag(1, 1); + writeString(defaultServer.getId()); + } + + writeTag(2, 0); + writeDouble(defaultServer.getWeight()); + + writeTag(3, 0); + writeInt(defaultServer.getPort()); + + writeTag(4, 0); + writeBoolean(defaultServer.getEnable()); + + writeTag(63, 3); + } + + @Override + public void visitDomain(Domain domain) { + if (domain.getId() != null) { + writeTag(1, 1); + writeString(domain.getId()); + } + + if (!domain.getGroups().isEmpty()) { + writeTag(33, 2); + writeInt(domain.getGroups().size()); + + for (Group group : domain.getGroups().values()) { + group.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitGroup(Group group) { + if (group.getId() != null) { + writeTag(1, 1); + writeString(group.getId()); + } + + if (!group.getServers().isEmpty()) { + writeTag(33, 2); + writeInt(group.getServers().size()); + + for (Server server : group.getServers()) { + server.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitGroupServer(GroupServer groupServer) { + if (groupServer.getId() != null) { + writeTag(1, 1); + writeString(groupServer.getId()); + } + + writeTag(63, 3); + } + + @Override + public void visitNetwork(Network network) { + if (network.getId() != null) { + writeTag(1, 1); + writeString(network.getId()); + } + + writeTag(63, 3); + } + + @Override + public void visitNetworkPolicy(NetworkPolicy networkPolicy) { + if (networkPolicy.getId() != null) { + writeTag(1, 1); + writeString(networkPolicy.getId()); + } + + if (networkPolicy.getTitle() != null) { + writeTag(2, 1); + writeString(networkPolicy.getTitle()); + } + + writeTag(3, 0); + writeBoolean(networkPolicy.getBlock()); + + if (networkPolicy.getServerGroup() != null) { + writeTag(4, 1); + writeString(networkPolicy.getServerGroup()); + } + + if (!networkPolicy.getNetworks().isEmpty()) { + writeTag(33, 2); + writeInt(networkPolicy.getNetworks().size()); + + for (Network network : networkPolicy.getNetworks().values()) { + network.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitRouterConfig(RouterConfig routerConfig) { + writeTag(63, 0); + + if (routerConfig.getBackupServer() != null) { + writeTag(1, 1); + writeString(routerConfig.getBackupServer()); + } + + writeTag(2, 0); + writeInt(routerConfig.getBackupServerPort()); + + if (routerConfig.getStartTime() != null) { + writeTag(3, 1); + writeDate(routerConfig.getStartTime()); + } + + if (routerConfig.getDomain() != null) { + writeTag(4, 1); + writeString(routerConfig.getDomain()); + } + + if (routerConfig.getEndTime() != null) { + writeTag(5, 1); + writeDate(routerConfig.getEndTime()); + } + + if (!routerConfig.getDefaultServers().isEmpty()) { + writeTag(33, 2); + writeInt(routerConfig.getDefaultServers().size()); + + for (DefaultServer defaultServer : routerConfig.getDefaultServers().values()) { + defaultServer.accept(m_visitor); + } + } + + if (!routerConfig.getNetworkPolicies().isEmpty()) { + writeTag(34, 2); + writeInt(routerConfig.getNetworkPolicies().size()); + + for (NetworkPolicy networkPolicy : routerConfig.getNetworkPolicies().values()) { + networkPolicy.accept(m_visitor); + } + } + + if (!routerConfig.getServerGroups().isEmpty()) { + writeTag(35, 2); + writeInt(routerConfig.getServerGroups().size()); + + for (ServerGroup serverGroup : routerConfig.getServerGroups().values()) { + serverGroup.accept(m_visitor); + } + } + + if (!routerConfig.getDomains().isEmpty()) { + writeTag(36, 2); + writeInt(routerConfig.getDomains().size()); + + for (Domain domain : routerConfig.getDomains().values()) { + domain.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitServer(Server server) { + if (server.getId() != null) { + writeTag(1, 1); + writeString(server.getId()); + } + + writeTag(2, 0); + writeInt(server.getPort()); + + writeTag(3, 0); + writeDouble(server.getWeight()); + + writeTag(63, 3); + } + + @Override + public void visitServerGroup(ServerGroup serverGroup) { + if (serverGroup.getId() != null) { + writeTag(1, 1); + writeString(serverGroup.getId()); + } + + if (serverGroup.getTitle() != null) { + writeTag(2, 1); + writeString(serverGroup.getTitle()); + } + + if (!serverGroup.getGroupServers().isEmpty()) { + writeTag(33, 2); + writeInt(serverGroup.getGroupServers().size()); + + for (GroupServer groupServer : serverGroup.getGroupServers().values()) { + groupServer.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + private void writeBoolean(boolean value) { + try { + m_out.writeByte(value ? 1 : 0); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeDouble(double value) { + try { + writeVarint(Double.doubleToLongBits(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultNativeParser.java b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..ea324361a5 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultNativeParser.java @@ -0,0 +1,430 @@ +package com.dianping.cat.home.router.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.home.router.IVisitor; +import com.dianping.cat.home.router.entity.DefaultServer; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.Group; +import com.dianping.cat.home.router.entity.GroupServer; +import com.dianping.cat.home.router.entity.Network; +import com.dianping.cat.home.router.entity.NetworkPolicy; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.home.router.entity.ServerGroup; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static RouterConfig parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static RouterConfig parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + RouterConfig routerConfig = new RouterConfig(); + + try { + routerConfig.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return routerConfig; + } + + @Override + public void visitDefaultServer(DefaultServer defaultServer) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDefaultServerChildren(defaultServer, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDefaultServerChildren(DefaultServer defaultServer, int _field, int _type) { + switch (_field) { + case 1: + defaultServer.setId(readString()); + break; + case 2: + defaultServer.setWeight(readDouble()); + break; + case 3: + defaultServer.setPort(readInt()); + break; + case 4: + defaultServer.setEnable(readBoolean()); + break; + } + } + + @Override + public void visitDomain(Domain domain) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDomainChildren(domain, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDomainChildren(Domain domain, int _field, int _type) { + switch (_field) { + case 1: + domain.setId(readString()); + break; + case 33: + if (_type == 1) { + Group group = new Group(); + + visitGroup(group); + m_linker.onGroup(domain, group); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Group group = new Group(); + + visitGroup(group); + m_linker.onGroup(domain, group); + } + } + break; + } + } + + @Override + public void visitGroup(Group group) { + byte tag; + + while ((tag = readTag()) != -1) { + visitGroupChildren(group, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitGroupChildren(Group group, int _field, int _type) { + switch (_field) { + case 1: + group.setId(readString()); + break; + case 33: + if (_type == 1) { + Server server = new Server(); + + visitServer(server); + m_linker.onServer(group, server); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Server server = new Server(); + + visitServer(server); + m_linker.onServer(group, server); + } + } + break; + } + } + + @Override + public void visitGroupServer(GroupServer groupServer) { + byte tag; + + while ((tag = readTag()) != -1) { + visitGroupServerChildren(groupServer, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitGroupServerChildren(GroupServer groupServer, int _field, int _type) { + switch (_field) { + case 1: + groupServer.setId(readString()); + break; + } + } + + @Override + public void visitNetwork(Network network) { + byte tag; + + while ((tag = readTag()) != -1) { + visitNetworkChildren(network, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitNetworkChildren(Network network, int _field, int _type) { + switch (_field) { + case 1: + network.setId(readString()); + break; + } + } + + @Override + public void visitNetworkPolicy(NetworkPolicy networkPolicy) { + byte tag; + + while ((tag = readTag()) != -1) { + visitNetworkPolicyChildren(networkPolicy, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitNetworkPolicyChildren(NetworkPolicy networkPolicy, int _field, int _type) { + switch (_field) { + case 1: + networkPolicy.setId(readString()); + break; + case 2: + networkPolicy.setTitle(readString()); + break; + case 3: + networkPolicy.setBlock(readBoolean()); + break; + case 4: + networkPolicy.setServerGroup(readString()); + break; + case 33: + if (_type == 1) { + Network network = new Network(); + + visitNetwork(network); + m_linker.onNetwork(networkPolicy, network); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Network network = new Network(); + + visitNetwork(network); + m_linker.onNetwork(networkPolicy, network); + } + } + break; + } + } + + @Override + public void visitRouterConfig(RouterConfig routerConfig) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitRouterConfigChildren(routerConfig, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitRouterConfigChildren(RouterConfig routerConfig, int _field, int _type) { + switch (_field) { + case 1: + routerConfig.setBackupServer(readString()); + break; + case 2: + routerConfig.setBackupServerPort(readInt()); + break; + case 3: + routerConfig.setStartTime(readDate()); + break; + case 4: + routerConfig.setDomain(readString()); + break; + case 5: + routerConfig.setEndTime(readDate()); + break; + case 33: + if (_type == 1) { + DefaultServer defaultServer = new DefaultServer(); + + visitDefaultServer(defaultServer); + m_linker.onDefaultServer(routerConfig, defaultServer); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + DefaultServer defaultServer = new DefaultServer(); + + visitDefaultServer(defaultServer); + m_linker.onDefaultServer(routerConfig, defaultServer); + } + } + break; + case 34: + if (_type == 1) { + NetworkPolicy networkPolicy = new NetworkPolicy(); + + visitNetworkPolicy(networkPolicy); + m_linker.onNetworkPolicy(routerConfig, networkPolicy); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + NetworkPolicy networkPolicy = new NetworkPolicy(); + + visitNetworkPolicy(networkPolicy); + m_linker.onNetworkPolicy(routerConfig, networkPolicy); + } + } + break; + case 35: + if (_type == 1) { + ServerGroup serverGroup = new ServerGroup(); + + visitServerGroup(serverGroup); + m_linker.onServerGroup(routerConfig, serverGroup); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + ServerGroup serverGroup = new ServerGroup(); + + visitServerGroup(serverGroup); + m_linker.onServerGroup(routerConfig, serverGroup); + } + } + break; + case 36: + if (_type == 1) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(routerConfig, domain); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(routerConfig, domain); + } + } + break; + } + } + + @Override + public void visitServer(Server server) { + byte tag; + + while ((tag = readTag()) != -1) { + visitServerChildren(server, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitServerChildren(Server server, int _field, int _type) { + switch (_field) { + case 1: + server.setId(readString()); + break; + case 2: + server.setPort(readInt()); + break; + case 3: + server.setWeight(readDouble()); + break; + } + } + + @Override + public void visitServerGroup(ServerGroup serverGroup) { + byte tag; + + while ((tag = readTag()) != -1) { + visitServerGroupChildren(serverGroup, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitServerGroupChildren(ServerGroup serverGroup, int _field, int _type) { + switch (_field) { + case 1: + serverGroup.setId(readString()); + break; + case 2: + serverGroup.setTitle(readString()); + break; + case 33: + if (_type == 1) { + GroupServer groupServer = new GroupServer(); + + visitGroupServer(groupServer); + m_linker.onGroupServer(serverGroup, groupServer); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + GroupServer groupServer = new GroupServer(); + + visitGroupServer(groupServer); + m_linker.onGroupServer(serverGroup, groupServer); + } + } + break; + } + } + + private boolean readBoolean() { + try { + return m_in.readByte() == 1 ? Boolean.TRUE : Boolean.FALSE; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private double readDouble() { + try { + return Double.longBitsToDouble(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..7bfd1c882a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultSaxMaker.java @@ -0,0 +1,209 @@ +package com.dianping.cat.home.router.transform; + +import static com.dianping.cat.home.router.Constants.ATTR_BACKUP_SERVER; +import static com.dianping.cat.home.router.Constants.ATTR_BACKUP_SERVER_PORT; +import static com.dianping.cat.home.router.Constants.ATTR_BLOCK; +import static com.dianping.cat.home.router.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.router.Constants.ATTR_ENABLE; +import static com.dianping.cat.home.router.Constants.ATTR_ENDTIME; +import static com.dianping.cat.home.router.Constants.ATTR_ID; +import static com.dianping.cat.home.router.Constants.ATTR_PORT; +import static com.dianping.cat.home.router.Constants.ATTR_SERVER_GROUP; +import static com.dianping.cat.home.router.Constants.ATTR_STARTTIME; +import static com.dianping.cat.home.router.Constants.ATTR_TITLE; +import static com.dianping.cat.home.router.Constants.ATTR_WEIGHT; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.router.entity.DefaultServer; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.Group; +import com.dianping.cat.home.router.entity.GroupServer; +import com.dianping.cat.home.router.entity.Network; +import com.dianping.cat.home.router.entity.NetworkPolicy; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.home.router.entity.ServerGroup; + +public class DefaultSaxMaker implements IMaker { + + @Override + public DefaultServer buildDefaultServer(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String weight = attributes.getValue(ATTR_WEIGHT); + String port = attributes.getValue(ATTR_PORT); + String enable = attributes.getValue(ATTR_ENABLE); + DefaultServer defaultServer = new DefaultServer(id); + + if (weight != null) { + defaultServer.setWeight(convert(Double.class, weight, 0.0)); + } + + if (port != null) { + defaultServer.setPort(convert(Integer.class, port, 0)); + } + + if (enable != null) { + defaultServer.setEnable(convert(Boolean.class, enable, false)); + } + + return defaultServer; + } + + @Override + public Domain buildDomain(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Domain domain = new Domain(id); + + return domain; + } + + @Override + public Group buildGroup(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Group group = new Group(id); + + return group; + } + + @Override + public GroupServer buildGroupServer(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + GroupServer groupServer = new GroupServer(id); + + return groupServer; + } + + @Override + public Network buildNetwork(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Network network = new Network(id); + + return network; + } + + @Override + public NetworkPolicy buildNetworkPolicy(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String title = attributes.getValue(ATTR_TITLE); + String block = attributes.getValue(ATTR_BLOCK); + String serverGroup = attributes.getValue(ATTR_SERVER_GROUP); + NetworkPolicy networkPolicy = new NetworkPolicy(id); + + if (title != null) { + networkPolicy.setTitle(title); + } + + if (block != null) { + networkPolicy.setBlock(convert(Boolean.class, block, false)); + } + + if (serverGroup != null) { + networkPolicy.setServerGroup(serverGroup); + } + + return networkPolicy; + } + + @Override + public RouterConfig buildRouterConfig(Attributes attributes) { + String backupServer = attributes.getValue(ATTR_BACKUP_SERVER); + String backupServerPort = attributes.getValue(ATTR_BACKUP_SERVER_PORT); + String startTime = attributes.getValue(ATTR_STARTTIME); + String domain = attributes.getValue(ATTR_DOMAIN); + String endTime = attributes.getValue(ATTR_ENDTIME); + RouterConfig routerConfig = new RouterConfig(domain); + + if (backupServer != null) { + routerConfig.setBackupServer(backupServer); + } + + if (backupServerPort != null) { + routerConfig.setBackupServerPort(convert(Integer.class, backupServerPort, 0)); + } + + if (startTime != null) { + routerConfig.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + routerConfig.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return routerConfig; + } + + @Override + public Server buildServer(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String port = attributes.getValue(ATTR_PORT); + String weight = attributes.getValue(ATTR_WEIGHT); + Server server = new Server(); + + if (id != null) { + server.setId(id); + } + + if (port != null) { + server.setPort(convert(Integer.class, port, 0)); + } + + if (weight != null) { + server.setWeight(convert(Double.class, weight, 0.0)); + } + + return server; + } + + @Override + public ServerGroup buildServerGroup(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String title = attributes.getValue(ATTR_TITLE); + ServerGroup serverGroup = new ServerGroup(id); + + if (title != null) { + serverGroup.setTitle(title); + } + + return serverGroup; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..f68cef9d57 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultSaxParser.java @@ -0,0 +1,387 @@ +package com.dianping.cat.home.router.transform; + +import static com.dianping.cat.home.router.Constants.ENTITY_DEFAULT_SERVER; +import static com.dianping.cat.home.router.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.home.router.Constants.ENTITY_GROUP; +import static com.dianping.cat.home.router.Constants.ENTITY_GROUP_SERVER; +import static com.dianping.cat.home.router.Constants.ENTITY_NETWORK; +import static com.dianping.cat.home.router.Constants.ENTITY_NETWORK_POLICY; +import static com.dianping.cat.home.router.Constants.ENTITY_ROUTER_CONFIG; +import static com.dianping.cat.home.router.Constants.ENTITY_SERVER; +import static com.dianping.cat.home.router.Constants.ENTITY_SERVER_GROUP; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.router.IEntity; +import com.dianping.cat.home.router.entity.DefaultServer; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.Group; +import com.dianping.cat.home.router.entity.GroupServer; +import com.dianping.cat.home.router.entity.Network; +import com.dianping.cat.home.router.entity.NetworkPolicy; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.home.router.entity.ServerGroup; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static RouterConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(RouterConfig.class, new InputSource(removeBOM(in))); + } + + public static RouterConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(RouterConfig.class, new InputSource(removeBOM(reader))); + } + + public static RouterConfig parse(String xml) throws SAXException, IOException { + return parseEntity(RouterConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForDefaultServer(DefaultServer parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForDomain(Domain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_GROUP.equals(qName)) { + Group group = m_maker.buildGroup(attributes); + + m_linker.onGroup(parentObj, group); + m_objs.push(group); + } else { + throw new SAXException(String.format("Element(%s) is not expected under domain!", qName)); + } + + m_tags.push(qName); + } + + private void parseForGroup(Group parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_SERVER.equals(qName)) { + Server server = m_maker.buildServer(attributes); + + m_linker.onServer(parentObj, server); + m_objs.push(server); + } else { + throw new SAXException(String.format("Element(%s) is not expected under group!", qName)); + } + + m_tags.push(qName); + } + + private void parseForGroupServer(GroupServer parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForNetwork(Network parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForNetworkPolicy(NetworkPolicy parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_NETWORK.equals(qName)) { + Network network = m_maker.buildNetwork(attributes); + + m_linker.onNetwork(parentObj, network); + m_objs.push(network); + } else { + throw new SAXException(String.format("Element(%s) is not expected under network-policy!", qName)); + } + + m_tags.push(qName); + } + + private void parseForRouterConfig(RouterConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DEFAULT_SERVER.equals(qName)) { + DefaultServer defaultServer = m_maker.buildDefaultServer(attributes); + + m_linker.onDefaultServer(parentObj, defaultServer); + m_objs.push(defaultServer); + } else if (ENTITY_NETWORK_POLICY.equals(qName)) { + NetworkPolicy networkPolicy = m_maker.buildNetworkPolicy(attributes); + + m_linker.onNetworkPolicy(parentObj, networkPolicy); + m_objs.push(networkPolicy); + } else if (ENTITY_SERVER_GROUP.equals(qName)) { + ServerGroup serverGroup = m_maker.buildServerGroup(attributes); + + m_linker.onServerGroup(parentObj, serverGroup); + m_objs.push(serverGroup); + } else if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_linker.onDomain(parentObj, domain); + m_objs.push(domain); + } else { + throw new SAXException(String.format("Element(%s) is not expected under router-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseForServer(Server parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForServerGroup(ServerGroup parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_GROUP_SERVER.equals(qName)) { + GroupServer groupServer = m_maker.buildGroupServer(attributes); + + m_linker.onGroupServer(parentObj, groupServer); + m_objs.push(groupServer); + } else { + throw new SAXException(String.format("Element(%s) is not expected under server-group!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_ROUTER_CONFIG.equals(qName)) { + RouterConfig routerConfig = m_maker.buildRouterConfig(attributes); + + m_entity = routerConfig; + m_objs.push(routerConfig); + m_tags.push(qName); + } else if (ENTITY_DEFAULT_SERVER.equals(qName)) { + DefaultServer defaultServer = m_maker.buildDefaultServer(attributes); + + m_entity = defaultServer; + m_objs.push(defaultServer); + m_tags.push(qName); + } else if (ENTITY_NETWORK_POLICY.equals(qName)) { + NetworkPolicy networkPolicy = m_maker.buildNetworkPolicy(attributes); + + m_entity = networkPolicy; + m_objs.push(networkPolicy); + m_tags.push(qName); + } else if (ENTITY_NETWORK.equals(qName)) { + Network network = m_maker.buildNetwork(attributes); + + m_entity = network; + m_objs.push(network); + m_tags.push(qName); + } else if (ENTITY_SERVER_GROUP.equals(qName)) { + ServerGroup serverGroup = m_maker.buildServerGroup(attributes); + + m_entity = serverGroup; + m_objs.push(serverGroup); + m_tags.push(qName); + } else if (ENTITY_GROUP_SERVER.equals(qName)) { + GroupServer groupServer = m_maker.buildGroupServer(attributes); + + m_entity = groupServer; + m_objs.push(groupServer); + m_tags.push(qName); + } else if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_entity = domain; + m_objs.push(domain); + m_tags.push(qName); + } else if (ENTITY_GROUP.equals(qName)) { + Group group = m_maker.buildGroup(attributes); + + m_entity = group; + m_objs.push(group); + m_tags.push(qName); + } else if (ENTITY_SERVER.equals(qName)) { + Server server = m_maker.buildServer(attributes); + + m_entity = server; + m_objs.push(server); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof RouterConfig) { + parseForRouterConfig((RouterConfig) parent, tag, qName, attributes); + } else if (parent instanceof DefaultServer) { + parseForDefaultServer((DefaultServer) parent, tag, qName, attributes); + } else if (parent instanceof NetworkPolicy) { + parseForNetworkPolicy((NetworkPolicy) parent, tag, qName, attributes); + } else if (parent instanceof Network) { + parseForNetwork((Network) parent, tag, qName, attributes); + } else if (parent instanceof ServerGroup) { + parseForServerGroup((ServerGroup) parent, tag, qName, attributes); + } else if (parent instanceof GroupServer) { + parseForGroupServer((GroupServer) parent, tag, qName, attributes); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, qName, attributes); + } else if (parent instanceof Group) { + parseForGroup((Group) parent, tag, qName, attributes); + } else if (parent instanceof Server) { + parseForServer((Server) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..ea39bafed9 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/transform/DefaultXmlBuilder.java @@ -0,0 +1,330 @@ +package com.dianping.cat.home.router.transform; + +import static com.dianping.cat.home.router.Constants.ATTR_BACKUP_SERVER; +import static com.dianping.cat.home.router.Constants.ATTR_BACKUP_SERVER_PORT; +import static com.dianping.cat.home.router.Constants.ATTR_BLOCK; +import static com.dianping.cat.home.router.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.router.Constants.ATTR_ENABLE; +import static com.dianping.cat.home.router.Constants.ATTR_ENDTIME; +import static com.dianping.cat.home.router.Constants.ATTR_ID; +import static com.dianping.cat.home.router.Constants.ATTR_PORT; +import static com.dianping.cat.home.router.Constants.ATTR_SERVER_GROUP; +import static com.dianping.cat.home.router.Constants.ATTR_STARTTIME; +import static com.dianping.cat.home.router.Constants.ATTR_TITLE; +import static com.dianping.cat.home.router.Constants.ATTR_WEIGHT; +import static com.dianping.cat.home.router.Constants.ENTITY_DEFAULT_SERVER; +import static com.dianping.cat.home.router.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.home.router.Constants.ENTITY_GROUP; +import static com.dianping.cat.home.router.Constants.ENTITY_GROUP_SERVER; +import static com.dianping.cat.home.router.Constants.ENTITY_NETWORK; +import static com.dianping.cat.home.router.Constants.ENTITY_NETWORK_POLICY; +import static com.dianping.cat.home.router.Constants.ENTITY_ROUTER_CONFIG; +import static com.dianping.cat.home.router.Constants.ENTITY_SERVER; +import static com.dianping.cat.home.router.Constants.ENTITY_SERVER_GROUP; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.router.IEntity; +import com.dianping.cat.home.router.IVisitor; +import com.dianping.cat.home.router.entity.DefaultServer; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.Group; +import com.dianping.cat.home.router.entity.GroupServer; +import com.dianping.cat.home.router.entity.Network; +import com.dianping.cat.home.router.entity.NetworkPolicy; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.home.router.entity.ServerGroup; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + @Override + public void visitDefaultServer(DefaultServer defaultServer) { + startTag(ENTITY_DEFAULT_SERVER, true, null, ATTR_ID, defaultServer.getId(), ATTR_WEIGHT, defaultServer.getWeight(), ATTR_PORT, defaultServer.getPort(), ATTR_ENABLE, defaultServer.isEnable()); + } + + @Override + public void visitDomain(Domain domain) { + startTag(ENTITY_DOMAIN, null, ATTR_ID, domain.getId()); + + if (!domain.getGroups().isEmpty()) { + for (Group group : domain.getGroups().values()) { + group.accept(m_visitor); + } + } + + endTag(ENTITY_DOMAIN); + } + + @Override + public void visitGroup(Group group) { + startTag(ENTITY_GROUP, null, ATTR_ID, group.getId()); + + if (!group.getServers().isEmpty()) { + for (Server server : group.getServers()) { + server.accept(m_visitor); + } + } + + endTag(ENTITY_GROUP); + } + + @Override + public void visitGroupServer(GroupServer groupServer) { + startTag(ENTITY_GROUP_SERVER, true, null, ATTR_ID, groupServer.getId()); + } + + @Override + public void visitNetwork(Network network) { + startTag(ENTITY_NETWORK, true, null, ATTR_ID, network.getId()); + } + + @Override + public void visitNetworkPolicy(NetworkPolicy networkPolicy) { + startTag(ENTITY_NETWORK_POLICY, null, ATTR_ID, networkPolicy.getId(), ATTR_TITLE, networkPolicy.getTitle(), ATTR_BLOCK, networkPolicy.isBlock(), ATTR_SERVER_GROUP, networkPolicy.getServerGroup()); + + if (!networkPolicy.getNetworks().isEmpty()) { + for (Network network : networkPolicy.getNetworks().values()) { + network.accept(m_visitor); + } + } + + endTag(ENTITY_NETWORK_POLICY); + } + + @Override + public void visitRouterConfig(RouterConfig routerConfig) { + startTag(ENTITY_ROUTER_CONFIG, null, ATTR_BACKUP_SERVER, routerConfig.getBackupServer(), ATTR_BACKUP_SERVER_PORT, routerConfig.getBackupServerPort(), ATTR_STARTTIME, toString(routerConfig.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_DOMAIN, routerConfig.getDomain(), ATTR_ENDTIME, toString(routerConfig.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!routerConfig.getDefaultServers().isEmpty()) { + for (DefaultServer defaultServer : routerConfig.getDefaultServers().values()) { + defaultServer.accept(m_visitor); + } + } + + if (!routerConfig.getNetworkPolicies().isEmpty()) { + for (NetworkPolicy networkPolicy : routerConfig.getNetworkPolicies().values()) { + networkPolicy.accept(m_visitor); + } + } + + if (!routerConfig.getServerGroups().isEmpty()) { + for (ServerGroup serverGroup : routerConfig.getServerGroups().values()) { + serverGroup.accept(m_visitor); + } + } + + if (!routerConfig.getDomains().isEmpty()) { + for (Domain domain : routerConfig.getDomains().values()) { + domain.accept(m_visitor); + } + } + + endTag(ENTITY_ROUTER_CONFIG); + } + + @Override + public void visitServer(Server server) { + startTag(ENTITY_SERVER, true, null, ATTR_ID, server.getId(), ATTR_PORT, server.getPort(), ATTR_WEIGHT, server.getWeight()); + } + + @Override + public void visitServerGroup(ServerGroup serverGroup) { + startTag(ENTITY_SERVER_GROUP, null, ATTR_ID, serverGroup.getId(), ATTR_TITLE, serverGroup.getTitle()); + + if (!serverGroup.getGroupServers().isEmpty()) { + for (GroupServer groupServer : serverGroup.getGroupServers().values()) { + groupServer.accept(m_visitor); + } + } + + endTag(ENTITY_SERVER_GROUP); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/router/transform/ILinker.java new file mode 100644 index 0000000000..2267291e38 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/transform/ILinker.java @@ -0,0 +1,30 @@ +package com.dianping.cat.home.router.transform; + +import com.dianping.cat.home.router.entity.DefaultServer; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.Group; +import com.dianping.cat.home.router.entity.GroupServer; +import com.dianping.cat.home.router.entity.Network; +import com.dianping.cat.home.router.entity.NetworkPolicy; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.home.router.entity.ServerGroup; + +public interface ILinker { + + public boolean onDefaultServer(RouterConfig parent, DefaultServer defaultServer); + + public boolean onDomain(RouterConfig parent, Domain domain); + + public boolean onGroup(Domain parent, Group group); + + public boolean onGroupServer(ServerGroup parent, GroupServer groupServer); + + public boolean onNetwork(NetworkPolicy parent, Network network); + + public boolean onNetworkPolicy(RouterConfig parent, NetworkPolicy networkPolicy); + + public boolean onServer(Group parent, Server server); + + public boolean onServerGroup(RouterConfig parent, ServerGroup serverGroup); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/router/transform/IMaker.java new file mode 100644 index 0000000000..b39a36d1ac --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/transform/IMaker.java @@ -0,0 +1,32 @@ +package com.dianping.cat.home.router.transform; + +import com.dianping.cat.home.router.entity.DefaultServer; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.Group; +import com.dianping.cat.home.router.entity.GroupServer; +import com.dianping.cat.home.router.entity.Network; +import com.dianping.cat.home.router.entity.NetworkPolicy; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.home.router.entity.ServerGroup; + +public interface IMaker { + + public DefaultServer buildDefaultServer(T node); + + public Domain buildDomain(T node); + + public Group buildGroup(T node); + + public GroupServer buildGroupServer(T node); + + public Network buildNetwork(T node); + + public NetworkPolicy buildNetworkPolicy(T node); + + public RouterConfig buildRouterConfig(T node); + + public Server buildServer(T node); + + public ServerGroup buildServerGroup(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/router/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/router/transform/IParser.java new file mode 100644 index 0000000000..92c5cf2c37 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/router/transform/IParser.java @@ -0,0 +1,31 @@ +package com.dianping.cat.home.router.transform; + +import com.dianping.cat.home.router.entity.DefaultServer; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.Group; +import com.dianping.cat.home.router.entity.GroupServer; +import com.dianping.cat.home.router.entity.Network; +import com.dianping.cat.home.router.entity.NetworkPolicy; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.home.router.entity.ServerGroup; + +public interface IParser { + public RouterConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForDefaultServer(IMaker maker, ILinker linker, DefaultServer parent, T node); + + public void parseForDomain(IMaker maker, ILinker linker, Domain parent, T node); + + public void parseForGroup(IMaker maker, ILinker linker, Group parent, T node); + + public void parseForGroupServer(IMaker maker, ILinker linker, GroupServer parent, T node); + + public void parseForNetwork(IMaker maker, ILinker linker, Network parent, T node); + + public void parseForNetworkPolicy(IMaker maker, ILinker linker, NetworkPolicy parent, T node); + + public void parseForServer(IMaker maker, ILinker linker, Server parent, T node); + + public void parseForServerGroup(IMaker maker, ILinker linker, ServerGroup parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/server/BaseEntity.java new file mode 100644 index 0000000000..dba6e95a15 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.server; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.server.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/server/Constants.java new file mode 100644 index 0000000000..4f8ae7e047 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/Constants.java @@ -0,0 +1,24 @@ +package com.dianping.cat.home.server; + +public class Constants { + + public static final String ATTR_CATEGORY = "category"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_TYPE = "type"; + + public static final String ENTITY_GROUP = "group"; + + public static final String ENTITY_GROUPS = "groups"; + + public static final String ENTITY_ITEM = "item"; + + public static final String ENTITY_ITEMS = "items"; + + public static final String ENTITY_SEGMENT = "segment"; + + public static final String ENTITY_SEGMENTS = "segments"; + + public static final String ENTITY_SERVER_METRIC_CONFIG = "server-metric-config"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/server/IEntity.java new file mode 100644 index 0000000000..6a3a50551d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.server; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/server/IVisitor.java new file mode 100644 index 0000000000..a81c13ee6b --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/IVisitor.java @@ -0,0 +1,17 @@ +package com.dianping.cat.home.server; + +import com.dianping.cat.home.server.entity.Group; +import com.dianping.cat.home.server.entity.Item; +import com.dianping.cat.home.server.entity.Segment; +import com.dianping.cat.home.server.entity.ServerMetricConfig; + +public interface IVisitor { + + public void visitGroup(Group group); + + public void visitItem(Item item); + + public void visitSegment(Segment segment); + + public void visitServerMetricConfig(ServerMetricConfig serverMetricConfig); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/entity/Group.java b/cat-home/src/main/java/com/dianping/cat/home/server/entity/Group.java new file mode 100644 index 0000000000..3bc2c7013c --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/entity/Group.java @@ -0,0 +1,102 @@ +package com.dianping.cat.home.server.entity; + +import static com.dianping.cat.home.server.Constants.ATTR_ID; +import static com.dianping.cat.home.server.Constants.ENTITY_GROUP; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.server.BaseEntity; +import com.dianping.cat.home.server.IVisitor; + +public class Group extends BaseEntity { + private String m_id; + + private Map m_items = new LinkedHashMap(); + + public Group() { + } + + public Group(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitGroup(this); + } + + public Group addItem(Item item) { + m_items.put(item.getId(), item); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Group) { + Group _o = (Group) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Item findItem(String id) { + return m_items.get(id); + } + + public Item findOrCreateItem(String id) { + Item item = m_items.get(id); + + if (item == null) { + synchronized (m_items) { + item = m_items.get(id); + + if (item == null) { + item = new Item(id); + m_items.put(id, item); + } + } + } + + return item; + } + + public String getId() { + return m_id; + } + + public Map getItems() { + return m_items; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Group other) { + assertAttributeEquals(other, ENTITY_GROUP, ATTR_ID, m_id, other.getId()); + + } + + public Item removeItem(String id) { + return m_items.remove(id); + } + + public Group setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/entity/Item.java b/cat-home/src/main/java/com/dianping/cat/home/server/entity/Item.java new file mode 100644 index 0000000000..114fce6ec9 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/entity/Item.java @@ -0,0 +1,102 @@ +package com.dianping.cat.home.server.entity; + +import static com.dianping.cat.home.server.Constants.ATTR_ID; +import static com.dianping.cat.home.server.Constants.ENTITY_ITEM; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.server.BaseEntity; +import com.dianping.cat.home.server.IVisitor; + +public class Item extends BaseEntity { + private String m_id; + + private Map m_segments = new LinkedHashMap(); + + public Item() { + } + + public Item(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitItem(this); + } + + public Item addSegment(Segment segment) { + m_segments.put(segment.getId(), segment); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Item) { + Item _o = (Item) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Segment findSegment(String id) { + return m_segments.get(id); + } + + public Segment findOrCreateSegment(String id) { + Segment segment = m_segments.get(id); + + if (segment == null) { + synchronized (m_segments) { + segment = m_segments.get(id); + + if (segment == null) { + segment = new Segment(id); + m_segments.put(id, segment); + } + } + } + + return segment; + } + + public String getId() { + return m_id; + } + + public Map getSegments() { + return m_segments; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Item other) { + assertAttributeEquals(other, ENTITY_ITEM, ATTR_ID, m_id, other.getId()); + + } + + public Segment removeSegment(String id) { + return m_segments.remove(id); + } + + public Item setId(String id) { + m_id = id; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/entity/Segment.java b/cat-home/src/main/java/com/dianping/cat/home/server/entity/Segment.java new file mode 100644 index 0000000000..5d746c9d73 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/entity/Segment.java @@ -0,0 +1,92 @@ +package com.dianping.cat.home.server.entity; + +import static com.dianping.cat.home.server.Constants.ATTR_ID; +import static com.dianping.cat.home.server.Constants.ENTITY_SEGMENT; + +import com.dianping.cat.home.server.BaseEntity; +import com.dianping.cat.home.server.IVisitor; + +public class Segment extends BaseEntity { + private String m_id; + + private String m_category; + + private String m_type; + + public Segment() { + } + + public Segment(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitSegment(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Segment) { + Segment _o = (Segment) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getCategory() { + return m_category; + } + + public String getId() { + return m_id; + } + + public String getType() { + return m_type; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Segment other) { + assertAttributeEquals(other, ENTITY_SEGMENT, ATTR_ID, m_id, other.getId()); + + if (other.getCategory() != null) { + m_category = other.getCategory(); + } + + if (other.getType() != null) { + m_type = other.getType(); + } + } + + public Segment setCategory(String category) { + m_category = category; + return this; + } + + public Segment setId(String id) { + m_id = id; + return this; + } + + public Segment setType(String type) { + m_type = type; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/entity/ServerMetricConfig.java b/cat-home/src/main/java/com/dianping/cat/home/server/entity/ServerMetricConfig.java new file mode 100644 index 0000000000..a2d2d9a8b1 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/entity/ServerMetricConfig.java @@ -0,0 +1,83 @@ +package com.dianping.cat.home.server.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.server.BaseEntity; +import com.dianping.cat.home.server.IVisitor; + +public class ServerMetricConfig extends BaseEntity { + private Map m_groups = new LinkedHashMap(); + + public ServerMetricConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitServerMetricConfig(this); + } + + public ServerMetricConfig addGroup(Group group) { + m_groups.put(group.getId(), group); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ServerMetricConfig) { + ServerMetricConfig _o = (ServerMetricConfig) obj; + + if (!equals(getGroups(), _o.getGroups())) { + return false; + } + + + return true; + } + + return false; + } + + public Group findGroup(String id) { + return m_groups.get(id); + } + + public Group findOrCreateGroup(String id) { + Group group = m_groups.get(id); + + if (group == null) { + synchronized (m_groups) { + group = m_groups.get(id); + + if (group == null) { + group = new Group(id); + m_groups.put(id, group); + } + } + } + + return group; + } + + public Map getGroups() { + return m_groups; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_groups == null ? 0 : m_groups.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ServerMetricConfig other) { + } + + public Group removeGroup(String id) { + return m_groups.remove(id); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultLinker.java new file mode 100644 index 0000000000..e51cde56de --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultLinker.java @@ -0,0 +1,72 @@ +package com.dianping.cat.home.server.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.server.entity.Group; +import com.dianping.cat.home.server.entity.Item; +import com.dianping.cat.home.server.entity.Segment; +import com.dianping.cat.home.server.entity.ServerMetricConfig; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onGroup(final ServerMetricConfig parent, final Group group) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addGroup(group); + } + }); + } else { + parent.addGroup(group); + } + + return true; + } + + @Override + public boolean onItem(final Group parent, final Item item) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addItem(item); + } + }); + } else { + parent.addItem(item); + } + + return true; + } + + @Override + public boolean onSegment(final Item parent, final Segment segment) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addSegment(segment); + } + }); + } else { + parent.addSegment(segment); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultMerger.java b/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultMerger.java new file mode 100644 index 0000000000..53078ca41c --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultMerger.java @@ -0,0 +1,135 @@ +package com.dianping.cat.home.server.transform; + +import java.util.Stack; + +import com.dianping.cat.home.server.IEntity; +import com.dianping.cat.home.server.IVisitor; +import com.dianping.cat.home.server.entity.Group; +import com.dianping.cat.home.server.entity.Item; +import com.dianping.cat.home.server.entity.Segment; +import com.dianping.cat.home.server.entity.ServerMetricConfig; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private ServerMetricConfig m_serverMetricConfig; + + public DefaultMerger() { + } + + public DefaultMerger(ServerMetricConfig serverMetricConfig) { + m_serverMetricConfig = serverMetricConfig; + m_objs.push(serverMetricConfig); + } + + public ServerMetricConfig getServerMetricConfig() { + return m_serverMetricConfig; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeGroup(Group to, Group from) { + to.mergeAttributes(from); + } + + protected void mergeItem(Item to, Item from) { + to.mergeAttributes(from); + } + + protected void mergeSegment(Segment to, Segment from) { + to.mergeAttributes(from); + } + + protected void mergeServerMetricConfig(ServerMetricConfig to, ServerMetricConfig from) { + to.mergeAttributes(from); + } + + @Override + public void visitGroup(Group from) { + Group to = (Group) m_objs.peek(); + + mergeGroup(to, from); + visitGroupChildren(to, from); + } + + protected void visitGroupChildren(Group to, Group from) { + for (Item source : from.getItems().values()) { + Item target = to.findItem(source.getId()); + + if (target == null) { + target = new Item(source.getId()); + to.addItem(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitItem(Item from) { + Item to = (Item) m_objs.peek(); + + mergeItem(to, from); + visitItemChildren(to, from); + } + + protected void visitItemChildren(Item to, Item from) { + for (Segment source : from.getSegments().values()) { + Segment target = to.findSegment(source.getId()); + + if (target == null) { + target = new Segment(source.getId()); + to.addSegment(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitSegment(Segment from) { + Segment to = (Segment) m_objs.peek(); + + mergeSegment(to, from); + visitSegmentChildren(to, from); + } + + protected void visitSegmentChildren(Segment to, Segment from) { + } + + @Override + public void visitServerMetricConfig(ServerMetricConfig from) { + ServerMetricConfig to = (ServerMetricConfig) m_objs.peek(); + + mergeServerMetricConfig(to, from); + visitServerMetricConfigChildren(to, from); + } + + protected void visitServerMetricConfigChildren(ServerMetricConfig to, ServerMetricConfig from) { + for (Group source : from.getGroups().values()) { + Group target = to.findGroup(source.getId()); + + if (target == null) { + target = new Group(source.getId()); + to.addGroup(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..ad583f5d11 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultSaxMaker.java @@ -0,0 +1,83 @@ +package com.dianping.cat.home.server.transform; + +import static com.dianping.cat.home.server.Constants.ATTR_CATEGORY; +import static com.dianping.cat.home.server.Constants.ATTR_ID; +import static com.dianping.cat.home.server.Constants.ATTR_TYPE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.server.entity.Group; +import com.dianping.cat.home.server.entity.Item; +import com.dianping.cat.home.server.entity.Segment; +import com.dianping.cat.home.server.entity.ServerMetricConfig; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Group buildGroup(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Group group = new Group(id); + + return group; + } + + @Override + public Item buildItem(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Item item = new Item(id); + + return item; + } + + @Override + public Segment buildSegment(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String category = attributes.getValue(ATTR_CATEGORY); + String type = attributes.getValue(ATTR_TYPE); + Segment segment = new Segment(id); + + if (category != null) { + segment.setCategory(category); + } + + if (type != null) { + segment.setType(type); + } + + return segment; + } + + @Override + public ServerMetricConfig buildServerMetricConfig(Attributes attributes) { + ServerMetricConfig serverMetricConfig = new ServerMetricConfig(); + + return serverMetricConfig; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..c0b1f95e95 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultSaxParser.java @@ -0,0 +1,273 @@ +package com.dianping.cat.home.server.transform; + +import static com.dianping.cat.home.server.Constants.ENTITY_GROUP; +import static com.dianping.cat.home.server.Constants.ENTITY_ITEM; +import static com.dianping.cat.home.server.Constants.ENTITY_SEGMENT; +import static com.dianping.cat.home.server.Constants.ENTITY_SERVER_METRIC_CONFIG; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.server.IEntity; +import com.dianping.cat.home.server.entity.Group; +import com.dianping.cat.home.server.entity.Item; +import com.dianping.cat.home.server.entity.Segment; +import com.dianping.cat.home.server.entity.ServerMetricConfig; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static ServerMetricConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(ServerMetricConfig.class, new InputSource(removeBOM(in))); + } + + public static ServerMetricConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(ServerMetricConfig.class, new InputSource(removeBOM(reader))); + } + + public static ServerMetricConfig parse(String xml) throws SAXException, IOException { + return parseEntity(ServerMetricConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForGroup(Group parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_ITEM.equals(qName)) { + Item item = m_maker.buildItem(attributes); + + m_linker.onItem(parentObj, item); + m_objs.push(item); + } else { + throw new SAXException(String.format("Element(%s) is not expected under group!", qName)); + } + + m_tags.push(qName); + } + + private void parseForItem(Item parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_SEGMENT.equals(qName)) { + Segment segment = m_maker.buildSegment(attributes); + + m_linker.onSegment(parentObj, segment); + m_objs.push(segment); + } else { + throw new SAXException(String.format("Element(%s) is not expected under item!", qName)); + } + + m_tags.push(qName); + } + + private void parseForSegment(Segment parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForServerMetricConfig(ServerMetricConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_GROUP.equals(qName)) { + Group group = m_maker.buildGroup(attributes); + + m_linker.onGroup(parentObj, group); + m_objs.push(group); + } else { + throw new SAXException(String.format("Element(%s) is not expected under server-metric-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_SERVER_METRIC_CONFIG.equals(qName)) { + ServerMetricConfig serverMetricConfig = m_maker.buildServerMetricConfig(attributes); + + m_entity = serverMetricConfig; + m_objs.push(serverMetricConfig); + m_tags.push(qName); + } else if (ENTITY_GROUP.equals(qName)) { + Group group = m_maker.buildGroup(attributes); + + m_entity = group; + m_objs.push(group); + m_tags.push(qName); + } else if (ENTITY_ITEM.equals(qName)) { + Item item = m_maker.buildItem(attributes); + + m_entity = item; + m_objs.push(item); + m_tags.push(qName); + } else if (ENTITY_SEGMENT.equals(qName)) { + Segment segment = m_maker.buildSegment(attributes); + + m_entity = segment; + m_objs.push(segment); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof ServerMetricConfig) { + parseForServerMetricConfig((ServerMetricConfig) parent, tag, qName, attributes); + } else if (parent instanceof Group) { + parseForGroup((Group) parent, tag, qName, attributes); + } else if (parent instanceof Item) { + parseForItem((Item) parent, tag, qName, attributes); + } else if (parent instanceof Segment) { + parseForSegment((Segment) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..08b185aafe --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/transform/DefaultXmlBuilder.java @@ -0,0 +1,244 @@ +package com.dianping.cat.home.server.transform; + +import static com.dianping.cat.home.server.Constants.ATTR_CATEGORY; +import static com.dianping.cat.home.server.Constants.ATTR_ID; +import static com.dianping.cat.home.server.Constants.ATTR_TYPE; +import static com.dianping.cat.home.server.Constants.ENTITY_GROUP; +import static com.dianping.cat.home.server.Constants.ENTITY_ITEM; +import static com.dianping.cat.home.server.Constants.ENTITY_SEGMENT; +import static com.dianping.cat.home.server.Constants.ENTITY_SERVER_METRIC_CONFIG; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.server.IEntity; +import com.dianping.cat.home.server.IVisitor; +import com.dianping.cat.home.server.entity.Group; +import com.dianping.cat.home.server.entity.Item; +import com.dianping.cat.home.server.entity.Segment; +import com.dianping.cat.home.server.entity.ServerMetricConfig; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitGroup(Group group) { + startTag(ENTITY_GROUP, null, ATTR_ID, group.getId()); + + if (!group.getItems().isEmpty()) { + for (Item item : group.getItems().values()) { + item.accept(m_visitor); + } + } + + endTag(ENTITY_GROUP); + } + + @Override + public void visitItem(Item item) { + startTag(ENTITY_ITEM, null, ATTR_ID, item.getId()); + + if (!item.getSegments().isEmpty()) { + for (Segment segment : item.getSegments().values()) { + segment.accept(m_visitor); + } + } + + endTag(ENTITY_ITEM); + } + + @Override + public void visitSegment(Segment segment) { + startTag(ENTITY_SEGMENT, true, null, ATTR_ID, segment.getId(), ATTR_CATEGORY, segment.getCategory(), ATTR_TYPE, segment.getType()); + } + + @Override + public void visitServerMetricConfig(ServerMetricConfig serverMetricConfig) { + startTag(ENTITY_SERVER_METRIC_CONFIG, null); + + if (!serverMetricConfig.getGroups().isEmpty()) { + for (Group group : serverMetricConfig.getGroups().values()) { + group.accept(m_visitor); + } + } + + endTag(ENTITY_SERVER_METRIC_CONFIG); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/server/transform/ILinker.java new file mode 100644 index 0000000000..5e9789bac5 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/transform/ILinker.java @@ -0,0 +1,15 @@ +package com.dianping.cat.home.server.transform; + +import com.dianping.cat.home.server.entity.Group; +import com.dianping.cat.home.server.entity.Item; +import com.dianping.cat.home.server.entity.Segment; +import com.dianping.cat.home.server.entity.ServerMetricConfig; + +public interface ILinker { + + public boolean onGroup(ServerMetricConfig parent, Group group); + + public boolean onItem(Group parent, Item item); + + public boolean onSegment(Item parent, Segment segment); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/server/transform/IMaker.java new file mode 100644 index 0000000000..c47e74edc0 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/transform/IMaker.java @@ -0,0 +1,17 @@ +package com.dianping.cat.home.server.transform; + +import com.dianping.cat.home.server.entity.Group; +import com.dianping.cat.home.server.entity.Item; +import com.dianping.cat.home.server.entity.Segment; +import com.dianping.cat.home.server.entity.ServerMetricConfig; + +public interface IMaker { + + public Group buildGroup(T node); + + public Item buildItem(T node); + + public Segment buildSegment(T node); + + public ServerMetricConfig buildServerMetricConfig(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/server/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/server/transform/IParser.java new file mode 100644 index 0000000000..daaf4279c1 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/server/transform/IParser.java @@ -0,0 +1,16 @@ +package com.dianping.cat.home.server.transform; + +import com.dianping.cat.home.server.entity.Group; +import com.dianping.cat.home.server.entity.Item; +import com.dianping.cat.home.server.entity.Segment; +import com.dianping.cat.home.server.entity.ServerMetricConfig; + +public interface IParser { + public ServerMetricConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForGroup(IMaker maker, ILinker linker, Group parent, T node); + + public void parseForItem(IMaker maker, ILinker linker, Item parent, T node); + + public void parseForSegment(IMaker maker, ILinker linker, Segment parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/service/BaseEntity.java new file mode 100644 index 0000000000..9d6296937f --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/BaseEntity.java @@ -0,0 +1,56 @@ +package com.dianping.cat.home.service; + +import java.util.Formattable; +import java.util.FormattableFlags; +import java.util.Formatter; + +import com.dianping.cat.home.service.transform.DefaultXmlBuilder; +import com.dianping.cat.home.service.transform.DefaultJsonBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String JSON = "%#.3s"; + + public static final String JSON_COMPACT = "%#s"; + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean useJson = (flags & FormattableFlags.ALTERNATE) == FormattableFlags.ALTERNATE; + boolean compact = (precision <= 0); + + if (useJson) { + DefaultJsonBuilder builder = new DefaultJsonBuilder(compact); + + formatter.format("%s", builder.build(this)); + } else { + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/service/Constants.java new file mode 100644 index 0000000000..356a9a57a3 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/Constants.java @@ -0,0 +1,30 @@ +package com.dianping.cat.home.service; + +public class Constants { + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ELEMENT_AVG = "avg"; + + public static final String ELEMENT_FAILURECOUNT = "failureCount"; + + public static final String ELEMENT_FAILUREPERCENT = "failurePercent"; + + public static final String ELEMENT_QPS = "qps"; + + public static final String ELEMENT_SUM = "sum"; + + public static final String ELEMENT_TOTALCOUNT = "totalCount"; + + public static final String ENTITY_DOMAIN = "domain"; + + public static final String ENTITY_DOMAINS = "domains"; + + public static final String ENTITY_SERVICE_REPORT = "service-report"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/service/IEntity.java new file mode 100644 index 0000000000..eed495b22d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.service; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/service/IVisitor.java new file mode 100644 index 0000000000..b4de58fdce --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/IVisitor.java @@ -0,0 +1,11 @@ +package com.dianping.cat.home.service; + +import com.dianping.cat.home.service.entity.Domain; +import com.dianping.cat.home.service.entity.ServiceReport; + +public interface IVisitor { + + public void visitDomain(Domain domain); + + public void visitServiceReport(ServiceReport serviceReport); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/BaseEntity.java new file mode 100644 index 0000000000..dbb7f42e24 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/BaseEntity.java @@ -0,0 +1,56 @@ +package com.dianping.cat.home.service.client; + +import java.util.Formattable; +import java.util.FormattableFlags; +import java.util.Formatter; + +import com.dianping.cat.home.service.client.transform.DefaultXmlBuilder; +import com.dianping.cat.home.service.client.transform.DefaultJsonBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String JSON = "%#.3s"; + + public static final String JSON_COMPACT = "%#s"; + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean useJson = (flags & FormattableFlags.ALTERNATE) == FormattableFlags.ALTERNATE; + boolean compact = (precision <= 0); + + if (useJson) { + DefaultJsonBuilder builder = new DefaultJsonBuilder(compact); + + formatter.format("%s", builder.build(this)); + } else { + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/Constants.java new file mode 100644 index 0000000000..185a7978e6 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/Constants.java @@ -0,0 +1,38 @@ +package com.dianping.cat.home.service.client; + +public class Constants { + + public static final String ATTR_AVG = "avg"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_END_TIME = "end-time"; + + public static final String ATTR_FAILURECOUNT = "failureCount"; + + public static final String ATTR_FAILUREPERCENT = "failurePercent"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_QPS = "qps"; + + public static final String ATTR_SERVICE = "service"; + + public static final String ATTR_START_TIME = "start-time"; + + public static final String ATTR_SUM = "sum"; + + public static final String ATTR_TIMEOUT = "timeout"; + + public static final String ATTR_TOTALCOUNT = "totalCount"; + + public static final String ENTITY_CLIENT_REPORT = "client-report"; + + public static final String ENTITY_DOMAIN = "domain"; + + public static final String ENTITY_DOMAINS = "domains"; + + public static final String ENTITY_METHOD = "method"; + + public static final String ENTITY_METHODS = "methods"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/IEntity.java new file mode 100644 index 0000000000..a67aa9922d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.service.client; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/IVisitor.java new file mode 100644 index 0000000000..236d4cfd26 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/IVisitor.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.service.client; + +import com.dianping.cat.home.service.client.entity.ClientReport; +import com.dianping.cat.home.service.client.entity.Domain; +import com.dianping.cat.home.service.client.entity.Method; + +public interface IVisitor { + + public void visitClientReport(ClientReport clientReport); + + public void visitDomain(Domain domain); + + public void visitMethod(Method method); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/entity/ClientReport.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/entity/ClientReport.java new file mode 100644 index 0000000000..74fb42ef54 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/entity/ClientReport.java @@ -0,0 +1,131 @@ +package com.dianping.cat.home.service.client.entity; + +import static com.dianping.cat.home.service.client.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.service.client.Constants.ENTITY_CLIENT_REPORT; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.service.client.BaseEntity; +import com.dianping.cat.home.service.client.IVisitor; + +public class ClientReport extends BaseEntity { + private String m_domain; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Map m_domains = new LinkedHashMap(); + + public ClientReport() { + } + + public ClientReport(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitClientReport(this); + } + + public ClientReport addDomain(Domain domain) { + m_domains.put(domain.getId(), domain); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ClientReport) { + ClientReport _o = (ClientReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public Domain findDomain(String id) { + return m_domains.get(id); + } + + public Domain findOrCreateDomain(String id) { + Domain domain = m_domains.get(id); + + if (domain == null) { + synchronized (m_domains) { + domain = m_domains.get(id); + + if (domain == null) { + domain = new Domain(id); + m_domains.put(id, domain); + } + } + } + + return domain; + } + + public String getDomain() { + return m_domain; + } + + public Map getDomains() { + return m_domains; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ClientReport other) { + assertAttributeEquals(other, ENTITY_CLIENT_REPORT, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Domain removeDomain(String id) { + return m_domains.remove(id); + } + + public ClientReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public ClientReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public ClientReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/entity/Domain.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/entity/Domain.java new file mode 100644 index 0000000000..ef766937e3 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/entity/Domain.java @@ -0,0 +1,196 @@ +package com.dianping.cat.home.service.client.entity; + +import static com.dianping.cat.home.service.client.Constants.ATTR_ID; +import static com.dianping.cat.home.service.client.Constants.ENTITY_DOMAIN; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.service.client.BaseEntity; +import com.dianping.cat.home.service.client.IVisitor; + +public class Domain extends BaseEntity { + private String m_id; + + private long m_totalCount; + + private long m_failureCount; + + private double m_failurePercent; + + private double m_sum; + + private double m_avg; + + private Map m_methods = new LinkedHashMap(); + + public Domain() { + } + + public Domain(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomain(this); + } + + public Domain addMethod(Method method) { + m_methods.put(method.getId(), method); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Domain) { + Domain _o = (Domain) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Method findMethod(String id) { + return m_methods.get(id); + } + + public Method findOrCreateMethod(String id) { + Method method = m_methods.get(id); + + if (method == null) { + synchronized (m_methods) { + method = m_methods.get(id); + + if (method == null) { + method = new Method(id); + m_methods.put(id, method); + } + } + } + + return method; + } + + public double getAvg() { + return m_avg; + } + + public long getFailureCount() { + return m_failureCount; + } + + public double getFailurePercent() { + return m_failurePercent; + } + + public String getId() { + return m_id; + } + + public Map getMethods() { + return m_methods; + } + + public double getSum() { + return m_sum; + } + + public long getTotalCount() { + return m_totalCount; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public Domain incFailureCount() { + m_failureCount++; + return this; + } + + public Domain incFailureCount(long failureCount) { + m_failureCount += failureCount; + return this; + } + + public Domain incSum() { + m_sum++; + return this; + } + + public Domain incSum(double sum) { + m_sum += sum; + return this; + } + + public Domain incTotalCount() { + m_totalCount++; + return this; + } + + public Domain incTotalCount(long totalCount) { + m_totalCount += totalCount; + return this; + } + + @Override + public void mergeAttributes(Domain other) { + assertAttributeEquals(other, ENTITY_DOMAIN, ATTR_ID, m_id, other.getId()); + + m_totalCount = other.getTotalCount(); + + m_failureCount = other.getFailureCount(); + + m_failurePercent = other.getFailurePercent(); + + m_sum = other.getSum(); + + m_avg = other.getAvg(); + } + + public Method removeMethod(String id) { + return m_methods.remove(id); + } + + public Domain setAvg(double avg) { + m_avg = avg; + return this; + } + + public Domain setFailureCount(long failureCount) { + m_failureCount = failureCount; + return this; + } + + public Domain setFailurePercent(double failurePercent) { + m_failurePercent = failurePercent; + return this; + } + + public Domain setId(String id) { + m_id = id; + return this; + } + + public Domain setSum(double sum) { + m_sum = sum; + return this; + } + + public Domain setTotalCount(long totalCount) { + m_totalCount = totalCount; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/entity/Method.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/entity/Method.java new file mode 100644 index 0000000000..03687b4696 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/entity/Method.java @@ -0,0 +1,198 @@ +package com.dianping.cat.home.service.client.entity; + +import static com.dianping.cat.home.service.client.Constants.ATTR_ID; +import static com.dianping.cat.home.service.client.Constants.ENTITY_METHOD; + +import com.dianping.cat.home.service.client.BaseEntity; +import com.dianping.cat.home.service.client.IVisitor; + +public class Method extends BaseEntity { + private String m_id; + + private String m_service; + + private long m_totalCount; + + private long m_failureCount; + + private double m_failurePercent; + + private double m_sum; + + private double m_avg; + + private double m_qps; + + private double m_timeout; + + public Method() { + } + + public Method(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMethod(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Method) { + Method _o = (Method) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public double getAvg() { + return m_avg; + } + + public long getFailureCount() { + return m_failureCount; + } + + public double getFailurePercent() { + return m_failurePercent; + } + + public String getId() { + return m_id; + } + + public double getQps() { + return m_qps; + } + + public String getService() { + return m_service; + } + + public double getSum() { + return m_sum; + } + + public double getTimeout() { + return m_timeout; + } + + public long getTotalCount() { + return m_totalCount; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public Method incFailureCount() { + m_failureCount++; + return this; + } + + public Method incFailureCount(long failureCount) { + m_failureCount += failureCount; + return this; + } + + public Method incSum() { + m_sum++; + return this; + } + + public Method incSum(double sum) { + m_sum += sum; + return this; + } + + public Method incTotalCount() { + m_totalCount++; + return this; + } + + public Method incTotalCount(long totalCount) { + m_totalCount += totalCount; + return this; + } + + @Override + public void mergeAttributes(Method other) { + assertAttributeEquals(other, ENTITY_METHOD, ATTR_ID, m_id, other.getId()); + + if (other.getService() != null) { + m_service = other.getService(); + } + + m_totalCount = other.getTotalCount(); + + m_failureCount = other.getFailureCount(); + + m_failurePercent = other.getFailurePercent(); + + m_sum = other.getSum(); + + m_avg = other.getAvg(); + + m_qps = other.getQps(); + + m_timeout = other.getTimeout(); + } + + public Method setAvg(double avg) { + m_avg = avg; + return this; + } + + public Method setFailureCount(long failureCount) { + m_failureCount = failureCount; + return this; + } + + public Method setFailurePercent(double failurePercent) { + m_failurePercent = failurePercent; + return this; + } + + public Method setId(String id) { + m_id = id; + return this; + } + + public Method setQps(double qps) { + m_qps = qps; + return this; + } + + public Method setService(String service) { + m_service = service; + return this; + } + + public Method setSum(double sum) { + m_sum = sum; + return this; + } + + public Method setTimeout(double timeout) { + m_timeout = timeout; + return this; + } + + public Method setTotalCount(long totalCount) { + m_totalCount = totalCount; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/BaseVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/BaseVisitor.java new file mode 100644 index 0000000000..3b59e3d5f4 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/BaseVisitor.java @@ -0,0 +1,26 @@ +package com.dianping.cat.home.service.client.transform; + +import com.dianping.cat.home.service.client.IVisitor; +import com.dianping.cat.home.service.client.entity.ClientReport; +import com.dianping.cat.home.service.client.entity.Domain; +import com.dianping.cat.home.service.client.entity.Method; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitClientReport(ClientReport clientReport) { + for (Domain domain : clientReport.getDomains().values()) { + visitDomain(domain); + } + } + + @Override + public void visitDomain(Domain domain) { + for (Method method : domain.getMethods().values()) { + visitMethod(method); + } + } + + @Override + public void visitMethod(Method method) { + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultJsonBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultJsonBuilder.java new file mode 100644 index 0000000000..d18e57c6ff --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultJsonBuilder.java @@ -0,0 +1,297 @@ +package com.dianping.cat.home.service.client.transform; + +import static com.dianping.cat.home.service.client.Constants.ATTR_AVG; +import static com.dianping.cat.home.service.client.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.service.client.Constants.ATTR_END_TIME; +import static com.dianping.cat.home.service.client.Constants.ATTR_FAILURECOUNT; +import static com.dianping.cat.home.service.client.Constants.ATTR_FAILUREPERCENT; +import static com.dianping.cat.home.service.client.Constants.ATTR_ID; +import static com.dianping.cat.home.service.client.Constants.ATTR_QPS; +import static com.dianping.cat.home.service.client.Constants.ATTR_SERVICE; +import static com.dianping.cat.home.service.client.Constants.ATTR_START_TIME; +import static com.dianping.cat.home.service.client.Constants.ATTR_SUM; +import static com.dianping.cat.home.service.client.Constants.ATTR_TIMEOUT; +import static com.dianping.cat.home.service.client.Constants.ATTR_TOTALCOUNT; +import static com.dianping.cat.home.service.client.Constants.ENTITY_DOMAINS; +import static com.dianping.cat.home.service.client.Constants.ENTITY_METHODS; + +import java.lang.reflect.Array; +import java.util.Collection; +import java.util.Map; + +import com.dianping.cat.home.service.client.IEntity; +import com.dianping.cat.home.service.client.IVisitor; +import com.dianping.cat.home.service.client.entity.ClientReport; +import com.dianping.cat.home.service.client.entity.Domain; +import com.dianping.cat.home.service.client.entity.Method; + +public class DefaultJsonBuilder implements IVisitor { + + private IVisitor m_visitor; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultJsonBuilder() { + this(false); + } + + public DefaultJsonBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultJsonBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_visitor = this; + } + + protected void arrayBegin(String name) { + indent(); + m_sb.append('"').append(name).append(m_compact ? "\":[" : "\": [\r\n"); + m_level++; + } + + protected void arrayEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append("],").append(m_compact ? "" : "\r\n"); + } + + protected void attributes(Map dynamicAttributes, Object... nameValues) { + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + if (attrValue instanceof Collection) { + @SuppressWarnings("unchecked") + Collection items = (Collection) attrValue; + + if (!items.isEmpty()) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (Object item : items) { + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else if (attrValue.getClass().isArray()) { + int length = Array.getLength(attrValue); + + if (length > 0) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (int j = 0; j < length; j++) { + Object item = Array.get(attrValue, j); + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else { + if (m_compact) { + m_sb.append('"').append(attrName).append("\":"); + toString(m_sb, attrValue); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(attrName).append("\": "); + toString(m_sb, attrValue); + m_sb.append(",\r\n"); + } + } + } + } + + if (dynamicAttributes != null) { + for (Map.Entry e : dynamicAttributes.entrySet()) { + if (m_compact) { + m_sb.append('"').append(e.getKey()).append("\":"); + toString(m_sb, e.getValue()); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(e.getKey()).append("\": "); + toString(m_sb, e.getValue()); + m_sb.append(",\r\n"); + } + } + } + } + + public String build(IEntity entity) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + trimComma(); + + return m_sb.toString(); + } + + public String buildArray(Collection> entities) { + m_sb.append('['); + + if (entities != null) { + for (IEntity entity : entities) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + } + + trimComma(); + } + + m_sb.append(']'); + + return m_sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void objectBegin(String name) { + indent(); + + if (name == null) { + m_sb.append("{").append(m_compact ? "" : "\r\n"); + } else { + m_sb.append('"').append(name).append(m_compact ? "\":{" : "\": {\r\n"); + } + + m_level++; + } + + protected void objectEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append(m_compact ? "}," : "},\r\n"); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + protected void toString(StringBuilder sb, Object value) { + if (value == null) { + sb.append("null"); + } else if (value instanceof Boolean || value instanceof Number) { + sb.append(value); + } else { + String val = value.toString(); + int len = val.length(); + + sb.append('"'); + + for (int i = 0; i < len; i++) { + char ch = val.charAt(i); + + switch (ch) { + case '\\': + case '/': + case '"': + sb.append('\\').append(ch); + break; + case '\t': + sb.append("\\t"); + break; + case '\r': + sb.append("\\r"); + break; + case '\n': + sb.append("\\n"); + break; + default: + sb.append(ch); + break; + } + } + + sb.append('"'); + } + } + + protected void trimComma() { + int len = m_sb.length(); + + if (m_compact) { + if (len > 1 && m_sb.charAt(len - 1) == ',') { + m_sb.replace(len - 1, len, ""); + } + } else { + if (len > 3 && m_sb.charAt(len - 3) == ',') { + m_sb.replace(len - 3, len - 2, ""); + } + } + } + + @Override + public void visitClientReport(ClientReport clientReport) { + attributes(null, ATTR_DOMAIN, clientReport.getDomain(), ATTR_START_TIME, toString(clientReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_END_TIME, toString(clientReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!clientReport.getDomains().isEmpty()) { + objectBegin(ENTITY_DOMAINS); + + for (Map.Entry e : clientReport.getDomains().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_DOMAINS); + } + } + + @Override + public void visitDomain(Domain domain) { + attributes(null, ATTR_ID, domain.getId(), ATTR_TOTALCOUNT, domain.getTotalCount(), ATTR_FAILURECOUNT, domain.getFailureCount(), ATTR_FAILUREPERCENT, domain.getFailurePercent(), ATTR_SUM, domain.getSum(), ATTR_AVG, domain.getAvg()); + + if (!domain.getMethods().isEmpty()) { + objectBegin(ENTITY_METHODS); + + for (Map.Entry e : domain.getMethods().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_METHODS); + } + } + + @Override + public void visitMethod(Method method) { + attributes(null, ATTR_ID, method.getId(), ATTR_SERVICE, method.getService(), ATTR_TOTALCOUNT, method.getTotalCount(), ATTR_FAILURECOUNT, method.getFailureCount(), ATTR_FAILUREPERCENT, method.getFailurePercent(), ATTR_SUM, method.getSum(), ATTR_AVG, method.getAvg(), ATTR_QPS, method.getQps(), ATTR_TIMEOUT, method.getTimeout()); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultJsonParser.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultJsonParser.java new file mode 100644 index 0000000000..2061be8224 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultJsonParser.java @@ -0,0 +1,421 @@ +package com.dianping.cat.home.service.client.transform; + +import static com.dianping.cat.home.service.client.Constants.ATTR_AVG; +import static com.dianping.cat.home.service.client.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.service.client.Constants.ATTR_END_TIME; +import static com.dianping.cat.home.service.client.Constants.ATTR_FAILURECOUNT; +import static com.dianping.cat.home.service.client.Constants.ATTR_FAILUREPERCENT; +import static com.dianping.cat.home.service.client.Constants.ATTR_ID; +import static com.dianping.cat.home.service.client.Constants.ATTR_QPS; +import static com.dianping.cat.home.service.client.Constants.ATTR_SERVICE; +import static com.dianping.cat.home.service.client.Constants.ATTR_START_TIME; +import static com.dianping.cat.home.service.client.Constants.ATTR_SUM; +import static com.dianping.cat.home.service.client.Constants.ATTR_TIMEOUT; +import static com.dianping.cat.home.service.client.Constants.ATTR_TOTALCOUNT; +import static com.dianping.cat.home.service.client.Constants.ENTITY_DOMAINS; +import static com.dianping.cat.home.service.client.Constants.ENTITY_METHODS; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.dianping.cat.home.service.client.IEntity; +import com.dianping.cat.home.service.client.entity.ClientReport; +import com.dianping.cat.home.service.client.entity.Domain; +import com.dianping.cat.home.service.client.entity.Method; + +public class DefaultJsonParser { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private List m_entities = new ArrayList(); + + private Class m_entityClass; + + private DefaultJsonParser(Class entityClass) { + m_entityClass = entityClass; + } + + public static > T parse(Class entityClass, InputStream in) throws IOException { + return parse(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > T parse(Class entityClass, Reader reader) throws IOException { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.onArrayBegin(); + parser.parse(new JsonReader(reader)); + parser.onArrayEnd(); + + if (parser.m_entities.isEmpty()) { + return null; + } else { + return (T) parser.m_entities.get(0); + } + } + + public static > T parse(Class entityClass, String json) throws IOException { + return parse(entityClass, new StringReader(json)); + } + + public static > List parseArray(Class entityClass, InputStream in) throws Exception { + return parseArray(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > List parseArray(Class entityClass, Reader reader) throws Exception { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.parse(new JsonReader(reader)); + return (List) (List) parser.m_entities; + } + + public static > List parseArray(Class entityClass, String json) throws Exception { + return parseArray(entityClass, new StringReader(json)); + } + + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + private Object createRootEntity() { + try { + Object entity = m_entityClass.newInstance(); + + return entity; + } catch (Exception e) { + throw new RuntimeException(String.format("Unable to create entity(%s) instance!", m_entityClass.getName()), e); + } + } + + private boolean isTopLevel() { + return m_objs.size() == 1; + } + + protected void onArrayBegin() { + if (m_objs.isEmpty()) { + m_objs.push(m_entities); + m_tags.push(""); + } } + + protected void onArrayEnd() { + m_objs.pop(); + m_tags.pop(); + + } + protected void onName(String name) { + m_tags.push(name); + } + + protected void onObjectBegin() { + if (isTopLevel()) { + m_objs.push(createRootEntity()); + m_tags.push(""); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof ClientReport) { + if (ENTITY_DOMAINS.equals(tag)) { + m_objs.push(parent); + } else { + String parentTag = m_tags.size() >= 2 ? m_tags.get(m_tags.size() - 2) : null; + + if (ENTITY_DOMAINS.equals(parentTag)) { + Domain domains = new Domain(); + + m_linker.onDomain((ClientReport) parent, domains); + m_objs.push(domains); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } else if (parent instanceof Domain) { + if (ENTITY_METHODS.equals(tag)) { + m_objs.push(parent); + } else { + String parentTag = m_tags.size() >= 2 ? m_tags.get(m_tags.size() - 2) : null; + + if (ENTITY_METHODS.equals(parentTag)) { + Method methods = new Method(); + + m_linker.onMethod((Domain) parent, methods); + m_objs.push(methods); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } + + protected void onObjectEnd() { + m_tags.pop(); + + Object entity = m_objs.pop(); + + if (isTopLevel()) { + m_entities.add(entity); + } + } + + protected void onValue(String value) { + Object parent = m_objs.peek(); + String tag = m_tags.pop(); + + if (parent instanceof ClientReport) { + parseForClientReport((ClientReport) parent, tag, value); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, value); + } else if (parent instanceof Method) { + parseForMethod((Method) parent, tag, value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) under %s!", tag, parent)); + } + } + + private void parse(JsonReader reader) throws IOException { + try { + reader.parse(this); + } catch (EOFException e) { + if (m_objs.size() > 1) { + throw new EOFException(String.format("Unexpected end while parsing json! tags: %s.", m_tags)); + } + } + + m_linker.finish(); + } + + public void parseForClientReport(ClientReport clientReport, String tag, String value) { + if (ENTITY_DOMAINS.equals(tag)) { + // do nothing here + } else if (ATTR_DOMAIN.equals(tag)) { + clientReport.setDomain(value); + } else if (ATTR_START_TIME.equals(tag)) { + clientReport.setStartTime(toDate(value, "yyyy-MM-dd HH:mm:ss")); + } else if (ATTR_END_TIME.equals(tag)) { + clientReport.setEndTime(toDate(value, "yyyy-MM-dd HH:mm:ss")); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, clientReport, m_tags)); + } + } + + public void parseForDomain(Domain domain, String tag, String value) { + if (ENTITY_METHODS.equals(tag)) { + // do nothing here + } else if (ATTR_ID.equals(tag)) { + domain.setId(value); + } else if (ATTR_TOTALCOUNT.equals(tag)) { + domain.setTotalCount(convert(Long.class, value, 0L)); + } else if (ATTR_FAILURECOUNT.equals(tag)) { + domain.setFailureCount(convert(Long.class, value, 0L)); + } else if (ATTR_FAILUREPERCENT.equals(tag)) { + domain.setFailurePercent(convert(Double.class, value, 0.0)); + } else if (ATTR_SUM.equals(tag)) { + domain.setSum(convert(Double.class, value, 0.0)); + } else if (ATTR_AVG.equals(tag)) { + domain.setAvg(convert(Double.class, value, 0.0)); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, domain, m_tags)); + } + } + + public void parseForMethod(Method method, String tag, String value) { + if (ATTR_ID.equals(tag)) { + method.setId(value); + } else if (ATTR_SERVICE.equals(tag)) { + method.setService(value); + } else if (ATTR_TOTALCOUNT.equals(tag)) { + method.setTotalCount(convert(Long.class, value, 0L)); + } else if (ATTR_FAILURECOUNT.equals(tag)) { + method.setFailureCount(convert(Long.class, value, 0L)); + } else if (ATTR_FAILUREPERCENT.equals(tag)) { + method.setFailurePercent(convert(Double.class, value, 0.0)); + } else if (ATTR_SUM.equals(tag)) { + method.setSum(convert(Double.class, value, 0.0)); + } else if (ATTR_AVG.equals(tag)) { + method.setAvg(convert(Double.class, value, 0.0)); + } else if (ATTR_QPS.equals(tag)) { + method.setQps(convert(Double.class, value, 0.0)); + } else if (ATTR_TIMEOUT.equals(tag)) { + method.setTimeout(convert(Double.class, value, 0.0)); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, method, m_tags)); + } + } + + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + static class JsonReader { + private Reader m_reader; + + private char[] m_buffer = new char[2048]; + + private int m_size; + + private int m_index; + + public JsonReader(Reader reader) { + m_reader = reader; + } + + private char next() throws IOException { + if (m_index >= m_size) { + m_size = m_reader.read(m_buffer); + m_index = 0; + + if (m_size == -1) { + throw new EOFException(); + } + } + + return m_buffer[m_index++]; + } + + public void parse(DefaultJsonParser parser) throws IOException { + StringBuilder sb = new StringBuilder(); + boolean flag = false; + + while (true) { + char ch = next(); + + switch (ch) { + case ' ': + case '\t': + case '\r': + case '\n': + break; + case '{': + parser.onObjectBegin(); + flag = false; + break; + case '}': + if (flag) { // have value + parser.onValue(sb.toString()); + sb.setLength(0); + } + + parser.onObjectEnd(); + flag = false; + break; + case '\'': + case '"': + while (true) { + char ch2 = next(); + + if (ch2 != ch) { + if (ch2 == '\\') { + char ch3 = next(); + + switch (ch3) { + case 't': + sb.append('\t'); + break; + case 'r': + sb.append('\r'); + break; + case 'n': + sb.append('\n'); + break; + default: + sb.append(ch3); + break; + } + } else { + sb.append(ch2); + } + } else { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + flag = false; + } + + sb.setLength(0); + break; + } + } + + break; + case ':': + if (sb.length() != 0) { + parser.onName(sb.toString()); + sb.setLength(0); + } + + flag = true; + break; + case ',': + if (sb.length() != 0) { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + } + + sb.setLength(0); + } + + flag = false; + break; + case '[': + parser.onArrayBegin(); + flag = false; + break; + case ']': + parser.onArrayEnd(); + flag = false; + break; + default: + sb.append(ch); + break; + } + } + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultLinker.java new file mode 100644 index 0000000000..136374d9da --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultLinker.java @@ -0,0 +1,55 @@ +package com.dianping.cat.home.service.client.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.service.client.entity.ClientReport; +import com.dianping.cat.home.service.client.entity.Domain; +import com.dianping.cat.home.service.client.entity.Method; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDomain(final ClientReport parent, final Domain domain) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDomain(domain); + } + }); + } else { + parent.addDomain(domain); + } + + return true; + } + + @Override + public boolean onMethod(final Domain parent, final Method method) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addMethod(method); + } + }); + } else { + parent.addMethod(method); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultMerger.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultMerger.java new file mode 100644 index 0000000000..cd284b4dad --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultMerger.java @@ -0,0 +1,107 @@ +package com.dianping.cat.home.service.client.transform; + +import java.util.Stack; + +import com.dianping.cat.home.service.client.IEntity; +import com.dianping.cat.home.service.client.IVisitor; +import com.dianping.cat.home.service.client.entity.ClientReport; +import com.dianping.cat.home.service.client.entity.Domain; +import com.dianping.cat.home.service.client.entity.Method; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private ClientReport m_clientReport; + + public DefaultMerger() { + } + + public DefaultMerger(ClientReport clientReport) { + m_clientReport = clientReport; + m_objs.push(clientReport); + } + + public ClientReport getClientReport() { + return m_clientReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeClientReport(ClientReport to, ClientReport from) { + to.mergeAttributes(from); + } + + protected void mergeDomain(Domain to, Domain from) { + to.mergeAttributes(from); + } + + protected void mergeMethod(Method to, Method from) { + to.mergeAttributes(from); + } + + @Override + public void visitClientReport(ClientReport from) { + ClientReport to = (ClientReport) m_objs.peek(); + + mergeClientReport(to, from); + visitClientReportChildren(to, from); + } + + protected void visitClientReportChildren(ClientReport to, ClientReport from) { + for (Domain source : from.getDomains().values()) { + Domain target = to.findDomain(source.getId()); + + if (target == null) { + target = new Domain(source.getId()); + to.addDomain(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitDomain(Domain from) { + Domain to = (Domain) m_objs.peek(); + + mergeDomain(to, from); + visitDomainChildren(to, from); + } + + protected void visitDomainChildren(Domain to, Domain from) { + for (Method source : from.getMethods().values()) { + Method target = to.findMethod(source.getId()); + + if (target == null) { + target = new Method(source.getId()); + to.addMethod(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitMethod(Method from) { + Method to = (Method) m_objs.peek(); + + mergeMethod(to, from); + visitMethodChildren(to, from); + } + + protected void visitMethodChildren(Method to, Method from) { + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultNativeBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..74718ff424 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultNativeBuilder.java @@ -0,0 +1,199 @@ +package com.dianping.cat.home.service.client.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.home.service.client.IVisitor; +import com.dianping.cat.home.service.client.entity.ClientReport; +import com.dianping.cat.home.service.client.entity.Domain; +import com.dianping.cat.home.service.client.entity.Method; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(ClientReport clientReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(clientReport, out); + return out.toByteArray(); + } + + public static void build(ClientReport clientReport, OutputStream out) { + clientReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitClientReport(ClientReport clientReport) { + writeTag(63, 0); + + if (clientReport.getDomain() != null) { + writeTag(1, 1); + writeString(clientReport.getDomain()); + } + + if (clientReport.getStartTime() != null) { + writeTag(2, 1); + writeDate(clientReport.getStartTime()); + } + + if (clientReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(clientReport.getEndTime()); + } + + if (!clientReport.getDomains().isEmpty()) { + writeTag(33, 2); + writeInt(clientReport.getDomains().size()); + + for (Domain domain : clientReport.getDomains().values()) { + domain.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitDomain(Domain domain) { + if (domain.getId() != null) { + writeTag(1, 1); + writeString(domain.getId()); + } + + writeTag(2, 0); + writeLong(domain.getTotalCount()); + + writeTag(3, 0); + writeLong(domain.getFailureCount()); + + writeTag(4, 0); + writeDouble(domain.getFailurePercent()); + + writeTag(5, 0); + writeDouble(domain.getSum()); + + writeTag(6, 0); + writeDouble(domain.getAvg()); + + if (!domain.getMethods().isEmpty()) { + writeTag(33, 2); + writeInt(domain.getMethods().size()); + + for (Method method : domain.getMethods().values()) { + method.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitMethod(Method method) { + if (method.getId() != null) { + writeTag(1, 1); + writeString(method.getId()); + } + + if (method.getService() != null) { + writeTag(2, 1); + writeString(method.getService()); + } + + writeTag(3, 0); + writeLong(method.getTotalCount()); + + writeTag(4, 0); + writeLong(method.getFailureCount()); + + writeTag(5, 0); + writeDouble(method.getFailurePercent()); + + writeTag(6, 0); + writeDouble(method.getSum()); + + writeTag(7, 0); + writeDouble(method.getAvg()); + + writeTag(8, 0); + writeDouble(method.getQps()); + + writeTag(9, 0); + writeDouble(method.getTimeout()); + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeDouble(double value) { + try { + writeVarint(Double.doubleToLongBits(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeLong(long value) { + try { + writeVarint(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultNativeParser.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..7c2b56f092 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultNativeParser.java @@ -0,0 +1,238 @@ +package com.dianping.cat.home.service.client.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.home.service.client.IVisitor; +import com.dianping.cat.home.service.client.entity.ClientReport; +import com.dianping.cat.home.service.client.entity.Domain; +import com.dianping.cat.home.service.client.entity.Method; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static ClientReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static ClientReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + ClientReport clientReport = new ClientReport(); + + try { + clientReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return clientReport; + } + + @Override + public void visitClientReport(ClientReport clientReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitClientReportChildren(clientReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitClientReportChildren(ClientReport clientReport, int _field, int _type) { + switch (_field) { + case 1: + clientReport.setDomain(readString()); + break; + case 2: + clientReport.setStartTime(readDate()); + break; + case 3: + clientReport.setEndTime(readDate()); + break; + case 33: + if (_type == 1) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(clientReport, domain); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(clientReport, domain); + } + } + break; + } + } + + @Override + public void visitDomain(Domain domain) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDomainChildren(domain, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDomainChildren(Domain domain, int _field, int _type) { + switch (_field) { + case 1: + domain.setId(readString()); + break; + case 2: + domain.setTotalCount(readLong()); + break; + case 3: + domain.setFailureCount(readLong()); + break; + case 4: + domain.setFailurePercent(readDouble()); + break; + case 5: + domain.setSum(readDouble()); + break; + case 6: + domain.setAvg(readDouble()); + break; + case 33: + if (_type == 1) { + Method method = new Method(); + + visitMethod(method); + m_linker.onMethod(domain, method); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Method method = new Method(); + + visitMethod(method); + m_linker.onMethod(domain, method); + } + } + break; + } + } + + @Override + public void visitMethod(Method method) { + byte tag; + + while ((tag = readTag()) != -1) { + visitMethodChildren(method, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitMethodChildren(Method method, int _field, int _type) { + switch (_field) { + case 1: + method.setId(readString()); + break; + case 2: + method.setService(readString()); + break; + case 3: + method.setTotalCount(readLong()); + break; + case 4: + method.setFailureCount(readLong()); + break; + case 5: + method.setFailurePercent(readDouble()); + break; + case 6: + method.setSum(readDouble()); + break; + case 7: + method.setAvg(readDouble()); + break; + case 8: + method.setQps(readDouble()); + break; + case 9: + method.setTimeout(readDouble()); + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private double readDouble() { + try { + return Double.longBitsToDouble(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private long readLong() { + try { + return readVarint(64); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..3fd0d75448 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultSaxMaker.java @@ -0,0 +1,161 @@ +package com.dianping.cat.home.service.client.transform; + +import static com.dianping.cat.home.service.client.Constants.ATTR_AVG; +import static com.dianping.cat.home.service.client.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.service.client.Constants.ATTR_END_TIME; +import static com.dianping.cat.home.service.client.Constants.ATTR_FAILURECOUNT; +import static com.dianping.cat.home.service.client.Constants.ATTR_FAILUREPERCENT; +import static com.dianping.cat.home.service.client.Constants.ATTR_ID; +import static com.dianping.cat.home.service.client.Constants.ATTR_QPS; +import static com.dianping.cat.home.service.client.Constants.ATTR_SERVICE; +import static com.dianping.cat.home.service.client.Constants.ATTR_START_TIME; +import static com.dianping.cat.home.service.client.Constants.ATTR_SUM; +import static com.dianping.cat.home.service.client.Constants.ATTR_TIMEOUT; +import static com.dianping.cat.home.service.client.Constants.ATTR_TOTALCOUNT; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.service.client.entity.ClientReport; +import com.dianping.cat.home.service.client.entity.Domain; +import com.dianping.cat.home.service.client.entity.Method; + +public class DefaultSaxMaker implements IMaker { + + @Override + public ClientReport buildClientReport(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String startTime = attributes.getValue(ATTR_START_TIME); + String endTime = attributes.getValue(ATTR_END_TIME); + ClientReport clientReport = new ClientReport(domain); + + if (startTime != null) { + clientReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + clientReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return clientReport; + } + + @Override + public Domain buildDomain(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String totalCount = attributes.getValue(ATTR_TOTALCOUNT); + String failureCount = attributes.getValue(ATTR_FAILURECOUNT); + String failurePercent = attributes.getValue(ATTR_FAILUREPERCENT); + String sum = attributes.getValue(ATTR_SUM); + String avg = attributes.getValue(ATTR_AVG); + Domain domain = new Domain(id); + + if (totalCount != null) { + domain.setTotalCount(convert(Long.class, totalCount, 0L)); + } + + if (failureCount != null) { + domain.setFailureCount(convert(Long.class, failureCount, 0L)); + } + + if (failurePercent != null) { + domain.setFailurePercent(convert(Double.class, failurePercent, 0.0)); + } + + if (sum != null) { + domain.setSum(convert(Double.class, sum, 0.0)); + } + + if (avg != null) { + domain.setAvg(convert(Double.class, avg, 0.0)); + } + + return domain; + } + + @Override + public Method buildMethod(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String service = attributes.getValue(ATTR_SERVICE); + String totalCount = attributes.getValue(ATTR_TOTALCOUNT); + String failureCount = attributes.getValue(ATTR_FAILURECOUNT); + String failurePercent = attributes.getValue(ATTR_FAILUREPERCENT); + String sum = attributes.getValue(ATTR_SUM); + String avg = attributes.getValue(ATTR_AVG); + String qps = attributes.getValue(ATTR_QPS); + String timeout = attributes.getValue(ATTR_TIMEOUT); + Method method = new Method(id); + + if (service != null) { + method.setService(service); + } + + if (totalCount != null) { + method.setTotalCount(convert(Long.class, totalCount, 0L)); + } + + if (failureCount != null) { + method.setFailureCount(convert(Long.class, failureCount, 0L)); + } + + if (failurePercent != null) { + method.setFailurePercent(convert(Double.class, failurePercent, 0.0)); + } + + if (sum != null) { + method.setSum(convert(Double.class, sum, 0.0)); + } + + if (avg != null) { + method.setAvg(convert(Double.class, avg, 0.0)); + } + + if (qps != null) { + method.setQps(convert(Double.class, qps, 0.0)); + } + + if (timeout != null) { + method.setTimeout(convert(Double.class, timeout, 0.0)); + } + + return method; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..44ec350aca --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultSaxParser.java @@ -0,0 +1,258 @@ +package com.dianping.cat.home.service.client.transform; + +import static com.dianping.cat.home.service.client.Constants.ENTITY_CLIENT_REPORT; +import static com.dianping.cat.home.service.client.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.home.service.client.Constants.ENTITY_METHOD; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.service.client.IEntity; +import com.dianping.cat.home.service.client.entity.ClientReport; +import com.dianping.cat.home.service.client.entity.Domain; +import com.dianping.cat.home.service.client.entity.Method; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static ClientReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(ClientReport.class, new InputSource(removeBOM(in))); + } + + public static ClientReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(ClientReport.class, new InputSource(removeBOM(reader))); + } + + public static ClientReport parse(String xml) throws SAXException, IOException { + return parseEntity(ClientReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForClientReport(ClientReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_linker.onDomain(parentObj, domain); + m_objs.push(domain); + } else { + throw new SAXException(String.format("Element(%s) is not expected under client-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseForDomain(Domain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_METHOD.equals(qName)) { + Method method = m_maker.buildMethod(attributes); + + m_linker.onMethod(parentObj, method); + m_objs.push(method); + } else { + throw new SAXException(String.format("Element(%s) is not expected under domain!", qName)); + } + + m_tags.push(qName); + } + + private void parseForMethod(Method parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_CLIENT_REPORT.equals(qName)) { + ClientReport clientReport = m_maker.buildClientReport(attributes); + + m_entity = clientReport; + m_objs.push(clientReport); + m_tags.push(qName); + } else if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_entity = domain; + m_objs.push(domain); + m_tags.push(qName); + } else if (ENTITY_METHOD.equals(qName)) { + Method method = m_maker.buildMethod(attributes); + + m_entity = method; + m_objs.push(method); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof ClientReport) { + parseForClientReport((ClientReport) parent, tag, qName, attributes); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, qName, attributes); + } else if (parent instanceof Method) { + parseForMethod((Method) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..e17b1f523b --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/DefaultXmlBuilder.java @@ -0,0 +1,246 @@ +package com.dianping.cat.home.service.client.transform; + +import static com.dianping.cat.home.service.client.Constants.ATTR_AVG; +import static com.dianping.cat.home.service.client.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.service.client.Constants.ATTR_END_TIME; +import static com.dianping.cat.home.service.client.Constants.ATTR_FAILURECOUNT; +import static com.dianping.cat.home.service.client.Constants.ATTR_FAILUREPERCENT; +import static com.dianping.cat.home.service.client.Constants.ATTR_ID; +import static com.dianping.cat.home.service.client.Constants.ATTR_QPS; +import static com.dianping.cat.home.service.client.Constants.ATTR_SERVICE; +import static com.dianping.cat.home.service.client.Constants.ATTR_START_TIME; +import static com.dianping.cat.home.service.client.Constants.ATTR_SUM; +import static com.dianping.cat.home.service.client.Constants.ATTR_TIMEOUT; +import static com.dianping.cat.home.service.client.Constants.ATTR_TOTALCOUNT; +import static com.dianping.cat.home.service.client.Constants.ENTITY_CLIENT_REPORT; +import static com.dianping.cat.home.service.client.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.home.service.client.Constants.ENTITY_METHOD; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.service.client.IEntity; +import com.dianping.cat.home.service.client.IVisitor; +import com.dianping.cat.home.service.client.entity.ClientReport; +import com.dianping.cat.home.service.client.entity.Domain; +import com.dianping.cat.home.service.client.entity.Method; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + @Override + public void visitClientReport(ClientReport clientReport) { + startTag(ENTITY_CLIENT_REPORT, null, ATTR_DOMAIN, clientReport.getDomain(), ATTR_START_TIME, toString(clientReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_END_TIME, toString(clientReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!clientReport.getDomains().isEmpty()) { + for (Domain domain : clientReport.getDomains().values()) { + domain.accept(m_visitor); + } + } + + endTag(ENTITY_CLIENT_REPORT); + } + + @Override + public void visitDomain(Domain domain) { + startTag(ENTITY_DOMAIN, null, ATTR_ID, domain.getId(), ATTR_TOTALCOUNT, domain.getTotalCount(), ATTR_FAILURECOUNT, domain.getFailureCount(), ATTR_FAILUREPERCENT, domain.getFailurePercent(), ATTR_SUM, domain.getSum(), ATTR_AVG, domain.getAvg()); + + if (!domain.getMethods().isEmpty()) { + for (Method method : domain.getMethods().values()) { + method.accept(m_visitor); + } + } + + endTag(ENTITY_DOMAIN); + } + + @Override + public void visitMethod(Method method) { + startTag(ENTITY_METHOD, true, null, ATTR_ID, method.getId(), ATTR_SERVICE, method.getService(), ATTR_TOTALCOUNT, method.getTotalCount(), ATTR_FAILURECOUNT, method.getFailureCount(), ATTR_FAILUREPERCENT, method.getFailurePercent(), ATTR_SUM, method.getSum(), ATTR_AVG, method.getAvg(), ATTR_QPS, method.getQps(), ATTR_TIMEOUT, method.getTimeout()); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/ILinker.java new file mode 100644 index 0000000000..1e7d353e35 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/ILinker.java @@ -0,0 +1,12 @@ +package com.dianping.cat.home.service.client.transform; + +import com.dianping.cat.home.service.client.entity.ClientReport; +import com.dianping.cat.home.service.client.entity.Domain; +import com.dianping.cat.home.service.client.entity.Method; + +public interface ILinker { + + public boolean onDomain(ClientReport parent, Domain domain); + + public boolean onMethod(Domain parent, Method method); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/IMaker.java new file mode 100644 index 0000000000..d85e24ba98 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/IMaker.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.service.client.transform; + +import com.dianping.cat.home.service.client.entity.ClientReport; +import com.dianping.cat.home.service.client.entity.Domain; +import com.dianping.cat.home.service.client.entity.Method; + +public interface IMaker { + + public ClientReport buildClientReport(T node); + + public Domain buildDomain(T node); + + public Method buildMethod(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/IParser.java new file mode 100644 index 0000000000..261caddef5 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/client/transform/IParser.java @@ -0,0 +1,13 @@ +package com.dianping.cat.home.service.client.transform; + +import com.dianping.cat.home.service.client.entity.ClientReport; +import com.dianping.cat.home.service.client.entity.Domain; +import com.dianping.cat.home.service.client.entity.Method; + +public interface IParser { + public ClientReport parse(IMaker maker, ILinker linker, T node); + + public void parseForDomain(IMaker maker, ILinker linker, Domain parent, T node); + + public void parseForMethod(IMaker maker, ILinker linker, Method parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/entity/Domain.java b/cat-home/src/main/java/com/dianping/cat/home/service/entity/Domain.java new file mode 100644 index 0000000000..3fee212eff --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/entity/Domain.java @@ -0,0 +1,129 @@ +package com.dianping.cat.home.service.entity; + +import static com.dianping.cat.home.service.Constants.ATTR_ID; +import static com.dianping.cat.home.service.Constants.ENTITY_DOMAIN; + +import com.dianping.cat.home.service.BaseEntity; +import com.dianping.cat.home.service.IVisitor; + +public class Domain extends BaseEntity { + private String m_id; + + private long m_totalCount; + + private long m_failureCount; + + private double m_failurePercent; + + private double m_sum; + + private double m_avg; + + private double m_qps; + + public Domain() { + } + + public Domain(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomain(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Domain) { + Domain _o = (Domain) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public double getAvg() { + return m_avg; + } + + public long getFailureCount() { + return m_failureCount; + } + + public double getFailurePercent() { + return m_failurePercent; + } + + public String getId() { + return m_id; + } + + public double getQps() { + return m_qps; + } + + public double getSum() { + return m_sum; + } + + public long getTotalCount() { + return m_totalCount; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Domain other) { + assertAttributeEquals(other, ENTITY_DOMAIN, ATTR_ID, m_id, other.getId()); + + } + + public Domain setAvg(double avg) { + m_avg = avg; + return this; + } + + public Domain setFailureCount(long failureCount) { + m_failureCount = failureCount; + return this; + } + + public Domain setFailurePercent(double failurePercent) { + m_failurePercent = failurePercent; + return this; + } + + public Domain setId(String id) { + m_id = id; + return this; + } + + public Domain setQps(double qps) { + m_qps = qps; + return this; + } + + public Domain setSum(double sum) { + m_sum = sum; + return this; + } + + public Domain setTotalCount(long totalCount) { + m_totalCount = totalCount; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/entity/ServiceReport.java b/cat-home/src/main/java/com/dianping/cat/home/service/entity/ServiceReport.java new file mode 100644 index 0000000000..686f1955ef --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/entity/ServiceReport.java @@ -0,0 +1,131 @@ +package com.dianping.cat.home.service.entity; + +import static com.dianping.cat.home.service.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.service.Constants.ENTITY_SERVICE_REPORT; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.service.BaseEntity; +import com.dianping.cat.home.service.IVisitor; + +public class ServiceReport extends BaseEntity { + private java.util.Date m_startTime; + + private String m_domain; + + private java.util.Date m_endTime; + + private Map m_domains = new LinkedHashMap(); + + public ServiceReport() { + } + + public ServiceReport(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitServiceReport(this); + } + + public ServiceReport addDomain(Domain domain) { + m_domains.put(domain.getId(), domain); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ServiceReport) { + ServiceReport _o = (ServiceReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public Domain findDomain(String id) { + return m_domains.get(id); + } + + public Domain findOrCreateDomain(String id) { + Domain domain = m_domains.get(id); + + if (domain == null) { + synchronized (m_domains) { + domain = m_domains.get(id); + + if (domain == null) { + domain = new Domain(id); + m_domains.put(id, domain); + } + } + } + + return domain; + } + + public String getDomain() { + return m_domain; + } + + public Map getDomains() { + return m_domains; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ServiceReport other) { + assertAttributeEquals(other, ENTITY_SERVICE_REPORT, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Domain removeDomain(String id) { + return m_domains.remove(id); + } + + public ServiceReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public ServiceReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public ServiceReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/transform/BaseVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/service/transform/BaseVisitor.java new file mode 100644 index 0000000000..37bd83a1ed --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/transform/BaseVisitor.java @@ -0,0 +1,18 @@ +package com.dianping.cat.home.service.transform; + +import com.dianping.cat.home.service.IVisitor; +import com.dianping.cat.home.service.entity.Domain; +import com.dianping.cat.home.service.entity.ServiceReport; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitDomain(Domain domain) { + } + + @Override + public void visitServiceReport(ServiceReport serviceReport) { + for (Domain domain : serviceReport.getDomains().values()) { + visitDomain(domain); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultJsonBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultJsonBuilder.java new file mode 100644 index 0000000000..522afddfaf --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultJsonBuilder.java @@ -0,0 +1,274 @@ +package com.dianping.cat.home.service.transform; + +import static com.dianping.cat.home.service.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.service.Constants.ATTR_ENDTIME; +import static com.dianping.cat.home.service.Constants.ATTR_ID; +import static com.dianping.cat.home.service.Constants.ATTR_STARTTIME; +import static com.dianping.cat.home.service.Constants.ELEMENT_AVG; +import static com.dianping.cat.home.service.Constants.ELEMENT_FAILURECOUNT; +import static com.dianping.cat.home.service.Constants.ELEMENT_FAILUREPERCENT; +import static com.dianping.cat.home.service.Constants.ELEMENT_QPS; +import static com.dianping.cat.home.service.Constants.ELEMENT_SUM; +import static com.dianping.cat.home.service.Constants.ELEMENT_TOTALCOUNT; +import static com.dianping.cat.home.service.Constants.ENTITY_DOMAINS; + +import java.lang.reflect.Array; +import java.util.Collection; +import java.util.Map; + +import com.dianping.cat.home.service.IEntity; +import com.dianping.cat.home.service.IVisitor; +import com.dianping.cat.home.service.entity.Domain; +import com.dianping.cat.home.service.entity.ServiceReport; + +public class DefaultJsonBuilder implements IVisitor { + + private IVisitor m_visitor; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultJsonBuilder() { + this(false); + } + + public DefaultJsonBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultJsonBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_visitor = this; + } + + protected void arrayBegin(String name) { + indent(); + m_sb.append('"').append(name).append(m_compact ? "\":[" : "\": [\r\n"); + m_level++; + } + + protected void arrayEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append("],").append(m_compact ? "" : "\r\n"); + } + + protected void attributes(Map dynamicAttributes, Object... nameValues) { + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + if (attrValue instanceof Collection) { + @SuppressWarnings("unchecked") + Collection items = (Collection) attrValue; + + if (!items.isEmpty()) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (Object item : items) { + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else if (attrValue.getClass().isArray()) { + int length = Array.getLength(attrValue); + + if (length > 0) { + indent(); + m_sb.append('"').append(attrName).append(m_compact ? "\":[" : "\": ["); + + for (int j = 0; j < length; j++) { + Object item = Array.get(attrValue, j); + m_sb.append(' '); + toString(m_sb, item); + m_sb.append(','); + } + + m_sb.setLength(m_sb.length() - 1); + m_sb.append(m_compact ? "]," : " ],\r\n"); + } + } else { + if (m_compact) { + m_sb.append('"').append(attrName).append("\":"); + toString(m_sb, attrValue); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(attrName).append("\": "); + toString(m_sb, attrValue); + m_sb.append(",\r\n"); + } + } + } + } + + if (dynamicAttributes != null) { + for (Map.Entry e : dynamicAttributes.entrySet()) { + if (m_compact) { + m_sb.append('"').append(e.getKey()).append("\":"); + toString(m_sb, e.getValue()); + m_sb.append(","); + } else { + indent(); + m_sb.append('"').append(e.getKey()).append("\": "); + toString(m_sb, e.getValue()); + m_sb.append(",\r\n"); + } + } + } + } + + public String build(IEntity entity) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + trimComma(); + + return m_sb.toString(); + } + + public String buildArray(Collection> entities) { + m_sb.append('['); + + if (entities != null) { + for (IEntity entity : entities) { + objectBegin(null); + entity.accept(this); + objectEnd(null); + } + + trimComma(); + } + + m_sb.append(']'); + + return m_sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void objectBegin(String name) { + indent(); + + if (name == null) { + m_sb.append("{").append(m_compact ? "" : "\r\n"); + } else { + m_sb.append('"').append(name).append(m_compact ? "\":{" : "\": {\r\n"); + } + + m_level++; + } + + protected void objectEnd(String name) { + m_level--; + + trimComma(); + indent(); + m_sb.append(m_compact ? "}," : "},\r\n"); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + protected void toString(StringBuilder sb, Object value) { + if (value == null) { + sb.append("null"); + } else if (value instanceof Boolean || value instanceof Number) { + sb.append(value); + } else { + String val = value.toString(); + int len = val.length(); + + sb.append('"'); + + for (int i = 0; i < len; i++) { + char ch = val.charAt(i); + + switch (ch) { + case '\\': + case '/': + case '"': + sb.append('\\').append(ch); + break; + case '\t': + sb.append("\\t"); + break; + case '\r': + sb.append("\\r"); + break; + case '\n': + sb.append("\\n"); + break; + default: + sb.append(ch); + break; + } + } + + sb.append('"'); + } + } + + protected void trimComma() { + int len = m_sb.length(); + + if (m_compact) { + if (len > 1 && m_sb.charAt(len - 1) == ',') { + m_sb.replace(len - 1, len, ""); + } + } else { + if (len > 3 && m_sb.charAt(len - 3) == ',') { + m_sb.replace(len - 3, len - 2, ""); + } + } + } + + @Override + public void visitDomain(Domain domain) { + attributes(null, ATTR_ID, domain.getId(), ELEMENT_TOTALCOUNT, domain.getTotalCount(), ELEMENT_FAILURECOUNT, domain.getFailureCount(), ELEMENT_FAILUREPERCENT, domain.getFailurePercent(), ELEMENT_SUM, domain.getSum(), ELEMENT_AVG, domain.getAvg(), ELEMENT_QPS, domain.getQps()); + } + + @Override + public void visitServiceReport(ServiceReport serviceReport) { + attributes(null, ATTR_STARTTIME, toString(serviceReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_DOMAIN, serviceReport.getDomain(), ATTR_ENDTIME, toString(serviceReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!serviceReport.getDomains().isEmpty()) { + objectBegin(ENTITY_DOMAINS); + + for (Map.Entry e : serviceReport.getDomains().entrySet()) { + String key = String.valueOf(e.getKey()); + + objectBegin(key); + e.getValue().accept(m_visitor); + objectEnd(key); + } + + objectEnd(ENTITY_DOMAINS); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultJsonParser.java b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultJsonParser.java new file mode 100644 index 0000000000..b461d51daa --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultJsonParser.java @@ -0,0 +1,376 @@ +package com.dianping.cat.home.service.transform; + +import static com.dianping.cat.home.service.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.service.Constants.ATTR_ENDTIME; +import static com.dianping.cat.home.service.Constants.ATTR_ID; +import static com.dianping.cat.home.service.Constants.ATTR_STARTTIME; +import static com.dianping.cat.home.service.Constants.ELEMENT_AVG; +import static com.dianping.cat.home.service.Constants.ELEMENT_FAILURECOUNT; +import static com.dianping.cat.home.service.Constants.ELEMENT_FAILUREPERCENT; +import static com.dianping.cat.home.service.Constants.ELEMENT_QPS; +import static com.dianping.cat.home.service.Constants.ELEMENT_SUM; +import static com.dianping.cat.home.service.Constants.ELEMENT_TOTALCOUNT; +import static com.dianping.cat.home.service.Constants.ENTITY_DOMAINS; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.dianping.cat.home.service.IEntity; +import com.dianping.cat.home.service.entity.Domain; +import com.dianping.cat.home.service.entity.ServiceReport; + +public class DefaultJsonParser { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private List m_entities = new ArrayList(); + + private Class m_entityClass; + + private DefaultJsonParser(Class entityClass) { + m_entityClass = entityClass; + } + + public static > T parse(Class entityClass, InputStream in) throws IOException { + return parse(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > T parse(Class entityClass, Reader reader) throws IOException { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.onArrayBegin(); + parser.parse(new JsonReader(reader)); + parser.onArrayEnd(); + + if (parser.m_entities.isEmpty()) { + return null; + } else { + return (T) parser.m_entities.get(0); + } + } + + public static > T parse(Class entityClass, String json) throws IOException { + return parse(entityClass, new StringReader(json)); + } + + public static > List parseArray(Class entityClass, InputStream in) throws Exception { + return parseArray(entityClass, new InputStreamReader(in, "utf-8")); + } + + @SuppressWarnings("unchecked") + public static > List parseArray(Class entityClass, Reader reader) throws Exception { + DefaultJsonParser parser = new DefaultJsonParser(entityClass); + + parser.parse(new JsonReader(reader)); + return (List) (List) parser.m_entities; + } + + public static > List parseArray(Class entityClass, String json) throws Exception { + return parseArray(entityClass, new StringReader(json)); + } + + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + private Object createRootEntity() { + try { + Object entity = m_entityClass.newInstance(); + + return entity; + } catch (Exception e) { + throw new RuntimeException(String.format("Unable to create entity(%s) instance!", m_entityClass.getName()), e); + } + } + + private boolean isTopLevel() { + return m_objs.size() == 1; + } + + protected void onArrayBegin() { + if (m_objs.isEmpty()) { + m_objs.push(m_entities); + m_tags.push(""); + } } + + protected void onArrayEnd() { + m_objs.pop(); + m_tags.pop(); + + } + protected void onName(String name) { + m_tags.push(name); + } + + protected void onObjectBegin() { + if (isTopLevel()) { + m_objs.push(createRootEntity()); + m_tags.push(""); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof ServiceReport) { + if (ENTITY_DOMAINS.equals(tag)) { + m_objs.push(parent); + } else { + String parentTag = m_tags.size() >= 2 ? m_tags.get(m_tags.size() - 2) : null; + + if (ENTITY_DOMAINS.equals(parentTag)) { + Domain domains = new Domain(); + + m_linker.onDomain((ServiceReport) parent, domains); + m_objs.push(domains); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } else { + throw new RuntimeException(String.format("Unknown tag(%s) found at %s!", tag, m_tags)); + } + } + } + + protected void onObjectEnd() { + m_tags.pop(); + + Object entity = m_objs.pop(); + + if (isTopLevel()) { + m_entities.add(entity); + } + } + + protected void onValue(String value) { + Object parent = m_objs.peek(); + String tag = m_tags.pop(); + + if (parent instanceof ServiceReport) { + parseForServiceReport((ServiceReport) parent, tag, value); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, value); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) under %s!", tag, parent)); + } + } + + private void parse(JsonReader reader) throws IOException { + try { + reader.parse(this); + } catch (EOFException e) { + if (m_objs.size() > 1) { + throw new EOFException(String.format("Unexpected end while parsing json! tags: %s.", m_tags)); + } + } + + m_linker.finish(); + } + + public void parseForDomain(Domain domain, String tag, String value) { + if (ATTR_ID.equals(tag)) { + domain.setId(value); + } else if (ELEMENT_TOTALCOUNT.equals(tag)) { + domain.setTotalCount(convert(Long.class, value, 0L)); + } else if (ELEMENT_FAILURECOUNT.equals(tag)) { + domain.setFailureCount(convert(Long.class, value, 0L)); + } else if (ELEMENT_FAILUREPERCENT.equals(tag)) { + domain.setFailurePercent(convert(Double.class, value, 0.0)); + } else if (ELEMENT_SUM.equals(tag)) { + domain.setSum(convert(Double.class, value, 0.0)); + } else if (ELEMENT_AVG.equals(tag)) { + domain.setAvg(convert(Double.class, value, 0.0)); + } else if (ELEMENT_QPS.equals(tag)) { + domain.setQps(convert(Double.class, value, 0.0)); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, domain, m_tags)); + } + } + + public void parseForServiceReport(ServiceReport serviceReport, String tag, String value) { + if (ENTITY_DOMAINS.equals(tag)) { + // do nothing here + } else if (ATTR_STARTTIME.equals(tag)) { + serviceReport.setStartTime(toDate(value, "yyyy-MM-dd HH:mm:ss")); + } else if (ATTR_DOMAIN.equals(tag)) { + serviceReport.setDomain(value); + } else if (ATTR_ENDTIME.equals(tag)) { + serviceReport.setEndTime(toDate(value, "yyyy-MM-dd HH:mm:ss")); + } else { + throw new RuntimeException(String.format("Unknown tag(%s) of %s under %s!", tag, serviceReport, m_tags)); + } + } + + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + static class JsonReader { + private Reader m_reader; + + private char[] m_buffer = new char[2048]; + + private int m_size; + + private int m_index; + + public JsonReader(Reader reader) { + m_reader = reader; + } + + private char next() throws IOException { + if (m_index >= m_size) { + m_size = m_reader.read(m_buffer); + m_index = 0; + + if (m_size == -1) { + throw new EOFException(); + } + } + + return m_buffer[m_index++]; + } + + public void parse(DefaultJsonParser parser) throws IOException { + StringBuilder sb = new StringBuilder(); + boolean flag = false; + + while (true) { + char ch = next(); + + switch (ch) { + case ' ': + case '\t': + case '\r': + case '\n': + break; + case '{': + parser.onObjectBegin(); + flag = false; + break; + case '}': + if (flag) { // have value + parser.onValue(sb.toString()); + sb.setLength(0); + } + + parser.onObjectEnd(); + flag = false; + break; + case '\'': + case '"': + while (true) { + char ch2 = next(); + + if (ch2 != ch) { + if (ch2 == '\\') { + char ch3 = next(); + + switch (ch3) { + case 't': + sb.append('\t'); + break; + case 'r': + sb.append('\r'); + break; + case 'n': + sb.append('\n'); + break; + default: + sb.append(ch3); + break; + } + } else { + sb.append(ch2); + } + } else { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + flag = false; + } + + sb.setLength(0); + break; + } + } + + break; + case ':': + if (sb.length() != 0) { + parser.onName(sb.toString()); + sb.setLength(0); + } + + flag = true; + break; + case ',': + if (sb.length() != 0) { + if (!flag) { + parser.onName(sb.toString()); + } else { + parser.onValue(sb.toString()); + } + + sb.setLength(0); + } + + flag = false; + break; + case '[': + parser.onArrayBegin(); + flag = false; + break; + case ']': + parser.onArrayEnd(); + flag = false; + break; + default: + sb.append(ch); + break; + } + } + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultLinker.java new file mode 100644 index 0000000000..ccc01f9262 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultLinker.java @@ -0,0 +1,38 @@ +package com.dianping.cat.home.service.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.service.entity.Domain; +import com.dianping.cat.home.service.entity.ServiceReport; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onDomain(final ServiceReport parent, final Domain domain) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDomain(domain); + } + }); + } else { + parent.addDomain(domain); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultMerger.java b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultMerger.java new file mode 100644 index 0000000000..7d993546b9 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultMerger.java @@ -0,0 +1,85 @@ +package com.dianping.cat.home.service.transform; + +import java.util.Stack; + +import com.dianping.cat.home.service.IEntity; +import com.dianping.cat.home.service.IVisitor; +import com.dianping.cat.home.service.entity.Domain; +import com.dianping.cat.home.service.entity.ServiceReport; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private ServiceReport m_serviceReport; + + public DefaultMerger() { + } + + public DefaultMerger(ServiceReport serviceReport) { + m_serviceReport = serviceReport; + m_objs.push(serviceReport); + } + + public ServiceReport getServiceReport() { + return m_serviceReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeDomain(Domain to, Domain from) { + to.mergeAttributes(from); + to.setTotalCount(from.getTotalCount()); + to.setFailureCount(from.getFailureCount()); + to.setFailurePercent(from.getFailurePercent()); + to.setSum(from.getSum()); + to.setAvg(from.getAvg()); + to.setQps(from.getQps()); + } + + protected void mergeServiceReport(ServiceReport to, ServiceReport from) { + to.mergeAttributes(from); + } + + @Override + public void visitDomain(Domain from) { + Domain to = (Domain) m_objs.peek(); + + mergeDomain(to, from); + visitDomainChildren(to, from); + } + + protected void visitDomainChildren(Domain to, Domain from) { + } + + @Override + public void visitServiceReport(ServiceReport from) { + ServiceReport to = (ServiceReport) m_objs.peek(); + + mergeServiceReport(to, from); + visitServiceReportChildren(to, from); + } + + protected void visitServiceReportChildren(ServiceReport to, ServiceReport from) { + for (Domain source : from.getDomains().values()) { + Domain target = to.findDomain(source.getId()); + + if (target == null) { + target = new Domain(source.getId()); + to.addDomain(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultNativeBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..dd715eccb2 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultNativeBuilder.java @@ -0,0 +1,156 @@ +package com.dianping.cat.home.service.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.home.service.IVisitor; +import com.dianping.cat.home.service.entity.Domain; +import com.dianping.cat.home.service.entity.ServiceReport; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(ServiceReport serviceReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(serviceReport, out); + return out.toByteArray(); + } + + public static void build(ServiceReport serviceReport, OutputStream out) { + serviceReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitDomain(Domain domain) { + if (domain.getId() != null) { + writeTag(1, 1); + writeString(domain.getId()); + } + + writeTag(2, 0); + writeLong(domain.getTotalCount()); + + writeTag(3, 0); + writeLong(domain.getFailureCount()); + + writeTag(4, 0); + writeDouble(domain.getFailurePercent()); + + writeTag(5, 0); + writeDouble(domain.getSum()); + + writeTag(6, 0); + writeDouble(domain.getAvg()); + + writeTag(7, 0); + writeDouble(domain.getQps()); + + writeTag(63, 3); + } + + @Override + public void visitServiceReport(ServiceReport serviceReport) { + writeTag(63, 0); + + if (serviceReport.getStartTime() != null) { + writeTag(1, 1); + writeDate(serviceReport.getStartTime()); + } + + if (serviceReport.getDomain() != null) { + writeTag(2, 1); + writeString(serviceReport.getDomain()); + } + + if (serviceReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(serviceReport.getEndTime()); + } + + if (!serviceReport.getDomains().isEmpty()) { + writeTag(33, 2); + writeInt(serviceReport.getDomains().size()); + + for (Domain domain : serviceReport.getDomains().values()) { + domain.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeDouble(double value) { + try { + writeVarint(Double.doubleToLongBits(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeLong(long value) { + try { + writeVarint(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultNativeParser.java b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..df6d971ab1 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultNativeParser.java @@ -0,0 +1,184 @@ +package com.dianping.cat.home.service.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.home.service.IVisitor; +import com.dianping.cat.home.service.entity.Domain; +import com.dianping.cat.home.service.entity.ServiceReport; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static ServiceReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static ServiceReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + ServiceReport serviceReport = new ServiceReport(); + + try { + serviceReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return serviceReport; + } + + @Override + public void visitDomain(Domain domain) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDomainChildren(domain, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDomainChildren(Domain domain, int _field, int _type) { + switch (_field) { + case 1: + domain.setId(readString()); + break; + case 2: + domain.setTotalCount(readLong()); + break; + case 3: + domain.setFailureCount(readLong()); + break; + case 4: + domain.setFailurePercent(readDouble()); + break; + case 5: + domain.setSum(readDouble()); + break; + case 6: + domain.setAvg(readDouble()); + break; + case 7: + domain.setQps(readDouble()); + break; + } + } + + @Override + public void visitServiceReport(ServiceReport serviceReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitServiceReportChildren(serviceReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitServiceReportChildren(ServiceReport serviceReport, int _field, int _type) { + switch (_field) { + case 1: + serviceReport.setStartTime(readDate()); + break; + case 2: + serviceReport.setDomain(readString()); + break; + case 3: + serviceReport.setEndTime(readDate()); + break; + case 33: + if (_type == 1) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(serviceReport, domain); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(serviceReport, domain); + } + } + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private double readDouble() { + try { + return Double.longBitsToDouble(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private long readLong() { + try { + return readVarint(64); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..f7b99de0dc --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultSaxMaker.java @@ -0,0 +1,79 @@ +package com.dianping.cat.home.service.transform; + +import static com.dianping.cat.home.service.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.service.Constants.ATTR_ENDTIME; +import static com.dianping.cat.home.service.Constants.ATTR_ID; +import static com.dianping.cat.home.service.Constants.ATTR_STARTTIME; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.service.entity.Domain; +import com.dianping.cat.home.service.entity.ServiceReport; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Domain buildDomain(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + Domain domain = new Domain(id); + + return domain; + } + + @Override + public ServiceReport buildServiceReport(Attributes attributes) { + String startTime = attributes.getValue(ATTR_STARTTIME); + String domain = attributes.getValue(ATTR_DOMAIN); + String endTime = attributes.getValue(ATTR_ENDTIME); + ServiceReport serviceReport = new ServiceReport(domain); + + if (startTime != null) { + serviceReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + serviceReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return serviceReport; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..7a55f552c4 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultSaxParser.java @@ -0,0 +1,264 @@ +package com.dianping.cat.home.service.transform; + +import static com.dianping.cat.home.service.Constants.ELEMENT_AVG; +import static com.dianping.cat.home.service.Constants.ELEMENT_FAILURECOUNT; +import static com.dianping.cat.home.service.Constants.ELEMENT_FAILUREPERCENT; +import static com.dianping.cat.home.service.Constants.ELEMENT_QPS; +import static com.dianping.cat.home.service.Constants.ELEMENT_SUM; +import static com.dianping.cat.home.service.Constants.ELEMENT_TOTALCOUNT; + +import static com.dianping.cat.home.service.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.home.service.Constants.ENTITY_SERVICE_REPORT; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.service.IEntity; +import com.dianping.cat.home.service.entity.Domain; +import com.dianping.cat.home.service.entity.ServiceReport; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static ServiceReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(ServiceReport.class, new InputSource(removeBOM(in))); + } + + public static ServiceReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(ServiceReport.class, new InputSource(removeBOM(reader))); + } + + public static ServiceReport parse(String xml) throws SAXException, IOException { + return parseEntity(ServiceReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof Domain) { + Domain domain = (Domain) currentObj; + + if (ELEMENT_TOTALCOUNT.equals(currentTag)) { + domain.setTotalCount(convert(Long.class, getText(), 0L)); + } else if (ELEMENT_FAILURECOUNT.equals(currentTag)) { + domain.setFailureCount(convert(Long.class, getText(), 0L)); + } else if (ELEMENT_FAILUREPERCENT.equals(currentTag)) { + domain.setFailurePercent(convert(Double.class, getText(), 0.0)); + } else if (ELEMENT_SUM.equals(currentTag)) { + domain.setSum(convert(Double.class, getText(), 0.0)); + } else if (ELEMENT_AVG.equals(currentTag)) { + domain.setAvg(convert(Double.class, getText(), 0.0)); + } else if (ELEMENT_QPS.equals(currentTag)) { + domain.setQps(convert(Double.class, getText(), 0.0)); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForDomain(Domain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_TOTALCOUNT.equals(qName) || ELEMENT_FAILURECOUNT.equals(qName) || ELEMENT_FAILUREPERCENT.equals(qName) || ELEMENT_SUM.equals(qName) || ELEMENT_AVG.equals(qName) || ELEMENT_QPS.equals(qName)) { + m_objs.push(parentObj); + } else { + throw new SAXException(String.format("Element(%s) is not expected under domain!", qName)); + } + + m_tags.push(qName); + } + + private void parseForServiceReport(ServiceReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_linker.onDomain(parentObj, domain); + m_objs.push(domain); + } else { + throw new SAXException(String.format("Element(%s) is not expected under service-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_SERVICE_REPORT.equals(qName)) { + ServiceReport serviceReport = m_maker.buildServiceReport(attributes); + + m_entity = serviceReport; + m_objs.push(serviceReport); + m_tags.push(qName); + } else if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_entity = domain; + m_objs.push(domain); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof ServiceReport) { + parseForServiceReport((ServiceReport) parent, tag, qName, attributes); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..18cb5bcba8 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/transform/DefaultXmlBuilder.java @@ -0,0 +1,286 @@ +package com.dianping.cat.home.service.transform; + +import static com.dianping.cat.home.service.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.service.Constants.ATTR_ENDTIME; +import static com.dianping.cat.home.service.Constants.ATTR_ID; +import static com.dianping.cat.home.service.Constants.ATTR_STARTTIME; +import static com.dianping.cat.home.service.Constants.ELEMENT_AVG; +import static com.dianping.cat.home.service.Constants.ELEMENT_FAILURECOUNT; +import static com.dianping.cat.home.service.Constants.ELEMENT_FAILUREPERCENT; +import static com.dianping.cat.home.service.Constants.ELEMENT_QPS; +import static com.dianping.cat.home.service.Constants.ELEMENT_SUM; +import static com.dianping.cat.home.service.Constants.ELEMENT_TOTALCOUNT; +import static com.dianping.cat.home.service.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.home.service.Constants.ENTITY_SERVICE_REPORT; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.service.IEntity; +import com.dianping.cat.home.service.IVisitor; +import com.dianping.cat.home.service.entity.Domain; +import com.dianping.cat.home.service.entity.ServiceReport; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + @Override + public void visitDomain(Domain domain) { + startTag(ENTITY_DOMAIN, null, ATTR_ID, domain.getId()); + + tagWithText(ELEMENT_TOTALCOUNT, String.valueOf(domain.getTotalCount())); + + tagWithText(ELEMENT_FAILURECOUNT, String.valueOf(domain.getFailureCount())); + + tagWithText(ELEMENT_FAILUREPERCENT, String.valueOf(domain.getFailurePercent())); + + tagWithText(ELEMENT_SUM, String.valueOf(domain.getSum())); + + tagWithText(ELEMENT_AVG, String.valueOf(domain.getAvg())); + + tagWithText(ELEMENT_QPS, String.valueOf(domain.getQps())); + + endTag(ENTITY_DOMAIN); + } + + @Override + public void visitServiceReport(ServiceReport serviceReport) { + startTag(ENTITY_SERVICE_REPORT, null, ATTR_STARTTIME, toString(serviceReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_DOMAIN, serviceReport.getDomain(), ATTR_ENDTIME, toString(serviceReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!serviceReport.getDomains().isEmpty()) { + for (Domain domain : serviceReport.getDomains().values()) { + domain.accept(m_visitor); + } + } + + endTag(ENTITY_SERVICE_REPORT); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/service/transform/ILinker.java new file mode 100644 index 0000000000..4d42776929 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/transform/ILinker.java @@ -0,0 +1,9 @@ +package com.dianping.cat.home.service.transform; + +import com.dianping.cat.home.service.entity.Domain; +import com.dianping.cat.home.service.entity.ServiceReport; + +public interface ILinker { + + public boolean onDomain(ServiceReport parent, Domain domain); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/service/transform/IMaker.java new file mode 100644 index 0000000000..3afb596c95 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/transform/IMaker.java @@ -0,0 +1,11 @@ +package com.dianping.cat.home.service.transform; + +import com.dianping.cat.home.service.entity.Domain; +import com.dianping.cat.home.service.entity.ServiceReport; + +public interface IMaker { + + public Domain buildDomain(T node); + + public ServiceReport buildServiceReport(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/service/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/service/transform/IParser.java new file mode 100644 index 0000000000..d743b1a9e6 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/service/transform/IParser.java @@ -0,0 +1,10 @@ +package com.dianping.cat.home.service.transform; + +import com.dianping.cat.home.service.entity.Domain; +import com.dianping.cat.home.service.entity.ServiceReport; + +public interface IParser { + public ServiceReport parse(IMaker maker, ILinker linker, T node); + + public void parseForDomain(IMaker maker, ILinker linker, Domain parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/storage/BaseEntity.java new file mode 100644 index 0000000000..20e5707b4b --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.storage; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.storage.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/storage/Constants.java new file mode 100644 index 0000000000..f883b80f4d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/Constants.java @@ -0,0 +1,30 @@ +package com.dianping.cat.home.storage; + +public class Constants { + + public static final String ATTR_DEPARTMENT = "department"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_PRODUCTLINE = "productline"; + + public static final String ATTR_TITLE = "title"; + + public static final String ATTR_URL = "url"; + + public static final String ELEMENT_PAR = "par"; + + public static final String ELEMENT_PARS = "pars"; + + public static final String ENTITY_LINK = "link"; + + public static final String ENTITY_STORAGE = "storage"; + + public static final String ENTITY_STORAGES = "storages"; + + public static final String ENTITY_STORAGE_GROUP = "storage-group"; + + public static final String ENTITY_STORAGE_GROUPS = "storage-groups"; + + public static final String ENTITY_STORAGE_GROUP_CONFIG = "storage-group-config"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/storage/IEntity.java new file mode 100644 index 0000000000..cbfb266215 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.storage; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/storage/IVisitor.java new file mode 100644 index 0000000000..c43938b6c1 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/IVisitor.java @@ -0,0 +1,17 @@ +package com.dianping.cat.home.storage; + +import com.dianping.cat.home.storage.entity.Link; +import com.dianping.cat.home.storage.entity.Storage; +import com.dianping.cat.home.storage.entity.StorageGroup; +import com.dianping.cat.home.storage.entity.StorageGroupConfig; + +public interface IVisitor { + + public void visitLink(Link link); + + public void visitStorage(Storage storage); + + public void visitStorageGroup(StorageGroup storageGroup); + + public void visitStorageGroupConfig(StorageGroupConfig storageGroupConfig); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/alert/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/BaseEntity.java new file mode 100644 index 0000000000..a527c3b94c --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.storage.alert; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.storage.alert.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/alert/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/Constants.java new file mode 100644 index 0000000000..0c1b2d88fd --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/Constants.java @@ -0,0 +1,40 @@ +package com.dianping.cat.home.storage.alert; + +public class Constants { + + public static final String ATTR_CONTENT = "content"; + + public static final String ATTR_COUNT = "count"; + + public static final String ATTR_END_TIME = "end-time"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_LEVEL = "level"; + + public static final String ATTR_START_TIME = "start-time"; + + public static final String ATTR_TITLE = "title"; + + public static final String ENTITY_DETAIL = "detail"; + + public static final String ENTITY_DETAILS = "details"; + + public static final String ENTITY_MACHINE = "machine"; + + public static final String ENTITY_MACHINES = "machines"; + + public static final String ENTITY_OPERATION = "operation"; + + public static final String ENTITY_OPERATIONS = "operations"; + + public static final String ENTITY_STORAGE = "storage"; + + public static final String ENTITY_STORAGES = "storages"; + + public static final String ENTITY_STORAGE_ALERT_INFO = "storage-alert-info"; + + public static final String ENTITY_TARGET = "target"; + + public static final String ENTITY_TARGETS = "targets"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/alert/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/IEntity.java new file mode 100644 index 0000000000..aae7f9d1d1 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.storage.alert; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/alert/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/IVisitor.java new file mode 100644 index 0000000000..d3f196562b --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/IVisitor.java @@ -0,0 +1,23 @@ +package com.dianping.cat.home.storage.alert; + +import com.dianping.cat.home.storage.alert.entity.Detail; +import com.dianping.cat.home.storage.alert.entity.Machine; +import com.dianping.cat.home.storage.alert.entity.Operation; +import com.dianping.cat.home.storage.alert.entity.Storage; +import com.dianping.cat.home.storage.alert.entity.StorageAlertInfo; +import com.dianping.cat.home.storage.alert.entity.Target; + +public interface IVisitor { + + public void visitDetail(Detail detail); + + public void visitMachine(Machine machine); + + public void visitOperation(Operation operation); + + public void visitStorage(Storage storage); + + public void visitStorageAlertInfo(StorageAlertInfo storageAlertInfo); + + public void visitTarget(Target target); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Detail.java b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Detail.java new file mode 100644 index 0000000000..5d2e3bcc76 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Detail.java @@ -0,0 +1,75 @@ +package com.dianping.cat.home.storage.alert.entity; + +import static com.dianping.cat.home.storage.alert.Constants.ATTR_CONTENT; +import static com.dianping.cat.home.storage.alert.Constants.ENTITY_DETAIL; + +import com.dianping.cat.home.storage.alert.BaseEntity; +import com.dianping.cat.home.storage.alert.IVisitor; + +public class Detail extends BaseEntity { + private String m_content; + + private int m_level; + + public Detail() { + } + + public Detail(String content) { + m_content = content; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDetail(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Detail) { + Detail _o = (Detail) obj; + + if (!equals(getContent(), _o.getContent())) { + return false; + } + + return true; + } + + return false; + } + + public String getContent() { + return m_content; + } + + public int getLevel() { + return m_level; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_content == null ? 0 : m_content.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Detail other) { + assertAttributeEquals(other, ENTITY_DETAIL, ATTR_CONTENT, m_content, other.getContent()); + + m_level = other.getLevel(); + } + + public Detail setContent(String content) { + m_content = content; + return this; + } + + public Detail setLevel(int level) { + m_level = level; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Machine.java b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Machine.java new file mode 100644 index 0000000000..26ec2a9506 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Machine.java @@ -0,0 +1,137 @@ +package com.dianping.cat.home.storage.alert.entity; + +import static com.dianping.cat.home.storage.alert.Constants.ATTR_ID; +import static com.dianping.cat.home.storage.alert.Constants.ENTITY_MACHINE; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.storage.alert.BaseEntity; +import com.dianping.cat.home.storage.alert.IVisitor; + +public class Machine extends BaseEntity { + private String m_id; + + private int m_level; + + private int m_count; + + private Map m_operations = new LinkedHashMap(); + + public Machine() { + } + + public Machine(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMachine(this); + } + + public Machine addOperation(Operation operation) { + m_operations.put(operation.getId(), operation); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Machine) { + Machine _o = (Machine) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Operation findOperation(String id) { + return m_operations.get(id); + } + + public Operation findOrCreateOperation(String id) { + Operation operation = m_operations.get(id); + + if (operation == null) { + synchronized (m_operations) { + operation = m_operations.get(id); + + if (operation == null) { + operation = new Operation(id); + m_operations.put(id, operation); + } + } + } + + return operation; + } + + public int getCount() { + return m_count; + } + + public String getId() { + return m_id; + } + + public int getLevel() { + return m_level; + } + + public Map getOperations() { + return m_operations; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public Machine incCount() { + m_count++; + return this; + } + + public Machine incCount(int count) { + m_count += count; + return this; + } + + @Override + public void mergeAttributes(Machine other) { + assertAttributeEquals(other, ENTITY_MACHINE, ATTR_ID, m_id, other.getId()); + + m_level = other.getLevel(); + + m_count = other.getCount(); + } + + public Operation removeOperation(String id) { + return m_operations.remove(id); + } + + public Machine setCount(int count) { + m_count = count; + return this; + } + + public Machine setId(String id) { + m_id = id; + return this; + } + + public Machine setLevel(int level) { + m_level = level; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Operation.java b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Operation.java new file mode 100644 index 0000000000..43044c4438 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Operation.java @@ -0,0 +1,137 @@ +package com.dianping.cat.home.storage.alert.entity; + +import static com.dianping.cat.home.storage.alert.Constants.ATTR_ID; +import static com.dianping.cat.home.storage.alert.Constants.ENTITY_OPERATION; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.storage.alert.BaseEntity; +import com.dianping.cat.home.storage.alert.IVisitor; + +public class Operation extends BaseEntity { + private String m_id; + + private int m_level; + + private int m_count; + + private Map m_targets = new LinkedHashMap(); + + public Operation() { + } + + public Operation(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitOperation(this); + } + + public Operation addTarget(Target target) { + m_targets.put(target.getId(), target); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Operation) { + Operation _o = (Operation) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Target findTarget(String id) { + return m_targets.get(id); + } + + public Target findOrCreateTarget(String id) { + Target target = m_targets.get(id); + + if (target == null) { + synchronized (m_targets) { + target = m_targets.get(id); + + if (target == null) { + target = new Target(id); + m_targets.put(id, target); + } + } + } + + return target; + } + + public int getCount() { + return m_count; + } + + public String getId() { + return m_id; + } + + public int getLevel() { + return m_level; + } + + public Map getTargets() { + return m_targets; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public Operation incCount() { + m_count++; + return this; + } + + public Operation incCount(int count) { + m_count += count; + return this; + } + + @Override + public void mergeAttributes(Operation other) { + assertAttributeEquals(other, ENTITY_OPERATION, ATTR_ID, m_id, other.getId()); + + m_level = other.getLevel(); + + m_count = other.getCount(); + } + + public Target removeTarget(String id) { + return m_targets.remove(id); + } + + public Operation setCount(int count) { + m_count = count; + return this; + } + + public Operation setId(String id) { + m_id = id; + return this; + } + + public Operation setLevel(int level) { + m_level = level; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Storage.java b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Storage.java new file mode 100644 index 0000000000..3fa43b7be9 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Storage.java @@ -0,0 +1,137 @@ +package com.dianping.cat.home.storage.alert.entity; + +import static com.dianping.cat.home.storage.alert.Constants.ATTR_ID; +import static com.dianping.cat.home.storage.alert.Constants.ENTITY_STORAGE; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.storage.alert.BaseEntity; +import com.dianping.cat.home.storage.alert.IVisitor; + +public class Storage extends BaseEntity { + private String m_id; + + private int m_level; + + private int m_count; + + private Map m_machines = new LinkedHashMap(); + + public Storage() { + } + + public Storage(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitStorage(this); + } + + public Storage addMachine(Machine machine) { + m_machines.put(machine.getId(), machine); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Storage) { + Storage _o = (Storage) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Machine findMachine(String id) { + return m_machines.get(id); + } + + public Machine findOrCreateMachine(String id) { + Machine machine = m_machines.get(id); + + if (machine == null) { + synchronized (m_machines) { + machine = m_machines.get(id); + + if (machine == null) { + machine = new Machine(id); + m_machines.put(id, machine); + } + } + } + + return machine; + } + + public int getCount() { + return m_count; + } + + public String getId() { + return m_id; + } + + public int getLevel() { + return m_level; + } + + public Map getMachines() { + return m_machines; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public Storage incCount() { + m_count++; + return this; + } + + public Storage incCount(int count) { + m_count += count; + return this; + } + + @Override + public void mergeAttributes(Storage other) { + assertAttributeEquals(other, ENTITY_STORAGE, ATTR_ID, m_id, other.getId()); + + m_level = other.getLevel(); + + m_count = other.getCount(); + } + + public Machine removeMachine(String id) { + return m_machines.remove(id); + } + + public Storage setCount(int count) { + m_count = count; + return this; + } + + public Storage setId(String id) { + m_id = id; + return this; + } + + public Storage setLevel(int level) { + m_level = level; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/StorageAlertInfo.java b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/StorageAlertInfo.java new file mode 100644 index 0000000000..943bd86f78 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/StorageAlertInfo.java @@ -0,0 +1,131 @@ +package com.dianping.cat.home.storage.alert.entity; + +import static com.dianping.cat.home.storage.alert.Constants.ATTR_ID; +import static com.dianping.cat.home.storage.alert.Constants.ENTITY_STORAGE_ALERT_INFO; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.storage.alert.BaseEntity; +import com.dianping.cat.home.storage.alert.IVisitor; + +public class StorageAlertInfo extends BaseEntity { + private String m_id; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Map m_storages = new LinkedHashMap(); + + public StorageAlertInfo() { + } + + public StorageAlertInfo(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitStorageAlertInfo(this); + } + + public StorageAlertInfo addStorage(Storage storage) { + m_storages.put(storage.getId(), storage); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StorageAlertInfo) { + StorageAlertInfo _o = (StorageAlertInfo) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Storage findStorage(String id) { + return m_storages.get(id); + } + + public Storage findOrCreateStorage(String id) { + Storage storage = m_storages.get(id); + + if (storage == null) { + synchronized (m_storages) { + storage = m_storages.get(id); + + if (storage == null) { + storage = new Storage(id); + m_storages.put(id, storage); + } + } + } + + return storage; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public String getId() { + return m_id; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + public Map getStorages() { + return m_storages; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(StorageAlertInfo other) { + assertAttributeEquals(other, ENTITY_STORAGE_ALERT_INFO, ATTR_ID, m_id, other.getId()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Storage removeStorage(String id) { + return m_storages.remove(id); + } + + public StorageAlertInfo setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public StorageAlertInfo setId(String id) { + m_id = id; + return this; + } + + public StorageAlertInfo setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Target.java b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Target.java new file mode 100644 index 0000000000..06a4b19657 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/entity/Target.java @@ -0,0 +1,155 @@ +package com.dianping.cat.home.storage.alert.entity; + +import static com.dianping.cat.home.storage.alert.Constants.ATTR_ID; +import static com.dianping.cat.home.storage.alert.Constants.ENTITY_TARGET; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.home.storage.alert.BaseEntity; +import com.dianping.cat.home.storage.alert.IVisitor; + +public class Target extends BaseEntity { + private String m_id; + + private String m_title; + + private int m_level; + + private int m_count; + + private List m_details = new ArrayList(); + + public Target() { + } + + public Target(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitTarget(this); + } + + public Target addDetail(Detail detail) { + m_details.add(detail); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Target) { + Target _o = (Target) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Detail findDetail(String content) { + for (Detail detail : m_details) { + if (!equals(detail.getContent(), content)) { + continue; + } + + return detail; + } + + return null; + } + + public int getCount() { + return m_count; + } + + public List getDetails() { + return m_details; + } + + public String getId() { + return m_id; + } + + public int getLevel() { + return m_level; + } + + public String getTitle() { + return m_title; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + public Target incCount() { + m_count++; + return this; + } + + public Target incCount(int count) { + m_count += count; + return this; + } + + @Override + public void mergeAttributes(Target other) { + assertAttributeEquals(other, ENTITY_TARGET, ATTR_ID, m_id, other.getId()); + + if (other.getTitle() != null) { + m_title = other.getTitle(); + } + + m_level = other.getLevel(); + + m_count = other.getCount(); + } + + public Detail removeDetail(String content) { + int len = m_details.size(); + + for (int i = 0; i < len; i++) { + Detail detail = m_details.get(i); + + if (!equals(detail.getContent(), content)) { + continue; + } + + return m_details.remove(i); + } + + return null; + } + + public Target setCount(int count) { + m_count = count; + return this; + } + + public Target setId(String id) { + m_id = id; + return this; + } + + public Target setLevel(int level) { + m_level = level; + return this; + } + + public Target setTitle(String title) { + m_title = title; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/alert/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..7b9ebbb3b5 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/alert/transform/DefaultXmlBuilder.java @@ -0,0 +1,286 @@ +package com.dianping.cat.home.storage.alert.transform; + +import static com.dianping.cat.home.storage.alert.Constants.ATTR_CONTENT; +import static com.dianping.cat.home.storage.alert.Constants.ATTR_COUNT; +import static com.dianping.cat.home.storage.alert.Constants.ATTR_END_TIME; +import static com.dianping.cat.home.storage.alert.Constants.ATTR_ID; +import static com.dianping.cat.home.storage.alert.Constants.ATTR_LEVEL; +import static com.dianping.cat.home.storage.alert.Constants.ATTR_START_TIME; +import static com.dianping.cat.home.storage.alert.Constants.ATTR_TITLE; +import static com.dianping.cat.home.storage.alert.Constants.ENTITY_DETAIL; +import static com.dianping.cat.home.storage.alert.Constants.ENTITY_MACHINE; +import static com.dianping.cat.home.storage.alert.Constants.ENTITY_OPERATION; +import static com.dianping.cat.home.storage.alert.Constants.ENTITY_STORAGE; +import static com.dianping.cat.home.storage.alert.Constants.ENTITY_STORAGE_ALERT_INFO; +import static com.dianping.cat.home.storage.alert.Constants.ENTITY_TARGET; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.storage.alert.IEntity; +import com.dianping.cat.home.storage.alert.IVisitor; +import com.dianping.cat.home.storage.alert.entity.Detail; +import com.dianping.cat.home.storage.alert.entity.Machine; +import com.dianping.cat.home.storage.alert.entity.Operation; +import com.dianping.cat.home.storage.alert.entity.Storage; +import com.dianping.cat.home.storage.alert.entity.StorageAlertInfo; +import com.dianping.cat.home.storage.alert.entity.Target; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + @Override + public void visitDetail(Detail detail) { + startTag(ENTITY_DETAIL, true, null, ATTR_CONTENT, detail.getContent(), ATTR_LEVEL, detail.getLevel()); + } + + @Override + public void visitMachine(Machine machine) { + startTag(ENTITY_MACHINE, null, ATTR_ID, machine.getId(), ATTR_LEVEL, machine.getLevel(), ATTR_COUNT, machine.getCount()); + + if (!machine.getOperations().isEmpty()) { + for (Operation operation : machine.getOperations().values()) { + operation.accept(m_visitor); + } + } + + endTag(ENTITY_MACHINE); + } + + @Override + public void visitOperation(Operation operation) { + startTag(ENTITY_OPERATION, null, ATTR_ID, operation.getId(), ATTR_LEVEL, operation.getLevel(), ATTR_COUNT, operation.getCount()); + + if (!operation.getTargets().isEmpty()) { + for (Target target : operation.getTargets().values()) { + target.accept(m_visitor); + } + } + + endTag(ENTITY_OPERATION); + } + + @Override + public void visitStorage(Storage storage) { + startTag(ENTITY_STORAGE, null, ATTR_ID, storage.getId(), ATTR_LEVEL, storage.getLevel(), ATTR_COUNT, storage.getCount()); + + if (!storage.getMachines().isEmpty()) { + for (Machine machine : storage.getMachines().values()) { + machine.accept(m_visitor); + } + } + + endTag(ENTITY_STORAGE); + } + + @Override + public void visitStorageAlertInfo(StorageAlertInfo storageAlertInfo) { + startTag(ENTITY_STORAGE_ALERT_INFO, null, ATTR_ID, storageAlertInfo.getId(), ATTR_START_TIME, toString(storageAlertInfo.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_END_TIME, toString(storageAlertInfo.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!storageAlertInfo.getStorages().isEmpty()) { + for (Storage storage : storageAlertInfo.getStorages().values()) { + storage.accept(m_visitor); + } + } + + endTag(ENTITY_STORAGE_ALERT_INFO); + } + + @Override + public void visitTarget(Target target) { + startTag(ENTITY_TARGET, null, ATTR_ID, target.getId(), ATTR_TITLE, target.getTitle(), ATTR_LEVEL, target.getLevel(), ATTR_COUNT, target.getCount()); + + if (!target.getDetails().isEmpty()) { + for (Detail detail : target.getDetails()) { + detail.accept(m_visitor); + } + } + + endTag(ENTITY_TARGET); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/entity/Link.java b/cat-home/src/main/java/com/dianping/cat/home/storage/entity/Link.java new file mode 100644 index 0000000000..0aa3985b1d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/entity/Link.java @@ -0,0 +1,80 @@ +package com.dianping.cat.home.storage.entity; + +import java.util.ArrayList; +import java.util.List; + +import com.dianping.cat.home.storage.BaseEntity; +import com.dianping.cat.home.storage.IVisitor; + +public class Link extends BaseEntity { + private String m_url; + + private List m_pars = new ArrayList(); + + public Link() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitLink(this); + } + + public Link addPar(String par) { + m_pars.add(par); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Link) { + Link _o = (Link) obj; + + if (!equals(getUrl(), _o.getUrl())) { + return false; + } + + if (!equals(getPars(), _o.getPars())) { + return false; + } + + + return true; + } + + return false; + } + + public List getPars() { + return m_pars; + } + + public String getUrl() { + return m_url; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_url == null ? 0 : m_url.hashCode()); + for (String e : m_pars) { + hash = hash * 31 + (e == null ? 0 :e.hashCode()); + } + + + return hash; + } + + @Override + public void mergeAttributes(Link other) { + if (other.getUrl() != null) { + m_url = other.getUrl(); + } + } + + public Link setUrl(String url) { + m_url = url; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/entity/Storage.java b/cat-home/src/main/java/com/dianping/cat/home/storage/entity/Storage.java new file mode 100644 index 0000000000..828d6046cf --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/entity/Storage.java @@ -0,0 +1,107 @@ +package com.dianping.cat.home.storage.entity; + +import static com.dianping.cat.home.storage.Constants.ATTR_ID; +import static com.dianping.cat.home.storage.Constants.ENTITY_STORAGE; + +import com.dianping.cat.home.storage.BaseEntity; +import com.dianping.cat.home.storage.IVisitor; + +public class Storage extends BaseEntity { + private String m_id; + + private String m_department; + + private String m_productline; + + private String m_title; + + public Storage() { + } + + public Storage(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitStorage(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Storage) { + Storage _o = (Storage) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getDepartment() { + return m_department; + } + + public String getId() { + return m_id; + } + + public String getProductline() { + return m_productline; + } + + public String getTitle() { + return m_title; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Storage other) { + assertAttributeEquals(other, ENTITY_STORAGE, ATTR_ID, m_id, other.getId()); + + if (other.getDepartment() != null) { + m_department = other.getDepartment(); + } + + if (other.getProductline() != null) { + m_productline = other.getProductline(); + } + + if (other.getTitle() != null) { + m_title = other.getTitle(); + } + } + + public Storage setDepartment(String department) { + m_department = department; + return this; + } + + public Storage setId(String id) { + m_id = id; + return this; + } + + public Storage setProductline(String productline) { + m_productline = productline; + return this; + } + + public Storage setTitle(String title) { + m_title = title; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/entity/StorageGroup.java b/cat-home/src/main/java/com/dianping/cat/home/storage/entity/StorageGroup.java new file mode 100644 index 0000000000..fa5666b443 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/entity/StorageGroup.java @@ -0,0 +1,96 @@ +package com.dianping.cat.home.storage.entity; + +import static com.dianping.cat.home.storage.Constants.ATTR_ID; +import static com.dianping.cat.home.storage.Constants.ENTITY_STORAGE_GROUP; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.storage.BaseEntity; +import com.dianping.cat.home.storage.IVisitor; + +public class StorageGroup extends BaseEntity { + private String m_id; + + private Link m_link; + + private Map m_storages = new LinkedHashMap(); + + public StorageGroup() { + } + + public StorageGroup(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitStorageGroup(this); + } + + public StorageGroup addStorage(Storage storage) { + m_storages.put(storage.getId(), storage); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StorageGroup) { + StorageGroup _o = (StorageGroup) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public Storage findStorage(String id) { + return m_storages.get(id); + } + + public String getId() { + return m_id; + } + + public Link getLink() { + return m_link; + } + + public Map getStorages() { + return m_storages; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(StorageGroup other) { + assertAttributeEquals(other, ENTITY_STORAGE_GROUP, ATTR_ID, m_id, other.getId()); + + } + + public Storage removeStorage(String id) { + return m_storages.remove(id); + } + + public StorageGroup setId(String id) { + m_id = id; + return this; + } + + public StorageGroup setLink(Link link) { + m_link = link; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/entity/StorageGroupConfig.java b/cat-home/src/main/java/com/dianping/cat/home/storage/entity/StorageGroupConfig.java new file mode 100644 index 0000000000..ec4d860ef8 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/entity/StorageGroupConfig.java @@ -0,0 +1,66 @@ +package com.dianping.cat.home.storage.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.storage.BaseEntity; +import com.dianping.cat.home.storage.IVisitor; + +public class StorageGroupConfig extends BaseEntity { + private Map m_storageGroups = new LinkedHashMap(); + + public StorageGroupConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitStorageGroupConfig(this); + } + + public StorageGroupConfig addStorageGroup(StorageGroup storageGroup) { + m_storageGroups.put(storageGroup.getId(), storageGroup); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StorageGroupConfig) { + StorageGroupConfig _o = (StorageGroupConfig) obj; + + if (!equals(getStorageGroups(), _o.getStorageGroups())) { + return false; + } + + + return true; + } + + return false; + } + + public StorageGroup findStorageGroup(String id) { + return m_storageGroups.get(id); + } + + public Map getStorageGroups() { + return m_storageGroups; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_storageGroups == null ? 0 : m_storageGroups.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(StorageGroupConfig other) { + } + + public StorageGroup removeStorageGroup(String id) { + return m_storageGroups.remove(id); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultLinker.java new file mode 100644 index 0000000000..cf60a722b4 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultLinker.java @@ -0,0 +1,62 @@ +package com.dianping.cat.home.storage.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.storage.entity.Link; +import com.dianping.cat.home.storage.entity.Storage; +import com.dianping.cat.home.storage.entity.StorageGroup; +import com.dianping.cat.home.storage.entity.StorageGroupConfig; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onLink(final StorageGroup parent, final Link link) { + parent.setLink(link); + return true; + } + + @Override + public boolean onStorage(final StorageGroup parent, final Storage storage) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addStorage(storage); + } + }); + } else { + parent.addStorage(storage); + } + + return true; + } + + @Override + public boolean onStorageGroup(final StorageGroupConfig parent, final StorageGroup storageGroup) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addStorageGroup(storageGroup); + } + }); + } else { + parent.addStorageGroup(storageGroup); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultMerger.java b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultMerger.java new file mode 100644 index 0000000000..79aff5284e --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultMerger.java @@ -0,0 +1,137 @@ +package com.dianping.cat.home.storage.transform; + +import java.util.Stack; + +import com.dianping.cat.home.storage.IEntity; +import com.dianping.cat.home.storage.IVisitor; +import com.dianping.cat.home.storage.entity.Link; +import com.dianping.cat.home.storage.entity.Storage; +import com.dianping.cat.home.storage.entity.StorageGroup; +import com.dianping.cat.home.storage.entity.StorageGroupConfig; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private StorageGroupConfig m_storageGroupConfig; + + public DefaultMerger() { + } + + public DefaultMerger(StorageGroupConfig storageGroupConfig) { + m_storageGroupConfig = storageGroupConfig; + m_objs.push(storageGroupConfig); + } + + public StorageGroupConfig getStorageGroupConfig() { + return m_storageGroupConfig; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeLink(Link to, Link from) { + to.mergeAttributes(from); + to.getPars().addAll(from.getPars()); + } + + protected void mergeStorage(Storage to, Storage from) { + to.mergeAttributes(from); + } + + protected void mergeStorageGroup(StorageGroup to, StorageGroup from) { + to.mergeAttributes(from); + } + + protected void mergeStorageGroupConfig(StorageGroupConfig to, StorageGroupConfig from) { + to.mergeAttributes(from); + } + + @Override + public void visitLink(Link from) { + Link to = (Link) m_objs.peek(); + + mergeLink(to, from); + visitLinkChildren(to, from); + } + + protected void visitLinkChildren(Link to, Link from) { + } + + @Override + public void visitStorage(Storage from) { + Storage to = (Storage) m_objs.peek(); + + mergeStorage(to, from); + visitStorageChildren(to, from); + } + + protected void visitStorageChildren(Storage to, Storage from) { + } + + @Override + public void visitStorageGroup(StorageGroup from) { + StorageGroup to = (StorageGroup) m_objs.peek(); + + mergeStorageGroup(to, from); + visitStorageGroupChildren(to, from); + } + + protected void visitStorageGroupChildren(StorageGroup to, StorageGroup from) { + if (from.getLink() != null) { + Link target = to.getLink(); + + if (target == null) { + target = new Link(); + to.setLink(target); + } + + m_objs.push(target); + from.getLink().accept(this); + m_objs.pop(); + } + + for (Storage source : from.getStorages().values()) { + Storage target = to.findStorage(source.getId()); + + if (target == null) { + target = new Storage(source.getId()); + to.addStorage(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitStorageGroupConfig(StorageGroupConfig from) { + StorageGroupConfig to = (StorageGroupConfig) m_objs.peek(); + + mergeStorageGroupConfig(to, from); + visitStorageGroupConfigChildren(to, from); + } + + protected void visitStorageGroupConfigChildren(StorageGroupConfig to, StorageGroupConfig from) { + for (StorageGroup source : from.getStorageGroups().values()) { + StorageGroup target = to.findStorageGroup(source.getId()); + + if (target == null) { + target = new StorageGroup(source.getId()); + to.addStorageGroup(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..a57acfcec1 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultSaxMaker.java @@ -0,0 +1,99 @@ +package com.dianping.cat.home.storage.transform; + +import static com.dianping.cat.home.storage.Constants.ATTR_DEPARTMENT; +import static com.dianping.cat.home.storage.Constants.ATTR_ID; +import static com.dianping.cat.home.storage.Constants.ATTR_PRODUCTLINE; +import static com.dianping.cat.home.storage.Constants.ATTR_TITLE; +import static com.dianping.cat.home.storage.Constants.ATTR_URL; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.storage.entity.Link; +import com.dianping.cat.home.storage.entity.Storage; +import com.dianping.cat.home.storage.entity.StorageGroup; +import com.dianping.cat.home.storage.entity.StorageGroupConfig; + +public class DefaultSaxMaker implements IMaker { + + @Override + public Link buildLink(Attributes attributes) { + String url = attributes.getValue(ATTR_URL); + Link link = new Link(); + + if (url != null) { + link.setUrl(url); + } + + return link; + } + + @Override + public String buildPar(Attributes attributes) { + throw new UnsupportedOperationException(); + } + + @Override + public Storage buildStorage(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String department = attributes.getValue(ATTR_DEPARTMENT); + String productline = attributes.getValue(ATTR_PRODUCTLINE); + String title = attributes.getValue(ATTR_TITLE); + Storage storage = new Storage(id); + + if (department != null) { + storage.setDepartment(department); + } + + if (productline != null) { + storage.setProductline(productline); + } + + if (title != null) { + storage.setTitle(title); + } + + return storage; + } + + @Override + public StorageGroup buildStorageGroup(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + StorageGroup storageGroup = new StorageGroup(id); + + return storageGroup; + } + + @Override + public StorageGroupConfig buildStorageGroupConfig(Attributes attributes) { + StorageGroupConfig storageGroupConfig = new StorageGroupConfig(); + + return storageGroupConfig; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..4de9d7b09a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultSaxParser.java @@ -0,0 +1,285 @@ +package com.dianping.cat.home.storage.transform; + +import static com.dianping.cat.home.storage.Constants.ELEMENT_PAR; +import static com.dianping.cat.home.storage.Constants.ELEMENT_PARS; + +import static com.dianping.cat.home.storage.Constants.ENTITY_LINK; +import static com.dianping.cat.home.storage.Constants.ENTITY_STORAGE; +import static com.dianping.cat.home.storage.Constants.ENTITY_STORAGE_GROUP; +import static com.dianping.cat.home.storage.Constants.ENTITY_STORAGE_GROUP_CONFIG; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.storage.IEntity; +import com.dianping.cat.home.storage.entity.Link; +import com.dianping.cat.home.storage.entity.Storage; +import com.dianping.cat.home.storage.entity.StorageGroup; +import com.dianping.cat.home.storage.entity.StorageGroupConfig; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static StorageGroupConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(StorageGroupConfig.class, new InputSource(removeBOM(in))); + } + + public static StorageGroupConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(StorageGroupConfig.class, new InputSource(removeBOM(reader))); + } + + public static StorageGroupConfig parse(String xml) throws SAXException, IOException { + return parseEntity(StorageGroupConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + Object currentObj = m_objs.pop(); + String currentTag = m_tags.pop(); + + if (currentObj instanceof Link) { + Link link = (Link) currentObj; + + if (ELEMENT_PAR.equals(currentTag)) { + link.addPar(getText()); + } + } + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForLink(Link parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ELEMENT_PARS.equals(qName) || ELEMENT_PAR.equals(qName)) { + m_objs.push(parentObj); + } else { + throw new SAXException(String.format("Element(%s) is not expected under link!", qName)); + } + + m_tags.push(qName); + } + + private void parseForStorage(Storage parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForStorageGroup(StorageGroup parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_LINK.equals(qName)) { + Link link = m_maker.buildLink(attributes); + + m_linker.onLink(parentObj, link); + m_objs.push(link); + } else if (ENTITY_STORAGE.equals(qName)) { + Storage storage = m_maker.buildStorage(attributes); + + m_linker.onStorage(parentObj, storage); + m_objs.push(storage); + } else { + throw new SAXException(String.format("Element(%s) is not expected under storage-group!", qName)); + } + + m_tags.push(qName); + } + + private void parseForStorageGroupConfig(StorageGroupConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_STORAGE_GROUP.equals(qName)) { + StorageGroup storageGroup = m_maker.buildStorageGroup(attributes); + + m_linker.onStorageGroup(parentObj, storageGroup); + m_objs.push(storageGroup); + } else { + throw new SAXException(String.format("Element(%s) is not expected under storage-group-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_STORAGE_GROUP_CONFIG.equals(qName)) { + StorageGroupConfig storageGroupConfig = m_maker.buildStorageGroupConfig(attributes); + + m_entity = storageGroupConfig; + m_objs.push(storageGroupConfig); + m_tags.push(qName); + } else if (ENTITY_STORAGE_GROUP.equals(qName)) { + StorageGroup storageGroup = m_maker.buildStorageGroup(attributes); + + m_entity = storageGroup; + m_objs.push(storageGroup); + m_tags.push(qName); + } else if (ENTITY_LINK.equals(qName)) { + Link link = m_maker.buildLink(attributes); + + m_entity = link; + m_objs.push(link); + m_tags.push(qName); + } else if (ENTITY_STORAGE.equals(qName)) { + Storage storage = m_maker.buildStorage(attributes); + + m_entity = storage; + m_objs.push(storage); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof StorageGroupConfig) { + parseForStorageGroupConfig((StorageGroupConfig) parent, tag, qName, attributes); + } else if (parent instanceof StorageGroup) { + parseForStorageGroup((StorageGroup) parent, tag, qName, attributes); + } else if (parent instanceof Link) { + parseForLink((Link) parent, tag, qName, attributes); + } else if (parent instanceof Storage) { + parseForStorage((Storage) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..8f9a8c140b --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/DefaultXmlBuilder.java @@ -0,0 +1,294 @@ +package com.dianping.cat.home.storage.transform; + +import static com.dianping.cat.home.storage.Constants.ATTR_DEPARTMENT; +import static com.dianping.cat.home.storage.Constants.ATTR_ID; +import static com.dianping.cat.home.storage.Constants.ATTR_PRODUCTLINE; +import static com.dianping.cat.home.storage.Constants.ATTR_TITLE; +import static com.dianping.cat.home.storage.Constants.ATTR_URL; +import static com.dianping.cat.home.storage.Constants.ELEMENT_PAR; +import static com.dianping.cat.home.storage.Constants.ENTITY_LINK; +import static com.dianping.cat.home.storage.Constants.ENTITY_STORAGE; +import static com.dianping.cat.home.storage.Constants.ENTITY_STORAGE_GROUP; +import static com.dianping.cat.home.storage.Constants.ENTITY_STORAGE_GROUP_CONFIG; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.storage.IEntity; +import com.dianping.cat.home.storage.IVisitor; +import com.dianping.cat.home.storage.entity.Link; +import com.dianping.cat.home.storage.entity.Storage; +import com.dianping.cat.home.storage.entity.StorageGroup; +import com.dianping.cat.home.storage.entity.StorageGroupConfig; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected void tagWithText(String name, String text, Object... nameValues) { + if (text == null) { + return; + } + + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + m_sb.append(">"); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } + + protected void element(String name, String text, String defaultValue, boolean escape) { + if (text == null || text.equals(defaultValue)) { + return; + } + + indent(); + + m_sb.append('<').append(name).append(">"); + + if (escape) { + m_sb.append(escape(text, true)); + } else { + m_sb.append(""); + } + + m_sb.append("\r\n"); + } + + @Override + public void visitLink(Link link) { + startTag(ENTITY_LINK, null, ATTR_URL, link.getUrl()); + + if (!link.getPars().isEmpty()) { + for (String par : link.getPars()) { + tagWithText(ELEMENT_PAR, par); + } + } + + endTag(ENTITY_LINK); + } + + @Override + public void visitStorage(Storage storage) { + startTag(ENTITY_STORAGE, true, null, ATTR_ID, storage.getId(), ATTR_DEPARTMENT, storage.getDepartment(), ATTR_PRODUCTLINE, storage.getProductline(), ATTR_TITLE, storage.getTitle()); + } + + @Override + public void visitStorageGroup(StorageGroup storageGroup) { + startTag(ENTITY_STORAGE_GROUP, null, ATTR_ID, storageGroup.getId()); + + if (storageGroup.getLink() != null) { + storageGroup.getLink().accept(m_visitor); + } + + if (!storageGroup.getStorages().isEmpty()) { + for (Storage storage : storageGroup.getStorages().values()) { + storage.accept(m_visitor); + } + } + + endTag(ENTITY_STORAGE_GROUP); + } + + @Override + public void visitStorageGroupConfig(StorageGroupConfig storageGroupConfig) { + startTag(ENTITY_STORAGE_GROUP_CONFIG, null); + + if (!storageGroupConfig.getStorageGroups().isEmpty()) { + for (StorageGroup storageGroup : storageGroupConfig.getStorageGroups().values()) { + storageGroup.accept(m_visitor); + } + } + + endTag(ENTITY_STORAGE_GROUP_CONFIG); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/ILinker.java new file mode 100644 index 0000000000..786141e7d8 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/ILinker.java @@ -0,0 +1,15 @@ +package com.dianping.cat.home.storage.transform; + +import com.dianping.cat.home.storage.entity.Link; +import com.dianping.cat.home.storage.entity.Storage; +import com.dianping.cat.home.storage.entity.StorageGroup; +import com.dianping.cat.home.storage.entity.StorageGroupConfig; + +public interface ILinker { + + public boolean onLink(StorageGroup parent, Link link); + + public boolean onStorage(StorageGroup parent, Storage storage); + + public boolean onStorageGroup(StorageGroupConfig parent, StorageGroup storageGroup); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/IMaker.java new file mode 100644 index 0000000000..92ed86caba --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/IMaker.java @@ -0,0 +1,19 @@ +package com.dianping.cat.home.storage.transform; + +import com.dianping.cat.home.storage.entity.Link; +import com.dianping.cat.home.storage.entity.Storage; +import com.dianping.cat.home.storage.entity.StorageGroup; +import com.dianping.cat.home.storage.entity.StorageGroupConfig; + +public interface IMaker { + + public Link buildLink(T node); + + public String buildPar(T node); + + public Storage buildStorage(T node); + + public StorageGroup buildStorageGroup(T node); + + public StorageGroupConfig buildStorageGroupConfig(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/storage/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/IParser.java new file mode 100644 index 0000000000..b616e35884 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/storage/transform/IParser.java @@ -0,0 +1,16 @@ +package com.dianping.cat.home.storage.transform; + +import com.dianping.cat.home.storage.entity.Link; +import com.dianping.cat.home.storage.entity.Storage; +import com.dianping.cat.home.storage.entity.StorageGroup; +import com.dianping.cat.home.storage.entity.StorageGroupConfig; + +public interface IParser { + public StorageGroupConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForLink(IMaker maker, ILinker linker, Link parent, T node); + + public void parseForStorage(IMaker maker, ILinker linker, Storage parent, T node); + + public void parseForStorageGroup(IMaker maker, ILinker linker, StorageGroup parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/user/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/user/BaseEntity.java new file mode 100644 index 0000000000..108b881bfa --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/user/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.user; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.user.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/user/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/user/Constants.java new file mode 100644 index 0000000000..3b2d88d074 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/user/Constants.java @@ -0,0 +1,14 @@ +package com.dianping.cat.home.user; + +public class Constants { + + public static final String ATTR_ID = "id"; + + public static final String ATTR_ROLE = "role"; + + public static final String ENTITY_USER = "user"; + + public static final String ENTITY_USERS = "users"; + + public static final String ENTITY_USER_CONFIG = "user-config"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/user/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/user/IEntity.java new file mode 100644 index 0000000000..90f16c36c5 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/user/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.user; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/user/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/user/IVisitor.java new file mode 100644 index 0000000000..761dcbd5fa --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/user/IVisitor.java @@ -0,0 +1,11 @@ +package com.dianping.cat.home.user; + +import com.dianping.cat.home.user.entity.User; +import com.dianping.cat.home.user.entity.UserConfig; + +public interface IVisitor { + + public void visitUser(User user); + + public void visitUserConfig(UserConfig userConfig); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/user/entity/User.java b/cat-home/src/main/java/com/dianping/cat/home/user/entity/User.java new file mode 100644 index 0000000000..04a86fd4f9 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/user/entity/User.java @@ -0,0 +1,75 @@ +package com.dianping.cat.home.user.entity; + +import static com.dianping.cat.home.user.Constants.ATTR_ID; +import static com.dianping.cat.home.user.Constants.ENTITY_USER; + +import com.dianping.cat.home.user.BaseEntity; +import com.dianping.cat.home.user.IVisitor; + +public class User extends BaseEntity { + private String m_id; + + private int m_role; + + public User() { + } + + public User(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitUser(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof User) { + User _o = (User) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public String getId() { + return m_id; + } + + public int getRole() { + return m_role; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(User other) { + assertAttributeEquals(other, ENTITY_USER, ATTR_ID, m_id, other.getId()); + + m_role = other.getRole(); + } + + public User setId(String id) { + m_id = id; + return this; + } + + public User setRole(int role) { + m_role = role; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/user/entity/UserConfig.java b/cat-home/src/main/java/com/dianping/cat/home/user/entity/UserConfig.java new file mode 100644 index 0000000000..adbbec0572 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/user/entity/UserConfig.java @@ -0,0 +1,66 @@ +package com.dianping.cat.home.user.entity; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.user.BaseEntity; +import com.dianping.cat.home.user.IVisitor; + +public class UserConfig extends BaseEntity { + private Map m_users = new LinkedHashMap(); + + public UserConfig() { + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitUserConfig(this); + } + + public UserConfig addUser(User user) { + m_users.put(user.getId(), user); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof UserConfig) { + UserConfig _o = (UserConfig) obj; + + if (!equals(getUsers(), _o.getUsers())) { + return false; + } + + + return true; + } + + return false; + } + + public User findUser(String id) { + return m_users.get(id); + } + + public Map getUsers() { + return m_users; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_users == null ? 0 : m_users.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(UserConfig other) { + } + + public User removeUser(String id) { + return m_users.remove(id); + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultLinker.java new file mode 100644 index 0000000000..32aa1518fb --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultLinker.java @@ -0,0 +1,38 @@ +package com.dianping.cat.home.user.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.user.entity.User; +import com.dianping.cat.home.user.entity.UserConfig; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onUser(final UserConfig parent, final User user) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addUser(user); + } + }); + } else { + parent.addUser(user); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..9e04439c94 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultSaxMaker.java @@ -0,0 +1,59 @@ +package com.dianping.cat.home.user.transform; + +import static com.dianping.cat.home.user.Constants.ATTR_ID; +import static com.dianping.cat.home.user.Constants.ATTR_ROLE; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.user.entity.User; +import com.dianping.cat.home.user.entity.UserConfig; + +public class DefaultSaxMaker implements IMaker { + + @Override + public User buildUser(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String role = attributes.getValue(ATTR_ROLE); + User user = new User(id); + + if (role != null) { + user.setRole(convert(Integer.class, role, 0)); + } + + return user; + } + + @Override + public UserConfig buildUserConfig(Attributes attributes) { + UserConfig userConfig = new UserConfig(); + + return userConfig; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..06628f6e18 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultSaxParser.java @@ -0,0 +1,227 @@ +package com.dianping.cat.home.user.transform; + +import static com.dianping.cat.home.user.Constants.ENTITY_USER; +import static com.dianping.cat.home.user.Constants.ENTITY_USER_CONFIG; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.user.IEntity; +import com.dianping.cat.home.user.entity.User; +import com.dianping.cat.home.user.entity.UserConfig; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static UserConfig parse(InputStream in) throws SAXException, IOException { + return parseEntity(UserConfig.class, new InputSource(removeBOM(in))); + } + + public static UserConfig parse(Reader reader) throws SAXException, IOException { + return parseEntity(UserConfig.class, new InputSource(removeBOM(reader))); + } + + public static UserConfig parse(String xml) throws SAXException, IOException { + return parseEntity(UserConfig.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForUser(User parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForUserConfig(UserConfig parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_USER.equals(qName)) { + User user = m_maker.buildUser(attributes); + + m_linker.onUser(parentObj, user); + m_objs.push(user); + } else { + throw new SAXException(String.format("Element(%s) is not expected under user-config!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_USER_CONFIG.equals(qName)) { + UserConfig userConfig = m_maker.buildUserConfig(attributes); + + m_entity = userConfig; + m_objs.push(userConfig); + m_tags.push(qName); + } else if (ENTITY_USER.equals(qName)) { + User user = m_maker.buildUser(attributes); + + m_entity = user; + m_objs.push(user); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof UserConfig) { + parseForUserConfig((UserConfig) parent, tag, qName, attributes); + } else if (parent instanceof User) { + parseForUser((User) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..692a792312 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/user/transform/DefaultXmlBuilder.java @@ -0,0 +1,213 @@ +package com.dianping.cat.home.user.transform; + +import static com.dianping.cat.home.user.Constants.ATTR_ID; +import static com.dianping.cat.home.user.Constants.ATTR_ROLE; +import static com.dianping.cat.home.user.Constants.ENTITY_USER; +import static com.dianping.cat.home.user.Constants.ENTITY_USER_CONFIG; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.user.IEntity; +import com.dianping.cat.home.user.IVisitor; +import com.dianping.cat.home.user.entity.User; +import com.dianping.cat.home.user.entity.UserConfig; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + @Override + public void visitUser(User user) { + startTag(ENTITY_USER, true, null, ATTR_ID, user.getId(), ATTR_ROLE, user.getRole()); + } + + @Override + public void visitUserConfig(UserConfig userConfig) { + startTag(ENTITY_USER_CONFIG, null); + + if (!userConfig.getUsers().isEmpty()) { + for (User user : userConfig.getUsers().values()) { + user.accept(m_visitor); + } + } + + endTag(ENTITY_USER_CONFIG); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/user/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/user/transform/ILinker.java new file mode 100644 index 0000000000..4ecf4445dd --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/user/transform/ILinker.java @@ -0,0 +1,9 @@ +package com.dianping.cat.home.user.transform; + +import com.dianping.cat.home.user.entity.User; +import com.dianping.cat.home.user.entity.UserConfig; + +public interface ILinker { + + public boolean onUser(UserConfig parent, User user); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/user/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/user/transform/IMaker.java new file mode 100644 index 0000000000..b3f88db14e --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/user/transform/IMaker.java @@ -0,0 +1,11 @@ +package com.dianping.cat.home.user.transform; + +import com.dianping.cat.home.user.entity.User; +import com.dianping.cat.home.user.entity.UserConfig; + +public interface IMaker { + + public User buildUser(T node); + + public UserConfig buildUserConfig(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/user/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/user/transform/IParser.java new file mode 100644 index 0000000000..86ced39d13 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/user/transform/IParser.java @@ -0,0 +1,10 @@ +package com.dianping.cat.home.user.transform; + +import com.dianping.cat.home.user.entity.User; +import com.dianping.cat.home.user.entity.UserConfig; + +public interface IParser { + public UserConfig parse(IMaker maker, ILinker linker, T node); + + public void parseForUser(IMaker maker, ILinker linker, User parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/BaseEntity.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/BaseEntity.java new file mode 100644 index 0000000000..870891c8f8 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/BaseEntity.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.utilization; + +import java.util.Formattable; +import java.util.Formatter; + +import com.dianping.cat.home.utilization.transform.DefaultXmlBuilder; + +public abstract class BaseEntity implements IEntity, Formattable { + + public static final String XML = "%.3s"; + + public static final String XML_COMPACT = "%s"; + + protected void assertAttributeEquals(Object instance, String entityName, String name, Object expectedValue, Object actualValue) { + if (expectedValue == null && actualValue != null || expectedValue != null && !expectedValue.equals(actualValue)) { + throw new IllegalArgumentException(String.format("Mismatched entity(%s) found! Same %s attribute is expected! %s: %s.", entityName, name, entityName, instance)); + } + } + + protected boolean equals(Object o1, Object o2) { + if (o1 == null) { + return o2 == null; + } else if (o2 == null) { + return false; + } else { + return o1.equals(o2); + } + } + + @Override + public void formatTo(Formatter formatter, int flags, int width, int precision) { + boolean compact = (precision == 0); + DefaultXmlBuilder builder = new DefaultXmlBuilder(compact); + + formatter.format("%s", builder.buildXml(this)); + } + + @Override + public String toString() { + return new DefaultXmlBuilder().buildXml(this); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/Constants.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/Constants.java new file mode 100644 index 0000000000..0fc795aead --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/Constants.java @@ -0,0 +1,46 @@ +package com.dianping.cat.home.utilization; + +public class Constants { + + public static final String ATTR_AVG = "avg"; + + public static final String ATTR_AVG95 = "avg95"; + + public static final String ATTR_AVG_MAX = "avg-max"; + + public static final String ATTR_CMDB_ID = "cmdb-id"; + + public static final String ATTR_COUNT = "count"; + + public static final String ATTR_DOMAIN = "domain"; + + public static final String ATTR_ENDTIME = "endTime"; + + public static final String ATTR_FAILURE_COUNT = "failure-count"; + + public static final String ATTR_FAILURE_PERCENT = "failure-percent"; + + public static final String ATTR_ID = "id"; + + public static final String ATTR_MACHINE_NUMBER = "machine-number"; + + public static final String ATTR_MAXQPS = "maxQps"; + + public static final String ATTR_STARTTIME = "startTime"; + + public static final String ATTR_SUM = "sum"; + + public static final String ENTITY_APPLICATIONSTATE = "applicationState"; + + public static final String ENTITY_APPLICATIONSTATES = "applicationStates"; + + public static final String ENTITY_DOMAIN = "domain"; + + public static final String ENTITY_DOMAINS = "domains"; + + public static final String ENTITY_MACHINESTATE = "machineState"; + + public static final String ENTITY_MACHINESTATES = "machineStates"; + + public static final String ENTITY_UTILIZATION_REPORT = "utilization-report"; +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/IEntity.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/IEntity.java new file mode 100644 index 0000000000..090fed8f28 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/IEntity.java @@ -0,0 +1,8 @@ +package com.dianping.cat.home.utilization; + +public interface IEntity { + public void accept(IVisitor visitor); + + public void mergeAttributes(T other); + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/IVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/IVisitor.java new file mode 100644 index 0000000000..731cf38d3f --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/IVisitor.java @@ -0,0 +1,17 @@ +package com.dianping.cat.home.utilization; + +import com.dianping.cat.home.utilization.entity.ApplicationState; +import com.dianping.cat.home.utilization.entity.Domain; +import com.dianping.cat.home.utilization.entity.MachineState; +import com.dianping.cat.home.utilization.entity.UtilizationReport; + +public interface IVisitor { + + public void visitApplicationState(ApplicationState applicationState); + + public void visitDomain(Domain domain); + + public void visitMachineState(MachineState machineState); + + public void visitUtilizationReport(UtilizationReport utilizationReport); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/entity/ApplicationState.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/entity/ApplicationState.java new file mode 100644 index 0000000000..a6ec619c39 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/entity/ApplicationState.java @@ -0,0 +1,153 @@ +package com.dianping.cat.home.utilization.entity; + +import static com.dianping.cat.home.utilization.Constants.ATTR_ID; +import static com.dianping.cat.home.utilization.Constants.ENTITY_APPLICATIONSTATE; + +import com.dianping.cat.home.utilization.BaseEntity; +import com.dianping.cat.home.utilization.IVisitor; + +public class ApplicationState extends BaseEntity { + private String m_id; + + private long m_failureCount; + + private double m_failurePercent; + + private long m_count; + + private double m_maxQps; + + private double m_avg; + + private double m_sum; + + private double m_avg95; + + public ApplicationState() { + } + + public ApplicationState(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitApplicationState(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ApplicationState) { + ApplicationState _o = (ApplicationState) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public double getAvg() { + return m_avg; + } + + public double getAvg95() { + return m_avg95; + } + + public long getCount() { + return m_count; + } + + public long getFailureCount() { + return m_failureCount; + } + + public double getFailurePercent() { + return m_failurePercent; + } + + public String getId() { + return m_id; + } + + public double getMaxQps() { + return m_maxQps; + } + + public double getSum() { + return m_sum; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(ApplicationState other) { + assertAttributeEquals(other, ENTITY_APPLICATIONSTATE, ATTR_ID, m_id, other.getId()); + + m_failureCount = other.getFailureCount(); + + m_failurePercent = other.getFailurePercent(); + + m_count = other.getCount(); + + m_maxQps = other.getMaxQps(); + + m_avg = other.getAvg(); + + m_sum = other.getSum(); + + m_avg95 = other.getAvg95(); + } + + public ApplicationState setAvg(double avg) { + m_avg = avg; + return this; + } + + public ApplicationState setAvg95(double avg95) { + m_avg95 = avg95; + return this; + } + + public ApplicationState setCount(long count) { + m_count = count; + return this; + } + + public ApplicationState setFailureCount(long failureCount) { + m_failureCount = failureCount; + return this; + } + + public ApplicationState setFailurePercent(double failurePercent) { + m_failurePercent = failurePercent; + return this; + } + + public ApplicationState setId(String id) { + m_id = id; + return this; + } + + public ApplicationState setMaxQps(double maxQps) { + m_maxQps = maxQps; + return this; + } + + public ApplicationState setSum(double sum) { + m_sum = sum; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/entity/Domain.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/entity/Domain.java new file mode 100644 index 0000000000..59c41cad53 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/entity/Domain.java @@ -0,0 +1,165 @@ +package com.dianping.cat.home.utilization.entity; + +import static com.dianping.cat.home.utilization.Constants.ATTR_ID; +import static com.dianping.cat.home.utilization.Constants.ENTITY_DOMAIN; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.utilization.BaseEntity; +import com.dianping.cat.home.utilization.IVisitor; + +public class Domain extends BaseEntity { + private String m_id; + + private int m_machineNumber; + + private String m_cmdbId; + + private Map m_machineStates = new LinkedHashMap(); + + private Map m_applicationStates = new LinkedHashMap(); + + public Domain() { + } + + public Domain(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitDomain(this); + } + + public Domain addApplicationState(ApplicationState applicationState) { + m_applicationStates.put(applicationState.getId(), applicationState); + return this; + } + + public Domain addMachineState(MachineState machineState) { + m_machineStates.put(machineState.getId(), machineState); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Domain) { + Domain _o = (Domain) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public ApplicationState findApplicationState(String id) { + return m_applicationStates.get(id); + } + + public MachineState findMachineState(String id) { + return m_machineStates.get(id); + } + + public ApplicationState findOrCreateApplicationState(String id) { + ApplicationState applicationState = m_applicationStates.get(id); + + if (applicationState == null) { + synchronized (m_applicationStates) { + applicationState = m_applicationStates.get(id); + + if (applicationState == null) { + applicationState = new ApplicationState(id); + m_applicationStates.put(id, applicationState); + } + } + } + + return applicationState; + } + + public MachineState findOrCreateMachineState(String id) { + MachineState machineState = m_machineStates.get(id); + + if (machineState == null) { + synchronized (m_machineStates) { + machineState = m_machineStates.get(id); + + if (machineState == null) { + machineState = new MachineState(id); + m_machineStates.put(id, machineState); + } + } + } + + return machineState; + } + + public Map getApplicationStates() { + return m_applicationStates; + } + + public String getCmdbId() { + return m_cmdbId; + } + + public String getId() { + return m_id; + } + + public int getMachineNumber() { + return m_machineNumber; + } + + public Map getMachineStates() { + return m_machineStates; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(Domain other) { + assertAttributeEquals(other, ENTITY_DOMAIN, ATTR_ID, m_id, other.getId()); + + m_machineNumber = other.getMachineNumber(); + + if (other.getCmdbId() != null) { + m_cmdbId = other.getCmdbId(); + } + } + + public ApplicationState removeApplicationState(String id) { + return m_applicationStates.remove(id); + } + + public MachineState removeMachineState(String id) { + return m_machineStates.remove(id); + } + + public Domain setCmdbId(String cmdbId) { + m_cmdbId = cmdbId; + return this; + } + + public Domain setId(String id) { + m_id = id; + return this; + } + + public Domain setMachineNumber(int machineNumber) { + m_machineNumber = machineNumber; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/entity/MachineState.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/entity/MachineState.java new file mode 100644 index 0000000000..4737b16231 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/entity/MachineState.java @@ -0,0 +1,114 @@ +package com.dianping.cat.home.utilization.entity; + +import static com.dianping.cat.home.utilization.Constants.ATTR_ID; +import static com.dianping.cat.home.utilization.Constants.ENTITY_MACHINESTATE; + +import com.dianping.cat.home.utilization.BaseEntity; +import com.dianping.cat.home.utilization.IVisitor; + +public class MachineState extends BaseEntity { + private String m_id; + + private long m_count; + + private double m_sum; + + private double m_avg; + + private double m_avgMax; + + public MachineState() { + } + + public MachineState(String id) { + m_id = id; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitMachineState(this); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof MachineState) { + MachineState _o = (MachineState) obj; + + if (!equals(getId(), _o.getId())) { + return false; + } + + return true; + } + + return false; + } + + public double getAvg() { + return m_avg; + } + + public double getAvgMax() { + return m_avgMax; + } + + public long getCount() { + return m_count; + } + + public String getId() { + return m_id; + } + + public double getSum() { + return m_sum; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_id == null ? 0 : m_id.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(MachineState other) { + assertAttributeEquals(other, ENTITY_MACHINESTATE, ATTR_ID, m_id, other.getId()); + + m_count = other.getCount(); + + m_sum = other.getSum(); + + m_avg = other.getAvg(); + + m_avgMax = other.getAvgMax(); + } + + public MachineState setAvg(double avg) { + m_avg = avg; + return this; + } + + public MachineState setAvgMax(double avgMax) { + m_avgMax = avgMax; + return this; + } + + public MachineState setCount(long count) { + m_count = count; + return this; + } + + public MachineState setId(String id) { + m_id = id; + return this; + } + + public MachineState setSum(double sum) { + m_sum = sum; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/entity/UtilizationReport.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/entity/UtilizationReport.java new file mode 100644 index 0000000000..aa8669716a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/entity/UtilizationReport.java @@ -0,0 +1,131 @@ +package com.dianping.cat.home.utilization.entity; + +import static com.dianping.cat.home.utilization.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.utilization.Constants.ENTITY_UTILIZATION_REPORT; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.home.utilization.BaseEntity; +import com.dianping.cat.home.utilization.IVisitor; + +public class UtilizationReport extends BaseEntity { + private String m_domain; + + private java.util.Date m_startTime; + + private java.util.Date m_endTime; + + private Map m_domains = new LinkedHashMap(); + + public UtilizationReport() { + } + + public UtilizationReport(String domain) { + m_domain = domain; + } + + @Override + public void accept(IVisitor visitor) { + visitor.visitUtilizationReport(this); + } + + public UtilizationReport addDomain(Domain domain) { + m_domains.put(domain.getId(), domain); + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof UtilizationReport) { + UtilizationReport _o = (UtilizationReport) obj; + + if (!equals(getDomain(), _o.getDomain())) { + return false; + } + + return true; + } + + return false; + } + + public Domain findDomain(String id) { + return m_domains.get(id); + } + + public Domain findOrCreateDomain(String id) { + Domain domain = m_domains.get(id); + + if (domain == null) { + synchronized (m_domains) { + domain = m_domains.get(id); + + if (domain == null) { + domain = new Domain(id); + m_domains.put(id, domain); + } + } + } + + return domain; + } + + public String getDomain() { + return m_domain; + } + + public Map getDomains() { + return m_domains; + } + + public java.util.Date getEndTime() { + return m_endTime; + } + + public java.util.Date getStartTime() { + return m_startTime; + } + + @Override + public int hashCode() { + int hash = 0; + + hash = hash * 31 + (m_domain == null ? 0 : m_domain.hashCode()); + + return hash; + } + + @Override + public void mergeAttributes(UtilizationReport other) { + assertAttributeEquals(other, ENTITY_UTILIZATION_REPORT, ATTR_DOMAIN, m_domain, other.getDomain()); + + if (other.getStartTime() != null) { + m_startTime = other.getStartTime(); + } + + if (other.getEndTime() != null) { + m_endTime = other.getEndTime(); + } + } + + public Domain removeDomain(String id) { + return m_domains.remove(id); + } + + public UtilizationReport setDomain(String domain) { + m_domain = domain; + return this; + } + + public UtilizationReport setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public UtilizationReport setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/BaseVisitor.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/BaseVisitor.java new file mode 100644 index 0000000000..132df88df5 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/BaseVisitor.java @@ -0,0 +1,35 @@ +package com.dianping.cat.home.utilization.transform; + +import com.dianping.cat.home.utilization.IVisitor; +import com.dianping.cat.home.utilization.entity.ApplicationState; +import com.dianping.cat.home.utilization.entity.Domain; +import com.dianping.cat.home.utilization.entity.MachineState; +import com.dianping.cat.home.utilization.entity.UtilizationReport; + +public abstract class BaseVisitor implements IVisitor { + @Override + public void visitApplicationState(ApplicationState applicationState) { + } + + @Override + public void visitDomain(Domain domain) { + for (MachineState machineState : domain.getMachineStates().values()) { + visitMachineState(machineState); + } + + for (ApplicationState applicationState : domain.getApplicationStates().values()) { + visitApplicationState(applicationState); + } + } + + @Override + public void visitMachineState(MachineState machineState) { + } + + @Override + public void visitUtilizationReport(UtilizationReport utilizationReport) { + for (Domain domain : utilizationReport.getDomains().values()) { + visitDomain(domain); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultLinker.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultLinker.java new file mode 100644 index 0000000000..5cc9e56b94 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultLinker.java @@ -0,0 +1,72 @@ +package com.dianping.cat.home.utilization.transform; + +import java.util.ArrayList; +import java.util.List; +import com.dianping.cat.home.utilization.entity.ApplicationState; +import com.dianping.cat.home.utilization.entity.Domain; +import com.dianping.cat.home.utilization.entity.MachineState; +import com.dianping.cat.home.utilization.entity.UtilizationReport; + +public class DefaultLinker implements ILinker { + private boolean m_deferrable; + + private List m_deferedJobs = new ArrayList(); + + public DefaultLinker(boolean deferrable) { + m_deferrable = deferrable; + } + + public void finish() { + for (Runnable job : m_deferedJobs) { + job.run(); + } + } + + @Override + public boolean onApplicationState(final Domain parent, final ApplicationState applicationState) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addApplicationState(applicationState); + } + }); + } else { + parent.addApplicationState(applicationState); + } + + return true; + } + + @Override + public boolean onDomain(final UtilizationReport parent, final Domain domain) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addDomain(domain); + } + }); + } else { + parent.addDomain(domain); + } + + return true; + } + + @Override + public boolean onMachineState(final Domain parent, final MachineState machineState) { + if (m_deferrable) { + m_deferedJobs.add(new Runnable() { + @Override + public void run() { + parent.addMachineState(machineState); + } + }); + } else { + parent.addMachineState(machineState); + } + + return true; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultMerger.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultMerger.java new file mode 100644 index 0000000000..34927cf887 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultMerger.java @@ -0,0 +1,136 @@ +package com.dianping.cat.home.utilization.transform; + +import java.util.Stack; + +import com.dianping.cat.home.utilization.IEntity; +import com.dianping.cat.home.utilization.IVisitor; +import com.dianping.cat.home.utilization.entity.ApplicationState; +import com.dianping.cat.home.utilization.entity.Domain; +import com.dianping.cat.home.utilization.entity.MachineState; +import com.dianping.cat.home.utilization.entity.UtilizationReport; + +public class DefaultMerger implements IVisitor { + + private Stack m_objs = new Stack(); + + private UtilizationReport m_utilizationReport; + + public DefaultMerger() { + } + + public DefaultMerger(UtilizationReport utilizationReport) { + m_utilizationReport = utilizationReport; + m_objs.push(utilizationReport); + } + + public UtilizationReport getUtilizationReport() { + return m_utilizationReport; + } + + protected Stack getObjects() { + return m_objs; + } + + public void merge(IEntity to, IEntity from) { + m_objs.push(to); + from.accept(this); + m_objs.pop(); + } + + protected void mergeApplicationState(ApplicationState to, ApplicationState from) { + to.mergeAttributes(from); + } + + protected void mergeDomain(Domain to, Domain from) { + to.mergeAttributes(from); + } + + protected void mergeMachineState(MachineState to, MachineState from) { + to.mergeAttributes(from); + } + + protected void mergeUtilizationReport(UtilizationReport to, UtilizationReport from) { + to.mergeAttributes(from); + } + + @Override + public void visitApplicationState(ApplicationState from) { + ApplicationState to = (ApplicationState) m_objs.peek(); + + mergeApplicationState(to, from); + visitApplicationStateChildren(to, from); + } + + protected void visitApplicationStateChildren(ApplicationState to, ApplicationState from) { + } + + @Override + public void visitDomain(Domain from) { + Domain to = (Domain) m_objs.peek(); + + mergeDomain(to, from); + visitDomainChildren(to, from); + } + + protected void visitDomainChildren(Domain to, Domain from) { + for (MachineState source : from.getMachineStates().values()) { + MachineState target = to.findMachineState(source.getId()); + + if (target == null) { + target = new MachineState(source.getId()); + to.addMachineState(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + + for (ApplicationState source : from.getApplicationStates().values()) { + ApplicationState target = to.findApplicationState(source.getId()); + + if (target == null) { + target = new ApplicationState(source.getId()); + to.addApplicationState(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } + + @Override + public void visitMachineState(MachineState from) { + MachineState to = (MachineState) m_objs.peek(); + + mergeMachineState(to, from); + visitMachineStateChildren(to, from); + } + + protected void visitMachineStateChildren(MachineState to, MachineState from) { + } + + @Override + public void visitUtilizationReport(UtilizationReport from) { + UtilizationReport to = (UtilizationReport) m_objs.peek(); + + mergeUtilizationReport(to, from); + visitUtilizationReportChildren(to, from); + } + + protected void visitUtilizationReportChildren(UtilizationReport to, UtilizationReport from) { + for (Domain source : from.getDomains().values()) { + Domain target = to.findDomain(source.getId()); + + if (target == null) { + target = new Domain(source.getId()); + to.addDomain(target); + } + + m_objs.push(target); + source.accept(this); + m_objs.pop(); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultNativeBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultNativeBuilder.java new file mode 100644 index 0000000000..b1227270c1 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultNativeBuilder.java @@ -0,0 +1,219 @@ +package com.dianping.cat.home.utilization.transform; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import com.dianping.cat.home.utilization.IVisitor; +import com.dianping.cat.home.utilization.entity.ApplicationState; +import com.dianping.cat.home.utilization.entity.Domain; +import com.dianping.cat.home.utilization.entity.MachineState; +import com.dianping.cat.home.utilization.entity.UtilizationReport; + +public class DefaultNativeBuilder implements IVisitor { + + private IVisitor m_visitor; + + private DataOutputStream m_out; + + public DefaultNativeBuilder(OutputStream out) { + this(out, null); + } + + public DefaultNativeBuilder(OutputStream out, IVisitor visitor) { + m_out = new DataOutputStream(out); + m_visitor = (visitor == null ? this : visitor); + } + + public static byte[] build(UtilizationReport utilizationReport) { + ByteArrayOutputStream out = new ByteArrayOutputStream(8192); + + build(utilizationReport, out); + return out.toByteArray(); + } + + public static void build(UtilizationReport utilizationReport, OutputStream out) { + utilizationReport.accept(new DefaultNativeBuilder(out)); + } + + @Override + public void visitApplicationState(ApplicationState applicationState) { + if (applicationState.getId() != null) { + writeTag(1, 1); + writeString(applicationState.getId()); + } + + writeTag(2, 0); + writeLong(applicationState.getFailureCount()); + + writeTag(3, 0); + writeDouble(applicationState.getFailurePercent()); + + writeTag(4, 0); + writeLong(applicationState.getCount()); + + writeTag(5, 0); + writeDouble(applicationState.getMaxQps()); + + writeTag(6, 0); + writeDouble(applicationState.getAvg()); + + writeTag(7, 0); + writeDouble(applicationState.getSum()); + + writeTag(8, 0); + writeDouble(applicationState.getAvg95()); + + writeTag(63, 3); + } + + @Override + public void visitDomain(Domain domain) { + if (domain.getId() != null) { + writeTag(1, 1); + writeString(domain.getId()); + } + + writeTag(2, 0); + writeInt(domain.getMachineNumber()); + + if (domain.getCmdbId() != null) { + writeTag(3, 1); + writeString(domain.getCmdbId()); + } + + if (!domain.getMachineStates().isEmpty()) { + writeTag(33, 2); + writeInt(domain.getMachineStates().size()); + + for (MachineState machineState : domain.getMachineStates().values()) { + machineState.accept(m_visitor); + } + } + + if (!domain.getApplicationStates().isEmpty()) { + writeTag(34, 2); + writeInt(domain.getApplicationStates().size()); + + for (ApplicationState applicationState : domain.getApplicationStates().values()) { + applicationState.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + @Override + public void visitMachineState(MachineState machineState) { + if (machineState.getId() != null) { + writeTag(1, 1); + writeString(machineState.getId()); + } + + writeTag(2, 0); + writeLong(machineState.getCount()); + + writeTag(3, 0); + writeDouble(machineState.getSum()); + + writeTag(4, 0); + writeDouble(machineState.getAvg()); + + writeTag(5, 0); + writeDouble(machineState.getAvgMax()); + + writeTag(63, 3); + } + + @Override + public void visitUtilizationReport(UtilizationReport utilizationReport) { + writeTag(63, 0); + + if (utilizationReport.getDomain() != null) { + writeTag(1, 1); + writeString(utilizationReport.getDomain()); + } + + if (utilizationReport.getStartTime() != null) { + writeTag(2, 1); + writeDate(utilizationReport.getStartTime()); + } + + if (utilizationReport.getEndTime() != null) { + writeTag(3, 1); + writeDate(utilizationReport.getEndTime()); + } + + if (!utilizationReport.getDomains().isEmpty()) { + writeTag(33, 2); + writeInt(utilizationReport.getDomains().size()); + + for (Domain domain : utilizationReport.getDomains().values()) { + domain.accept(m_visitor); + } + } + + writeTag(63, 3); + } + + private void writeDate(java.util.Date value) { + try { + writeVarint(value.getTime()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeDouble(double value) { + try { + writeVarint(Double.doubleToLongBits(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeInt(int value) { + try { + writeVarint(value & 0xFFFFFFFFL); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeLong(long value) { + try { + writeVarint(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeString(String value) { + try { + m_out.writeUTF(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void writeTag(int field, int type) { + try { + m_out.writeByte((field << 2) + type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void writeVarint(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + m_out.writeByte((byte) value); + return; + } else { + m_out.writeByte(((byte) value & 0x7F) | 0x80); + value >>>= 7; + } + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultNativeParser.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultNativeParser.java new file mode 100644 index 0000000000..ed60a7f434 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultNativeParser.java @@ -0,0 +1,271 @@ +package com.dianping.cat.home.utilization.transform; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.dianping.cat.home.utilization.IVisitor; +import com.dianping.cat.home.utilization.entity.ApplicationState; +import com.dianping.cat.home.utilization.entity.Domain; +import com.dianping.cat.home.utilization.entity.MachineState; +import com.dianping.cat.home.utilization.entity.UtilizationReport; + +public class DefaultNativeParser implements IVisitor { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DataInputStream m_in; + + public DefaultNativeParser(InputStream in) { + m_in = new DataInputStream(in); + } + + public static UtilizationReport parse(byte[] data) { + return parse(new ByteArrayInputStream(data)); + } + + public static UtilizationReport parse(InputStream in) { + DefaultNativeParser parser = new DefaultNativeParser(in); + UtilizationReport utilizationReport = new UtilizationReport(); + + try { + utilizationReport.accept(parser); + } catch (RuntimeException e) { + if (e.getCause() !=null && e.getCause() instanceof java.io.EOFException) { + // ignore it + } else { + throw e; + } + } + + parser.m_linker.finish(); + return utilizationReport; + } + + @Override + public void visitApplicationState(ApplicationState applicationState) { + byte tag; + + while ((tag = readTag()) != -1) { + visitApplicationStateChildren(applicationState, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitApplicationStateChildren(ApplicationState applicationState, int _field, int _type) { + switch (_field) { + case 1: + applicationState.setId(readString()); + break; + case 2: + applicationState.setFailureCount(readLong()); + break; + case 3: + applicationState.setFailurePercent(readDouble()); + break; + case 4: + applicationState.setCount(readLong()); + break; + case 5: + applicationState.setMaxQps(readDouble()); + break; + case 6: + applicationState.setAvg(readDouble()); + break; + case 7: + applicationState.setSum(readDouble()); + break; + case 8: + applicationState.setAvg95(readDouble()); + break; + } + } + + @Override + public void visitDomain(Domain domain) { + byte tag; + + while ((tag = readTag()) != -1) { + visitDomainChildren(domain, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitDomainChildren(Domain domain, int _field, int _type) { + switch (_field) { + case 1: + domain.setId(readString()); + break; + case 2: + domain.setMachineNumber(readInt()); + break; + case 3: + domain.setCmdbId(readString()); + break; + case 33: + if (_type == 1) { + MachineState machineState = new MachineState(); + + visitMachineState(machineState); + m_linker.onMachineState(domain, machineState); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + MachineState machineState = new MachineState(); + + visitMachineState(machineState); + m_linker.onMachineState(domain, machineState); + } + } + break; + case 34: + if (_type == 1) { + ApplicationState applicationState = new ApplicationState(); + + visitApplicationState(applicationState); + m_linker.onApplicationState(domain, applicationState); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + ApplicationState applicationState = new ApplicationState(); + + visitApplicationState(applicationState); + m_linker.onApplicationState(domain, applicationState); + } + } + break; + } + } + + @Override + public void visitMachineState(MachineState machineState) { + byte tag; + + while ((tag = readTag()) != -1) { + visitMachineStateChildren(machineState, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitMachineStateChildren(MachineState machineState, int _field, int _type) { + switch (_field) { + case 1: + machineState.setId(readString()); + break; + case 2: + machineState.setCount(readLong()); + break; + case 3: + machineState.setSum(readDouble()); + break; + case 4: + machineState.setAvg(readDouble()); + break; + case 5: + machineState.setAvgMax(readDouble()); + break; + } + } + + @Override + public void visitUtilizationReport(UtilizationReport utilizationReport) { + byte tag; + + if ((tag = readTag()) != -4) { + throw new RuntimeException(String.format("Malformed payload, expected: %s, but was: %s!", -4, tag)); + } + + while ((tag = readTag()) != -1) { + visitUtilizationReportChildren(utilizationReport, (tag & 0xFF) >> 2, tag & 0x3); + } + } + + protected void visitUtilizationReportChildren(UtilizationReport utilizationReport, int _field, int _type) { + switch (_field) { + case 1: + utilizationReport.setDomain(readString()); + break; + case 2: + utilizationReport.setStartTime(readDate()); + break; + case 3: + utilizationReport.setEndTime(readDate()); + break; + case 33: + if (_type == 1) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(utilizationReport, domain); + } else if (_type == 2) { + for (int i = readInt(); i > 0; i--) { + Domain domain = new Domain(); + + visitDomain(domain); + m_linker.onDomain(utilizationReport, domain); + } + } + break; + } + } + + private java.util.Date readDate() { + try { + return new java.util.Date(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private double readDouble() { + try { + return Double.longBitsToDouble(readVarint(64)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private int readInt() { + try { + return (int) readVarint(32); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private long readLong() { + try { + return readVarint(64); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String readString() { + try { + return m_in.readUTF(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private byte readTag() { + try { + return m_in.readByte(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected long readVarint(final int length) throws IOException { + int shift = 0; + long result = 0; + + while (shift < length) { + final byte b = m_in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + + throw new RuntimeException("Malformed variable int " + length + "!"); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultSaxMaker.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultSaxMaker.java new file mode 100644 index 0000000000..00e9a5cf38 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultSaxMaker.java @@ -0,0 +1,184 @@ +package com.dianping.cat.home.utilization.transform; + +import static com.dianping.cat.home.utilization.Constants.ATTR_AVG; +import static com.dianping.cat.home.utilization.Constants.ATTR_AVG_MAX; +import static com.dianping.cat.home.utilization.Constants.ATTR_AVG95; +import static com.dianping.cat.home.utilization.Constants.ATTR_CMDB_ID; +import static com.dianping.cat.home.utilization.Constants.ATTR_COUNT; +import static com.dianping.cat.home.utilization.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.utilization.Constants.ATTR_ENDTIME; +import static com.dianping.cat.home.utilization.Constants.ATTR_FAILURE_COUNT; +import static com.dianping.cat.home.utilization.Constants.ATTR_FAILURE_PERCENT; +import static com.dianping.cat.home.utilization.Constants.ATTR_ID; +import static com.dianping.cat.home.utilization.Constants.ATTR_MACHINE_NUMBER; +import static com.dianping.cat.home.utilization.Constants.ATTR_MAXQPS; +import static com.dianping.cat.home.utilization.Constants.ATTR_STARTTIME; +import static com.dianping.cat.home.utilization.Constants.ATTR_SUM; + +import org.xml.sax.Attributes; + +import com.dianping.cat.home.utilization.entity.ApplicationState; +import com.dianping.cat.home.utilization.entity.Domain; +import com.dianping.cat.home.utilization.entity.MachineState; +import com.dianping.cat.home.utilization.entity.UtilizationReport; + +public class DefaultSaxMaker implements IMaker { + + @Override + public ApplicationState buildApplicationState(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String failureCount = attributes.getValue(ATTR_FAILURE_COUNT); + String failurePercent = attributes.getValue(ATTR_FAILURE_PERCENT); + String count = attributes.getValue(ATTR_COUNT); + String maxQps = attributes.getValue(ATTR_MAXQPS); + String avg = attributes.getValue(ATTR_AVG); + String sum = attributes.getValue(ATTR_SUM); + String avg95 = attributes.getValue(ATTR_AVG95); + ApplicationState applicationState = new ApplicationState(id); + + if (failureCount != null) { + applicationState.setFailureCount(convert(Long.class, failureCount, 0L)); + } + + if (failurePercent != null) { + applicationState.setFailurePercent(toNumber(failurePercent, "0.000000", 0).doubleValue()); + } + + if (count != null) { + applicationState.setCount(convert(Long.class, count, 0L)); + } + + if (maxQps != null) { + applicationState.setMaxQps(toNumber(maxQps, "0.0000", 0).doubleValue()); + } + + if (avg != null) { + applicationState.setAvg(toNumber(avg, "0.0000", 0).doubleValue()); + } + + if (sum != null) { + applicationState.setSum(toNumber(sum, "0.0000", 0).doubleValue()); + } + + if (avg95 != null) { + applicationState.setAvg95(toNumber(avg95, "0.0000", 0).doubleValue()); + } + + return applicationState; + } + + @Override + public Domain buildDomain(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String machineNumber = attributes.getValue(ATTR_MACHINE_NUMBER); + String cmdbId = attributes.getValue(ATTR_CMDB_ID); + Domain domain = new Domain(id); + + if (machineNumber != null) { + domain.setMachineNumber(convert(Integer.class, machineNumber, 0)); + } + + if (cmdbId != null) { + domain.setCmdbId(cmdbId); + } + + return domain; + } + + @Override + public MachineState buildMachineState(Attributes attributes) { + String id = attributes.getValue(ATTR_ID); + String count = attributes.getValue(ATTR_COUNT); + String sum = attributes.getValue(ATTR_SUM); + String avg = attributes.getValue(ATTR_AVG); + String avgMax = attributes.getValue(ATTR_AVG_MAX); + MachineState machineState = new MachineState(id); + + if (count != null) { + machineState.setCount(convert(Long.class, count, 0L)); + } + + if (sum != null) { + machineState.setSum(toNumber(sum, "0.0000", 0).doubleValue()); + } + + if (avg != null) { + machineState.setAvg(toNumber(avg, "0.0000", 0).doubleValue()); + } + + if (avgMax != null) { + machineState.setAvgMax(toNumber(avgMax, "0.0000", 0).doubleValue()); + } + + return machineState; + } + + @Override + public UtilizationReport buildUtilizationReport(Attributes attributes) { + String domain = attributes.getValue(ATTR_DOMAIN); + String startTime = attributes.getValue(ATTR_STARTTIME); + String endTime = attributes.getValue(ATTR_ENDTIME); + UtilizationReport utilizationReport = new UtilizationReport(domain); + + if (startTime != null) { + utilizationReport.setStartTime(toDate(startTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + if (endTime != null) { + utilizationReport.setEndTime(toDate(endTime, "yyyy-MM-dd HH:mm:ss", null)); + } + + return utilizationReport; + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class || type == Boolean.TYPE) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class || type == Integer.TYPE) { + return (T) Integer.valueOf(value); + } else if (type == Long.class || type == Long.TYPE) { + return (T) Long.valueOf(value); + } else if (type == Short.class || type == Short.TYPE) { + return (T) Short.valueOf(value); + } else if (type == Float.class || type == Float.TYPE) { + return (T) Float.valueOf(value); + } else if (type == Double.class || type == Double.TYPE) { + return (T) Double.valueOf(value); + } else if (type == Byte.class || type == Byte.TYPE) { + return (T) Byte.valueOf(value); + } else if (type == Character.class || type == Character.TYPE) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + protected java.util.Date toDate(String str, String format, java.util.Date defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format, Number defaultValue) { + if (str == null || str.length() == 0) { + return defaultValue; + } + + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultSaxParser.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultSaxParser.java new file mode 100644 index 0000000000..849cde919a --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultSaxParser.java @@ -0,0 +1,286 @@ +package com.dianping.cat.home.utilization.transform; + +import static com.dianping.cat.home.utilization.Constants.ENTITY_APPLICATIONSTATE; +import static com.dianping.cat.home.utilization.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.home.utilization.Constants.ENTITY_MACHINESTATE; +import static com.dianping.cat.home.utilization.Constants.ENTITY_UTILIZATION_REPORT; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Stack; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.dianping.cat.home.utilization.IEntity; +import com.dianping.cat.home.utilization.entity.ApplicationState; +import com.dianping.cat.home.utilization.entity.Domain; +import com.dianping.cat.home.utilization.entity.MachineState; +import com.dianping.cat.home.utilization.entity.UtilizationReport; + +public class DefaultSaxParser extends DefaultHandler { + + private DefaultLinker m_linker = new DefaultLinker(true); + + private DefaultSaxMaker m_maker = new DefaultSaxMaker(); + + private Stack m_tags = new Stack(); + + private Stack m_objs = new Stack(); + + private IEntity m_entity; + + private StringBuilder m_text = new StringBuilder(); + + public static UtilizationReport parse(InputStream in) throws SAXException, IOException { + return parseEntity(UtilizationReport.class, new InputSource(removeBOM(in))); + } + + public static UtilizationReport parse(Reader reader) throws SAXException, IOException { + return parseEntity(UtilizationReport.class, new InputSource(removeBOM(reader))); + } + + public static UtilizationReport parse(String xml) throws SAXException, IOException { + return parseEntity(UtilizationReport.class, new InputSource(new StringReader(removeBOM(xml)))); + } + + @SuppressWarnings("unchecked") + private static > T parseEntity(Class type, InputSource is) throws SAXException, IOException { + try { + DefaultSaxParser handler = new DefaultSaxParser(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + + factory.setValidating(false); + factory.setFeature("http://xml.org/sax/features/validation", false); + + factory.newSAXParser().parse(is, handler); + return (T) handler.getEntity(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("Unable to get SAX parser instance!", e); + } + } + + public static > T parseEntity(Class type, InputStream in) throws SAXException, IOException { + return parseEntity(type, new InputSource(removeBOM(in))); + } + + public static > T parseEntity(Class type, String xml) throws SAXException, IOException { + return parseEntity(type, new InputSource(new StringReader(removeBOM(xml)))); + } + + // to remove Byte Order Mark(BOM) at the head of windows utf-8 file + @SuppressWarnings("unchecked") + private static T removeBOM(T obj) throws IOException { + if (obj instanceof String) { + String str = (String) obj; + + if (str.length() != 0 && str.charAt(0) == 0xFEFF) { + return (T) str.substring(1); + } else { + return obj; + } + } else if (obj instanceof InputStream) { + BufferedInputStream in = new BufferedInputStream((InputStream) obj); + + in.mark(3); + + if (in.read() != 0xEF || in.read() != 0xBB || in.read() != 0xBF) { + in.reset(); + } + + return (T) in; + } else if (obj instanceof Reader) { + BufferedReader in = new BufferedReader((Reader) obj); + + in.mark(1); + + if (in.read() != 0xFEFF) { + in.reset(); + } + + return (T) in; + } else { + return obj; + } + } + + @SuppressWarnings("unchecked") + protected T convert(Class type, String value, T defaultValue) { + if (value == null || value.length() == 0) { + return defaultValue; + } + + if (type == Boolean.class) { + return (T) Boolean.valueOf(value); + } else if (type == Integer.class) { + return (T) Integer.valueOf(value); + } else if (type == Long.class) { + return (T) Long.valueOf(value); + } else if (type == Short.class) { + return (T) Short.valueOf(value); + } else if (type == Float.class) { + return (T) Float.valueOf(value); + } else if (type == Double.class) { + return (T) Double.valueOf(value); + } else if (type == Byte.class) { + return (T) Byte.valueOf(value); + } else if (type == Character.class) { + return (T) (Character) value.charAt(0); + } else { + return (T) value; + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + m_text.append(ch, start, length); + } + + @Override + public void endDocument() throws SAXException { + m_linker.finish(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (uri == null || uri.length() == 0) { + m_objs.pop(); + m_tags.pop(); + + } + + m_text.setLength(0); + } + + private IEntity getEntity() { + return m_entity; + } + + protected String getText() { + return m_text.toString(); + } + + private void parseForApplicationState(ApplicationState parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForDomain(Domain parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_MACHINESTATE.equals(qName)) { + MachineState machineState = m_maker.buildMachineState(attributes); + + m_linker.onMachineState(parentObj, machineState); + m_objs.push(machineState); + } else if (ENTITY_APPLICATIONSTATE.equals(qName)) { + ApplicationState applicationState = m_maker.buildApplicationState(attributes); + + m_linker.onApplicationState(parentObj, applicationState); + m_objs.push(applicationState); + } else { + throw new SAXException(String.format("Element(%s) is not expected under domain!", qName)); + } + + m_tags.push(qName); + } + + private void parseForMachineState(MachineState parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + m_objs.push(parentObj); + m_tags.push(qName); + } + + private void parseForUtilizationReport(UtilizationReport parentObj, String parentTag, String qName, Attributes attributes) throws SAXException { + if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_linker.onDomain(parentObj, domain); + m_objs.push(domain); + } else { + throw new SAXException(String.format("Element(%s) is not expected under utilization-report!", qName)); + } + + m_tags.push(qName); + } + + private void parseRoot(String qName, Attributes attributes) throws SAXException { + if (ENTITY_UTILIZATION_REPORT.equals(qName)) { + UtilizationReport utilizationReport = m_maker.buildUtilizationReport(attributes); + + m_entity = utilizationReport; + m_objs.push(utilizationReport); + m_tags.push(qName); + } else if (ENTITY_DOMAIN.equals(qName)) { + Domain domain = m_maker.buildDomain(attributes); + + m_entity = domain; + m_objs.push(domain); + m_tags.push(qName); + } else if (ENTITY_MACHINESTATE.equals(qName)) { + MachineState machineState = m_maker.buildMachineState(attributes); + + m_entity = machineState; + m_objs.push(machineState); + m_tags.push(qName); + } else if (ENTITY_APPLICATIONSTATE.equals(qName)) { + ApplicationState applicationState = m_maker.buildApplicationState(attributes); + + m_entity = applicationState; + m_objs.push(applicationState); + m_tags.push(qName); + } else { + throw new SAXException("Unknown root element(" + qName + ") found!"); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (uri == null || uri.length() == 0) { + if (m_objs.isEmpty()) { // root + parseRoot(qName, attributes); + } else { + Object parent = m_objs.peek(); + String tag = m_tags.peek(); + + if (parent instanceof UtilizationReport) { + parseForUtilizationReport((UtilizationReport) parent, tag, qName, attributes); + } else if (parent instanceof Domain) { + parseForDomain((Domain) parent, tag, qName, attributes); + } else if (parent instanceof MachineState) { + parseForMachineState((MachineState) parent, tag, qName, attributes); + } else if (parent instanceof ApplicationState) { + parseForApplicationState((ApplicationState) parent, tag, qName, attributes); + } else { + throw new RuntimeException(String.format("Unknown entity(%s) under %s!", qName, parent.getClass().getName())); + } + } + + m_text.setLength(0); + } else { + throw new SAXException(String.format("Namespace(%s) is not supported by %s.", uri, this.getClass().getName())); + } + } + + protected java.util.Date toDate(String str, String format) { + try { + return new java.text.SimpleDateFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse date(%s) in format(%s)!", str, format), e); + } + } + + protected Number toNumber(String str, String format) { + try { + return new java.text.DecimalFormat(format).parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(String.format("Unable to parse number(%s) in format(%s)!", str, format), e); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultXmlBuilder.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultXmlBuilder.java new file mode 100644 index 0000000000..72fb53ddfa --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/DefaultXmlBuilder.java @@ -0,0 +1,269 @@ +package com.dianping.cat.home.utilization.transform; + +import static com.dianping.cat.home.utilization.Constants.ATTR_AVG; +import static com.dianping.cat.home.utilization.Constants.ATTR_AVG_MAX; +import static com.dianping.cat.home.utilization.Constants.ATTR_AVG95; +import static com.dianping.cat.home.utilization.Constants.ATTR_CMDB_ID; +import static com.dianping.cat.home.utilization.Constants.ATTR_COUNT; +import static com.dianping.cat.home.utilization.Constants.ATTR_DOMAIN; +import static com.dianping.cat.home.utilization.Constants.ATTR_ENDTIME; +import static com.dianping.cat.home.utilization.Constants.ATTR_FAILURE_COUNT; +import static com.dianping.cat.home.utilization.Constants.ATTR_FAILURE_PERCENT; +import static com.dianping.cat.home.utilization.Constants.ATTR_ID; +import static com.dianping.cat.home.utilization.Constants.ATTR_MACHINE_NUMBER; +import static com.dianping.cat.home.utilization.Constants.ATTR_MAXQPS; +import static com.dianping.cat.home.utilization.Constants.ATTR_STARTTIME; +import static com.dianping.cat.home.utilization.Constants.ATTR_SUM; +import static com.dianping.cat.home.utilization.Constants.ENTITY_APPLICATIONSTATE; +import static com.dianping.cat.home.utilization.Constants.ENTITY_DOMAIN; +import static com.dianping.cat.home.utilization.Constants.ENTITY_MACHINESTATE; +import static com.dianping.cat.home.utilization.Constants.ENTITY_UTILIZATION_REPORT; + +import java.lang.reflect.Array; +import java.util.Collection; + +import com.dianping.cat.home.utilization.IEntity; +import com.dianping.cat.home.utilization.IVisitor; +import com.dianping.cat.home.utilization.entity.ApplicationState; +import com.dianping.cat.home.utilization.entity.Domain; +import com.dianping.cat.home.utilization.entity.MachineState; +import com.dianping.cat.home.utilization.entity.UtilizationReport; + +public class DefaultXmlBuilder implements IVisitor { + + private IVisitor m_visitor = this; + + private int m_level; + + private StringBuilder m_sb; + + private boolean m_compact; + + public DefaultXmlBuilder() { + this(false); + } + + public DefaultXmlBuilder(boolean compact) { + this(compact, new StringBuilder(4096)); + } + + public DefaultXmlBuilder(boolean compact, StringBuilder sb) { + m_compact = compact; + m_sb = sb; + m_sb.append("\r\n"); + } + + public String buildXml(IEntity entity) { + entity.accept(m_visitor); + return m_sb.toString(); + } + + protected void endTag(String name) { + m_level--; + + indent(); + m_sb.append("\r\n"); + } + + protected String escape(Object value) { + return escape(value, false); + } + + protected String escape(Object value, boolean text) { + if (value == null) { + return null; + } + + String str = toString(value); + int len = str.length(); + StringBuilder sb = new StringBuilder(len + 16); + + for (int i = 0; i < len; i++) { + final char ch = str.charAt(i); + + switch (ch) { + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '&': + sb.append("&"); + break; + case '"': + if (!text) { + sb.append("""); + break; + } + default: + sb.append(ch); + break; + } + } + + return sb.toString(); + } + + protected void indent() { + if (!m_compact) { + for (int i = m_level - 1; i >= 0; i--) { + m_sb.append(" "); + } + } + } + + protected void startTag(String name) { + startTag(name, false, null); + } + + protected void startTag(String name, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, closed, dynamicAttributes, nameValues); + } + + protected void startTag(String name, java.util.Map dynamicAttributes, Object... nameValues) { + startTag(name, null, false, dynamicAttributes, nameValues); + } + + protected void startTag(String name, Object text, boolean closed, java.util.Map dynamicAttributes, Object... nameValues) { + indent(); + + m_sb.append('<').append(name); + + int len = nameValues.length; + + for (int i = 0; i + 1 < len; i += 2) { + Object attrName = nameValues[i]; + Object attrValue = nameValues[i + 1]; + + if (attrValue != null) { + m_sb.append(' ').append(attrName).append("=\"").append(escape(attrValue)).append('"'); + } + } + + if (dynamicAttributes != null) { + for (java.util.Map.Entry e : dynamicAttributes.entrySet()) { + m_sb.append(' ').append(e.getKey()).append("=\"").append(escape(e.getValue())).append('"'); + } + } + + if (text != null && closed) { + m_sb.append('>'); + m_sb.append(escape(text, true)); + m_sb.append("\r\n"); + } else { + if (closed) { + m_sb.append('/'); + } else { + m_level++; + } + + m_sb.append(">\r\n"); + } + } + + @SuppressWarnings("unchecked") + protected String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value instanceof Collection) { + Collection list = (Collection) value; + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (Object item : list) { + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(32); + boolean first = true; + + for (int i = 0; i < len; i++) { + Object item = Array.get(value, i); + + if (first) { + first = false; + } else { + sb.append(','); + } + + if (item != null) { + sb.append(item); + } + } + + return sb.toString(); + } + + return String.valueOf(value); + } + + protected String toString(java.util.Date date, String format) { + if (date != null) { + return new java.text.SimpleDateFormat(format).format(date); + } else { + return null; + } + } + + protected String toString(Number number, String format) { + if (number != null) { + return new java.text.DecimalFormat(format).format(number); + } else { + return null; + } + } + + @Override + public void visitApplicationState(ApplicationState applicationState) { + startTag(ENTITY_APPLICATIONSTATE, true, null, ATTR_ID, applicationState.getId(), ATTR_FAILURE_COUNT, applicationState.getFailureCount(), ATTR_FAILURE_PERCENT, toString(applicationState.getFailurePercent(), "0.000000"), ATTR_COUNT, applicationState.getCount(), ATTR_MAXQPS, toString(applicationState.getMaxQps(), "0.0000"), ATTR_AVG, toString(applicationState.getAvg(), "0.0000"), ATTR_SUM, toString(applicationState.getSum(), "0.0000"), ATTR_AVG95, toString(applicationState.getAvg95(), "0.0000")); + } + + @Override + public void visitDomain(Domain domain) { + startTag(ENTITY_DOMAIN, null, ATTR_ID, domain.getId(), ATTR_MACHINE_NUMBER, domain.getMachineNumber(), ATTR_CMDB_ID, domain.getCmdbId()); + + if (!domain.getMachineStates().isEmpty()) { + for (MachineState machineState : domain.getMachineStates().values()) { + machineState.accept(m_visitor); + } + } + + if (!domain.getApplicationStates().isEmpty()) { + for (ApplicationState applicationState : domain.getApplicationStates().values()) { + applicationState.accept(m_visitor); + } + } + + endTag(ENTITY_DOMAIN); + } + + @Override + public void visitMachineState(MachineState machineState) { + startTag(ENTITY_MACHINESTATE, true, null, ATTR_ID, machineState.getId(), ATTR_COUNT, machineState.getCount(), ATTR_SUM, toString(machineState.getSum(), "0.0000"), ATTR_AVG, toString(machineState.getAvg(), "0.0000"), ATTR_AVG_MAX, toString(machineState.getAvgMax(), "0.0000")); + } + + @Override + public void visitUtilizationReport(UtilizationReport utilizationReport) { + startTag(ENTITY_UTILIZATION_REPORT, null, ATTR_DOMAIN, utilizationReport.getDomain(), ATTR_STARTTIME, toString(utilizationReport.getStartTime(), "yyyy-MM-dd HH:mm:ss"), ATTR_ENDTIME, toString(utilizationReport.getEndTime(), "yyyy-MM-dd HH:mm:ss")); + + if (!utilizationReport.getDomains().isEmpty()) { + for (Domain domain : utilizationReport.getDomains().values()) { + domain.accept(m_visitor); + } + } + + endTag(ENTITY_UTILIZATION_REPORT); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/ILinker.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/ILinker.java new file mode 100644 index 0000000000..820ac8af7d --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/ILinker.java @@ -0,0 +1,15 @@ +package com.dianping.cat.home.utilization.transform; + +import com.dianping.cat.home.utilization.entity.ApplicationState; +import com.dianping.cat.home.utilization.entity.Domain; +import com.dianping.cat.home.utilization.entity.MachineState; +import com.dianping.cat.home.utilization.entity.UtilizationReport; + +public interface ILinker { + + public boolean onApplicationState(Domain parent, ApplicationState applicationState); + + public boolean onDomain(UtilizationReport parent, Domain domain); + + public boolean onMachineState(Domain parent, MachineState machineState); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/IMaker.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/IMaker.java new file mode 100644 index 0000000000..a466576379 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/IMaker.java @@ -0,0 +1,17 @@ +package com.dianping.cat.home.utilization.transform; + +import com.dianping.cat.home.utilization.entity.ApplicationState; +import com.dianping.cat.home.utilization.entity.Domain; +import com.dianping.cat.home.utilization.entity.MachineState; +import com.dianping.cat.home.utilization.entity.UtilizationReport; + +public interface IMaker { + + public ApplicationState buildApplicationState(T node); + + public Domain buildDomain(T node); + + public MachineState buildMachineState(T node); + + public UtilizationReport buildUtilizationReport(T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/IParser.java b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/IParser.java new file mode 100644 index 0000000000..b02c53ee00 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/utilization/transform/IParser.java @@ -0,0 +1,16 @@ +package com.dianping.cat.home.utilization.transform; + +import com.dianping.cat.home.utilization.entity.ApplicationState; +import com.dianping.cat.home.utilization.entity.Domain; +import com.dianping.cat.home.utilization.entity.MachineState; +import com.dianping.cat.home.utilization.entity.UtilizationReport; + +public interface IParser { + public UtilizationReport parse(IMaker maker, ILinker linker, T node); + + public void parseForApplicationState(IMaker maker, ILinker linker, ApplicationState parent, T node); + + public void parseForDomain(IMaker maker, ILinker linker, Domain parent, T node); + + public void parseForMachineState(IMaker maker, ILinker linker, MachineState parent, T node); +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java index 9d2efe3e31..3e1bff476f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java @@ -27,7 +27,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.alarm.rule.entity.Condition; @@ -40,7 +39,6 @@ import com.dianping.cat.configuration.business.entity.BusinessItemConfig; import com.dianping.cat.core.config.BusinessConfig; import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; -import com.dianping.cat.core.config.BusinessConfigEntity; import com.dianping.cat.helper.MetricType; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; @@ -151,7 +149,7 @@ private void ensureInitialized() { private void loadData() { try { - List configs = m_configDao.findByName(ALERT_CONFIG, BusinessConfigEntity.READSET_FULL); + List configs = m_configDao.findByName(ALERT_CONFIG); Map rules = new ConcurrentHashMap(); for (BusinessConfig config : configs) { @@ -167,7 +165,7 @@ private void loadData() { } m_rules = rules; LOGGER.info("Loaded business alert rule configs, count={}.", m_rules.size()); - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to load business alert rule configs from repository.", e); Cat.logError(e); } @@ -232,7 +230,7 @@ public void updateRule(String domain, String key, String configsStr, String type proto.setUpdatetime(new Date()); if (isExist) { - m_configDao.updateBaseConfigByDomain(proto, BusinessConfigEntity.UPDATESET_FULL); + m_configDao.updateBaseConfigByDomain(proto); } else { m_configDao.insert(proto); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java index f7acff326c..2cc9747fa4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java @@ -22,14 +22,13 @@ import java.util.List; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.home.exception.entity.ExceptionExclude; import com.dianping.cat.home.exception.entity.ExceptionLimit; import com.dianping.cat.home.exception.entity.ExceptionRuleConfig; @@ -85,11 +84,11 @@ public void initialize() { try { LOGGER.info("Initializing exception rule config manager, configName={}.", CONFIG_NAME); - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); m_exceptionRuleConfig = DefaultSaxParser.parse(content); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Exception rule config not found in repository, loading default content, configName={}.", CONFIG_NAME); try { @@ -190,7 +189,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_exceptionRuleConfig.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); } catch (Exception e) { LOGGER.error("Unable to store exception rule config, configName={}, configId={}.", CONFIG_NAME, m_configId, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java index ea2d1da2c0..49150d75f4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java @@ -29,9 +29,8 @@ import java.util.regex.Pattern; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.xml.sax.SAXException; @@ -48,7 +47,6 @@ import com.dianping.cat.alarm.spi.rule.RuleType; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.helper.MetricType; import com.dianping.cat.message.Event; import com.dianping.cat.report.alert.config.BaseRuleHelper; @@ -102,13 +100,12 @@ public void initialize() { LOGGER.info("Initializing alert rule config manager, configName={}.", getConfigName()); try { - com.dianping.cat.core.config.Config config = m_configDao.findByName(getConfigName(), - ConfigEntity.READSET_FULL); + com.dianping.cat.core.config.Config config = m_configDao.findByName(getConfigName()); String content = config.getContent(); m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Alert rule config not found in repository, loading default content, configName={}.", getConfigName()); try { @@ -162,8 +159,8 @@ public void handle() throws Exception { }); } - private void refreshConfig() throws DalException, SAXException, IOException { - com.dianping.cat.core.config.Config config = m_configDao.findByName(getConfigName(), ConfigEntity.READSET_FULL); + private void refreshConfig() throws SAXException, IOException { + com.dianping.cat.core.config.Config config = m_configDao.findByName(getConfigName()); long modifyTime = config.getModifyDate().getTime(); @@ -213,7 +210,7 @@ private void decorateConfigOnDelete(List configs) { String id = subCondition.getText(); m_manager.removeById(id); - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to remove user defined alert rule text, configName={}, id={}.", getConfigName(), subCondition.getText(), e); Cat.logError(e); @@ -235,7 +232,7 @@ private List decorateConfigOnRead(List originConfigs) { String id = subCondition.getText(); subCondition.setText(m_manager.getUserDefineText(id)); - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to read user defined alert rule text, configName={}, id={}.", getConfigName(), subCondition.getText(), e); Cat.logError(e); @@ -256,7 +253,7 @@ private Map> decorateConfigOnRead(Map configs) throws DalException { + private void decorateConfigOnStore(List configs) { for (Config config : configs) { for (Condition condition : config.getConditions()) { for (SubCondition subCondition : condition.getSubConditions()) { @@ -265,7 +262,7 @@ private void decorateConfigOnStore(List configs) throws DalException { String userDefinedText = subCondition.getText(); subCondition.setText(m_manager.addUserDefineText(userDefinedText)); - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to store user defined alert rule text, configName={}.", getConfigName(), e); Cat.logError(e); @@ -425,7 +422,7 @@ protected boolean storeConfig() { config.setKeyId(m_configId); config.setName(getConfigName()); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); } catch (Exception e) { LOGGER.error("Unable to store alert rule config, configName={}, configId={}.", getConfigName(), m_configId, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java index c1d2e908ec..3e9d9bab3f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java @@ -18,18 +18,16 @@ */ package com.dianping.cat.report.alert.spi.config; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.alarm.UserDefineRule; import com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository; -import com.dianping.cat.alarm.UserDefineRuleEntity; public class UserDefinedRuleManager { private UserDefineRuleRepository m_dao; - public String addUserDefineText(String userDefinedText) throws DalException { - UserDefineRule item = m_dao.findMaxId(UserDefineRuleEntity.READSET_MAXID); + public String addUserDefineText(String userDefinedText) { + UserDefineRule item = m_dao.findMaxId(); int id = 1; if (item != null) { id = item.getMaxId() + 1; @@ -43,14 +41,14 @@ public String addUserDefineText(String userDefinedText) throws DalException { return Integer.toString(id); } - public String getUserDefineText(String idStr) throws DalException { + public String getUserDefineText(String idStr) { int id = Integer.parseInt(idStr); - UserDefineRule item = m_dao.findByPK(id, UserDefineRuleEntity.READSET_FULL); + UserDefineRule item = m_dao.findByPK(id); return item.getContent(); } - public void removeById(String id) throws DalException { + public void removeById(String id) { UserDefineRule item = m_dao.createLocal(); item.setId(Integer.parseInt(id)); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java index 2f2a0d9136..283d9d0f91 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java @@ -20,7 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.home.dal.report.AlertSummary; @@ -41,7 +40,7 @@ public void insert(com.dianping.cat.home.alert.summary.entity.AlertSummary alert try { m_alertSummaryDao.insert(summary); - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to insert alert summary, domain={}, alertTime={}.", alertSummary.getDomain(), alertSummary.getAlertDate(), e); Cat.logError("insert alert summary error: " + content, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java index 248a0bc79b..71c1dcaa65 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java @@ -28,12 +28,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.alarm.Alert; import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; -import com.dianping.cat.alarm.AlertEntity; import com.dianping.cat.alarm.spi.AlertType; import com.dianping.cat.home.alert.summary.entity.AlertSummary; import com.dianping.cat.home.alert.summary.entity.Category; @@ -147,11 +145,11 @@ private Category generateCategoryByTimeCateDomain(Date date, String cate, String return category; } List dbAlerts = alertDao - .queryAlertsByTimeCategoryDomain(startTime, date, dbCategoryName, domain, AlertEntity.READSET_FULL); + .queryAlertsByTimeCategoryDomain(startTime, date, dbCategoryName, domain); LOGGER.info("Loaded alert summary category alerts, category={}, domain={}, start={}, end={}, alertCount={}.", cate, domain, startTime, date, dbAlerts.size()); setDBAlertsToCategory(category, dbAlerts); - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to load alert summary category alerts, category={}, domain={}, start={}, end={}.", cate, domain, startTime, date, e); Cat.logError("find alerts error for category:" + cate + " domain:" + domain + " date:" + date, e); @@ -176,12 +174,12 @@ private Category generateDependCategoryByTimeCateDomain(Date date, String cate, continue; } List dbAlerts = alertDao - .queryAlertsByTimeCategoryDomain(startTime, date, dbCategoryName, domain, AlertEntity.READSET_FULL); + .queryAlertsByTimeCategoryDomain(startTime, date, dbCategoryName, domain); LOGGER.info("Loaded dependency alert summary alerts, category={}, domain={}, start={}, end={}, alertCount={}.", cate, domain, startTime, date, dbAlerts.size()); setDBAlertsToCategory(category, dbAlerts); - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to load dependency alert summary alerts, category={}, domain={}, start={}, end={}.", cate, domain, startTime, date, e); Cat.logError("find dependency alerts error for category:" + cate + " domain:" + domain + " date:" + date, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java index b9d531457e..fafd1f4fab 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java @@ -25,12 +25,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.home.dal.report.Alteration; import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; -import com.dianping.cat.home.dal.report.AlterationEntity; import com.dianping.cat.report.alert.summary.AlertSummaryExecutor; public class AlterationSummaryBuilder extends SummaryBuilder { @@ -53,11 +51,11 @@ public Map generateModel(String domain, Date date) { return dataMap; } List alterations = alterationDao - .findByDomainAndTime(getStartDate(date), date, domain, AlterationEntity.READSET_FULL); + .findByDomainAndTime(getStartDate(date), date, domain); dataMap.put("count", alterations.size()); dataMap.put("items", alterations); - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to query alteration summary data, domain={}, date={}.", domain, date, e); Cat.logError(e); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java index 9b6edb4ab7..35e4218f3e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java @@ -22,14 +22,13 @@ import java.util.List; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.home.group.entity.Domain; import com.dianping.cat.home.group.entity.DomainGroup; @@ -65,13 +64,13 @@ public void setFetcher(ContentFetcher fetcher) { public void initialize() { try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); m_domainGroup = DefaultSaxParser.parse(content); LOGGER.info("Loaded domain group config from repository, configId={}.", m_configId); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Domain group config is missing in repository, loading default content from fetcher.", e); try { @@ -195,7 +194,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_domainGroup.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); LOGGER.info("Stored domain group config, configId={}, domainCount={}.", m_configId, m_domainGroup.getDomains().size()); } catch (Exception e) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java index 8ff362221f..fc4adacf00 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java @@ -31,7 +31,6 @@ import java.util.List; import java.util.Map; -import com.dianping.cat.core.dal.jdbc.DalException; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,7 +44,6 @@ import com.dianping.cat.Cat; import com.dianping.cat.alarm.Alert; import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; -import com.dianping.cat.alarm.AlertEntity; import com.dianping.cat.alarm.spi.AlertChannel; import com.dianping.cat.alarm.spi.sender.SendMessageEntity; import com.dianping.cat.alarm.spi.sender.SenderManager; @@ -148,7 +146,7 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { } else { setAlertResult(model, 1); } - } catch (DalException e) { + } catch (RuntimeException e) { setAlertResult(model, 5); LOGGER.error("Unable to insert manual alert, domain={}, category={}, metric={}.", alertEntity.getDomain(), alertEntity.getCategory(), alertEntity.getMetric(), e); @@ -164,12 +162,11 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { List alerts; try { if (StringUtils.isEmpty(alertTypeStr)) { - alerts = m_alertDao.queryAlertsByTimeDomain(startTime, endTime, domain, AlertEntity.READSET_FULL); + alerts = m_alertDao.queryAlertsByTimeDomain(startTime, endTime, domain); } else { - alerts = m_alertDao.queryAlertsByTimeDomainCategories(startTime, endTime, domain, payload.getAlertTypeArray(), - AlertEntity.READSET_FULL); + alerts = m_alertDao.queryAlertsByTimeDomainCategories(startTime, endTime, domain, payload.getAlertTypeArray()); } - } catch (DalException e) { + } catch (RuntimeException e) { alerts = new ArrayList(); LOGGER.error("Unable to query alerts, startTime={}, endTime={}, domain={}, alertTypes={}.", startTime, endTime, domain, alertTypeStr, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java index 346dbac125..8e18ca77e4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java @@ -33,8 +33,8 @@ import java.util.List; import java.util.Map; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.apache.commons.lang3.StringUtils; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.web.mvc.PageHandler; @@ -46,7 +46,6 @@ import com.dianping.cat.consumer.storage.builder.StorageSQLBuilder; import com.dianping.cat.home.dal.report.Alteration; import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; -import com.dianping.cat.home.dal.report.AlterationEntity; import com.dianping.cat.report.ReportPage; public class Handler implements PageHandler { @@ -168,12 +167,12 @@ public void handleOutbound(Context ctx) throws ServletException, IOException { try { if (altTypes == null) { - alts = m_alterationDao.findByDtdh(startTime, endTime, type, domain, hostname, AlterationEntity.READSET_FULL); + alts = m_alterationDao.findByDtdh(startTime, endTime, type, domain, hostname); } else { alts = m_alterationDao - .findByDtdhTypes(startTime, endTime, type, domain, hostname, altTypes, AlterationEntity.READSET_FULL); + .findByDtdhTypes(startTime, endTime, type, domain, hostname, altTypes); } - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { // ignore it } catch (Exception e) { LOGGER.error("Unable to query alterations, startTime={}, endTime={}, type={}, domain={}, hostname={}.", diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java index 0dbf8700ff..b87051eb45 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java @@ -18,11 +18,11 @@ */ package com.dianping.cat.report.page.business.service; +import org.springframework.dao.EmptyResultDataAccessException; + import java.util.Date; import java.util.List; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.consumer.business.BusinessAnalyzer; @@ -31,8 +31,6 @@ import com.dianping.cat.consumer.business.model.transform.DefaultNativeParser; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; @@ -64,8 +62,8 @@ public BusinessReport queryHourlyReport(String domain, Date start, Date end) { List reports = null; try { - reports = m_hourlyReportDao.findAllByDomainNamePeriod(period, domain, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + reports = m_hourlyReportDao.findAllByDomainNamePeriod(period, domain, name); + } catch (RuntimeException e) { Cat.logError(e); } if (reports != null) { @@ -73,7 +71,7 @@ public BusinessReport queryHourlyReport(String domain, Date start, Date end) { try { BusinessReport reportModel = queryFromHourlyBinary(report.getId(), period, domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { // ignore } catch (Exception e) { Cat.logError(e); @@ -89,9 +87,9 @@ public BusinessReport queryHourlyReport(String domain, Date start, Date end) { return businessReport; } - private BusinessReport queryFromHourlyBinary(int id, Date period, String domain) throws DalException { + private BusinessReport queryFromHourlyBinary(int id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java index 7610b26a38..814e1113e7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java @@ -22,9 +22,8 @@ import java.util.List; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.consumer.cross.CrossAnalyzer; @@ -33,20 +32,12 @@ import com.dianping.cat.consumer.cross.model.transform.DefaultNativeParser; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.dal.MonthlyReportContentEntity; -import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.dal.WeeklyReportContentEntity; -import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; @@ -72,11 +63,11 @@ public CrossReport queryDailyReport(String domain, Date start, Date end) { for (; startTime < endTime; startTime = startTime + TimeHelper.ONE_DAY) { try { DailyReport report = m_dailyReportDao - .findByDomainNamePeriod(domain, name, new Date(startTime), DailyReportEntity.READSET_FULL); + .findByDomainNamePeriod(domain, name, new Date(startTime)); CrossReport reportModel = queryFromDailyBinary(report.getId(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Cross daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { LOGGER.error("Unable to query cross daily report, domain={}, period={}.", domain, new Date(startTime), @@ -91,8 +82,8 @@ public CrossReport queryDailyReport(String domain, Date start, Date end) { return crossReport; } - private CrossReport queryFromDailyBinary(int id, String domain) throws DalException { - DailyReportContent content = m_dailyReportContentDao.findByPK(id, DailyReportContentEntity.READSET_FULL); + private CrossReport queryFromDailyBinary(int id, String domain) { + DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -101,9 +92,9 @@ private CrossReport queryFromDailyBinary(int id, String domain) throws DalExcept } } - private CrossReport queryFromHourlyBinary(int id, Date period, String domain) throws DalException { + private CrossReport queryFromHourlyBinary(int id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -112,8 +103,8 @@ private CrossReport queryFromHourlyBinary(int id, Date period, String domain) th } } - private CrossReport queryFromMonthlyBinary(int id, String domain) throws DalException { - MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id, MonthlyReportContentEntity.READSET_FULL); + private CrossReport queryFromMonthlyBinary(int id, String domain) { + MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -122,8 +113,8 @@ private CrossReport queryFromMonthlyBinary(int id, String domain) throws DalExce } } - private CrossReport queryFromWeeklyBinary(int id, String domain) throws DalException { - WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id, WeeklyReportContentEntity.READSET_FULL); + private CrossReport queryFromWeeklyBinary(int id, String domain) { + WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -143,8 +134,8 @@ public CrossReport queryHourlyReport(String domain, Date start, Date end) { List reports = null; try { reports = m_hourlyReportDao - .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + .findAllByDomainNamePeriod(new Date(startTime), domain, name); + } catch (RuntimeException e) { LOGGER.error("Unable to query cross hourly report list, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); @@ -155,7 +146,7 @@ public CrossReport queryHourlyReport(String domain, Date start, Date end) { CrossReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Cross hourly report content is missing, domain={}, reportId={}, period={}.", domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { @@ -178,9 +169,9 @@ public CrossReport queryHourlyReport(String domain, Date start, Date end) { public CrossReport queryMonthlyReport(String domain, Date start) { try { MonthlyReport entity = m_monthlyReportDao - .findReportByDomainNamePeriod(start, domain, CrossAnalyzer.ID, MonthlyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, CrossAnalyzer.ID); return queryFromMonthlyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Cross monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query cross monthly report, domain={}, period={}.", domain, start, e); @@ -193,10 +184,10 @@ public CrossReport queryMonthlyReport(String domain, Date start) { public CrossReport queryWeeklyReport(String domain, Date start) { try { WeeklyReport entity = m_weeklyReportDao - .findReportByDomainNamePeriod(start, domain, CrossAnalyzer.ID, WeeklyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, CrossAnalyzer.ID); return queryFromWeeklyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Cross weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query cross weekly report, domain={}, period={}.", domain, start, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java index f05a89c945..2d72b7523c 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java @@ -18,17 +18,17 @@ */ package com.dianping.cat.report.page.dependency.config; +import org.springframework.dao.EmptyResultDataAccessException; + import java.util.HashMap; import java.util.List; import java.util.Map; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.home.dependency.format.entity.ProductLine; import com.dianping.cat.home.dependency.format.entity.TopoGraphFormatConfig; @@ -76,12 +76,12 @@ public void setFetcher(ContentFetcher fetcher) { public void initialize() { try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -138,7 +138,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); } catch (Exception e) { Cat.logError(e); return false; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java index ee18702e70..18fe58e977 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java @@ -27,7 +27,7 @@ import java.util.Set; import org.apache.commons.io.FileUtils; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; +import org.springframework.dao.EmptyResultDataAccessException; import org.apache.commons.lang3.tuple.Pair; import com.dianping.cat.Cat; @@ -36,7 +36,6 @@ import com.dianping.cat.consumer.dependency.model.entity.Index; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.helper.Chinese; import com.dianping.cat.home.dependency.config.entity.DomainConfig; import com.dianping.cat.home.dependency.config.entity.EdgeConfig; @@ -252,12 +251,12 @@ public void initialize() { } } else { try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -382,7 +381,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); } catch (Exception e) { Cat.logError(e); return false; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java index c6b78527f4..17e96d8946 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java @@ -29,7 +29,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.support.Threads; import com.dianping.cat.support.Threads.Task; @@ -40,7 +39,6 @@ import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository; -import com.dianping.cat.home.dal.report.TopologyGraphEntity; import com.dianping.cat.home.dependency.format.entity.Domain; import com.dianping.cat.home.dependency.format.entity.ProductLine; import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; @@ -204,14 +202,14 @@ public void initialize() { public TopologyGraph queryGraphFromDB(long time) { try { com.dianping.cat.home.dal.report.TopologyGraph topologyGraph = m_topologyGraphDao - .findByPeriod(new Date(time), TopologyGraphEntity.READSET_FULL); + .findByPeriod(new Date(time)); if (topologyGraph != null) { byte[] content = topologyGraph.getContent(); return DefaultNativeParser.parse(content); } - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to query dependency topology graph from database, time={}.", time, e); Cat.logError(e); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java index 728d554e08..9305e639a1 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java @@ -22,9 +22,8 @@ import java.util.List; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.consumer.dependency.DependencyAnalyzer; @@ -33,8 +32,6 @@ import com.dianping.cat.consumer.dependency.model.transform.DefaultNativeParser; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; @@ -55,9 +52,9 @@ public DependencyReport queryDailyReport(String domain, Date start, Date end) { throw new UnsupportedOperationException("Dependency report don't support daily report"); } - private DependencyReport queryFromHourlyBinary(int id, Date period, String domain) throws DalException { + private DependencyReport queryFromHourlyBinary(int id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -77,8 +74,8 @@ public DependencyReport queryHourlyReport(String domain, Date start, Date end) { List reports = null; try { reports = m_hourlyReportDao - .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + .findAllByDomainNamePeriod(new Date(startTime), domain, name); + } catch (RuntimeException e) { LOGGER.error("Unable to query dependency hourly report list, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); @@ -88,7 +85,7 @@ public DependencyReport queryHourlyReport(String domain, Date start, Date end) { try { DependencyReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Dependency hourly report content is missing, domain={}, reportId={}, period={}.", domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java index d8806d0921..434d52e3ac 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java @@ -22,9 +22,8 @@ import java.util.Date; import java.util.List; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; @@ -38,20 +37,12 @@ import com.dianping.cat.consumer.event.model.transform.DefaultNativeParser; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.dal.MonthlyReportContentEntity; -import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.dal.WeeklyReportContentEntity; -import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; @@ -102,11 +93,11 @@ public EventReport queryDailyReport(String domain, Date start, Date end) { for (; startTime < endTime; startTime = startTime + TimeHelper.ONE_DAY) { try { DailyReport report = m_dailyReportDao - .findByDomainNamePeriod(domain, name, new Date(startTime), DailyReportEntity.READSET_FULL); + .findByDomainNamePeriod(domain, name, new Date(startTime)); EventReport reportModel = queryFromDailyBinary(report.getId(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Event daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { LOGGER.error("Unable to query event daily report, domain={}, period={}.", domain, new Date(startTime), e); @@ -120,8 +111,8 @@ public EventReport queryDailyReport(String domain, Date start, Date end) { return convert(eventReport); } - private EventReport queryFromDailyBinary(int id, String domain) throws DalException { - DailyReportContent content = m_dailyReportContentDao.findByPK(id, DailyReportContentEntity.READSET_FULL); + private EventReport queryFromDailyBinary(int id, String domain) { + DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -130,9 +121,9 @@ private EventReport queryFromDailyBinary(int id, String domain) throws DalExcept } } - private EventReport queryFromHourlyBinary(int id, Date period, String domain) throws DalException { + private EventReport queryFromHourlyBinary(int id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -141,8 +132,8 @@ private EventReport queryFromHourlyBinary(int id, Date period, String domain) th } } - private EventReport queryFromMonthlyBinary(int id, String domain) throws DalException { - MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id, MonthlyReportContentEntity.READSET_FULL); + private EventReport queryFromMonthlyBinary(int id, String domain) { + MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -151,8 +142,8 @@ private EventReport queryFromMonthlyBinary(int id, String domain) throws DalExce } } - private EventReport queryFromWeeklyBinary(int id, String domain) throws DalException { - WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id, WeeklyReportContentEntity.READSET_FULL); + private EventReport queryFromWeeklyBinary(int id, String domain) { + WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -172,8 +163,8 @@ public EventReport queryHourlyReport(String domain, Date start, Date end) { List reports = null; try { reports = m_hourlyReportDao - .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + .findAllByDomainNamePeriod(new Date(startTime), domain, name); + } catch (RuntimeException e) { LOGGER.error("Unable to query event hourly report list, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); @@ -184,7 +175,7 @@ public EventReport queryHourlyReport(String domain, Date start, Date end) { EventReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Event hourly report content is missing, domain={}, reportId={}, period={}.", domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { @@ -209,10 +200,10 @@ public EventReport queryMonthlyReport(String domain, Date start) { try { MonthlyReport entity = m_monthlyReportDao - .findReportByDomainNamePeriod(start, domain, EventAnalyzer.ID, MonthlyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, EventAnalyzer.ID); eventReport = queryFromMonthlyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Event monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query event monthly report, domain={}, period={}.", domain, start, e); @@ -227,10 +218,10 @@ public EventReport queryWeeklyReport(String domain, Date start) { try { WeeklyReport entity = m_weeklyReportDao - .findReportByDomainNamePeriod(start, domain, EventAnalyzer.ID, WeeklyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, EventAnalyzer.ID); eventReport = queryFromWeeklyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Event weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query event weekly report, domain={}, period={}.", domain, start, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java index 68bbba7ffe..71b915ff4d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/task/EventReportBuilder.java @@ -22,7 +22,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.config.AtomicMessageConfigManager; @@ -183,8 +182,7 @@ private EventReport queryDailyReportsByDuration(String domain, Date start, Date return eventReport; } - private EventReport queryHourlyReportsByDuration(String name, String domain, Date start, Date endDate) - throws DalException { + private EventReport queryHourlyReportsByDuration(String name, String domain, Date start, Date endDate) { long startTime = start.getTime(); long endTime = endDate.getTime(); double duration = (endTime - startTime) * 1.0 / TimeHelper.ONE_DAY; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java index 73513b90ce..dabc85d10b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java @@ -18,6 +18,8 @@ */ package com.dianping.cat.report.page.heartbeat.config; +import org.springframework.dao.EmptyResultDataAccessException; + import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -25,13 +27,11 @@ import java.util.Map.Entry; import java.util.Set; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.home.heartbeat.entity.Group; import com.dianping.cat.home.heartbeat.entity.HeartbeatDisplayPolicy; import com.dianping.cat.home.heartbeat.entity.Metric; @@ -67,12 +67,12 @@ public void setFetcher(ContentFetcher fetcher) { public void initialize() { try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -269,7 +269,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); } catch (Exception e) { Cat.logError(e); return false; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java index 8128719ed4..64c84cb323 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java @@ -21,9 +21,8 @@ import java.util.Date; import java.util.List; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; @@ -37,12 +36,8 @@ import com.dianping.cat.consumer.heartbeat.model.transform.DefaultNativeParser; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; @@ -68,11 +63,11 @@ public HeartbeatReport queryDailyReport(String domain, Date start, Date end) { for (; startTime < endTime; startTime = startTime + TimeHelper.ONE_DAY) { try { DailyReport report = m_dailyReportDao - .findByDomainNamePeriod(domain, name, new Date(startTime), DailyReportEntity.READSET_FULL); + .findByDomainNamePeriod(domain, name, new Date(startTime)); HeartbeatReport reportModel = queryFromDailyBinary(report.getId(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Heartbeat daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { LOGGER.error("Unable to query heartbeat daily report, domain={}, period={}.", domain, @@ -89,8 +84,8 @@ public HeartbeatReport queryDailyReport(String domain, Date start, Date end) { return heartbeatReport; } - private HeartbeatReport queryFromDailyBinary(int id, String domain) throws DalException { - DailyReportContent content = m_dailyReportContentDao.findByPK(id, DailyReportContentEntity.READSET_FULL); + private HeartbeatReport queryFromDailyBinary(int id, String domain) { + DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -99,9 +94,9 @@ private HeartbeatReport queryFromDailyBinary(int id, String domain) throws DalEx } } - private HeartbeatReport queryFromHourlyBinary(int id, Date period, String domain) throws DalException { + private HeartbeatReport queryFromHourlyBinary(int id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -121,8 +116,8 @@ public HeartbeatReport queryHourlyReport(String domain, Date start, Date end) { List reports = null; try { reports = m_hourlyReportDao - .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + .findAllByDomainNamePeriod(new Date(startTime), domain, name); + } catch (RuntimeException e) { LOGGER.error("Unable to query heartbeat hourly report list, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); @@ -132,7 +127,7 @@ public HeartbeatReport queryHourlyReport(String domain, Date start, Date end) { try { HeartbeatReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Heartbeat hourly report content is missing, domain={}, reportId={}, period={}.", domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java index 6dc62ab026..0b4415ad48 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java @@ -22,9 +22,8 @@ import java.util.List; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.consumer.matrix.MatrixAnalyzer; @@ -33,20 +32,12 @@ import com.dianping.cat.consumer.matrix.model.transform.DefaultNativeParser; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.dal.MonthlyReportContentEntity; -import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.dal.WeeklyReportContentEntity; -import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; @@ -72,11 +63,11 @@ public MatrixReport queryDailyReport(String domain, Date start, Date end) { for (; startTime < endTime; startTime = startTime + TimeHelper.ONE_DAY) { try { DailyReport report = m_dailyReportDao - .findByDomainNamePeriod(domain, name, new Date(startTime), DailyReportEntity.READSET_FULL); + .findByDomainNamePeriod(domain, name, new Date(startTime)); MatrixReport reportModel = queryFromDailyBinary(report.getId(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Matrix daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { LOGGER.error("Unable to query matrix daily report, domain={}, period={}.", domain, new Date(startTime), @@ -91,8 +82,8 @@ public MatrixReport queryDailyReport(String domain, Date start, Date end) { return matrixReport; } - private MatrixReport queryFromDailyBinary(int id, String domain) throws DalException { - DailyReportContent content = m_dailyReportContentDao.findByPK(id, DailyReportContentEntity.READSET_FULL); + private MatrixReport queryFromDailyBinary(int id, String domain) { + DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -101,9 +92,9 @@ private MatrixReport queryFromDailyBinary(int id, String domain) throws DalExcep } } - private MatrixReport queryFromHourlyBinary(int id, Date period, String domain) throws DalException { + private MatrixReport queryFromHourlyBinary(int id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -112,8 +103,8 @@ private MatrixReport queryFromHourlyBinary(int id, Date period, String domain) t } } - private MatrixReport queryFromMonthlyBinary(int id, String domain) throws DalException { - MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id, MonthlyReportContentEntity.READSET_FULL); + private MatrixReport queryFromMonthlyBinary(int id, String domain) { + MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -122,8 +113,8 @@ private MatrixReport queryFromMonthlyBinary(int id, String domain) throws DalExc } } - private MatrixReport queryFromWeeklyBinary(int id, String domain) throws DalException { - WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id, WeeklyReportContentEntity.READSET_FULL); + private MatrixReport queryFromWeeklyBinary(int id, String domain) { + WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -143,8 +134,8 @@ public MatrixReport queryHourlyReport(String domain, Date start, Date end) { List reports = null; try { reports = m_hourlyReportDao - .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + .findAllByDomainNamePeriod(new Date(startTime), domain, name); + } catch (RuntimeException e) { LOGGER.error("Unable to query matrix hourly report list, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); @@ -155,7 +146,7 @@ public MatrixReport queryHourlyReport(String domain, Date start, Date end) { MatrixReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Matrix hourly report content is missing, domain={}, reportId={}, period={}.", domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { @@ -178,9 +169,9 @@ public MatrixReport queryHourlyReport(String domain, Date start, Date end) { public MatrixReport queryMonthlyReport(String domain, Date start) { try { MonthlyReport entity = m_monthlyReportDao - .findReportByDomainNamePeriod(start, domain, MatrixAnalyzer.ID, MonthlyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, MatrixAnalyzer.ID); return queryFromMonthlyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Matrix monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query matrix monthly report, domain={}, period={}.", domain, start, e); @@ -193,9 +184,9 @@ public MatrixReport queryMonthlyReport(String domain, Date start) { public MatrixReport queryWeeklyReport(String domain, Date start) { try { WeeklyReport entity = m_weeklyReportDao - .findReportByDomainNamePeriod(start, domain, MatrixAnalyzer.ID, WeeklyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, MatrixAnalyzer.ID); return queryFromWeeklyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Matrix weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query matrix weekly report, domain={}, period={}.", domain, start, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java b/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java index 1664fed6aa..5deaf72bb2 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java @@ -18,6 +18,8 @@ */ package com.dianping.cat.report.page.metric.service; +import org.springframework.dao.EmptyResultDataAccessException; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; @@ -28,13 +30,11 @@ import java.util.Map; import java.util.Map.Entry; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.dal.report.Baseline; import com.dianping.cat.core.mybatis.repository.baseline.BaselineRepository; -import com.dianping.cat.home.dal.report.BaselineEntity; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.task.TaskHelper; @@ -106,9 +106,9 @@ public boolean hasDailyBaseline(String reportName, String key, Date reportPeriod has = true; } else { try { - baseline = m_baselineDao.findByReportNameKeyTime(reportPeriod, reportName, key, BaselineEntity.READSET_FULL); + baseline = m_baselineDao.findByReportNameKeyTime(reportPeriod, reportName, key); has = true; - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { } catch (Exception e) { Cat.logError(e); } @@ -198,12 +198,12 @@ public double[] queryDailyBaseline(String reportName, String key, Date reportPer boolean has = getEmpties().containsKey(baselineKey); if (!has) { - baseline = m_baselineDao.findByReportNameKeyTime(reportPeriod, reportName, key, BaselineEntity.READSET_FULL); + baseline = m_baselineDao.findByReportNameKeyTime(reportPeriod, reportName, key); m_baselines.put(baselineKey, baseline); } else { return null; } - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { getEmpties().put(baselineKey, baselineKey); return null; } catch (Exception e) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java index d857d2052c..aceb90413c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java @@ -20,14 +20,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; -import com.dianping.cat.home.dal.report.OverloadEntity; public class CapacityUpdateStatusManager { private static final Logger LOGGER = LoggerFactory.getLogger(CapacityUpdateStatusManager.class); @@ -91,21 +88,21 @@ public int getWeeklyStatus() { public void initialize() { try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); extractStatus(content); - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.warn("Unable to load capacity update status config, will initialize it from overload table.", e); try { - m_hourlyStatus = m_overloadDao.findMaxIdByType(CapacityUpdater.HOURLY_TYPE, OverloadEntity.READSET_MAXID) + m_hourlyStatus = m_overloadDao.findMaxIdByType(CapacityUpdater.HOURLY_TYPE) .getMaxId(); - m_dailyStatus = m_overloadDao.findMaxIdByType(CapacityUpdater.DAILY_TYPE, OverloadEntity.READSET_MAXID).getMaxId(); - m_weeklyStatus = m_overloadDao.findMaxIdByType(CapacityUpdater.WEEKLY_TYPE, OverloadEntity.READSET_MAXID) + m_dailyStatus = m_overloadDao.findMaxIdByType(CapacityUpdater.DAILY_TYPE).getMaxId(); + m_weeklyStatus = m_overloadDao.findMaxIdByType(CapacityUpdater.WEEKLY_TYPE) .getMaxId(); - m_monthlyStatus = m_overloadDao.findMaxIdByType(CapacityUpdater.MONTHLY_TYPE, OverloadEntity.READSET_MAXID) + m_monthlyStatus = m_overloadDao.findMaxIdByType(CapacityUpdater.MONTHLY_TYPE) .getMaxId(); Config config = m_configDao.createLocal(); @@ -115,7 +112,7 @@ public void initialize() { m_configDao.insert(config); m_configId = config.getId(); - } catch (DalException ex) { + } catch (RuntimeException ex) { LOGGER.error("Unable to initialize capacity update status config from overload table.", ex); Cat.logError(ex); } @@ -131,7 +128,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(buildConfigContent()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); } catch (Exception e) { LOGGER.error("Unable to store capacity update status config. content={}", buildConfigContent(), e); Cat.logError(e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java index c99fdcb473..54bb873d0a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateTask.java @@ -21,7 +21,6 @@ import java.util.Date; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -47,7 +46,7 @@ public boolean buildDailyTask(String name, String domain, Date period) { m_dailyUpdater.updateDBCapacity(); SLF4J_LOGGER.info("Finished daily capacity update task, name={}, domain={}, period={}.", name, domain, period); return true; - } catch (DalException e) { + } catch (RuntimeException e) { SLF4J_LOGGER.error("Unable to build daily capacity update task, name={}, domain={}, period={}.", name, domain, period, e); Cat.logError(e); @@ -62,7 +61,7 @@ public boolean buildHourlyTask(String name, String domain, Date period) { m_hourlyUpdater.updateDBCapacity(); SLF4J_LOGGER.info("Finished hourly capacity update task, name={}, domain={}, period={}.", name, domain, period); return true; - } catch (DalException e) { + } catch (RuntimeException e) { SLF4J_LOGGER.error("Unable to build hourly capacity update task, name={}, domain={}, period={}.", name, domain, period, e); Cat.logError(e); @@ -79,7 +78,7 @@ public boolean buildMonthlyTask(String name, String domain, Date period) { SLF4J_LOGGER.info("Finished monthly capacity update task, name={}, domain={}, period={}.", name, domain, period); return true; - } catch (DalException e) { + } catch (RuntimeException e) { SLF4J_LOGGER.error("Unable to build monthly capacity update task, name={}, domain={}, period={}.", name, domain, period, e); Cat.logError(e); @@ -94,7 +93,7 @@ public boolean buildWeeklyTask(String name, String domain, Date period) { m_weeklyUpdater.updateDBCapacity(); SLF4J_LOGGER.info("Finished weekly capacity update task, name={}, domain={}, period={}.", name, domain, period); return true; - } catch (DalException e) { + } catch (RuntimeException e) { SLF4J_LOGGER.error("Unable to build weekly capacity update task, name={}, domain={}, period={}.", name, domain, period, e); Cat.logError(e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdater.java index 11987b6fa1..b1bb058eae 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdater.java @@ -18,7 +18,6 @@ */ package com.dianping.cat.report.page.overload.task; -import com.dianping.cat.core.dal.jdbc.DalException; public interface CapacityUpdater { @@ -32,7 +31,7 @@ public interface CapacityUpdater { public static final double CAPACITY = 15.0; - public void updateDBCapacity() throws DalException; + public void updateDBCapacity(); public String getId(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java index 0e8d754700..68d9d21ece 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java @@ -20,17 +20,14 @@ import java.util.List; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; -import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; @@ -54,13 +51,13 @@ public String getId() { } @Override - public void updateDBCapacity() throws DalException { + public void updateDBCapacity() { int maxId = m_manager.getDailyStatus(); LOGGER.info("Starting daily report capacity scan, startMaxId={}.", maxId); while (true) { List reports = m_dailyReportContentDao - .findOverloadReport(maxId, DailyReportContentEntity.READSET_LENGTH); + .findOverloadReport(maxId); for (DailyReportContent content : reports) { try { @@ -75,10 +72,10 @@ public void updateDBCapacity() throws DalException { overload.setReportType(CapacityUpdater.DAILY_TYPE); try { - DailyReport report = m_dailyReportDao.findByPK(reportId, DailyReportEntity.READSET_FULL); + DailyReport report = m_dailyReportDao.findByPK(reportId); overload.setPeriod(report.getPeriod()); m_overloadDao.insert(overload); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Daily report not found while recording overload report, reportId={}.", reportId); } catch (Exception e) { LOGGER.error("Unable to record daily overload report, reportId={}, contentLength={}.", diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java index c101d668c7..cb7d794f6d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java @@ -20,18 +20,15 @@ import java.util.List; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; -import com.dianping.cat.core.dal.HourlyReportContentEntity; import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; @@ -54,13 +51,13 @@ public String getId() { } @Override - public void updateDBCapacity() throws DalException { + public void updateDBCapacity() { int maxId = m_manager.getHourlyStatus(); LOGGER.info("Starting hourly report capacity scan, startMaxId={}.", maxId); while (true) { List reports = m_hourlyReportContentDao - .findOverloadReport(maxId, HourlyReportContentEntity.READSET_LENGTH); + .findOverloadReport(maxId); for (HourlyReportContent content : reports) { try { @@ -76,11 +73,11 @@ public void updateDBCapacity() throws DalException { HourlyReport hourlyReport; try { - hourlyReport = m_hourlyReportDao.findByPK(reportId, HourlyReportEntity.READSET_FULL); + hourlyReport = m_hourlyReportDao.findByPK(reportId); overload.setPeriod(hourlyReport.getPeriod()); m_overloadDao.insert(overload); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Hourly report not found while recording overload report, reportId={}.", reportId); } catch (Exception e) { LOGGER.error("Unable to record hourly overload report, reportId={}, contentLength={}.", diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java index 2d408f8c8b..4f33e2c5ca 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java @@ -20,18 +20,15 @@ import java.util.List; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; -import com.dianping.cat.core.dal.MonthlyReportContentEntity; import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; -import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; @@ -54,13 +51,13 @@ public String getId() { } @Override - public void updateDBCapacity() throws DalException { + public void updateDBCapacity() { int maxId = m_manager.getMonthlyStatus(); LOGGER.info("Starting monthly report capacity scan, startMaxId={}.", maxId); while (true) { List reports = m_monthlyReportContentDao - .findOverloadReport(maxId, MonthlyReportContentEntity.READSET_LENGTH); + .findOverloadReport(maxId); for (MonthlyReportContent content : reports) { try { @@ -75,10 +72,10 @@ public void updateDBCapacity() throws DalException { overload.setReportType(CapacityUpdater.MONTHLY_TYPE); try { - MonthlyReport report = m_monthlyReportDao.findByPK(reportId, MonthlyReportEntity.READSET_FULL); + MonthlyReport report = m_monthlyReportDao.findByPK(reportId); overload.setPeriod(report.getPeriod()); m_overloadDao.insert(overload); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Monthly report not found while recording overload report, reportId={}.", reportId); } catch (Exception e) { LOGGER.error("Unable to record monthly overload report, reportId={}, contentLength={}.", diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java index dd44eed254..401a034175 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java @@ -22,27 +22,21 @@ import java.util.Date; import java.util.List; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; -import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; -import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; -import com.dianping.cat.home.dal.report.OverloadEntity; public class TableCapacityService { private static final Logger LOGGER = LoggerFactory.getLogger(TableCapacityService.class); @@ -101,7 +95,7 @@ public List queryOverloadReports(Date startTime, Date endTime) { try { List overloads = m_overloadDao - .findIdAndSizeByDuration(startTime, endTime, OverloadEntity.READSET_ID_SIZE_TYPE); + .findIdAndSizeByDuration(startTime, endTime); for (Overload overload : overloads) { try { @@ -112,20 +106,20 @@ public List queryOverloadReports(Date startTime, Date endTime) { switch (reportType) { case CapacityUpdater.HOURLY_TYPE: - report = m_hourlyReportDao.findByPK(reportId, HourlyReportEntity.READSET_FULL); + report = m_hourlyReportDao.findByPK(reportId); break; case CapacityUpdater.DAILY_TYPE: - report = m_dailyReportDao.findByPK(reportId, DailyReportEntity.READSET_FULL); + report = m_dailyReportDao.findByPK(reportId); break; case CapacityUpdater.WEEKLY_TYPE: - report = m_weeklyReportDao.findByPK(reportId, WeeklyReportEntity.READSET_FULL); + report = m_weeklyReportDao.findByPK(reportId); break; case CapacityUpdater.MONTHLY_TYPE: - report = m_monthlyReportDao.findByPK(reportId, MonthlyReportEntity.READSET_FULL); + report = m_monthlyReportDao.findByPK(reportId); break; } reports.add(generateOverloadReport(report, reportSize, reportType)); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Overload report target record not found, overloadId={}, reportId={}, reportType={}.", overload.getId(), overload.getReportId(), overload.getReportType()); } catch (Exception ex) { @@ -134,7 +128,7 @@ public List queryOverloadReports(Date startTime, Date endTime) { Cat.logError(ex); } } - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to query overload reports, startTime={}, endTime={}.", startTime, endTime, e); Cat.logError(e); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java index 79c258c0d8..eb95158a8a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java @@ -20,18 +20,15 @@ import java.util.List; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; -import com.dianping.cat.core.dal.WeeklyReportContentEntity; import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; -import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; @@ -54,13 +51,13 @@ public String getId() { } @Override - public void updateDBCapacity() throws DalException { + public void updateDBCapacity() { int maxId = m_manager.getWeeklyStatus(); LOGGER.info("Starting weekly report capacity scan, startMaxId={}.", maxId); while (true) { List reports = m_weeklyReportContentDao - .findOverloadReport(maxId, WeeklyReportContentEntity.READSET_LENGTH); + .findOverloadReport(maxId); for (WeeklyReportContent content : reports) { try { @@ -75,10 +72,10 @@ public void updateDBCapacity() throws DalException { overload.setReportType(CapacityUpdater.WEEKLY_TYPE); try { - WeeklyReport report = m_weeklyReportDao.findByPK(reportId, WeeklyReportEntity.READSET_FULL); + WeeklyReport report = m_weeklyReportDao.findByPK(reportId); overload.setPeriod(report.getPeriod()); m_overloadDao.insert(overload); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Weekly report not found while recording overload report, reportId={}.", reportId); } catch (Exception e) { LOGGER.error("Unable to record weekly overload report, reportId={}, contentLength={}.", diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java index d985c679bd..62add1d029 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java @@ -21,9 +21,8 @@ import java.util.Date; import java.util.List; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; @@ -34,20 +33,12 @@ import com.dianping.cat.consumer.problem.model.transform.DefaultNativeParser; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.dal.MonthlyReportContentEntity; -import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.dal.WeeklyReportContentEntity; -import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; @@ -73,11 +64,11 @@ public ProblemReport queryDailyReport(String domain, Date start, Date end) { for (; startTime < endTime; startTime = startTime + TimeHelper.ONE_DAY) { try { DailyReport report = m_dailyReportDao - .findByDomainNamePeriod(domain, name, new Date(startTime), DailyReportEntity.READSET_FULL); + .findByDomainNamePeriod(domain, name, new Date(startTime)); ProblemReport reportModel = queryFromDailyBinary(report.getId(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Problem daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { LOGGER.error("Unable to query problem daily report, domain={}, period={}.", domain, new Date(startTime), @@ -94,8 +85,8 @@ public ProblemReport queryDailyReport(String domain, Date start, Date end) { return problemReport; } - private ProblemReport queryFromDailyBinary(int id, String domain) throws DalException { - DailyReportContent content = m_dailyReportContentDao.findByPK(id, DailyReportContentEntity.READSET_FULL); + private ProblemReport queryFromDailyBinary(int id, String domain) { + DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -104,9 +95,9 @@ private ProblemReport queryFromDailyBinary(int id, String domain) throws DalExce } } - private ProblemReport queryFromHourlyBinary(int id, Date period, String domain) throws DalException { + private ProblemReport queryFromHourlyBinary(int id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -115,8 +106,8 @@ private ProblemReport queryFromHourlyBinary(int id, Date period, String domain) } } - private ProblemReport queryFromMonthlyBinary(int id, String domain) throws DalException { - MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id, MonthlyReportContentEntity.READSET_FULL); + private ProblemReport queryFromMonthlyBinary(int id, String domain) { + MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -125,8 +116,8 @@ private ProblemReport queryFromMonthlyBinary(int id, String domain) throws DalEx } } - private ProblemReport queryFromWeeklyBinary(int id, String domain) throws DalException { - WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id, WeeklyReportContentEntity.READSET_FULL); + private ProblemReport queryFromWeeklyBinary(int id, String domain) { + WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -146,8 +137,8 @@ public ProblemReport queryHourlyReport(String domain, Date start, Date end) { List reports = null; try { reports = m_hourlyReportDao - .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + .findAllByDomainNamePeriod(new Date(startTime), domain, name); + } catch (RuntimeException e) { LOGGER.error("Unable to query problem hourly report list, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); @@ -158,7 +149,7 @@ public ProblemReport queryHourlyReport(String domain, Date start, Date end) { ProblemReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Problem hourly report content is missing, domain={}, reportId={}, period={}.", domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { @@ -185,10 +176,10 @@ public ProblemReport queryMonthlyReport(String domain, Date start) { try { MonthlyReport entity = m_monthlyReportDao - .findReportByDomainNamePeriod(start, domain, ProblemAnalyzer.ID, MonthlyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, ProblemAnalyzer.ID); problemReport = queryFromMonthlyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Problem monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query problem monthly report, domain={}, period={}.", domain, start, e); @@ -206,10 +197,10 @@ public ProblemReport queryWeeklyReport(String domain, Date start) { try { WeeklyReport entity = m_weeklyReportDao - .findReportByDomainNamePeriod(start, domain, ProblemAnalyzer.ID, WeeklyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, ProblemAnalyzer.ID); problemReport = queryFromWeeklyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Problem weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query problem weekly report, domain={}, period={}.", domain, start, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java index 7e448de14b..7b03e9c040 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/task/ProblemReportBuilder.java @@ -22,7 +22,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; @@ -64,7 +63,7 @@ public boolean buildDailyTask(String name, String domain, Date period) { byte[] binaryContent = DefaultNativeBuilder.build(problemReport); return m_reportService.insertDailyReport(report, binaryContent); - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to build problem daily report, name={}, domain={}, period={}.", name, domain, period, e); Cat.logError(e); return false; @@ -161,8 +160,7 @@ private ProblemReport queryDailyReportsByDuration(String domain, Date start, Dat return problemReport; } - private ProblemReport queryHourlyReportsByDuration(String name, String domain, Date start, Date endDate) - throws DalException { + private ProblemReport queryHourlyReportsByDuration(String name, String domain, Date start, Date endDate) { long startTime = start.getTime(); long endTime = endDate.getTime(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java index d68205add7..239b2866d1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java @@ -22,9 +22,8 @@ import java.util.List; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.consumer.state.StateAnalyzer; @@ -33,20 +32,12 @@ import com.dianping.cat.consumer.state.model.transform.DefaultNativeParser; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.dal.MonthlyReportContentEntity; -import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.dal.WeeklyReportContentEntity; -import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; @@ -72,11 +63,11 @@ public StateReport queryDailyReport(String domain, Date start, Date end) { for (; startTime < endTime; startTime = startTime + TimeHelper.ONE_DAY) { try { DailyReport report = m_dailyReportDao - .findByDomainNamePeriod(domain, name, new Date(startTime), DailyReportEntity.READSET_FULL); + .findByDomainNamePeriod(domain, name, new Date(startTime)); StateReport reportModel = queryFromDailyBinary(report.getId(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("State daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { LOGGER.error("Unable to query state daily report, domain={}, period={}.", domain, new Date(startTime), @@ -91,8 +82,8 @@ public StateReport queryDailyReport(String domain, Date start, Date end) { return stateReport; } - private StateReport queryFromDailyBinary(int id, String domain) throws DalException { - DailyReportContent content = m_dailyReportContentDao.findByPK(id, DailyReportContentEntity.READSET_FULL); + private StateReport queryFromDailyBinary(int id, String domain) { + DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -101,9 +92,9 @@ private StateReport queryFromDailyBinary(int id, String domain) throws DalExcept } } - private StateReport queryFromHourlyBinary(int id, Date period, String domain) throws DalException { + private StateReport queryFromHourlyBinary(int id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -112,8 +103,8 @@ private StateReport queryFromHourlyBinary(int id, Date period, String domain) th } } - private StateReport queryFromMonthlyBinary(int id, String domain) throws DalException { - MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id, MonthlyReportContentEntity.READSET_FULL); + private StateReport queryFromMonthlyBinary(int id, String domain) { + MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -122,8 +113,8 @@ private StateReport queryFromMonthlyBinary(int id, String domain) throws DalExce } } - private StateReport queryFromWeeklyBinary(int id, String domain) throws DalException { - WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id, WeeklyReportContentEntity.READSET_FULL); + private StateReport queryFromWeeklyBinary(int id, String domain) { + WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -143,8 +134,8 @@ public StateReport queryHourlyReport(String domain, Date start, Date end) { List reports = null; try { reports = m_hourlyReportDao - .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + .findAllByDomainNamePeriod(new Date(startTime), domain, name); + } catch (RuntimeException e) { LOGGER.error("Unable to query state hourly report list, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); @@ -155,7 +146,7 @@ public StateReport queryHourlyReport(String domain, Date start, Date end) { StateReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("State hourly report content is missing, domain={}, reportId={}, period={}.", domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { @@ -177,10 +168,10 @@ public StateReport queryHourlyReport(String domain, Date start, Date end) { public StateReport queryMonthlyReport(String domain, Date start) { try { MonthlyReport entity = m_monthlyReportDao - .findReportByDomainNamePeriod(start, domain, StateAnalyzer.ID, MonthlyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, StateAnalyzer.ID); return queryFromMonthlyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("State monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query state monthly report, domain={}, period={}.", domain, start, e); @@ -193,10 +184,10 @@ public StateReport queryMonthlyReport(String domain, Date start) { public StateReport queryWeeklyReport(String domain, Date start) { try { WeeklyReport entity = m_weeklyReportDao - .findReportByDomainNamePeriod(start, domain, StateAnalyzer.ID, WeeklyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, StateAnalyzer.ID); return queryFromWeeklyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("State weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query state weekly report, domain={}, period={}.", domain, start, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java index d9d18ea731..dcc0ce6d07 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java @@ -21,16 +21,13 @@ import java.util.Date; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.Constants; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.home.service.client.entity.ClientReport; import com.dianping.cat.home.service.client.transform.DefaultNativeParser; import com.dianping.cat.report.service.AbstractReportService; @@ -54,9 +51,9 @@ public ClientReport queryDailyReport(String domain, Date start, Date end) { try { DailyReport report = m_dailyReportDao - .findByDomainNamePeriod(domain, name, new Date(startTime), DailyReportEntity.READSET_FULL); + .findByDomainNamePeriod(domain, name, new Date(startTime)); return queryFromDailyBinary(report.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Client daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { LOGGER.error("Unable to query client daily report, domain={}, period={}.", domain, new Date(startTime), e); @@ -69,8 +66,8 @@ public ClientReport queryDailyReport(String domain, Date start, Date end) { return report; } - private ClientReport queryFromDailyBinary(int id, String domain) throws DalException { - DailyReportContent content = m_dailyReportContentDao.findByPK(id, DailyReportContentEntity.READSET_FULL); + private ClientReport queryFromDailyBinary(int id, String domain) { + DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java index 85502ea819..03a55a93b0 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java @@ -22,28 +22,19 @@ import java.util.List; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.Constants; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.dal.MonthlyReportContentEntity; -import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.dal.WeeklyReportContentEntity; -import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.heavy.entity.HeavyReport; import com.dianping.cat.home.heavy.transform.DefaultNativeParser; @@ -72,11 +63,11 @@ public HeavyReport queryDailyReport(String domain, Date start, Date end) { for (; startTime < endTime; startTime = startTime + TimeHelper.ONE_DAY) { try { DailyReport report = m_dailyReportDao - .findByDomainNamePeriod(domain, name, new Date(startTime), DailyReportEntity.READSET_FULL); + .findByDomainNamePeriod(domain, name, new Date(startTime)); HeavyReport reportModel = queryFromDailyBinary(report.getId(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Heavy daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { LOGGER.error("Unable to query heavy daily report, domain={}, period={}.", domain, new Date(startTime), @@ -91,8 +82,8 @@ public HeavyReport queryDailyReport(String domain, Date start, Date end) { return heavyReport; } - private HeavyReport queryFromDailyBinary(int id, String domain) throws DalException { - DailyReportContent content = m_dailyReportContentDao.findByPK(id, DailyReportContentEntity.READSET_FULL); + private HeavyReport queryFromDailyBinary(int id, String domain) { + DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -101,9 +92,9 @@ private HeavyReport queryFromDailyBinary(int id, String domain) throws DalExcept } } - private HeavyReport queryFromHourlyBinary(int id, Date period, String domain) throws DalException { + private HeavyReport queryFromHourlyBinary(int id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -112,8 +103,8 @@ private HeavyReport queryFromHourlyBinary(int id, Date period, String domain) th } } - private HeavyReport queryFromMonthlyBinary(int id, String domain) throws DalException { - MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id, MonthlyReportContentEntity.READSET_FULL); + private HeavyReport queryFromMonthlyBinary(int id, String domain) { + MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -122,8 +113,8 @@ private HeavyReport queryFromMonthlyBinary(int id, String domain) throws DalExce } } - private HeavyReport queryFromWeeklyBinary(int id, String domain) throws DalException { - WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id, WeeklyReportContentEntity.READSET_FULL); + private HeavyReport queryFromWeeklyBinary(int id, String domain) { + WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -143,8 +134,8 @@ public HeavyReport queryHourlyReport(String domain, Date start, Date end) { List reports = null; try { reports = m_hourlyReportDao - .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + .findAllByDomainNamePeriod(new Date(startTime), domain, name); + } catch (RuntimeException e) { LOGGER.error("Unable to query heavy hourly report list, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); @@ -154,7 +145,7 @@ public HeavyReport queryHourlyReport(String domain, Date start, Date end) { try { HeavyReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Heavy hourly report content is missing, domain={}, reportId={}, period={}.", domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { @@ -177,9 +168,9 @@ public HeavyReport queryHourlyReport(String domain, Date start, Date end) { public HeavyReport queryMonthlyReport(String domain, Date start) { try { MonthlyReport entity = m_monthlyReportDao - .findReportByDomainNamePeriod(start, domain, Constants.REPORT_HEAVY, MonthlyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, Constants.REPORT_HEAVY); return queryFromMonthlyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Heavy monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query heavy monthly report, domain={}, period={}.", domain, start, e); @@ -192,9 +183,9 @@ public HeavyReport queryMonthlyReport(String domain, Date start) { public HeavyReport queryWeeklyReport(String domain, Date start) { try { WeeklyReport entity = m_weeklyReportDao - .findReportByDomainNamePeriod(start, domain, Constants.REPORT_HEAVY, WeeklyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, Constants.REPORT_HEAVY); return queryFromWeeklyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Heavy weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query heavy weekly report, domain={}, period={}.", domain, start, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java index 9da0020fbc..317c445862 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java @@ -23,14 +23,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.Constants; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.jar.entity.JarReport; import com.dianping.cat.home.jar.transform.DefaultNativeParser; @@ -49,9 +46,9 @@ public JarReport queryDailyReport(String domain, Date start, Date end) { throw new RuntimeException("JarReportService do not suppot queryDailyReport feature"); } - private JarReport queryFromHourlyBinary(int id, Date period, String domain) throws DalException { + private JarReport queryFromHourlyBinary(int id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -69,8 +66,8 @@ public JarReport queryHourlyReport(String domain, Date start, Date end) { for (; startTime < endTime; startTime = startTime + TimeHelper.ONE_HOUR) { List reports = null; try { - reports = m_hourlyReportDao.findAllByDomainNamePeriod(start, domain, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + reports = m_hourlyReportDao.findAllByDomainNamePeriod(start, domain, name); + } catch (RuntimeException e) { LOGGER.error("Unable to query jar hourly report list, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); @@ -79,7 +76,7 @@ public JarReport queryHourlyReport(String domain, Date start, Date end) { for (HourlyReport report : reports) { try { return queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to parse jar hourly report, domain={}, reportId={}, period={}.", domain, report.getId(), report.getPeriod(), e); Cat.logError(e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java index 16d562cbd6..7ec4d0d144 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java @@ -22,28 +22,19 @@ import java.util.List; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.Constants; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.dal.MonthlyReportContentEntity; -import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.dal.WeeklyReportContentEntity; -import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.service.entity.ServiceReport; import com.dianping.cat.home.service.transform.DefaultNativeParser; @@ -72,11 +63,11 @@ public ServiceReport queryDailyReport(String domain, Date start, Date end) { for (; startTime < endTime; startTime = startTime + TimeHelper.ONE_DAY) { try { DailyReport report = m_dailyReportDao - .findByDomainNamePeriod(domain, name, new Date(startTime), DailyReportEntity.READSET_FULL); + .findByDomainNamePeriod(domain, name, new Date(startTime)); ServiceReport reportModel = queryFromDailyBinary(report.getId(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Service daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { LOGGER.error("Unable to query service daily report, domain={}, period={}.", domain, new Date(startTime), @@ -91,8 +82,8 @@ public ServiceReport queryDailyReport(String domain, Date start, Date end) { return serviceReport; } - private ServiceReport queryFromDailyBinary(int id, String domain) throws DalException { - DailyReportContent content = m_dailyReportContentDao.findByPK(id, DailyReportContentEntity.READSET_FULL); + private ServiceReport queryFromDailyBinary(int id, String domain) { + DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -101,9 +92,9 @@ private ServiceReport queryFromDailyBinary(int id, String domain) throws DalExce } } - private ServiceReport queryFromHourlyBinary(int id, Date period, String domain) throws DalException { + private ServiceReport queryFromHourlyBinary(int id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -112,8 +103,8 @@ private ServiceReport queryFromHourlyBinary(int id, Date period, String domain) } } - private ServiceReport queryFromMonthlyBinary(int id, String domain) throws DalException { - MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id, MonthlyReportContentEntity.READSET_FULL); + private ServiceReport queryFromMonthlyBinary(int id, String domain) { + MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -122,8 +113,8 @@ private ServiceReport queryFromMonthlyBinary(int id, String domain) throws DalEx } } - private ServiceReport queryFromWeeklyBinary(int id, String domain) throws DalException { - WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id, WeeklyReportContentEntity.READSET_FULL); + private ServiceReport queryFromWeeklyBinary(int id, String domain) { + WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -143,8 +134,8 @@ public ServiceReport queryHourlyReport(String domain, Date start, Date end) { List reports = null; try { reports = m_hourlyReportDao - .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + .findAllByDomainNamePeriod(new Date(startTime), domain, name); + } catch (RuntimeException e) { LOGGER.error("Unable to query service hourly report list, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); @@ -154,7 +145,7 @@ public ServiceReport queryHourlyReport(String domain, Date start, Date end) { try { ServiceReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Service hourly report content is missing, domain={}, reportId={}, period={}.", domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { @@ -177,9 +168,9 @@ public ServiceReport queryHourlyReport(String domain, Date start, Date end) { public ServiceReport queryMonthlyReport(String domain, Date start) { try { MonthlyReport entity = m_monthlyReportDao - .findReportByDomainNamePeriod(start, domain, Constants.REPORT_SERVICE, MonthlyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, Constants.REPORT_SERVICE); return queryFromMonthlyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Service monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query service monthly report, domain={}, period={}.", domain, start, e); @@ -192,10 +183,10 @@ public ServiceReport queryMonthlyReport(String domain, Date start) { public ServiceReport queryWeeklyReport(String domain, Date start) { try { WeeklyReport entity = m_weeklyReportDao - .findReportByDomainNamePeriod(start, domain, Constants.REPORT_SERVICE, WeeklyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, Constants.REPORT_SERVICE); return queryFromWeeklyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Service weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query service weekly report, domain={}, period={}.", domain, start, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java index ed26f15838..758f453202 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java @@ -22,28 +22,19 @@ import java.util.List; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.Constants; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.dal.MonthlyReportContentEntity; -import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.dal.WeeklyReportContentEntity; -import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.utilization.entity.UtilizationReport; import com.dianping.cat.home.utilization.transform.DefaultNativeParser; @@ -72,10 +63,10 @@ public UtilizationReport queryDailyReport(String domain, Date start, Date end) { for (; startTime < endTime; startTime = startTime + TimeHelper.ONE_DAY) { try { DailyReport report = m_dailyReportDao - .findByDomainNamePeriod(domain, name, new Date(startTime), DailyReportEntity.READSET_FULL); + .findByDomainNamePeriod(domain, name, new Date(startTime)); UtilizationReport reportModel = queryFromDailyBinary(report.getId(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Utilization daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { LOGGER.error("Unable to query utilization daily report, domain={}, period={}.", domain, @@ -90,8 +81,8 @@ public UtilizationReport queryDailyReport(String domain, Date start, Date end) { return utilizationReport; } - private UtilizationReport queryFromDailyBinary(int id, String domain) throws DalException { - DailyReportContent content = m_dailyReportContentDao.findByPK(id, DailyReportContentEntity.READSET_FULL); + private UtilizationReport queryFromDailyBinary(int id, String domain) { + DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -100,9 +91,9 @@ private UtilizationReport queryFromDailyBinary(int id, String domain) throws Dal } } - private UtilizationReport queryFromHourlyBinary(int id, Date period, String domain) throws DalException { + private UtilizationReport queryFromHourlyBinary(int id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -111,8 +102,8 @@ private UtilizationReport queryFromHourlyBinary(int id, Date period, String doma } } - private UtilizationReport queryFromMonthlyBinary(int id, String domain) throws DalException { - MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id, MonthlyReportContentEntity.READSET_FULL); + private UtilizationReport queryFromMonthlyBinary(int id, String domain) { + MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -121,8 +112,8 @@ private UtilizationReport queryFromMonthlyBinary(int id, String domain) throws D } } - private UtilizationReport queryFromWeeklyBinary(int id, String domain) throws DalException { - WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id, WeeklyReportContentEntity.READSET_FULL); + private UtilizationReport queryFromWeeklyBinary(int id, String domain) { + WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -142,8 +133,8 @@ public UtilizationReport queryHourlyReport(String domain, Date start, Date end) List reports = null; try { reports = m_hourlyReportDao - .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + .findAllByDomainNamePeriod(new Date(startTime), domain, name); + } catch (RuntimeException e) { LOGGER.error("Unable to query utilization hourly report list, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); @@ -153,7 +144,7 @@ public UtilizationReport queryHourlyReport(String domain, Date start, Date end) try { UtilizationReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Utilization hourly report content is missing, domain={}, reportId={}, period={}.", domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { @@ -176,9 +167,9 @@ public UtilizationReport queryHourlyReport(String domain, Date start, Date end) public UtilizationReport queryMonthlyReport(String domain, Date start) { try { MonthlyReport entity = m_monthlyReportDao - .findReportByDomainNamePeriod(start, domain, Constants.REPORT_UTILIZATION, MonthlyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, Constants.REPORT_UTILIZATION); return queryFromMonthlyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Utilization monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query utilization monthly report, domain={}, period={}.", domain, start, e); @@ -191,9 +182,9 @@ public UtilizationReport queryMonthlyReport(String domain, Date start) { public UtilizationReport queryWeeklyReport(String domain, Date start) { try { WeeklyReport entity = m_weeklyReportDao - .findReportByDomainNamePeriod(start, domain, Constants.REPORT_UTILIZATION, WeeklyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, Constants.REPORT_UTILIZATION); return queryFromWeeklyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Utilization weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query utilization weekly report, domain={}, period={}.", domain, start, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java index b34bc96586..c589324dfa 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java @@ -32,8 +32,8 @@ import java.util.Map.Entry; import java.util.Set; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.apache.commons.lang3.StringUtils; +import org.springframework.dao.EmptyResultDataAccessException; import org.apache.commons.lang3.tuple.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,7 +54,6 @@ import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.dal.report.Alteration; import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; -import com.dianping.cat.home.dal.report.AlterationEntity; import com.dianping.cat.home.storage.alert.entity.Storage; import com.dianping.cat.home.storage.alert.entity.StorageAlertInfo; import com.dianping.cat.mvc.PayloadNormalizer; @@ -137,12 +136,12 @@ private List buildAlterations(Date start, Date end, String type) { List results = new LinkedList(); try { - List alterations = m_alterationDao.findByTypeDruation(start, end, type, AlterationEntity.READSET_FULL); + List alterations = m_alterationDao.findByTypeDruation(start, end, type); for (Alteration alteration : alterations) { results.add(alteration); } - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { // ignore it } catch (Exception e) { LOGGER.error("Unable to query storage alterations, start={}, end={}, type={}.", start, end, type, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java index fe5c063b6b..67b4718df1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java @@ -24,14 +24,13 @@ import java.util.List; import java.util.Map; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.apache.commons.lang3.StringUtils; +import org.springframework.dao.EmptyResultDataAccessException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.home.storage.entity.Link; import com.dianping.cat.home.storage.entity.Storage; import com.dianping.cat.home.storage.entity.StorageGroup; @@ -81,12 +80,12 @@ public void setFetcher(ContentFetcher fetcher) { public void initialize() { try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); m_config = DefaultSaxParser.parse(content); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { try { String content = m_fetcher.getConfigContent(CONFIG_NAME); Config config = m_configDao.createLocal(); @@ -196,7 +195,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); return true; } catch (Exception e) { Cat.logError(e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java index 9f4831d50e..5e8f04d330 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportBuilder.java @@ -23,7 +23,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.Constants; @@ -155,7 +154,7 @@ private StorageReport queryDailyReportsByDuration(String reportId, Date start, D return storageReport; } - private StorageReport queryHourlyReportsByDuration(String reportId, Date start, Date end) throws DalException { + private StorageReport queryHourlyReportsByDuration(String reportId, Date start, Date end) { long startTime = start.getTime(); long endTime = end.getTime(); int index = reportId.lastIndexOf("-"); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java index c516f92cd4..ad36ef17ee 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java @@ -24,9 +24,8 @@ import java.util.Set; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.consumer.storage.StorageAnalyzer; @@ -35,20 +34,12 @@ import com.dianping.cat.consumer.storage.model.transform.DefaultNativeParser; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.dal.MonthlyReportContentEntity; -import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.dal.WeeklyReportContentEntity; -import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; @@ -100,11 +91,11 @@ public StorageReport queryDailyReport(String id, Date start, Date end) { for (; startTime < endTime; startTime = startTime + TimeHelper.ONE_DAY) { try { DailyReport report = m_dailyReportDao - .findByDomainNamePeriod(id, name, new Date(startTime), DailyReportEntity.READSET_FULL); + .findByDomainNamePeriod(id, name, new Date(startTime)); StorageReport reportModel = queryFromDailyBinary(report.getId(), id); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Storage daily report is missing, reportId={}, period={}.", id, new Date(startTime), e); } catch (Exception e) { LOGGER.error("Unable to query storage daily report, reportId={}, period={}.", id, new Date(startTime), e); @@ -118,8 +109,8 @@ public StorageReport queryDailyReport(String id, Date start, Date end) { return storageReport; } - private StorageReport queryFromDailyBinary(int id, String domain) throws DalException { - DailyReportContent content = m_dailyReportContentDao.findByPK(id, DailyReportContentEntity.READSET_FULL); + private StorageReport queryFromDailyBinary(int id, String domain) { + DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -128,9 +119,9 @@ private StorageReport queryFromDailyBinary(int id, String domain) throws DalExce } } - private StorageReport queryFromHourlyBinary(int id, Date period, String reportId) throws DalException { + private StorageReport queryFromHourlyBinary(int id, Date period, String reportId) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -139,8 +130,8 @@ private StorageReport queryFromHourlyBinary(int id, Date period, String reportId } } - private StorageReport queryFromMonthlyBinary(int id, String reportId) throws DalException { - MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id, MonthlyReportContentEntity.READSET_FULL); + private StorageReport queryFromMonthlyBinary(int id, String reportId) { + MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -149,8 +140,8 @@ private StorageReport queryFromMonthlyBinary(int id, String reportId) throws Dal } } - private StorageReport queryFromWeeklyBinary(int id, String reportId) throws DalException { - WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id, WeeklyReportContentEntity.READSET_FULL); + private StorageReport queryFromWeeklyBinary(int id, String reportId) { + WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -170,8 +161,8 @@ public StorageReport queryHourlyReport(String reportId, Date start, Date end) { List reports = null; try { reports = m_hourlyReportDao - .findAllByDomainNamePeriod(new Date(startTime), reportId, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + .findAllByDomainNamePeriod(new Date(startTime), reportId, name); + } catch (RuntimeException e) { LOGGER.error("Unable to query storage hourly report list, reportId={}, period={}.", reportId, new Date(startTime), e); Cat.logError(e); @@ -181,7 +172,7 @@ public StorageReport queryHourlyReport(String reportId, Date start, Date end) { try { StorageReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), reportId); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Storage hourly report content is missing, reportId={}, reportDbId={}, period={}.", reportId, report.getId(), report.getPeriod(), e); } catch (Exception e) { @@ -206,10 +197,10 @@ public StorageReport queryHourlyReport(String reportId, Date start, Date end) { public StorageReport queryMonthlyReport(String reportId, Date start) { try { MonthlyReport entity = m_monthlyReportDao - .findReportByDomainNamePeriod(start, reportId, StorageAnalyzer.ID, MonthlyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, reportId, StorageAnalyzer.ID); return queryFromMonthlyBinary(entity.getId(), reportId); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Storage monthly report is missing, reportId={}, period={}.", reportId, start, e); } catch (Exception e) { LOGGER.error("Unable to query storage monthly report, reportId={}, period={}.", reportId, start, e); @@ -222,10 +213,10 @@ public StorageReport queryMonthlyReport(String reportId, Date start) { public StorageReport queryWeeklyReport(String reportId, Date start) { try { WeeklyReport entity = m_weeklyReportDao - .findReportByDomainNamePeriod(start, reportId, StorageAnalyzer.ID, WeeklyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, reportId, StorageAnalyzer.ID); return queryFromWeeklyBinary(entity.getId(), reportId); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Storage weekly report is missing, reportId={}, period={}.", reportId, start, e); } catch (Exception e) { LOGGER.error("Unable to query storage weekly report, reportId={}, period={}.", reportId, start, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java index 40a4ec1c07..a1d3ea698f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java @@ -22,9 +22,8 @@ import java.util.List; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.consumer.top.TopAnalyzer; @@ -33,8 +32,6 @@ import com.dianping.cat.consumer.top.model.transform.DefaultNativeParser; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; @@ -55,9 +52,9 @@ public TopReport queryDailyReport(String domain, Date start, Date end) { throw new RuntimeException("Top report don't support daily report"); } - private TopReport queryFromHourlyBinary(int id, Date period, String domain) throws DalException { + private TopReport queryFromHourlyBinary(int id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -77,8 +74,8 @@ public TopReport queryHourlyReport(String domain, Date start, Date end) { List reports = null; try { reports = m_hourlyReportDao - .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + .findAllByDomainNamePeriod(new Date(startTime), domain, name); + } catch (RuntimeException e) { LOGGER.error("Unable to query top hourly report list, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); @@ -88,7 +85,7 @@ public TopReport queryHourlyReport(String domain, Date start, Date end) { try { TopReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Top hourly report content is missing, domain={}, reportId={}, period={}.", domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java index 61e766bf5a..65a3a9aeed 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java @@ -22,9 +22,8 @@ import java.util.List; import java.util.Map; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; import com.dianping.cat.Cat; @@ -41,20 +40,12 @@ import com.dianping.cat.consumer.transaction.model.transform.DefaultNativeParser; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.dal.HourlyReportContentEntity; -import com.dianping.cat.core.dal.HourlyReportEntity; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.dal.MonthlyReportContentEntity; -import com.dianping.cat.core.dal.MonthlyReportEntity; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.dal.WeeklyReportContentEntity; -import com.dianping.cat.core.dal.WeeklyReportEntity; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.report.service.AbstractReportService; @@ -106,11 +97,11 @@ public TransactionReport queryDailyReport(String domain, Date start, Date end) { for (; startTime < endTime; startTime = startTime + TimeHelper.ONE_DAY) { try { DailyReport report = m_dailyReportDao - .findByDomainNamePeriod(domain, name, new Date(startTime), DailyReportEntity.READSET_FULL); + .findByDomainNamePeriod(domain, name, new Date(startTime)); TransactionReport reportModel = queryFromDailyBinary(report.getId(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Transaction daily report is missing, domain={}, period={}.", domain, new Date(startTime), e); } catch (Exception e) { LOGGER.error("Unable to query transaction daily report, domain={}, period={}.", domain, @@ -125,8 +116,8 @@ public TransactionReport queryDailyReport(String domain, Date start, Date end) { return convert(transactionReport); } - private TransactionReport queryFromDailyBinary(int id, String domain) throws DalException { - DailyReportContent content = m_dailyReportContentDao.findByPK(id, DailyReportContentEntity.READSET_FULL); + private TransactionReport queryFromDailyBinary(int id, String domain) { + DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -135,9 +126,9 @@ private TransactionReport queryFromDailyBinary(int id, String domain) throws Dal } } - private TransactionReport queryFromHourlyBinary(int id, Date period, String domain) throws DalException { + private TransactionReport queryFromHourlyBinary(int id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao - .findByPK(id, period, HourlyReportContentEntity.READSET_CONTENT); + .findByPK(id, period); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -146,8 +137,8 @@ private TransactionReport queryFromHourlyBinary(int id, Date period, String doma } } - private TransactionReport queryFromMonthlyBinary(int id, String domain) throws DalException { - MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id, MonthlyReportContentEntity.READSET_FULL); + private TransactionReport queryFromMonthlyBinary(int id, String domain) { + MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -156,8 +147,8 @@ private TransactionReport queryFromMonthlyBinary(int id, String domain) throws D } } - private TransactionReport queryFromWeeklyBinary(int id, String domain) throws DalException { - WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id, WeeklyReportContentEntity.READSET_FULL); + private TransactionReport queryFromWeeklyBinary(int id, String domain) { + WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -177,8 +168,8 @@ public TransactionReport queryHourlyReport(String domain, Date start, Date end) List reports = null; try { reports = m_hourlyReportDao - .findAllByDomainNamePeriod(new Date(startTime), domain, name, HourlyReportEntity.READSET_FULL); - } catch (DalException e) { + .findAllByDomainNamePeriod(new Date(startTime), domain, name); + } catch (RuntimeException e) { LOGGER.error("Unable to query transaction hourly report list, domain={}, period={}.", domain, new Date(startTime), e); Cat.logError(e); @@ -189,7 +180,7 @@ public TransactionReport queryHourlyReport(String domain, Date start, Date end) TransactionReport reportModel = queryFromHourlyBinary(report.getId(), report.getPeriod(), domain); reportModel.accept(merger); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Transaction hourly report content is missing, domain={}, reportId={}, period={}.", domain, report.getId(), report.getPeriod(), e); } catch (Exception e) { @@ -214,9 +205,9 @@ public TransactionReport queryMonthlyReport(String domain, Date start) { try { MonthlyReport entity = m_monthlyReportDao - .findReportByDomainNamePeriod(start, domain, TransactionAnalyzer.ID, MonthlyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, TransactionAnalyzer.ID); transactionReport = queryFromMonthlyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Transaction monthly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query transaction monthly report, domain={}, period={}.", domain, start, e); @@ -231,9 +222,9 @@ public TransactionReport queryWeeklyReport(String domain, Date start) { try { WeeklyReport entity = m_weeklyReportDao - .findReportByDomainNamePeriod(start, domain, TransactionAnalyzer.ID, WeeklyReportEntity.READSET_FULL); + .findReportByDomainNamePeriod(start, domain, TransactionAnalyzer.ID); transactionReport = queryFromWeeklyBinary(entity.getId(), domain); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Transaction weekly report is missing, domain={}, period={}.", domain, start, e); } catch (Exception e) { LOGGER.error("Unable to query transaction weekly report, domain={}, period={}.", domain, start, e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java index 91f08e7103..c1602e3ca8 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/task/TransactionReportBuilder.java @@ -21,7 +21,6 @@ import java.util.Date; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.config.AtomicMessageConfigManager; @@ -186,8 +185,7 @@ private TransactionReport queryDailyReportsByDuration(String domain, Date start, return transactionReport; } - private TransactionReport queryHourlyReportsByDuration(String name, String domain, Date start, Date endDate) - throws DalException { + private TransactionReport queryHourlyReportsByDuration(String name, String domain, Date start, Date endDate) { long startTime = start.getTime(); long endTime = endDate.getTime(); double duration = (endTime - startTime) * 1.0 / TimeHelper.ONE_DAY; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java index c97d460388..07d52e346f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java @@ -26,13 +26,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.core.dal.Task; import com.dianping.cat.core.mybatis.repository.task.TaskRepository; -import com.dianping.cat.core.dal.TaskEntity; import com.dianping.cat.message.Transaction; public class DefaultTaskConsumer extends TaskConsumer { @@ -46,8 +44,8 @@ public class DefaultTaskConsumer extends TaskConsumer { protected Task findDoingTask(String ip) { Task task = null; try { - task = m_taskDao.findByStatusConsumer(STATUS_DOING, ip, TaskEntity.READSET_FULL); - } catch (DalException e) { + task = m_taskDao.findByStatusConsumer(STATUS_DOING, ip); + } catch (RuntimeException e) { LOGGER.error("Unable to find doing task, consumerIp={}.", ip, e); } return task; @@ -57,8 +55,8 @@ protected Task findDoingTask(String ip) { protected Task findTodoTask() { Task task = null; try { - task = m_taskDao.findByStatusConsumer(STATUS_TODO, null, TaskEntity.READSET_FULL); - } catch (DalException e) { + task = m_taskDao.findByStatusConsumer(STATUS_TODO, null); + } catch (RuntimeException e) { LOGGER.error("Unable to find todo task.", e); } return task; @@ -117,8 +115,8 @@ protected boolean updateDoingToDone(Task doing) { doing.setEndDate(new Date()); try { - return m_taskDao.updateDoingToDone(doing, TaskEntity.UPDATESET_FULL) == 1; - } catch (DalException e) { + return m_taskDao.updateDoingToDone(doing) == 1; + } catch (RuntimeException e) { LOGGER.error("Unable to mark task done, reportName={}, domain={}, type={}, period={}, taskId={}.", doing.getReportName(), doing.getReportDomain(), doing.getTaskType(), doing.getReportPeriod(), doing.getId(), e); Cat.logError(e); @@ -132,8 +130,8 @@ protected boolean updateDoingToFailure(Task doing) { doing.setEndDate(new Date()); try { - return m_taskDao.updateDoingToFail(doing, TaskEntity.UPDATESET_FULL) == 1; - } catch (DalException e) { + return m_taskDao.updateDoingToFail(doing) == 1; + } catch (RuntimeException e) { LOGGER.error("Unable to mark task failed, reportName={}, domain={}, type={}, period={}, taskId={}.", doing.getReportName(), doing.getReportDomain(), doing.getTaskType(), doing.getReportPeriod(), doing.getId(), e); Cat.logError(e); @@ -148,8 +146,8 @@ protected boolean updateTodoToDoing(Task todo) { todo.setStartDate(new Date()); try { - return m_taskDao.updateTodoToDoing(todo, TaskEntity.UPDATESET_FULL) == 1; - } catch (DalException e) { + return m_taskDao.updateTodoToDoing(todo) == 1; + } catch (RuntimeException e) { LOGGER.error("Unable to claim todo task, reportName={}, domain={}, type={}, period={}, taskId={}, consumer={}.", todo.getReportName(), todo.getReportDomain(), todo.getTaskType(), todo.getReportPeriod(), todo.getId(), todo.getConsumer(), e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java index 01c6d212b5..1ca94887a8 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java @@ -32,7 +32,6 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.support.Threads.Task; import org.unidal.webres.json.JsonArray; import org.unidal.webres.json.JsonObject; @@ -110,7 +109,7 @@ public void deleteUnusedDomainInfo() { m_projectService.delete(project); Cat.logEvent("DeleteDomainInfo", project.getDomain(), Event.SUCCESS, project.toString()); } - } catch (DalException e) { + } catch (RuntimeException e) { Cat.logError(e); } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java index 85ad5cb2d7..ea56bd865b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/current/CurrentReportBuilder.java @@ -24,7 +24,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.support.Threads; import com.dianping.cat.Cat; @@ -62,7 +61,7 @@ public boolean buildDailyTask(String name, String domain, Date period) { LOGGER.info("Starting current weekly/monthly refresh task, domainCount={}.", domains.size()); Threads.forGroup(Constants.CAT).start(reportTask); - } catch (DalException e) { + } catch (RuntimeException e) { LOGGER.error("Unable to build current weekly/monthly refresh task, name={}, domain={}, period={}.", name, domain, period, e); Cat.logError(e); diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java index 6ecc12c5f8..3e9836137d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java @@ -22,7 +22,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; @@ -57,7 +56,7 @@ public boolean insertHourlyReport(ReportReloadEntity entity) { proto.setPeriod(report.getPeriod()); m_hourlyReportContentDao.insert(proto); return true; - } catch (DalException e) { + } catch (RuntimeException e) { HourlyReport report = entity == null ? null : entity.getReport(); LOGGER.error("Unable to insert reloaded hourly report, reloader={}, reportName={}, domain={}, period={}.", getId(), report == null ? null : report.getName(), report == null ? null : report.getDomain(), diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java index 8ba60e5143..6bd72af602 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java @@ -32,7 +32,6 @@ import com.dianping.cat.Constants; import com.dianping.cat.core.config.BusinessConfig; import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; -import com.dianping.cat.core.config.BusinessConfigEntity; import com.dianping.cat.home.business.entity.BusinessItem; import com.dianping.cat.home.business.entity.BusinessTagConfig; import com.dianping.cat.home.business.entity.Tag; @@ -110,7 +109,7 @@ public synchronized void initialize() { } try { - List result = m_configDao.findByName(TAG_CONFIG, BusinessConfigEntity.READSET_FULL); + List result = m_configDao.findByName(TAG_CONFIG); if (result.size() > 0) { BusinessConfig config = result.get(0); @@ -166,7 +165,7 @@ private boolean storeConfig() { config.setDomain(Constants.CAT); config.setContent(m_tagConfig.toString()); config.setUpdatetime(new Date()); - m_configDao.updateByPK(config, BusinessConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); LOGGER.info("Stored business tag config, configId={}, tagCount={}.", m_configId, m_tagConfig.getTags().size()); } catch (Exception e) { diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java index 4c4764b8da..53a3eb4753 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java @@ -22,14 +22,13 @@ import java.util.concurrent.ConcurrentHashMap; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.home.resource.entity.Resource; import com.dianping.cat.home.resource.entity.ResourceConfig; import com.dianping.cat.home.resource.transform.DefaultSaxParser; @@ -97,7 +96,7 @@ public int getRole(String path, String op) { public void initialize() { try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); @@ -105,7 +104,7 @@ public void initialize() { m_config = DefaultSaxParser.parse(content); LOGGER.info("Loaded resource config from repository, configId={}, modifyTime={}.", m_configId, m_modifyTime); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("Resource config is missing in repository, loading default content from fetcher.", e); try { @@ -161,7 +160,7 @@ public boolean insert(String xml) { } private void refreshConfig() throws Exception { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); long modifyTime = config.getModifyDate().getTime(); synchronized (this) { @@ -217,7 +216,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); refreshData(); LOGGER.info("Stored resource config, configId={}, resourceCount={}.", m_configId, diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java index 80037bfc0f..7122072777 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java @@ -19,14 +19,13 @@ package com.dianping.cat.system.page.permission; import org.slf4j.Logger; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.home.user.entity.User; import com.dianping.cat.home.user.entity.UserConfig; import com.dianping.cat.home.user.transform.DefaultSaxParser; @@ -78,14 +77,14 @@ public int getRole(String user) { public void initialize() { try { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); m_modifyTime = config.getModifyDate().getTime(); m_config = DefaultSaxParser.parse(content); LOGGER.info("Loaded user config from repository, configId={}, modifyTime={}.", m_configId, m_modifyTime); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { LOGGER.warn("User config is missing in repository, loading default content from fetcher.", e); try { @@ -127,7 +126,7 @@ public void handle() throws Exception { } private void refreshConfig() throws Exception { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); long modifyTime = config.getModifyDate().getTime(); synchronized (this) { @@ -174,7 +173,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_config.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); LOGGER.info("Stored user config, configId={}, userCount={}.", m_configId, m_config.getUsers().size()); } catch (Exception e) { LOGGER.error("Unable to store user config, configId={}.", m_configId, e); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java index 909804f1bc..194b06d742 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java @@ -26,7 +26,6 @@ import java.util.Map; import java.util.Map.Entry; -import com.dianping.cat.core.dal.jdbc.DalException; import com.google.common.base.Splitter; import com.dianping.cat.Cat; @@ -36,7 +35,6 @@ import com.dianping.cat.consumer.state.model.entity.ProcessDomain; import com.dianping.cat.consumer.state.model.entity.StateReport; import com.dianping.cat.core.dal.DailyReport; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.core.report.daily.repository.DailyReportRepository; import com.dianping.cat.helper.SortHelper; import com.dianping.cat.helper.TimeHelper; @@ -271,7 +269,7 @@ public boolean updateRouterConfigToDB(RouterConfig config) { String name = RouterConfigBuilder.ID; String domain = Constants.CAT; List reports = m_dailyReportDao - .queryLatestReportsByDomainName(domain, name, 1, DailyReportEntity.READSET_FULL); + .queryLatestReportsByDomainName(domain, name, 1); DailyReport oldReport = reports.get(0); DailyReport dailyReport = new DailyReport(); @@ -287,7 +285,7 @@ public boolean updateRouterConfigToDB(RouterConfig config) { m_routerService.insertDailyReport(dailyReport, binaryContent); return true; - } catch (DalException e) { + } catch (RuntimeException e) { Cat.logError(e); return false; } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java index 28befd51f2..c40627318b 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java @@ -23,7 +23,6 @@ import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; import com.dianping.cat.core.dal.*; import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; import com.dianping.cat.core.report.daily.repository.DailyReportRepository; @@ -35,11 +34,10 @@ import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; import org.apache.commons.net.util.SubnetUtils; +import org.springframework.dao.EmptyResultDataAccessException; import org.apache.commons.net.util.SubnetUtils.SubnetInfo; import org.apache.commons.lang3.tuple.Pair; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.xml.sax.SAXException; import java.io.IOException; @@ -130,13 +128,13 @@ public synchronized void initialize() { try { SLF4J_LOGGER.info("Initializing router config manager, configName={}.", CONFIG_NAME); - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + Config config = m_configDao.findByName(CONFIG_NAME); String content = config.getContent(); m_configId = config.getId(); m_routerConfig = DefaultSaxParser.parse(content); m_modifyTime = config.getModifyDate().getTime(); - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { SLF4J_LOGGER.warn("Router config not found in repository, loading default content, configName={}.", CONFIG_NAME); try { @@ -337,8 +335,8 @@ public List queryServersByDomain(String group, String domain) { return result; } - private void refreshConfigInfo() throws DalException, SAXException, IOException { - Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + private void refreshConfigInfo() throws SAXException, IOException { + Config config = m_configDao.findByName(CONFIG_NAME); long modifyTime = config.getModifyDate().getTime(); synchronized (this) { @@ -385,25 +383,23 @@ private void refreshReportInfo() throws Exception { long time = period.getTime(); try { - DailyReport report = m_dailyReportDao.findByDomainNamePeriod(Constants.CAT, RouterConfigBuilder.ID, period, - DailyReportEntity.READSET_FULL); + DailyReport report = m_dailyReportDao.findByDomainNamePeriod(Constants.CAT, RouterConfigBuilder.ID, period); long modifyTime = report.getCreationDate().getTime(); Pair pair = m_routerConfigs.get(time); if (pair == null || modifyTime > pair.getValue()) { try { - DailyReportContent reportContent = m_dailyReportContentDao.findByPK(report.getId(), - DailyReportContentEntity.READSET_FULL); + DailyReportContent reportContent = m_dailyReportContentDao.findByPK(report.getId()); RouterConfig routerConfig = DefaultNativeParser.parse(reportContent.getContent()); m_routerConfigs.put(time, Pair.of(routerConfig, modifyTime)); Cat.logEvent("ReloadConfig", "router"); - } catch (DalNotFoundException ignored) { + } catch (EmptyResultDataAccessException ignored) { SLF4J_LOGGER.warn("Router report content not found while refreshing report cache, reportId={}.", report.getId()); } } - } catch (DalNotFoundException ignored) { + } catch (EmptyResultDataAccessException ignored) { SLF4J_LOGGER.warn("Router daily report not found while refreshing report cache, period={}.", period); } } @@ -430,7 +426,7 @@ private boolean storeConfig() { config.setKeyId(m_configId); config.setName(CONFIG_NAME); config.setContent(m_routerConfig.toString()); - m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + m_configDao.updateByPK(config); } catch (Exception e) { SLF4J_LOGGER.error("Unable to store router config, configName={}, configId={}.", CONFIG_NAME, m_configId, e); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java index 365734219c..29ef929a5c 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java @@ -22,9 +22,8 @@ import java.util.List; import java.util.Map; -import com.dianping.cat.core.dal.jdbc.DalException; -import com.dianping.cat.core.dal.jdbc.DalNotFoundException; import org.apache.commons.lang3.tuple.Pair; +import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,8 +31,6 @@ import com.dianping.cat.Constants; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.dal.DailyReportContentEntity; -import com.dianping.cat.core.dal.DailyReportEntity; import com.dianping.cat.home.router.entity.RouterConfig; import com.dianping.cat.home.router.transform.DefaultNativeParser; import com.dianping.cat.report.service.AbstractReportService; @@ -59,12 +56,12 @@ public RouterConfig queryDailyReport(String domain, Date start, Date end) { String name = Constants.REPORT_ROUTER; try { - DailyReport report = m_dailyReportDao.findByDomainNamePeriod(domain, name, start, DailyReportEntity.READSET_FULL); + DailyReport report = m_dailyReportDao.findByDomainNamePeriod(domain, name, start); RouterConfig config = queryFromDailyBinary(report.getId()); routerConfigs.put(time, Pair.of(config, report.getCreationDate().getTime())); return config; - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { // ignore } catch (Exception e) { LOGGER.error("Unable to query daily router config report, domain={}, start={}, end={}.", domain, start, @@ -77,8 +74,8 @@ public RouterConfig queryDailyReport(String domain, Date start, Date end) { } } - private RouterConfig queryFromDailyBinary(int id) throws DalException { - DailyReportContent content = m_dailyReportContentDao.findByPK(id, DailyReportContentEntity.READSET_FULL); + private RouterConfig queryFromDailyBinary(int id) { + DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { return DefaultNativeParser.parse(content.getContent()); @@ -95,7 +92,7 @@ public RouterConfig queryHourlyReport(String domain, Date start, Date end) { public RouterConfig queryLastReport(String domain) { try { List reports = m_dailyReportDao - .queryLatestReportsByDomainName(domain, Constants.REPORT_ROUTER, 1, DailyReportEntity.READSET_FULL); + .queryLatestReportsByDomainName(domain, Constants.REPORT_ROUTER, 1); if (reports.size() == 0) { return null; @@ -105,7 +102,7 @@ public RouterConfig queryLastReport(String domain) { RouterConfig config = queryFromDailyBinary(report.getId()); return config; - } catch (DalNotFoundException e) { + } catch (EmptyResultDataAccessException e) { // ignore } catch (Exception e) { LOGGER.error("Unable to query latest router config report, domain={}.", domain, e); diff --git a/cat-home/src/main/resources/META-INF/dal/jdbc/report-codegen.xml b/cat-home/src/main/resources/META-INF/dal/jdbc/report-codegen.xml deleted file mode 100644 index 2acc87e7a8..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/jdbc/report-codegen.xml +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${key-id}]]> - - - () - VALUES()]]> - - - - - SET - WHERE = ${key-id}]]> - - - - - WHERE = ${key-id}]]> - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/jdbc/report-dal.xml b/cat-home/src/main/resources/META-INF/dal/jdbc/report-dal.xml deleted file mode 100644 index 7bf3ba06f0..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/jdbc/report-dal.xml +++ /dev/null @@ -1,264 +0,0 @@ - - - - - - - - - - - - - - - - - - - - FROM
- WHERE >= ${start-time} - AND <= ${end-time} - - AND = ${type} - - ORDER BY desc - ]]> - - - - - - - - - FROM
- WHERE >= ${start-time} - AND <= ${end-time} - - AND = ${type} - - - AND = ${domain} - - - AND = ${hostname} - - ORDER BY desc - ]]> - - - - - - - - - - FROM
- WHERE >= ${start-time} - AND <= ${end-time} - - AND = ${type} - - - AND = ${domain} - - - AND = ${hostname} - - AND in ${types} - ORDER BY desc - ]]> - - - - - - - FROM
- WHERE >= ${start-time} - AND <= ${end-time} - - AND = ${domain} - - ORDER BY desc - ]]> - - - - - - - - - - FROM
- WHERE = ${period}]]> - - - - - - - - - - - - - FROM
- WHERE = ${report-period} - AND = ${report-name} - AND = ${index-key} - ]]> - - - - - - - - - - - - FROM
- WHERE = ${graph-id} - ]]> - - - - - FROM
- ORDER BY DESC LIMIT ${number} - ]]> - - - - - WHERE < ${creation-date}]]> - - - - - - - - - - - - - - - - - - - - FROM
- ]]> - - - - - - FROM
- WHERE = ${name} - AND = ${graph-name} - ]]> - - - - - FROM
- WHERE = ${name} - ]]> - - - () - VALUES() ON DUPLICATE KEY UPDATE - = ${view}, - = ${end-points}, - = ${measurements}, - = ${content} - ]]> - - - - - WHERE = ${name}]]> - - - - - - WHERE = ${name} - AND = ${graph-name}]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - FROM
- WHERE = ${type} - ]]> - - - - FROM
- ]]> - - - - - - FROM
- WHERE >= ${start-time} - AND <= ${end-time} - ORDER BY DESC, ASC - ]]> - - - - - - - \ No newline at end of file diff --git a/cat-home/src/main/resources/META-INF/dal/jdbc/report-manifest.xml b/cat-home/src/main/resources/META-INF/dal/jdbc/report-manifest.xml deleted file mode 100644 index 559d141318..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/jdbc/report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/alert-receiver-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/alert-receiver-codegen.xml deleted file mode 100644 index 598b1e2e2b..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/alert-receiver-codegen.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/alert-receiver-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/alert-receiver-manifest.xml deleted file mode 100644 index 4677cf69cd..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/alert-receiver-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/alert-receiver-model.xml b/cat-home/src/main/resources/META-INF/dal/model/alert-receiver-model.xml deleted file mode 100644 index b74bff8e64..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/alert-receiver-model.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/alert-summary-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/alert-summary-codegen.xml deleted file mode 100644 index 30034fbbbb..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/alert-summary-codegen.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/alert-summary-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/alert-summary-manifest.xml deleted file mode 100644 index 6865ef47c2..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/alert-summary-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/alert-summary-model.xml b/cat-home/src/main/resources/META-INF/dal/model/alert-summary-model.xml deleted file mode 100644 index 522b19ece4..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/alert-summary-model.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - \ No newline at end of file diff --git a/cat-home/src/main/resources/META-INF/dal/model/business-tag-config-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/business-tag-config-codegen.xml deleted file mode 100644 index f037dd57ea..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/business-tag-config-codegen.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/business-tag-config-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/business-tag-config-manifest.xml deleted file mode 100644 index 27885710f9..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/business-tag-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/business-tag-config-model.xml b/cat-home/src/main/resources/META-INF/dal/model/business-tag-config-model.xml deleted file mode 100644 index f58414bb2a..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/business-tag-config-model.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/client-report-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/client-report-codegen.xml deleted file mode 100644 index e945c056fa..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/client-report-codegen.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/client-report-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/client-report-manifest.xml deleted file mode 100644 index 3b55ef193e..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/client-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/client-report-model.xml b/cat-home/src/main/resources/META-INF/dal/model/client-report-model.xml deleted file mode 100644 index c3e608529c..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/client-report-model.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/domain-group-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/domain-group-codegen.xml deleted file mode 100644 index c3094345f3..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/domain-group-codegen.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/domain-group-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/domain-group-manifest.xml deleted file mode 100644 index a776ab181c..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/domain-group-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/domain-group-model.xml b/cat-home/src/main/resources/META-INF/dal/model/domain-group-model.xml deleted file mode 100644 index 7dbb93bd18..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/domain-group-model.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cat-home/src/main/resources/META-INF/dal/model/exception-rule-config-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/exception-rule-config-codegen.xml deleted file mode 100644 index 5b8838da08..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/exception-rule-config-codegen.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/exception-rule-config-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/exception-rule-config-manifest.xml deleted file mode 100644 index 918f5a36ef..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/exception-rule-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/exception-rule-config-model.xml b/cat-home/src/main/resources/META-INF/dal/model/exception-rule-config-model.xml deleted file mode 100644 index d51278e3d2..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/exception-rule-config-model.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/graph-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/graph-codegen.xml deleted file mode 100644 index 0af8f8c3e3..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/graph-codegen.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/graph-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/graph-manifest.xml deleted file mode 100644 index c2ce5bb7f1..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/graph-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/graph-model.xml b/cat-home/src/main/resources/META-INF/dal/model/graph-model.xml deleted file mode 100644 index 453cd1f63b..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/graph-model.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/heartbeat-display-config-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/heartbeat-display-config-codegen.xml deleted file mode 100644 index 6b01a99899..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/heartbeat-display-config-codegen.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/heartbeat-display-config-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/heartbeat-display-config-manifest.xml deleted file mode 100644 index a3ad00db78..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/heartbeat-display-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/heartbeat-display-config-model.xml b/cat-home/src/main/resources/META-INF/dal/model/heartbeat-display-config-model.xml deleted file mode 100644 index d549cfba50..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/heartbeat-display-config-model.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/heavy-report-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/heavy-report-codegen.xml deleted file mode 100644 index a8024f688f..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/heavy-report-codegen.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/heavy-report-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/heavy-report-manifest.xml deleted file mode 100644 index 5c4aa1216a..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/heavy-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/heavy-report-model.xml b/cat-home/src/main/resources/META-INF/dal/model/heavy-report-model.xml deleted file mode 100644 index 17cd3ec0e0..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/heavy-report-model.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/highload-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/highload-codegen.xml deleted file mode 100644 index 7778de5f9d..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/highload-codegen.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/highload-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/highload-manifest.xml deleted file mode 100644 index e350f9ce10..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/highload-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/highload-model.xml b/cat-home/src/main/resources/META-INF/dal/model/highload-model.xml deleted file mode 100644 index 5a39bcff50..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/highload-model.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/jar-report-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/jar-report-codegen.xml deleted file mode 100644 index fb7a631802..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/jar-report-codegen.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/jar-report-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/jar-report-manifest.xml deleted file mode 100644 index 8ad71ace0e..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/jar-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/jar-report-model.xml b/cat-home/src/main/resources/META-INF/dal/model/jar-report-model.xml deleted file mode 100644 index d9cae0bf68..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/jar-report-model.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/monitor-rules-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/monitor-rules-codegen.xml deleted file mode 100644 index ba4aacd2e8..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/monitor-rules-codegen.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/monitor-rules-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/monitor-rules-manifest.xml deleted file mode 100644 index c8be666748..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/monitor-rules-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/monitor-rules-model.xml b/cat-home/src/main/resources/META-INF/dal/model/monitor-rules-model.xml deleted file mode 100644 index 4cdbef9f37..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/monitor-rules-model.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/resource-config-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/resource-config-codegen.xml deleted file mode 100644 index 82296e8e7f..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/resource-config-codegen.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/resource-config-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/resource-config-manifest.xml deleted file mode 100644 index 69b3929246..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/resource-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/resource-config-model.xml b/cat-home/src/main/resources/META-INF/dal/model/resource-config-model.xml deleted file mode 100644 index 5280f10e1c..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/resource-config-model.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/cat-home/src/main/resources/META-INF/dal/model/router-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/router-codegen.xml deleted file mode 100644 index a009eaf637..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/router-codegen.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/router-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/router-manifest.xml deleted file mode 100644 index 3b3f6d7f3c..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/router-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/router-model.xml b/cat-home/src/main/resources/META-INF/dal/model/router-model.xml deleted file mode 100644 index b56c68ac3f..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/router-model.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cat-home/src/main/resources/META-INF/dal/model/server-metric-config-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/server-metric-config-codegen.xml deleted file mode 100644 index fb9b185a8c..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/server-metric-config-codegen.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/server-metric-config-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/server-metric-config-manifest.xml deleted file mode 100644 index d2884b9d98..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/server-metric-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/server-metric-config-model.xml b/cat-home/src/main/resources/META-INF/dal/model/server-metric-config-model.xml deleted file mode 100644 index 44e575ab72..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/server-metric-config-model.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/service-report-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/service-report-codegen.xml deleted file mode 100644 index fe16a8156a..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/service-report-codegen.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/service-report-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/service-report-manifest.xml deleted file mode 100644 index 2e5356d675..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/service-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/service-report-model.xml b/cat-home/src/main/resources/META-INF/dal/model/service-report-model.xml deleted file mode 100644 index 623f0c3d2e..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/service-report-model.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/storage-alert-info-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/storage-alert-info-codegen.xml deleted file mode 100644 index e8782ded80..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/storage-alert-info-codegen.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/storage-alert-info-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/storage-alert-info-manifest.xml deleted file mode 100644 index 30ca041c4a..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/storage-alert-info-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/storage-alert-info-model.xml b/cat-home/src/main/resources/META-INF/dal/model/storage-alert-info-model.xml deleted file mode 100644 index bc10574bb5..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/storage-alert-info-model.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/storage-group-config-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/storage-group-config-codegen.xml deleted file mode 100644 index 641deefc6d..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/storage-group-config-codegen.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/storage-group-config-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/storage-group-config-manifest.xml deleted file mode 100644 index 5305eca471..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/storage-group-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/storage-group-config-model.xml b/cat-home/src/main/resources/META-INF/dal/model/storage-group-config-model.xml deleted file mode 100644 index d153236e0f..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/storage-group-config-model.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/system-report-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/system-report-codegen.xml deleted file mode 100644 index 8b0e583ab3..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/system-report-codegen.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/system-report-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/system-report-manifest.xml deleted file mode 100644 index 5c91ab4c16..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/system-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/system-report-model.xml b/cat-home/src/main/resources/META-INF/dal/model/system-report-model.xml deleted file mode 100644 index 1aa9211c28..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/system-report-model.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/topology-format-config-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/topology-format-config-codegen.xml deleted file mode 100644 index 641df2b3f7..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/topology-format-config-codegen.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/topology-format-config-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/topology-format-config-manifest.xml deleted file mode 100644 index e6b68b39bc..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/topology-format-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/topology-format-config-model.xml b/cat-home/src/main/resources/META-INF/dal/model/topology-format-config-model.xml deleted file mode 100644 index 2c6d5156e0..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/topology-format-config-model.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/topology-graph-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/topology-graph-codegen.xml deleted file mode 100644 index 29ba931e56..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/topology-graph-codegen.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/topology-graph-config-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/topology-graph-config-codegen.xml deleted file mode 100644 index bb3bef4ca1..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/topology-graph-config-codegen.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/topology-graph-config-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/topology-graph-config-manifest.xml deleted file mode 100644 index e6fa861b79..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/topology-graph-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/topology-graph-config-model.xml b/cat-home/src/main/resources/META-INF/dal/model/topology-graph-config-model.xml deleted file mode 100644 index b914fcb2f4..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/topology-graph-config-model.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/topology-graph-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/topology-graph-manifest.xml deleted file mode 100644 index 639f34f40a..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/topology-graph-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/topology-graph-model.xml b/cat-home/src/main/resources/META-INF/dal/model/topology-graph-model.xml deleted file mode 100644 index d22a9f7bd8..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/topology-graph-model.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/user-config-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/user-config-codegen.xml deleted file mode 100644 index 918bffcece..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/user-config-codegen.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/user-config-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/user-config-manifest.xml deleted file mode 100644 index 764c0f68f9..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/user-config-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/user-config-model.xml b/cat-home/src/main/resources/META-INF/dal/model/user-config-model.xml deleted file mode 100644 index 3bde9546f5..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/user-config-model.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/utilization-report-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/utilization-report-codegen.xml deleted file mode 100644 index 597966911c..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/utilization-report-codegen.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/utilization-report-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/utilization-report-manifest.xml deleted file mode 100644 index 1ab06a288e..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/utilization-report-manifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/cat-home/src/main/resources/META-INF/dal/model/utilization-report-model.xml b/cat-home/src/main/resources/META-INF/dal/model/utilization-report-model.xml deleted file mode 100644 index 379129c44f..0000000000 --- a/cat-home/src/main/resources/META-INF/dal/model/utilization-report-model.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java index eaaab933b1..a381c0aede 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java @@ -25,10 +25,8 @@ import org.junit.Assert; import org.junit.Test; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.core.config.Config; import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.config.ConfigEntity; public class ConfigsBackupTest extends SpringTaskTestSupport { @@ -66,7 +64,7 @@ public boolean backupConfigs() { boolean result = true; try { - List configs = m_dao.findAllConfig(ConfigEntity.READSET_FULL); + List configs = m_dao.findAllConfig(); for (Config config : configs) { boolean tmpResult = backupConfig(config.getName(), config.getContent()); @@ -75,7 +73,7 @@ public boolean backupConfigs() { result = false; } } - } catch (DalException e) { + } catch (RuntimeException e) { return false; } return result; diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/DatabaseCapacityTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/DatabaseCapacityTest.java index 4cb05eec43..3a74d0b70b 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/DatabaseCapacityTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/DatabaseCapacityTest.java @@ -19,14 +19,13 @@ package com.dianping.cat.report.task; -import com.dianping.cat.core.dal.jdbc.DalException; import com.dianping.cat.report.page.overload.task.CapacityUpdater; import com.dianping.cat.report.page.overload.task.HourlyCapacityUpdater; public class DatabaseCapacityTest extends SpringTaskTestSupport { // @Test - public void testTaskDuration() throws DalException { + public void testTaskDuration() { CapacityUpdater updater = lookup(CapacityUpdater.class, HourlyCapacityUpdater.ID); long currentMills = System.currentTimeMillis(); diff --git a/pom.xml b/pom.xml index 9f0e03d62d..c54790758a 100644 --- a/pom.xml +++ b/pom.xml @@ -72,11 +72,6 @@ ${project.version} war - - org.unidal.framework - dal-jdbc - 3.0.3 - org.unidal.framework foundation-service @@ -372,11 +367,6 @@ org.eclipse.jdt.core.compiler.compliance=21 - - org.unidal.maven.plugins - codegen-maven-plugin - 2.5.9 - org.sonatype.plugins nexus-staging-maven-plugin From c7900c68f7044adec4251e644ac9f370b5ba9261 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 17:05:55 +0800 Subject: [PATCH 141/231] =?UTF-8?q?=E6=B8=85=E7=90=86=20Unidal=20=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E4=B8=8E=E6=B5=8B=E8=AF=95=E6=A1=86=E6=9E=B6?= =?UTF-8?q?=E6=AE=8B=E7=95=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cat-alarm/pom.xml | 13 --- cat-consumer/pom.xml | 5 -- .../cat/consumer/CatConsumerModule.java | 38 --------- cat-core/pom.xml | 9 -- .../java/com/dianping/cat/CatCoreModule.java | 41 --------- .../core/dal/jdbc/mapping/TableProvider.java | 9 -- .../HourlyReportContentTableProvider.java | 45 ---------- .../cat/report/HourlyReportTableProvider.java | 47 ---------- .../dianping/cat/hadoop/CatHadoopModule.java | 43 ---------- cat-home/pom.xml | 9 -- .../java/com/dianping/cat/CatHomeModule.java | 49 ----------- .../report/task/cmdb/ProjectUpdateTask.java | 24 +++--- .../main/resources/freemaker/rule_configs.ftl | 4 +- .../jsp/report/home/interface/heartbeat.jsp | 9 +- .../src/test/java/com/dianping/cat/Api.java | 24 +++--- .../test/java/com/dianping/cat/TestApi.java | 13 +-- .../java/com/dianping/cat/TestServer.java | 85 ++++++++++++++++--- .../cat/demo/DatabaseDataFetcher.java | 23 ++--- pom.xml | 10 --- 19 files changed, 120 insertions(+), 380 deletions(-) delete mode 100644 cat-consumer/src/main/java/com/dianping/cat/consumer/CatConsumerModule.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/CatCoreModule.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/mapping/TableProvider.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/report/HourlyReportContentTableProvider.java delete mode 100644 cat-core/src/main/java/com/dianping/cat/report/HourlyReportTableProvider.java delete mode 100644 cat-hadoop/src/main/java/com/dianping/cat/hadoop/CatHadoopModule.java delete mode 100644 cat-home/src/main/java/com/dianping/cat/CatHomeModule.java diff --git a/cat-alarm/pom.xml b/cat-alarm/pom.xml index 00e3698d16..5881e80bff 100644 --- a/cat-alarm/pom.xml +++ b/cat-alarm/pom.xml @@ -19,14 +19,6 @@ com.dianping.cat cat-core - - org.unidal.framework - foundation-service - - - org.unidal.framework - web-framework - org.mybatis mybatis @@ -50,11 +42,6 @@ org.freemarker freemarker - - org.unidal.framework - test-framework - test - commons-lang commons-lang diff --git a/cat-consumer/pom.xml b/cat-consumer/pom.xml index 3d83e4cd58..1c20508929 100644 --- a/cat-consumer/pom.xml +++ b/cat-consumer/pom.xml @@ -19,11 +19,6 @@ com.dianping.cat cat-hadoop - - org.unidal.framework - test-framework - test - com.google.code.gson gson diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/CatConsumerModule.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/CatConsumerModule.java deleted file mode 100644 index f90ae2ccd1..0000000000 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/CatConsumerModule.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.consumer; - -import org.unidal.initialization.AbstractModule; -import org.unidal.initialization.Module; -import org.unidal.initialization.ModuleContext; - -import com.dianping.cat.CatCoreModule; - -public class CatConsumerModule extends AbstractModule { - public static final String ID = "cat-consumer"; - - @Override - protected void execute(ModuleContext ctx) { - } - - @Override - public Module[] getDependencies(ModuleContext ctx) { - return ctx.getModules(CatCoreModule.ID); - } -} diff --git a/cat-core/pom.xml b/cat-core/pom.xml index fe0c54e770..f2329d6d9e 100644 --- a/cat-core/pom.xml +++ b/cat-core/pom.xml @@ -15,10 +15,6 @@ com.dianping.cat cat-client - - org.unidal.framework - foundation-service - org.unidal.framework web-framework @@ -70,11 +66,6 @@ true provided - - org.unidal.framework - test-framework - test - ch.qos.logback logback-classic diff --git a/cat-core/src/main/java/com/dianping/cat/CatCoreModule.java b/cat-core/src/main/java/com/dianping/cat/CatCoreModule.java deleted file mode 100644 index 083ab506a3..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/CatCoreModule.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat; - -import org.unidal.initialization.AbstractModule; -import org.unidal.initialization.Module; -import org.unidal.initialization.ModuleContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class CatCoreModule extends AbstractModule { - private static final Logger LOGGER = LoggerFactory.getLogger(CatCoreModule.class); - - public static final String ID = "cat-core"; - - @Override - protected void execute(final ModuleContext ctx) throws Exception { - LOGGER.info("Cat core module initialized."); - } - - @Override - public Module[] getDependencies(ModuleContext ctx) { - return null; - } -} diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/mapping/TableProvider.java b/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/mapping/TableProvider.java deleted file mode 100644 index 481a66e3a4..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/jdbc/mapping/TableProvider.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.dianping.cat.core.dal.jdbc.mapping; - -import java.util.Map; - -public interface TableProvider { - String getDataSourceName(Map hints, String logicalTableName); - - String getPhysicalTableName(Map hints, String logicalTableName); -} diff --git a/cat-core/src/main/java/com/dianping/cat/report/HourlyReportContentTableProvider.java b/cat-core/src/main/java/com/dianping/cat/report/HourlyReportContentTableProvider.java deleted file mode 100644 index c4c9331c9e..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/report/HourlyReportContentTableProvider.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.report; - -import java.util.Map; - -import com.dianping.cat.core.dal.jdbc.mapping.TableProvider; - -public class HourlyReportContentTableProvider implements TableProvider { - - public final static String LOGIC_TABLE_NAME = "report-content"; - - protected String m_logicalTableName = LOGIC_TABLE_NAME; - - @Override - public String getDataSourceName(Map hints, String logicalTableName) { - return "cat"; - } - - @Override - public String getPhysicalTableName(Map hints, String logicalTableName) { - return "hourly_report_content"; - } - - public void setLogicalTableName(String logicalTableName) { - m_logicalTableName = logicalTableName; - } - -} diff --git a/cat-core/src/main/java/com/dianping/cat/report/HourlyReportTableProvider.java b/cat-core/src/main/java/com/dianping/cat/report/HourlyReportTableProvider.java deleted file mode 100644 index f07ffcd20f..0000000000 --- a/cat-core/src/main/java/com/dianping/cat/report/HourlyReportTableProvider.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.report; - -import java.util.Map; - -import com.dianping.cat.core.dal.jdbc.mapping.TableProvider; - -public class HourlyReportTableProvider implements TableProvider { - - public final static String LOGIC_TABLE_NAME = "report"; - - protected String m_logicalTableName = LOGIC_TABLE_NAME; - - private String m_dataSourceName = "cat"; - - @Override - public String getDataSourceName(Map hints, String logicalTableName) { - return m_dataSourceName; - } - - public void setLogicalTableName(String logicalTableName) { - m_logicalTableName = logicalTableName; - } - - @Override - public String getPhysicalTableName(Map hints, String logicalTableName) { - return "hourlyreport"; - } - -} diff --git a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/CatHadoopModule.java b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/CatHadoopModule.java deleted file mode 100644 index fda242e8ec..0000000000 --- a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/CatHadoopModule.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat.hadoop; - -import org.unidal.initialization.AbstractModule; -import org.unidal.initialization.Module; -import org.unidal.initialization.ModuleContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.dianping.cat.CatCoreModule; - -public class CatHadoopModule extends AbstractModule { - private static final Logger LOGGER = LoggerFactory.getLogger(CatHadoopModule.class); - - public static final String ID = "cat-hadoop"; - - @Override - protected void execute(ModuleContext ctx) { - LOGGER.info("Skipping legacy CAT hadoop module startup; logview processor is managed by Spring."); - } - - @Override - public Module[] getDependencies(ModuleContext ctx) { - return ctx.getModules(CatCoreModule.ID); - } -} diff --git a/cat-home/pom.xml b/cat-home/pom.xml index 3d7052886b..77c6aad501 100755 --- a/cat-home/pom.xml +++ b/cat-home/pom.xml @@ -82,10 +82,6 @@ org.projectlombok lombok - - org.unidal.framework - foundation-service - javax.servlet jstl @@ -119,11 +115,6 @@ jetty test - - org.unidal.framework - test-framework - test - org.apache.commons commons-email diff --git a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java deleted file mode 100644 index 41351241cd..0000000000 --- a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved. - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dianping.cat; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.unidal.initialization.AbstractModule; -import org.unidal.initialization.Module; -import org.unidal.initialization.ModuleContext; - -import com.dianping.cat.consumer.CatConsumerModule; -import com.dianping.cat.hadoop.CatHadoopModule; - -public class CatHomeModule extends AbstractModule { - private static final Logger LOGGER = LoggerFactory.getLogger(CatHomeModule.class); - - public static final String ID = "cat-home"; - - @Override - protected void execute(ModuleContext ctx) throws Exception { - LOGGER.info("Cat home module initialized."); - } - - @Override - public Module[] getDependencies(ModuleContext ctx) { - return ctx.getModules(CatConsumerModule.ID, CatHadoopModule.ID); - } - - @Override - protected void setup(ModuleContext ctx) throws Exception { - LOGGER.info("Cat home module setup completed."); - } -} diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java index 1ca94887a8..a80d1e0e88 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/cmdb/ProjectUpdateTask.java @@ -30,11 +30,11 @@ import java.util.Map.Entry; import java.util.Set; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import com.dianping.cat.support.Threads.Task; -import org.unidal.webres.json.JsonArray; -import org.unidal.webres.json.JsonObject; import com.dianping.cat.Cat; import com.dianping.cat.consumer.transaction.TransactionAnalyzer; @@ -120,29 +120,29 @@ public String getName() { } public String parseDomain(String content) throws Exception { - JsonObject object = new JsonObject(content); - JsonArray projectArray = object.getJSONArray("projects"); + JSONObject object = JSONObject.parseObject(content); + JSONArray projectArray = object.getJSONArray("projects"); - if (projectArray.length() > 0) { - JsonObject firstProject = projectArray.getJSONObject(0); + if (projectArray.size() > 0) { + JSONObject firstProject = projectArray.getJSONObject(0); return firstProject.get("project_name").toString(); } return null; } public String parseHostname(String content) throws Exception { - JsonObject object = new JsonObject(content); - JsonArray resultArray = object.getJSONArray("result"); + JSONObject object = JSONObject.parseObject(content); + JSONArray resultArray = object.getJSONArray("result"); - if (resultArray.length() > 0) { - JsonObject firstResult = resultArray.getJSONObject(0); + if (resultArray.size() > 0) { + JSONObject firstResult = resultArray.getJSONObject(0); return firstResult.get("hostname").toString(); } return null; } private String parseInfo(String content, String jsonName, String attrName) throws Exception { - JsonObject json = new JsonObject(content).getJSONObject(jsonName); + JSONObject json = JSONObject.parseObject(content).getJSONObject(jsonName); if (json != null) { Object obj = json.get(attrName); @@ -156,7 +156,7 @@ private String parseInfo(String content, String jsonName, String attrName) throw private Map parseInfos(String content) throws Exception { Map infosMap = new HashMap(); - JsonObject project = new JsonObject(content).getJSONObject("project"); + JSONObject project = JSONObject.parseObject(content).getJSONObject("project"); if (project == null) { return infosMap; diff --git a/cat-home/src/main/resources/freemaker/rule_configs.ftl b/cat-home/src/main/resources/freemaker/rule_configs.ftl index b9b6708ca6..66df97a9bc 100644 --- a/cat-home/src/main/resources/freemaker/rule_configs.ftl +++ b/cat-home/src/main/resources/freemaker/rule_configs.ftl @@ -90,7 +90,7 @@
         代码示例如下:
-    	    import org.unidal.tuple.Pair;
+    	    import org.apache.commons.lang3.tuple.Pair;
 	    import com.dianping.cat.report.task.alert.RuleType.MonitorRule;
 	    
 	    public class UserDefinedRule implements MonitorRule{
@@ -358,4 +358,4 @@ function generateConfigsJsonString() {
     }
     return "";
 }
-
\ No newline at end of file
+
diff --git a/cat-home/src/main/webapp/jsp/report/home/interface/heartbeat.jsp b/cat-home/src/main/webapp/jsp/report/home/interface/heartbeat.jsp
index 707e5a4d39..64f2180974 100644
--- a/cat-home/src/main/webapp/jsp/report/home/interface/heartbeat.jsp
+++ b/cat-home/src/main/webapp/jsp/report/home/interface/heartbeat.jsp
@@ -14,10 +14,9 @@ package com.dianping.cat.status;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
-import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
+import javax.annotation.PostConstruct;
 
-public class HeartbeatExtenstion implements StatusExtension, Initializable {
+public class HeartbeatExtenstion implements StatusExtension {
 
 	//给当前的类定义一个ID
 	@Override
@@ -44,8 +43,8 @@ public class HeartbeatExtenstion implements StatusExtension, Initializable {
 	}
 
 	//这里是实现了初始化方法,把这个实现注册到cat上,如果你使用spring,需要在spring里面注册此bean,并实现初始化方法。
-	@Override
-	public void initialize() throws InitializationException {
+	@PostConstruct
+	public void initialize() {
 		StatusExtensionRegister.getInstance().register(this);
 	}
 }
diff --git a/cat-home/src/test/java/com/dianping/cat/Api.java b/cat-home/src/test/java/com/dianping/cat/Api.java
index b340e7c728..60aecf682f 100644
--- a/cat-home/src/test/java/com/dianping/cat/Api.java
+++ b/cat-home/src/test/java/com/dianping/cat/Api.java
@@ -23,8 +23,8 @@
 import java.net.URL;
 import java.net.URLConnection;
 
-import org.unidal.webres.json.JsonArray;
-import org.unidal.webres.json.JsonObject;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
 
 public class Api {
 
@@ -35,12 +35,12 @@ public class Api {
 	public static void main(String args[]) throws Exception {
 		String content = fetchContent(BU_API);
 
-		JsonObject object = new JsonObject(content);
-		JsonArray projectArray = object.getJSONArray("bu");
-		int length = projectArray.length();
+		JSONObject object = JSONObject.parseObject(content);
+		JSONArray projectArray = object.getJSONArray("bu");
+		int length = projectArray.size();
 
 		for (int i = 0; i < length; i++) {
-			JsonObject project = projectArray.getJSONObject(i);
+			JSONObject project = projectArray.getJSONObject(i);
 			String bu = project.getString("bu_name");
 
 			String nextUrl = String.format(PROJECT_API, bu, String.valueOf(1));
@@ -54,8 +54,8 @@ public static void main(String args[]) throws Exception {
 	}
 
 	private static void findNextProjects(String bu, String detailContent) throws Exception, IOException {
-		JsonObject jobject = new JsonObject(detailContent);
-		int number = jobject.getInt("numfound");
+		JSONObject jobject = JSONObject.parseObject(detailContent);
+		int number = jobject.getIntValue("numfound");
 		int index = (int) Math.ceil(number * 1.0 / 25.0);
 
 		for (int j = 2; j <= index; j++) {
@@ -67,12 +67,12 @@ private static void findNextProjects(String bu, String detailContent) throws Exc
 	}
 
 	private static void print(String bu, String detailContent) throws Exception {
-		JsonObject object = new JsonObject(detailContent);
-		JsonArray projectArray = object.getJSONArray("products");
-		int length = projectArray.length();
+		JSONObject object = JSONObject.parseObject(detailContent);
+		JSONArray projectArray = object.getJSONArray("products");
+		int length = projectArray.size();
 
 		for (int i = 0; i < length; i++) {
-			JsonObject project = projectArray.getJSONObject(i);
+			JSONObject project = projectArray.getJSONObject(i);
 			String projectName = project.getString("product_name");
 
 			System.out.println(bu + "\t" + projectName);
diff --git a/cat-home/src/test/java/com/dianping/cat/TestApi.java b/cat-home/src/test/java/com/dianping/cat/TestApi.java
index b38ca6d07e..bebfdbda19 100644
--- a/cat-home/src/test/java/com/dianping/cat/TestApi.java
+++ b/cat-home/src/test/java/com/dianping/cat/TestApi.java
@@ -27,8 +27,9 @@
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.junit.Test;
-import org.unidal.webres.json.JsonArray;
-import org.unidal.webres.json.JsonObject;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
 
 public class TestApi {
 
@@ -51,11 +52,11 @@ private String fetchContent(String url) throws Exception {
 	}
 
 	private Pair parse(String content) throws ParseException {
-		JsonObject obj = new JsonObject(content);
-		JsonArray array = obj.getJSONArray("lineChartDetails");
-		JsonObject chart = (JsonObject) array.get(0);
+		JSONObject obj = JSONObject.parseObject(content);
+		JSONArray array = obj.getJSONArray("lineChartDetails");
+		JSONObject chart = array.getJSONObject(0);
 
-		return Pair.of(chart.getInt("accessNumberSum"), chart.getDouble("successRatio"));
+		return Pair.of(chart.getIntValue("accessNumberSum"), chart.getDouble("successRatio"));
 	}
 
 	@Test
diff --git a/cat-home/src/test/java/com/dianping/cat/TestServer.java b/cat-home/src/test/java/com/dianping/cat/TestServer.java
index 6fbbe6bcec..f301f4ff67 100644
--- a/cat-home/src/test/java/com/dianping/cat/TestServer.java
+++ b/cat-home/src/test/java/com/dianping/cat/TestServer.java
@@ -18,23 +18,37 @@
  */
 package com.dianping.cat;
 
+import java.awt.Desktop;
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 import org.mortbay.jetty.Handler;
+import org.mortbay.jetty.Server;
 import org.mortbay.jetty.webapp.WebAppContext;
 import org.mortbay.servlet.GzipFilter;
-import org.unidal.test.jetty.JettyServer;
 
 @RunWith(JUnit4.class)
-public class TestServer extends JettyServer {
+public class TestServer {
+	private Server m_server;
+
 	public static void main(String[] args) throws Exception {
 		TestServer server = new TestServer();
 		System.setProperty("devMode", "true");
-		server.startServer();
-		server.startWebApp();
-		server.stopServer();
+
+		try {
+			server.startServer();
+			server.display("/cat/r/t");
+			server.waitForAnyKey();
+		} finally {
+			server.stopServer();
+		}
 	}
 
 	@Before
@@ -42,26 +56,75 @@ public void before() throws Exception {
 		System.setProperty("devMode", "true");
 	}
 
-	@Override
 	protected String getContextPath() {
 		return "/cat";
 	}
 
-	@Override
 	protected int getServerPort() {
 		return 8080;
 	}
 
-	@Override
 	protected void postConfigure(WebAppContext context) {
 		context.addFilter(GzipFilter.class, "/*", Handler.ALL);
 	}
 
+	protected void startServer() throws Exception {
+		Server server = new Server(getServerPort());
+		WebAppContext context = new WebAppContext();
+		File warRoot = getWarRoot();
+
+		context.getInitParams().put("org.mortbay.jetty.servlet.Default.dirAllowed", "false");
+		context.setContextPath(getContextPath());
+		context.setDescriptor(new File(warRoot, "WEB-INF/web.xml").getPath());
+		context.setWar(warRoot.getPath());
+		postConfigure(context);
+		server.addHandler(context);
+		server.start();
+
+		m_server = server;
+	}
+
+	protected void stopServer() throws Exception {
+		if (m_server != null) {
+			m_server.stop();
+			m_server = null;
+		}
+	}
+
+	private void display(String requestUri) throws Exception {
+		URI uri = new URI("http://localhost:" + getServerPort() + requestUri);
+
+		System.out.println(uri);
+		if (Desktop.isDesktopSupported()) {
+			Desktop.getDesktop().browse(uri);
+		}
+	}
+
+	private File getWarRoot() {
+		String warRoot = System.getProperty("warRoot");
+
+		if (warRoot != null) {
+			return new File(warRoot);
+		}
+		return new File("src/main/webapp");
+	}
+
+	private void waitForAnyKey() throws IOException {
+		String timestamp = new SimpleDateFormat("MM-dd HH:mm:ss.SSS").format(new Date());
+
+		System.out.println(String.format("[%s] [INFO] Press ENTER to stop server ... ", timestamp));
+		System.in.read();
+	}
+
 	@Test
 	public void startWebApp() throws Exception {
-		super.startServer();
-		display("/cat/r/t");
-		waitForAnyKey();
+		try {
+			startServer();
+			display("/cat/r/t");
+			waitForAnyKey();
+		} finally {
+			stopServer();
+		}
 	}
 
 }
diff --git a/cat-home/src/test/java/com/dianping/cat/demo/DatabaseDataFetcher.java b/cat-home/src/test/java/com/dianping/cat/demo/DatabaseDataFetcher.java
index 815e0d03aa..87e92f344c 100644
--- a/cat-home/src/test/java/com/dianping/cat/demo/DatabaseDataFetcher.java
+++ b/cat-home/src/test/java/com/dianping/cat/demo/DatabaseDataFetcher.java
@@ -22,16 +22,15 @@
 import java.io.InputStream;
 import java.net.URL;
 import java.net.URLConnection;
-import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
 import org.junit.Test;
-import org.unidal.webres.json.JsonArray;
-import org.unidal.webres.json.JsonObject;
 
 public class DatabaseDataFetcher {
 
@@ -50,23 +49,21 @@ public void test() {
 				try (InputStream stream = connection.getInputStream()) {
 					result = new String(stream.readAllBytes(), java.nio.charset.StandardCharsets.UTF_8);
 				}
-				JsonObject jo = new JsonObject(result);
-				JsonArray array = jo.getJSONArray("lineCharts");
+				JSONObject jo = JSONObject.parseObject(result);
+				JSONArray array = jo.getJSONArray("lineCharts");
 				Map datas = new LinkedHashMap();
 
-				for (int i = 0; i < array.length(); i++) {
-					JsonObject o = array.getJSONObject(i);
+				for (int i = 0; i < array.size(); i++) {
+					JSONObject o = array.getJSONObject(i);
 					String title = o.getString("title");
 
 					if (title.contains("THREADS_RUNNING")) {
-						JsonArray arys = o.getJSONArray("datas");
-						JsonObject object = arys.getJSONObject(0);
-						JsonArray names = object.names();
+						JSONArray arys = o.getJSONArray("datas");
+						JSONObject object = arys.getJSONObject(0);
 
 						List sortedNames = new ArrayList();
 
-						for (int k = 0; k < names.length(); k++) {
-							String key = names.getString(k);
+						for (String key : object.keySet()) {
 							sortedNames.add(Long.parseLong(key));
 						}
 
@@ -81,8 +78,6 @@ public void test() {
 				System.out.println(datas);
 			} catch (IOException e) {
 				e.printStackTrace();
-			} catch (ParseException e) {
-				e.printStackTrace();
 			}
 		}
 	}
diff --git a/pom.xml b/pom.xml
index c54790758a..5724a03232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -72,21 +72,11 @@
 				${project.version}
 				war
 			
-			
-				org.unidal.framework
-				foundation-service
-				3.0.3
-			
 			
 				org.unidal.framework
 				web-framework
 				3.0.3
 			
-			
-				org.unidal.framework
-				test-framework
-				3.0.3
-			
 			
 				org.unidal.webres
 				WebResServer

From e0494c5ae198758655461f547e699422c205a572 Mon Sep 17 00:00:00 2001
From: Shang 
Date: Tue, 16 Jun 2026 18:02:26 +0800
Subject: [PATCH 142/231] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20Spring=20MVC=20?=
 =?UTF-8?q?=E5=B9=B6=E8=A1=8C=E8=BF=81=E7=A7=BB=E5=85=A5=E5=8F=A3=E5=92=8C?=
 =?UTF-8?q?=E9=A6=96=E9=A1=B5=E5=8E=9F=E5=9E=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../dianping/cat/boot/EmbeddedCatServer.java  |  37 ++++-
 cat-core/pom.xml                              |  20 ++-
 cat-hadoop/pom.xml                            |  12 +-
 cat-home/pom.xml                              |  24 ++-
 .../spring/CatHomeSpringConfiguration.java    |   2 +
 .../SpringMvcMigrationConfiguration.java      |  27 ++++
 .../spring/web/SpringMvcHealthController.java |  19 +++
 .../spring/web/SpringMvcHomeController.java   |  43 ++++++
 .../spring/web/SpringMvcLoginController.java  |  91 ++++++++++++
 .../spring/web/SpringMvcMigrationServlet.java | 133 +++++++++++++++++
 cat-home/src/main/webapp/WEB-INF/web.xml      |   9 ++
 .../webapp/jsp/spring/report/home/home.jsp    |  58 ++++++++
 .../main/webapp/jsp/spring/system/login.jsp   | 137 ++++++++++++++++++
 .../SpringMvcMigrationConfigurationTest.java  |  37 +++++
 .../web/SpringMvcHomeControllerTest.java      |  52 +++++++
 pom.xml                                       |   5 +
 16 files changed, 684 insertions(+), 22 deletions(-)
 create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/SpringMvcMigrationConfiguration.java
 create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHealthController.java
 create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHomeController.java
 create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcLoginController.java
 create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java
 create mode 100644 cat-home/src/main/webapp/jsp/spring/report/home/home.jsp
 create mode 100644 cat-home/src/main/webapp/jsp/spring/system/login.jsp
 create mode 100644 cat-home/src/test/java/com/dianping/cat/home/spring/SpringMvcMigrationConfigurationTest.java
 create mode 100644 cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcHomeControllerTest.java

diff --git a/cat-boot/src/main/java/com/dianping/cat/boot/EmbeddedCatServer.java b/cat-boot/src/main/java/com/dianping/cat/boot/EmbeddedCatServer.java
index b9581b1b00..5cb3156f31 100644
--- a/cat-boot/src/main/java/com/dianping/cat/boot/EmbeddedCatServer.java
+++ b/cat-boot/src/main/java/com/dianping/cat/boot/EmbeddedCatServer.java
@@ -8,8 +8,11 @@
 
 import org.apache.catalina.Context;
 import org.apache.catalina.startup.Tomcat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class EmbeddedCatServer {
+	private static final Logger LOGGER = LoggerFactory.getLogger(EmbeddedCatServer.class);
 
 	private static final String WAR_RESOURCE = "cat-home.war";
 
@@ -20,7 +23,7 @@ public void start() throws IOException {
 		Path baseDir = resolveBaseDir(port);
 		deleteDirectory(baseDir);
 		Path appBase = Files.createDirectories(baseDir.resolve("webapps"));
-		Path warFile = copyWar(baseDir);
+		Path webapp = resolveWebapp(baseDir);
 
 		Tomcat tomcat = new Tomcat();
 		tomcat.setBaseDir(baseDir.toString());
@@ -28,7 +31,8 @@ public void start() throws IOException {
 		tomcat.getConnector().setURIEncoding("UTF-8");
 		tomcat.getHost().setAppBase(appBase.toString());
 
-		Context context = tomcat.addWebapp(CONTEXT_PATH, warFile.toString());
+		LOGGER.info("Starting CAT web application, contextPath={}, webapp={}.", CONTEXT_PATH, webapp);
+		Context context = tomcat.addWebapp(CONTEXT_PATH, webapp.toString());
 		context.setParentClassLoader(getClass().getClassLoader());
 
 		try {
@@ -52,6 +56,15 @@ private Path copyWar(Path baseDir) throws IOException {
 		return warFile;
 	}
 
+	private Path defaultExplodedWebapp() {
+		Path fromRepositoryRoot = Paths.get("cat-home", "target", "cat-home").toAbsolutePath().normalize();
+
+		if (Files.exists(fromRepositoryRoot.resolve("WEB-INF").resolve("web.xml"))) {
+			return fromRepositoryRoot;
+		}
+		return Paths.get("..", "cat-home", "target", "cat-home").toAbsolutePath().normalize();
+	}
+
 	private void deleteDirectory(Path directory) throws IOException {
 		if (!Files.exists(directory)) {
 			return;
@@ -81,4 +94,24 @@ private Path resolveBaseDir(int port) {
 		}
 		return Paths.get("target", "cat-boot-" + port).toAbsolutePath().normalize();
 	}
+
+	private Path resolveWebapp(Path baseDir) throws IOException {
+		String configuredWebapp = System.getProperty("cat.home.webapp");
+
+		if (configuredWebapp != null && configuredWebapp.trim().length() > 0) {
+			Path webapp = Paths.get(configuredWebapp).toAbsolutePath().normalize();
+
+			if (!Files.exists(webapp)) {
+				throw new IllegalStateException("Configured CAT home webapp does not exist: " + webapp);
+			}
+			return webapp;
+		}
+
+		Path explodedWebapp = defaultExplodedWebapp();
+
+		if (Files.exists(explodedWebapp.resolve("WEB-INF").resolve("web.xml"))) {
+			return explodedWebapp;
+		}
+		return copyWar(baseDir);
+	}
 }
diff --git a/cat-core/pom.xml b/cat-core/pom.xml
index f2329d6d9e..b4ee3bdd9d 100644
--- a/cat-core/pom.xml
+++ b/cat-core/pom.xml
@@ -11,14 +11,18 @@
 	cat-core
 	jar
 	
-		
-			com.dianping.cat
-			cat-client
-		
-		
-			org.unidal.framework
-			web-framework
-		
+		
+			com.dianping.cat
+			cat-client
+		
+		
+			io.netty
+			netty-all
+		
+		
+			org.unidal.framework
+			web-framework
+		
 		
 			org.xerial.snappy
 			snappy-java
diff --git a/cat-hadoop/pom.xml b/cat-hadoop/pom.xml
index f399457808..e02794d7b5 100644
--- a/cat-hadoop/pom.xml
+++ b/cat-hadoop/pom.xml
@@ -34,10 +34,14 @@
 				
 			
 		
-		
-			com.dianping.cat
-			cat-core
-		
+		
+			com.dianping.cat
+			cat-core
+		
+		
+			io.netty
+			netty-all
+		
 		
 			org.xerial.snappy
 			snappy-java
diff --git a/cat-home/pom.xml b/cat-home/pom.xml
index 77c6aad501..d2b2ffbfde 100755
--- a/cat-home/pom.xml
+++ b/cat-home/pom.xml
@@ -18,14 +18,18 @@
          com.dianping.cat
          cat-hadoop
       
-      
-         com.dianping.cat
-         cat-alarm
-      
-      
-         org.unidal.webres
-         WebResServer
-      
+      
+         com.dianping.cat
+         cat-alarm
+      
+      
+         io.netty
+         netty-all
+      
+      
+         org.unidal.webres
+         WebResServer
+      
       
          org.unidal.framework
          web-framework
@@ -62,6 +66,10 @@
          org.springframework
          spring-context
       
+      
+         org.springframework
+         spring-web
+      
       
          org.springframework
          spring-jdbc
diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java
index 8a025e6a75..d90618b2d0 100644
--- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java
+++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java
@@ -60,6 +60,7 @@
 import org.unidal.cat.message.storage.clean.LogviewProcessor;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
 import org.springframework.context.annotation.Primary;
 import org.springframework.context.annotation.Scope;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -391,6 +392,7 @@
 import com.dianping.cat.system.page.router.task.RouterConfigBuilder;
 
 @Configuration
+@Import(SpringMvcMigrationConfiguration.class)
 @MapperScan(basePackages = {
 		"com.dianping.cat.core.config.dao",
 		"com.dianping.cat.core.report.daily.dao",
diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/SpringMvcMigrationConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/SpringMvcMigrationConfiguration.java
new file mode 100644
index 0000000000..6c3e8d534a
--- /dev/null
+++ b/cat-home/src/main/java/com/dianping/cat/home/spring/SpringMvcMigrationConfiguration.java
@@ -0,0 +1,27 @@
+package com.dianping.cat.home.spring;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.dianping.cat.home.spring.web.SpringMvcHealthController;
+import com.dianping.cat.home.spring.web.SpringMvcHomeController;
+import com.dianping.cat.home.spring.web.SpringMvcLoginController;
+import com.dianping.cat.system.page.login.service.SigninService;
+
+@Configuration
+public class SpringMvcMigrationConfiguration {
+	@Bean
+	public SpringMvcHealthController springMvcHealthController() {
+		return new SpringMvcHealthController();
+	}
+
+	@Bean
+	public SpringMvcHomeController springMvcHomeController() {
+		return new SpringMvcHomeController();
+	}
+
+	@Bean
+	public SpringMvcLoginController springMvcLoginController(SigninService signinService) {
+		return new SpringMvcLoginController(signinService);
+	}
+}
diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHealthController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHealthController.java
new file mode 100644
index 0000000000..8558d74adf
--- /dev/null
+++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHealthController.java
@@ -0,0 +1,19 @@
+package com.dianping.cat.home.spring.web;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+public class SpringMvcHealthController {
+	@GetMapping("/health")
+	@ResponseBody
+	public Map health() {
+		Map model = new LinkedHashMap();
+
+		model.put("status", "UP");
+		model.put("runtime", "spring-mvc-migration");
+		return model;
+	}
+}
diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHomeController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHomeController.java
new file mode 100644
index 0000000000..4e07bf1067
--- /dev/null
+++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHomeController.java
@@ -0,0 +1,43 @@
+package com.dianping.cat.home.spring.web;
+
+import java.io.IOException;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.web.bind.annotation.GetMapping;
+
+public class SpringMvcHomeController {
+	@GetMapping("/r/home")
+	public void home(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		Map model = homeModel(request);
+
+		for (Map.Entry entry : model.entrySet()) {
+			request.setAttribute(entry.getKey(), entry.getValue());
+		}
+
+		RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/spring/report/home/home.jsp");
+
+		dispatcher.forward(request, response);
+	}
+
+	Map homeModel(HttpServletRequest request) {
+		Map model = new LinkedHashMap();
+		String docName = request.getParameter("docName");
+
+		if (docName == null || docName.length() == 0) {
+			docName = "index";
+		}
+
+		model.put("docName", docName);
+		model.put("runtime", "spring-mvc-migration");
+		model.put("legacyHomeUrl", request.getContextPath() + "/r/home");
+		model.put("loginUrl", request.getContextPath() + "/mvc/s/login");
+
+		return model;
+	}
+}
diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcLoginController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcLoginController.java
new file mode 100644
index 0000000000..5158624eb6
--- /dev/null
+++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcLoginController.java
@@ -0,0 +1,91 @@
+package com.dianping.cat.home.spring.web;
+
+import java.io.IOException;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+
+import com.dianping.cat.system.page.login.service.Credential;
+import com.dianping.cat.system.page.login.service.Session;
+import com.dianping.cat.system.page.login.service.SigninContext;
+import com.dianping.cat.system.page.login.service.SigninService;
+
+public class SpringMvcLoginController {
+	private static final Logger LOGGER = LoggerFactory.getLogger(SpringMvcLoginController.class);
+
+	private final SigninService m_signinService;
+
+	public SpringMvcLoginController(SigninService signinService) {
+		m_signinService = signinService;
+	}
+
+	@GetMapping("/s/login")
+	public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		String op = request.getParameter("op");
+
+		if ("logout".equals(op)) {
+			m_signinService.signout(new SigninContext(request, response));
+			response.sendRedirect(defaultReturnUrl(request));
+		} else {
+			forwardLogin(request, response, null);
+		}
+	}
+
+	@PostMapping("/s/login")
+	public void submit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		String account = request.getParameter("account");
+		String password = request.getParameter("password");
+
+		if (account != null && account.length() > 0 && password != null) {
+			Session session = m_signinService.signin(new SigninContext(request, response),
+					new Credential(account, password));
+
+			if (session != null) {
+				LOGGER.info("User login succeeded on Spring MVC migration path, account={}.", account);
+				response.sendRedirect(resolveReturnUrl(request));
+				return;
+			}
+			LOGGER.warn("User login failed on Spring MVC migration path, account={}.", account);
+		} else {
+			LOGGER.warn("User login input is incomplete on Spring MVC migration path, accountPresent={}, passwordPresent={}.",
+					account != null, password != null);
+		}
+
+		forwardLogin(request, response, "biz.login");
+	}
+
+	private String defaultReturnUrl(HttpServletRequest request) {
+		return request.getContextPath() + "/mvc/r/home";
+	}
+
+	private void forwardLogin(HttpServletRequest request, HttpServletResponse response, String error)
+			throws ServletException, IOException {
+		if (error != null) {
+			request.setAttribute("loginError", error);
+		}
+		if (request.getAttribute("rtnUrl") == null) {
+			request.setAttribute("rtnUrl", request.getParameter("rtnUrl"));
+		}
+
+		RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/spring/system/login.jsp");
+
+		dispatcher.forward(request, response);
+	}
+
+	private String resolveReturnUrl(HttpServletRequest request) {
+		String rtnUrl = request.getParameter("rtnUrl");
+
+		if (rtnUrl == null || rtnUrl.length() == 0 || rtnUrl.contains("/cat/s/login")
+				|| rtnUrl.contains("/cat/mvc/s/login")) {
+			return defaultReturnUrl(request);
+		}
+		return rtnUrl;
+	}
+}
diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java
new file mode 100644
index 0000000000..43b30e7b03
--- /dev/null
+++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java
@@ -0,0 +1,133 @@
+package com.dianping.cat.home.spring.web;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.fastjson2.JSON;
+import org.springframework.context.ApplicationContext;
+
+import com.dianping.cat.home.spring.CatHomeSpringContextListener;
+
+public class SpringMvcMigrationServlet extends HttpServlet {
+	private static final long serialVersionUID = 1L;
+
+	private SpringMvcHealthController m_healthController;
+
+	private SpringMvcHomeController m_homeController;
+
+	private SpringMvcLoginController m_loginController;
+
+	private Map m_routes = Collections.emptyMap();
+
+	@Override
+	public void init(ServletConfig config) throws ServletException {
+		super.init(config);
+
+		ApplicationContext context = (ApplicationContext) config.getServletContext()
+				.getAttribute(CatHomeSpringContextListener.ATTRIBUTE_NAME);
+
+		if (context == null) {
+			throw new ServletException("CAT home Spring context is not initialized.");
+		}
+		m_healthController = context.getBean(SpringMvcHealthController.class);
+		m_homeController = context.getBean(SpringMvcHomeController.class);
+		m_loginController = context.getBean(SpringMvcLoginController.class);
+		m_routes = buildRoutes();
+	}
+
+	@Override
+	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		handle("GET", request, response);
+	}
+
+	@Override
+	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		handle("POST", request, response);
+	}
+
+	private Map buildRoutes() {
+		Map routes = new LinkedHashMap();
+
+		register(routes, "GET", "/", (request, response) -> writeJson(response, m_healthController.health()));
+		register(routes, "GET", "/health", (request, response) -> writeJson(response, m_healthController.health()));
+		register(routes, "GET", "/r/home", m_homeController::home);
+		register(routes, "GET", "/s/login", m_loginController::login);
+		register(routes, "POST", "/s/login", m_loginController::submit);
+
+		return Collections.unmodifiableMap(routes);
+	}
+
+	private void handle(String method, HttpServletRequest request, HttpServletResponse response)
+			throws ServletException, IOException {
+		RouteHandler handler = m_routes.get(new RouteKey(method, normalizePath(request.getPathInfo())));
+
+		if (handler == null) {
+			response.sendError(HttpServletResponse.SC_NOT_FOUND);
+			return;
+		}
+		handler.handle(request, response);
+	}
+
+	private String normalizePath(String path) {
+		if (path == null || path.length() == 0) {
+			return "/";
+		}
+		return path;
+	}
+
+	private void register(Map routes, String method, String path, RouteHandler handler) {
+		routes.put(new RouteKey(method, path), handler);
+	}
+
+	private void writeJson(HttpServletResponse response, Map model) throws IOException {
+		response.setCharacterEncoding("utf-8");
+		response.setContentType("application/json;charset=utf-8");
+
+		try (PrintWriter writer = response.getWriter()) {
+			writer.write(JSON.toJSONString(model));
+		}
+	}
+
+	interface RouteHandler {
+		void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
+	}
+
+	static class RouteKey {
+		private final String m_method;
+
+		private final String m_path;
+
+		RouteKey(String method, String path) {
+			m_method = method;
+			m_path = path;
+		}
+
+		@Override
+		public boolean equals(Object obj) {
+			if (this == obj) {
+				return true;
+			}
+			if (!(obj instanceof RouteKey)) {
+				return false;
+			}
+
+			RouteKey other = (RouteKey) obj;
+
+			return m_method.equals(other.m_method) && m_path.equals(other.m_path);
+		}
+
+		@Override
+		public int hashCode() {
+			return m_method.hashCode() * 31 + m_path.hashCode();
+		}
+	}
+}
diff --git a/cat-home/src/main/webapp/WEB-INF/web.xml b/cat-home/src/main/webapp/WEB-INF/web.xml
index 310bffb82d..04d06ff096 100755
--- a/cat-home/src/main/webapp/WEB-INF/web.xml
+++ b/cat-home/src/main/webapp/WEB-INF/web.xml
@@ -43,6 +43,11 @@
 		
 		2
 	
+	
+		spring-mvc-migration-servlet
+		com.dianping.cat.home.spring.web.SpringMvcMigrationServlet
+		3
+	
 	
 		cat-filter
 		/r/*
@@ -81,6 +86,10 @@
 		mvc-servlet
 		/s/*
 	
+	
+		spring-mvc-migration-servlet
+		/mvc/*
+	
 	
 		
 			/WEB-INF/app.tld
diff --git a/cat-home/src/main/webapp/jsp/spring/report/home/home.jsp b/cat-home/src/main/webapp/jsp/spring/report/home/home.jsp
new file mode 100644
index 0000000000..28038893e5
--- /dev/null
+++ b/cat-home/src/main/webapp/jsp/spring/report/home/home.jsp
@@ -0,0 +1,58 @@
+<%@ page session="false" language="java" pageEncoding="UTF-8" %>
+<%@ page contentType="text/html; charset=utf-8" %>
+<%
+	String contextPath = request.getContextPath();
+	String docName = (String) request.getAttribute("docName");
+	String runtime = (String) request.getAttribute("runtime");
+	String legacyHomeUrl = (String) request.getAttribute("legacyHomeUrl");
+	String loginUrl = (String) request.getAttribute("loginUrl");
+
+	if (docName == null || docName.length() == 0) {
+		docName = "index";
+	}
+%>
+
+
+
+	
+	CAT Spring MVC Home
+	
+	
+
+
+	
+	
+ Runtime: <%=runtime%> +
+
+ + + + + + + + + + +
Path<%=request.getRequestURI()%>
Document<%=docName%>
+ + + diff --git a/cat-home/src/main/webapp/jsp/spring/system/login.jsp b/cat-home/src/main/webapp/jsp/spring/system/login.jsp new file mode 100644 index 0000000000..b92ba3bb17 --- /dev/null +++ b/cat-home/src/main/webapp/jsp/spring/system/login.jsp @@ -0,0 +1,137 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<% + String contextPath = request.getContextPath(); + String rtnUrl = request.getParameter("rtnUrl"); + String error = (String) request.getAttribute("loginError"); + + if (rtnUrl == null || rtnUrl.length() == 0) { + rtnUrl = contextPath + "/mvc/r/home"; + } +%> + + + + + CAT + + + + + + + + + + + + +
+
+
+
+ +
+
+
+
+ + + + + + diff --git a/cat-home/src/test/java/com/dianping/cat/home/spring/SpringMvcMigrationConfigurationTest.java b/cat-home/src/test/java/com/dianping/cat/home/spring/SpringMvcMigrationConfigurationTest.java new file mode 100644 index 0000000000..54a55f3d66 --- /dev/null +++ b/cat-home/src/test/java/com/dianping/cat/home/spring/SpringMvcMigrationConfigurationTest.java @@ -0,0 +1,37 @@ +package com.dianping.cat.home.spring; + +import org.junit.Assert; +import org.junit.Test; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import com.dianping.cat.home.spring.web.SpringMvcHealthController; +import com.dianping.cat.home.spring.web.SpringMvcHomeController; +import com.dianping.cat.home.spring.web.SpringMvcLoginController; +import com.dianping.cat.system.page.login.service.SigninService; + +public class SpringMvcMigrationConfigurationTest { + @Test + public void shouldRegisterSpringMvcMigrationController() { + try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( + TestConfiguration.class, SpringMvcMigrationConfiguration.class)) { + Assert.assertNotNull(context.getBean(SpringMvcHealthController.class)); + Assert.assertNotNull(context.getBean(SpringMvcHomeController.class)); + Assert.assertNotNull(context.getBean(SpringMvcLoginController.class)); + } + } + + @Test + public void shouldExposeHealthPayloadForMigrationPath() { + SpringMvcHealthController controller = new SpringMvcHealthController(); + + Assert.assertEquals("UP", controller.health().get("status")); + Assert.assertEquals("spring-mvc-migration", controller.health().get("runtime")); + } + + static class TestConfiguration { + @org.springframework.context.annotation.Bean + public SigninService signinService() { + return new SigninService(); + } + } +} diff --git a/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcHomeControllerTest.java b/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcHomeControllerTest.java new file mode 100644 index 0000000000..d413f175da --- /dev/null +++ b/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcHomeControllerTest.java @@ -0,0 +1,52 @@ +package com.dianping.cat.home.spring.web; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Collections; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.junit.Assert; +import org.junit.Test; + +public class SpringMvcHomeControllerTest { + @Test + public void shouldBuildDefaultHomeModel() { + SpringMvcHomeController controller = new SpringMvcHomeController(); + Map model = controller.homeModel(request("/cat", Collections.emptyMap())); + + Assert.assertEquals("index", model.get("docName")); + Assert.assertEquals("spring-mvc-migration", model.get("runtime")); + Assert.assertEquals("/cat/r/home", model.get("legacyHomeUrl")); + Assert.assertEquals("/cat/mvc/s/login", model.get("loginUrl")); + } + + @Test + public void shouldPreserveRequestedDocName() { + SpringMvcHomeController controller = new SpringMvcHomeController(); + Map model = controller.homeModel(request("/cat", Collections.singletonMap("docName", "plugin"))); + + Assert.assertEquals("plugin", model.get("docName")); + } + + private HttpServletRequest request(String contextPath, Map parameters) { + return (HttpServletRequest) Proxy.newProxyInstance(getClass().getClassLoader(), + new Class[] { HttpServletRequest.class }, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) { + if ("getContextPath".equals(method.getName())) { + return contextPath; + } + if ("getParameter".equals(method.getName())) { + return parameters.get(args[0]); + } + if ("toString".equals(method.getName())) { + return "SpringMvcHomeControllerTestRequest"; + } + return null; + } + }); + } +} diff --git a/pom.xml b/pom.xml index 5724a03232..cfb04bba9f 100644 --- a/pom.xml +++ b/pom.xml @@ -183,6 +183,11 @@ spring-context ${spring-framework.version} + + org.springframework + spring-web + ${spring-framework.version} + org.springframework spring-jdbc From 26f071db9386ddce640113c31faf3e9a128d6368 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 19:06:25 +0800 Subject: [PATCH 143/231] =?UTF-8?q?=E6=89=A9=E5=B1=95=20Spring=20MVC=20?= =?UTF-8?q?=E5=B9=B6=E8=A1=8C=E8=BF=81=E7=A7=BB=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cat-home/pom.xml | 6 +- .../SpringMvcMigrationConfiguration.java | 22 +-- .../spring/web/SpringMvcHealthController.java | 2 + .../spring/web/SpringMvcHomeController.java | 2 + .../spring/web/SpringMvcLoginController.java | 11 +- .../spring/web/SpringMvcMigrationServlet.java | 9 + .../spring/web/SpringMvcPluginController.java | 155 ++++++++++++++++++ .../spring/web/SpringMvcRouterController.java | 148 +++++++++++++++++ .../jsp/spring/system/plugin/plugin.jsp | 51 ++++++ .../SpringMvcMigrationConfigurationTest.java | 28 ++++ .../web/SpringMvcPluginControllerTest.java | 64 ++++++++ .../web/SpringMvcRouterControllerTest.java | 76 +++++++++ pom.xml | 5 + 13 files changed, 553 insertions(+), 26 deletions(-) create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcPluginController.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcRouterController.java create mode 100644 cat-home/src/main/webapp/jsp/spring/system/plugin/plugin.jsp create mode 100644 cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcPluginControllerTest.java create mode 100644 cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcRouterControllerTest.java diff --git a/cat-home/pom.xml b/cat-home/pom.xml index d2b2ffbfde..174c682fd9 100755 --- a/cat-home/pom.xml +++ b/cat-home/pom.xml @@ -53,7 +53,11 @@ javax.servlet servlet-api provided - + + + jakarta.annotation + jakarta.annotation-api + org.mybatis mybatis diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/SpringMvcMigrationConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/SpringMvcMigrationConfiguration.java index 6c3e8d534a..e346174df2 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/SpringMvcMigrationConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/SpringMvcMigrationConfiguration.java @@ -1,27 +1,9 @@ package com.dianping.cat.home.spring; -import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import com.dianping.cat.home.spring.web.SpringMvcHealthController; -import com.dianping.cat.home.spring.web.SpringMvcHomeController; -import com.dianping.cat.home.spring.web.SpringMvcLoginController; -import com.dianping.cat.system.page.login.service.SigninService; - @Configuration +@ComponentScan(basePackages = "com.dianping.cat.home.spring.web") public class SpringMvcMigrationConfiguration { - @Bean - public SpringMvcHealthController springMvcHealthController() { - return new SpringMvcHealthController(); - } - - @Bean - public SpringMvcHomeController springMvcHomeController() { - return new SpringMvcHomeController(); - } - - @Bean - public SpringMvcLoginController springMvcLoginController(SigninService signinService) { - return new SpringMvcLoginController(signinService); - } } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHealthController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHealthController.java index 8558d74adf..d7b2e90bf2 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHealthController.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHealthController.java @@ -3,9 +3,11 @@ import java.util.LinkedHashMap; import java.util.Map; +import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; +@Controller public class SpringMvcHealthController { @GetMapping("/health") @ResponseBody diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHomeController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHomeController.java index 4e07bf1067..07cf310c15 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHomeController.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHomeController.java @@ -9,8 +9,10 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +@Controller public class SpringMvcHomeController { @GetMapping("/r/home") public void home(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcLoginController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcLoginController.java index 5158624eb6..7c00e052ea 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcLoginController.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcLoginController.java @@ -2,6 +2,8 @@ import java.io.IOException; +import jakarta.annotation.Resource; + import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -9,6 +11,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -17,14 +20,12 @@ import com.dianping.cat.system.page.login.service.SigninContext; import com.dianping.cat.system.page.login.service.SigninService; +@Controller public class SpringMvcLoginController { private static final Logger LOGGER = LoggerFactory.getLogger(SpringMvcLoginController.class); - private final SigninService m_signinService; - - public SpringMvcLoginController(SigninService signinService) { - m_signinService = signinService; - } + @Resource + private SigninService m_signinService; @GetMapping("/s/login") public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java index 43b30e7b03..1ae0dc9a41 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java @@ -26,6 +26,10 @@ public class SpringMvcMigrationServlet extends HttpServlet { private SpringMvcLoginController m_loginController; + private SpringMvcPluginController m_pluginController; + + private SpringMvcRouterController m_routerController; + private Map m_routes = Collections.emptyMap(); @Override @@ -41,6 +45,8 @@ public void init(ServletConfig config) throws ServletException { m_healthController = context.getBean(SpringMvcHealthController.class); m_homeController = context.getBean(SpringMvcHomeController.class); m_loginController = context.getBean(SpringMvcLoginController.class); + m_pluginController = context.getBean(SpringMvcPluginController.class); + m_routerController = context.getBean(SpringMvcRouterController.class); m_routes = buildRoutes(); } @@ -61,6 +67,9 @@ private Map buildRoutes() { register(routes, "GET", "/health", (request, response) -> writeJson(response, m_healthController.health())); register(routes, "GET", "/r/home", m_homeController::home); register(routes, "GET", "/s/login", m_loginController::login); + register(routes, "GET", "/s/plugin", m_pluginController::plugin); + register(routes, "GET", "/s/plugin/chrome", m_pluginController::chrome); + register(routes, "GET", "/s/router", m_routerController::router); register(routes, "POST", "/s/login", m_loginController::submit); return Collections.unmodifiableMap(routes); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcPluginController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcPluginController.java new file mode 100644 index 0000000000..b1df30ab56 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcPluginController.java @@ -0,0 +1,155 @@ +package com.dianping.cat.home.spring.web; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.alibaba.fastjson2.JSON; +import org.apache.commons.io.IOUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class SpringMvcPluginController { + private final Map m_serverMapping = new LinkedHashMap(); + + public SpringMvcPluginController() { + // Production + m_serverMapping.put("10.1.6.37:8080", "cat.dianpingoa.com"); + m_serverMapping.put("10.1.8.64:8080", "cat.dianpingoa.com"); + m_serverMapping.put("10.1.6.102:8080", "cat.dianpingoa.com"); + m_serverMapping.put("10.1.6.108:8080", "cat.dianpingoa.com"); + m_serverMapping.put("10.1.6.126:8080", "cat.dianpingoa.com"); + m_serverMapping.put("10.1.6.128:8080", "cat.dianpingoa.com"); + m_serverMapping.put("10.1.6.145:8080", "cat.dianpingoa.com"); + + // QATE + m_serverMapping.put("192.168.7.70:8080", "cat.qa.dianpingoa.com"); + } + + @GetMapping("/s/plugin/chrome") + public void chrome(HttpServletRequest request, HttpServletResponse response) throws IOException { + if (isEnabled(request, "mapping")) { + writeServerMapping(response); + } else if (isEnabled(request, "source")) { + writeChromeSource(response); + } else { + writeClasspathResource(response, "/chrome/cat.crx", "application/octet-stream", "cat.crx"); + } + } + + @GetMapping("/s/plugin") + public void plugin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if ("doc".equals(request.getParameter("op"))) { + downloadDoc(request, response); + return; + } + + Map model = pluginModel(request); + + for (Map.Entry entry : model.entrySet()) { + request.setAttribute(entry.getKey(), entry.getValue()); + } + + RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/spring/system/plugin/plugin.jsp"); + + dispatcher.forward(request, response); + } + + Map pluginModel(HttpServletRequest request) { + Map model = new LinkedHashMap(); + String contextPath = request.getContextPath(); + + model.put("runtime", "spring-mvc-migration"); + model.put("legacyPluginUrl", contextPath + "/s/plugin"); + model.put("chromeExtensionUrl", contextPath + "/mvc/s/plugin/chrome"); + model.put("chromeSourceUrl", contextPath + "/mvc/s/plugin/chrome?source=true"); + model.put("chromeMappingUrl", contextPath + "/mvc/s/plugin/chrome?mapping=true"); + model.put("legacyChromeExtensionUrl", contextPath + "/s/plugin/chrome"); + model.put("homeUrl", contextPath + "/mvc/r/home"); + + return model; + } + + private void addResourceFiles(ZipOutputStream output, String baseDir, String... paths) throws IOException { + for (String path : paths) { + String resource = baseDir + "/" + path; + + output.putNextEntry(new ZipEntry(path)); + try (InputStream in = getClass().getResourceAsStream(resource)) { + if (in == null) { + throw new IOException("Missing classpath resource: " + resource); + } + IOUtils.copy(in, output); + } + output.closeEntry(); + } + } + + private void downloadDoc(HttpServletRequest request, HttpServletResponse response) throws IOException { + String file = request.getParameter("file"); + + if (!isValidDocFile(file)) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST); + return; + } + writeClasspathResource(response, "/doc/" + file, "application/octet-stream", file); + } + + boolean isEnabled(HttpServletRequest request, String name) { + String value = request.getParameter(name); + + return "true".equalsIgnoreCase(value) || "1".equals(value) || "yes".equalsIgnoreCase(value); + } + + boolean isValidDocFile(String file) { + if (file == null || file.length() == 0 || file.contains("/") || file.contains("\\") || file.contains("..")) { + return false; + } + return file.endsWith(".pdf"); + } + + String serverMappingJson() { + return JSON.toJSONString(m_serverMapping); + } + + private void writeChromeSource(HttpServletResponse response) throws IOException { + response.setContentType("application/x-zip-compressed"); + response.addHeader("Content-Disposition", "attachment;filename=cat.zip"); + + try (ZipOutputStream output = new ZipOutputStream(response.getOutputStream())) { + addResourceFiles(output, "/chrome/cat", "manifest.json", "cat.png", "cat.js"); + } + } + + private void writeClasspathResource(HttpServletResponse response, String resource, String contentType, String fileName) + throws IOException { + try (InputStream in = getClass().getResourceAsStream(resource)) { + if (in == null) { + response.sendError(HttpServletResponse.SC_NOT_FOUND); + return; + } + + response.setContentType(contentType); + response.addHeader("Content-Disposition", "attachment;filename=" + fileName); + IOUtils.copy(in, response.getOutputStream()); + } + } + + private void writeServerMapping(HttpServletResponse response) throws IOException { + byte[] content = serverMappingJson().getBytes(StandardCharsets.UTF_8); + + response.setContentType("application/json; charset=utf-8"); + response.setContentLength(content.length); + response.getOutputStream().write(content); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcRouterController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcRouterController.java new file mode 100644 index 0000000000..9d326003c8 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcRouterController.java @@ -0,0 +1,148 @@ +package com.dianping.cat.home.spring.web; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.annotation.Resource; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.alibaba.fastjson2.JSON; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +import com.dianping.cat.Cat; +import com.dianping.cat.config.sample.SampleConfigManager; +import com.dianping.cat.config.server.ServerFilterConfigManager; +import com.dianping.cat.home.router.entity.Domain; +import com.dianping.cat.home.router.entity.RouterConfig; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.system.page.router.config.RouterConfigManager; +import com.dianping.cat.system.page.router.service.CachedRouterConfigService; + +@Controller +public class SpringMvcRouterController { + private static final Logger LOGGER = LoggerFactory.getLogger(SpringMvcRouterController.class); + + @Resource + private CachedRouterConfigService m_cachedReportService; + + @Resource + private RouterConfigManager m_configManager; + + @Resource + private SampleConfigManager m_sampleConfigManager; + + @Resource + private ServerFilterConfigManager m_filterManager; + + @GetMapping("/s/router") + public void router(HttpServletRequest request, HttpServletResponse response) throws IOException { + String action = action(request); + + response.setCharacterEncoding("utf-8"); + + if ("build".equals(action)) { + response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); + return; + } + + RouterConfig report = m_cachedReportService.queryLastRouterConfig(); + String domain = request.getParameter("domain"); + String ip = request.getParameter("ip"); + + if ("json".equals(action)) { + writeText(response, JSON.toJSONString(buildKvs(report, domain, ip))); + } else if ("model".equals(action)) { + writeText(response, report == null ? "" : report.toString()); + } else if ("view".equals(action)) { + writeText(response, "spring-mvc-migration"); + } else { + writeText(response, buildRouterInfo(ip, domain, report)); + } + } + + String action(HttpServletRequest request) { + String action = request.getParameter("op"); + + if (action == null || action.length() == 0) { + return "api"; + } + return action; + } + + Map buildKvs(RouterConfig report, String domain, String ip) { + Map kvs = new HashMap(); + + kvs.put("block", String.valueOf(m_configManager.shouldBlock(ip))); + kvs.put("routers", buildRouterInfo(ip, domain, report)); + kvs.put("sample", String.valueOf(buildSampleInfo(domain))); + kvs.put("startTransactionTypes", m_filterManager.getAtomicStartTypes()); + kvs.put("matchTransactionTypes", m_filterManager.getAtomicMatchTypes()); + + return kvs; + } + + double buildSampleInfo(String domain) { + double defaultValue = 1.0; + com.dianping.cat.sample.entity.Domain domainConfig = m_sampleConfigManager.getConfig().findDomain(domain); + + if (domainConfig != null) { + defaultValue = domainConfig.getSample(); + } + return defaultValue; + } + + String buildServerStr(List servers) { + StringBuilder sb = new StringBuilder(); + + for (Server server : servers) { + sb.append(server.getId()).append(":").append(server.getPort()).append(";"); + } + return sb.toString(); + } + + private String buildRouterInfo(String ip, String domain, RouterConfig config) { + String group = m_configManager.queryServerGroupByIp(ip); + Domain domainConfig = m_configManager.getRouterConfig().findDomain(domain); + List servers = new ArrayList(); + + if (domainConfigNotExist(group, domainConfig)) { + if (config != null) { + Domain d = config.findDomain(domain); + + if (d != null && d.findGroup(group) != null) { + servers = d.findGroup(group).getServers(); + + if (servers.isEmpty()) { + LOGGER.warn("Router report has empty servers for domain={}, group={}, ip={}.", domain, group, ip); + Cat.logError(new RuntimeException("Error when build router config, domain: " + domain)); + } + } + } + + if (servers.isEmpty()) { + servers = m_configManager.queryServersByDomain(group, domain); + } + } else { + servers = domainConfig.findGroup(group).getServers(); + } + return buildServerStr(servers); + } + + private boolean domainConfigNotExist(String group, Domain domainConfig) { + return domainConfig == null || domainConfig.findGroup(group) == null + || domainConfig.findGroup(group).getServers().isEmpty(); + } + + private void writeText(HttpServletResponse response, String content) throws IOException { + response.setContentType("text/plain;charset=utf-8"); + response.getWriter().write(content == null ? "" : content); + } +} diff --git a/cat-home/src/main/webapp/jsp/spring/system/plugin/plugin.jsp b/cat-home/src/main/webapp/jsp/spring/system/plugin/plugin.jsp new file mode 100644 index 0000000000..3562c52664 --- /dev/null +++ b/cat-home/src/main/webapp/jsp/spring/system/plugin/plugin.jsp @@ -0,0 +1,51 @@ +<%@ page session="false" language="java" pageEncoding="UTF-8" %> +<%@ page contentType="text/html; charset=utf-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + CAT Plugin + + + + + +
+ Runtime: +
+ + + + + + + + + + + +
Path
Legacy Path
+

+ Chrome extension + Source zip + Server mapping + Legacy chrome + Home +

+ + diff --git a/cat-home/src/test/java/com/dianping/cat/home/spring/SpringMvcMigrationConfigurationTest.java b/cat-home/src/test/java/com/dianping/cat/home/spring/SpringMvcMigrationConfigurationTest.java index 54a55f3d66..45d811b46d 100644 --- a/cat-home/src/test/java/com/dianping/cat/home/spring/SpringMvcMigrationConfigurationTest.java +++ b/cat-home/src/test/java/com/dianping/cat/home/spring/SpringMvcMigrationConfigurationTest.java @@ -7,7 +7,13 @@ import com.dianping.cat.home.spring.web.SpringMvcHealthController; import com.dianping.cat.home.spring.web.SpringMvcHomeController; import com.dianping.cat.home.spring.web.SpringMvcLoginController; +import com.dianping.cat.home.spring.web.SpringMvcPluginController; +import com.dianping.cat.home.spring.web.SpringMvcRouterController; import com.dianping.cat.system.page.login.service.SigninService; +import com.dianping.cat.system.page.router.config.RouterConfigManager; +import com.dianping.cat.system.page.router.service.CachedRouterConfigService; +import com.dianping.cat.config.sample.SampleConfigManager; +import com.dianping.cat.config.server.ServerFilterConfigManager; public class SpringMvcMigrationConfigurationTest { @Test @@ -17,6 +23,8 @@ public void shouldRegisterSpringMvcMigrationController() { Assert.assertNotNull(context.getBean(SpringMvcHealthController.class)); Assert.assertNotNull(context.getBean(SpringMvcHomeController.class)); Assert.assertNotNull(context.getBean(SpringMvcLoginController.class)); + Assert.assertNotNull(context.getBean(SpringMvcPluginController.class)); + Assert.assertNotNull(context.getBean(SpringMvcRouterController.class)); } } @@ -33,5 +41,25 @@ static class TestConfiguration { public SigninService signinService() { return new SigninService(); } + + @org.springframework.context.annotation.Bean + public CachedRouterConfigService cachedRouterConfigService() { + return new CachedRouterConfigService(); + } + + @org.springframework.context.annotation.Bean + public RouterConfigManager routerConfigManager() { + return new RouterConfigManager(); + } + + @org.springframework.context.annotation.Bean + public SampleConfigManager sampleConfigManager() { + return new SampleConfigManager(); + } + + @org.springframework.context.annotation.Bean + public ServerFilterConfigManager serverFilterConfigManager() { + return new ServerFilterConfigManager(); + } } } diff --git a/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcPluginControllerTest.java b/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcPluginControllerTest.java new file mode 100644 index 0000000000..3007dfb149 --- /dev/null +++ b/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcPluginControllerTest.java @@ -0,0 +1,64 @@ +package com.dianping.cat.home.spring.web; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.junit.Assert; +import org.junit.Test; + +public class SpringMvcPluginControllerTest { + @Test + public void shouldBuildPluginModelWithLegacyDownloadLinks() { + SpringMvcPluginController controller = new SpringMvcPluginController(); + Map model = controller.pluginModel(request("/cat")); + + Assert.assertEquals("spring-mvc-migration", model.get("runtime")); + Assert.assertEquals("/cat/s/plugin", model.get("legacyPluginUrl")); + Assert.assertEquals("/cat/mvc/s/plugin/chrome", model.get("chromeExtensionUrl")); + Assert.assertEquals("/cat/mvc/s/plugin/chrome?source=true", model.get("chromeSourceUrl")); + Assert.assertEquals("/cat/mvc/s/plugin/chrome?mapping=true", model.get("chromeMappingUrl")); + Assert.assertEquals("/cat/s/plugin/chrome", model.get("legacyChromeExtensionUrl")); + Assert.assertEquals("/cat/mvc/r/home", model.get("homeUrl")); + } + + @Test + public void shouldValidateDocFileName() { + SpringMvcPluginController controller = new SpringMvcPluginController(); + + Assert.assertTrue(controller.isValidDocFile("basemonitor-android.pdf")); + Assert.assertFalse(controller.isValidDocFile("../secret.pdf")); + Assert.assertFalse(controller.isValidDocFile("dir/secret.pdf")); + Assert.assertFalse(controller.isValidDocFile("secret.txt")); + Assert.assertFalse(controller.isValidDocFile(null)); + } + + @Test + public void shouldExposeServerMappingJson() { + SpringMvcPluginController controller = new SpringMvcPluginController(); + String json = controller.serverMappingJson(); + + Assert.assertTrue(json.contains("10.1.6.37:8080")); + Assert.assertTrue(json.contains("cat.dianpingoa.com")); + Assert.assertTrue(json.contains("192.168.7.70:8080")); + } + + private HttpServletRequest request(String contextPath) { + return (HttpServletRequest) Proxy.newProxyInstance(getClass().getClassLoader(), + new Class[] { HttpServletRequest.class }, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) { + if ("getContextPath".equals(method.getName())) { + return contextPath; + } + if ("toString".equals(method.getName())) { + return "SpringMvcPluginControllerTestRequest"; + } + return null; + } + }); + } +} diff --git a/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcRouterControllerTest.java b/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcRouterControllerTest.java new file mode 100644 index 0000000000..a4493d2d25 --- /dev/null +++ b/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcRouterControllerTest.java @@ -0,0 +1,76 @@ +package com.dianping.cat.home.spring.web; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Collections; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.junit.Assert; +import org.junit.Test; + +import com.dianping.cat.config.sample.SampleConfigManager; +import com.dianping.cat.config.server.ServerFilterConfigManager; +import com.dianping.cat.home.router.entity.Server; +import com.dianping.cat.system.page.router.config.RouterConfigManager; +import com.dianping.cat.system.page.router.service.CachedRouterConfigService; + +public class SpringMvcRouterControllerTest { + @Test + public void shouldDefaultToApiAction() { + SpringMvcRouterController controller = controller(); + + Assert.assertEquals("api", controller.action(request(Collections.emptyMap()))); + Assert.assertEquals("json", controller.action(request(Collections.singletonMap("op", "json")))); + } + + @Test + public void shouldBuildServerString() { + SpringMvcRouterController controller = controller(); + + Assert.assertEquals("10.1.1.1:2280;10.1.1.2:2280;", + controller.buildServerStr(Arrays.asList(new Server().setId("10.1.1.1").setPort(2280), + new Server().setId("10.1.1.2").setPort(2280)))); + } + + private SpringMvcRouterController controller() { + SpringMvcRouterController controller = new SpringMvcRouterController(); + + inject(controller, "m_cachedReportService", new CachedRouterConfigService()); + inject(controller, "m_configManager", new RouterConfigManager()); + inject(controller, "m_sampleConfigManager", new SampleConfigManager()); + inject(controller, "m_filterManager", new ServerFilterConfigManager()); + return controller; + } + + private void inject(Object target, String field, Object value) { + try { + Field declaredField = target.getClass().getDeclaredField(field); + + declaredField.setAccessible(true); + declaredField.set(target, value); + } catch (Exception e) { + throw new AssertionError(e); + } + } + + private HttpServletRequest request(Map parameters) { + return (HttpServletRequest) Proxy.newProxyInstance(getClass().getClassLoader(), + new Class[] { HttpServletRequest.class }, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) { + if ("getParameter".equals(method.getName())) { + return parameters.get(args[0]); + } + if ("toString".equals(method.getName())) { + return "SpringMvcRouterControllerTestRequest"; + } + return null; + } + }); + } +} diff --git a/pom.xml b/pom.xml index cfb04bba9f..61028a6568 100644 --- a/pom.xml +++ b/pom.xml @@ -123,6 +123,11 @@ jsp-api 2.1
+ + jakarta.annotation + jakarta.annotation-api + 3.0.0 + com.mysql mysql-connector-j From 06bde37c3fc899b2a05867b5ece7452ea5799aa3 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 20:01:28 +0800 Subject: [PATCH 144/231] =?UTF-8?q?=E6=9A=82=E5=81=9C=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=89=8D=E8=A1=A5=E5=85=85=20Spring=20MVC=20?= =?UTF-8?q?=E5=B9=B6=E8=A1=8C=E9=A1=B5=E9=9D=A2=E5=AE=9E=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/SpringMvcBusinessController.java | 179 ++++++++++++++++++ .../spring/web/SpringMvcMigrationServlet.java | 8 + .../web/SpringMvcProjectController.java | 61 ++++++ .../web/SpringMvcWebResourceInitializer.java | 42 ++++ .../SpringMvcMigrationConfigurationTest.java | 22 +++ .../web/SpringMvcBusinessControllerTest.java | 169 +++++++++++++++++ .../web/SpringMvcProjectControllerTest.java | 69 +++++++ 7 files changed, 550 insertions(+) create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcBusinessController.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcProjectController.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcWebResourceInitializer.java create mode 100644 cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcBusinessControllerTest.java create mode 100644 cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcProjectControllerTest.java diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcBusinessController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcBusinessController.java new file mode 100644 index 0000000000..9cbe17f0f2 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcBusinessController.java @@ -0,0 +1,179 @@ +package com.dianping.cat.home.spring.web; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.dianping.cat.Constants; +import com.dianping.cat.config.business.BusinessConfigManager; +import com.dianping.cat.configuration.business.entity.BusinessItemConfig; +import com.dianping.cat.configuration.business.entity.BusinessReportConfig; +import com.dianping.cat.configuration.business.entity.CustomConfig; +import com.dianping.cat.service.ProjectService; +import com.dianping.cat.system.SystemPage; +import com.dianping.cat.system.page.business.Action; +import com.dianping.cat.system.page.business.Context; +import com.dianping.cat.system.page.business.Model; +import com.dianping.cat.system.page.business.Payload; +import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; +import jakarta.annotation.Resource; +import org.unidal.web.lifecycle.ActionResolver; +import org.unidal.web.lifecycle.DefaultUrlMapping; +import org.unidal.web.lifecycle.UrlMapping; +import org.unidal.web.mvc.lifecycle.RequestContext; +import org.unidal.web.mvc.payload.ParameterProvider; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class SpringMvcBusinessController { + @Resource + private ProjectService m_projectService; + + @Resource + private BusinessConfigManager m_configManager; + + @Resource + private BusinessTagConfigManager m_tagConfigManager; + + @GetMapping("/s/business") + public void business(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String action = action(request); + + if (!"list".equals(action)) { + response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); + return; + } + + Context context = businessContext(request, response); + Model model = businessModel(context); + + SpringMvcWebResourceInitializer.initialize(request); + request.setAttribute("ctx", context); + request.setAttribute("payload", context.getPayload()); + request.setAttribute("model", model); + + RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/system/business/list.jsp"); + + dispatcher.forward(request, response); + } + + String action(HttpServletRequest request) { + String action = request.getParameter("op"); + + if (action == null || action.length() == 0) { + return "list"; + } + return action; + } + + Context businessContext(HttpServletRequest request, HttpServletResponse response) { + Context context = new Context(); + Payload payload = new Payload(); + RequestContext requestContext = new RequestContext(); + DefaultUrlMapping urlMapping = new DefaultUrlMapping(); + + urlMapping.setContextPath(request.getContextPath()); + urlMapping.setServletPath("/mvc/s"); + urlMapping.setModule("s"); + urlMapping.setAction("business"); + urlMapping.setPathInfo("/business"); + urlMapping.setQueryString(request.getQueryString()); + requestContext.setActionResolver(new SpringMvcActionResolver()); + requestContext.setUrlMapping(urlMapping); + context.initialize(request, response); + context.setRequestContext(requestContext); + context.setInboundPage("business"); + context.setOutboundPage("business"); + context.setServletContext(request.getSession().getServletContext()); + payload.setPage(SystemPage.BUSINESS.getName()); + payload.setAction("list"); + payload.setDomain(domain(request)); + context.setPayload(payload); + return context; + } + + Model businessModel(Context context) { + Payload payload = context.getPayload(); + Model model = new Model(context); + String domain = payload.getDomain(); + BusinessReportConfig config = m_configManager.queryConfigByDomain(domain); + + model.setPage(SystemPage.BUSINESS); + model.setAction(Action.LIST); + model.setDomains(m_projectService.findAllDomains()); + model.setConfigs(businessItemConfigs(config)); + model.setCustomConfigs(customConfigs(config)); + model.setTags(m_tagConfigManager.findTagByDomain(domain)); + return model; + } + + List businessItemConfigs(BusinessReportConfig config) { + List configs = new ArrayList(config.getBusinessItemConfigs().values()); + + Collections.sort(configs, new Comparator() { + @Override + public int compare(BusinessItemConfig m1, BusinessItemConfig m2) { + return (int) ((m1.getViewOrder() - m2.getViewOrder()) * 100); + } + }); + return configs; + } + + List customConfigs(BusinessReportConfig config) { + List configs = new ArrayList(config.getCustomConfigs().values()); + + Collections.sort(configs, new Comparator() { + @Override + public int compare(CustomConfig m1, CustomConfig m2) { + return (int) ((m1.getViewOrder() - m2.getViewOrder()) * 100); + } + }); + return configs; + } + + void setConfigManager(BusinessConfigManager configManager) { + m_configManager = configManager; + } + + void setProjectService(ProjectService projectService) { + m_projectService = projectService; + } + + void setTagConfigManager(BusinessTagConfigManager tagConfigManager) { + m_tagConfigManager = tagConfigManager; + } + + private String domain(HttpServletRequest request) { + String domain = request.getParameter("domain"); + + if (domain == null || domain.length() == 0) { + return Constants.CAT; + } + return domain; + } + + private static class SpringMvcActionResolver implements ActionResolver { + @Override + public String buildUrl(ParameterProvider provider, UrlMapping mapping) { + String contextPath = mapping.getContextPath(); + String servletPath = mapping.getServletPath(); + String action = mapping.getAction(); + + return contextPath + servletPath + "/" + action; + } + + @Override + public UrlMapping parseUrl(ParameterProvider provider) { + throw new UnsupportedOperationException(); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java index 1ae0dc9a41..2a7f861fb3 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java @@ -22,12 +22,16 @@ public class SpringMvcMigrationServlet extends HttpServlet { private SpringMvcHealthController m_healthController; + private SpringMvcBusinessController m_businessController; + private SpringMvcHomeController m_homeController; private SpringMvcLoginController m_loginController; private SpringMvcPluginController m_pluginController; + private SpringMvcProjectController m_projectController; + private SpringMvcRouterController m_routerController; private Map m_routes = Collections.emptyMap(); @@ -42,10 +46,12 @@ public void init(ServletConfig config) throws ServletException { if (context == null) { throw new ServletException("CAT home Spring context is not initialized."); } + m_businessController = context.getBean(SpringMvcBusinessController.class); m_healthController = context.getBean(SpringMvcHealthController.class); m_homeController = context.getBean(SpringMvcHomeController.class); m_loginController = context.getBean(SpringMvcLoginController.class); m_pluginController = context.getBean(SpringMvcPluginController.class); + m_projectController = context.getBean(SpringMvcProjectController.class); m_routerController = context.getBean(SpringMvcRouterController.class); m_routes = buildRoutes(); } @@ -67,8 +73,10 @@ private Map buildRoutes() { register(routes, "GET", "/health", (request, response) -> writeJson(response, m_healthController.health())); register(routes, "GET", "/r/home", m_homeController::home); register(routes, "GET", "/s/login", m_loginController::login); + register(routes, "GET", "/s/business", m_businessController::business); register(routes, "GET", "/s/plugin", m_pluginController::plugin); register(routes, "GET", "/s/plugin/chrome", m_pluginController::chrome); + register(routes, "GET", "/s/project", m_projectController::project); register(routes, "GET", "/s/router", m_routerController::router); register(routes, "POST", "/s/login", m_loginController::submit); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcProjectController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcProjectController.java new file mode 100644 index 0000000000..17213433ce --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcProjectController.java @@ -0,0 +1,61 @@ +package com.dianping.cat.home.spring.web; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.dianping.cat.helper.JsonBuilder; +import com.dianping.cat.service.ProjectService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class SpringMvcProjectController { + @Resource + private ProjectService m_projectService; + + @GetMapping("/s/project") + public void project(HttpServletRequest request, HttpServletResponse response) throws IOException { + String action = action(request); + + if ("projectUpdate".equals(action)) { + response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); + return; + } + + writeJson(response, domainsJson()); + } + + String action(HttpServletRequest request) { + String action = request.getParameter("op"); + + if (action == null || action.length() == 0) { + return "domains"; + } + return action; + } + + String domainsJson() { + JsonBuilder builder = new JsonBuilder(); + Set domains = m_projectService.findAllDomains(); + Map jsons = new HashMap(); + + jsons.put("domains", domains); + return builder.toJson(jsons); + } + + void setProjectService(ProjectService projectService) { + m_projectService = projectService; + } + + private void writeJson(HttpServletResponse response, String content) throws IOException { + response.setCharacterEncoding("utf-8"); + response.setContentType("application/json;charset=utf-8"); + response.getWriter().write(content == null ? "" : content); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcWebResourceInitializer.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcWebResourceInitializer.java new file mode 100644 index 0000000000..93c92d0f01 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcWebResourceInitializer.java @@ -0,0 +1,42 @@ +package com.dianping.cat.home.spring.web; + +import java.io.File; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; + +import org.unidal.webres.resource.runtime.ResourceConfigurator; +import org.unidal.webres.resource.runtime.ResourceInitializer; +import org.unidal.webres.resource.runtime.ResourceRuntime; +import org.unidal.webres.resource.runtime.ResourceRuntimeContext; +import org.unidal.webres.resource.spi.IResourceRegistry; +import org.unidal.webres.tag.resource.ResourceTagConfigurator; +import org.unidal.webres.taglib.basic.ResourceTagLibConfigurator; + +public final class SpringMvcWebResourceInitializer { + private SpringMvcWebResourceInitializer() { + } + + public static void initialize(HttpServletRequest request) { + String contextPath = request.getContextPath(); + + synchronized (ResourceRuntime.INSTANCE) { + if (!ResourceRuntime.INSTANCE.hasConfig(contextPath)) { + ServletContext servletContext = request.getSession().getServletContext(); + File warRoot = new File(servletContext.getRealPath("/")); + + ResourceRuntime.INSTANCE.removeConfig(contextPath); + ResourceInitializer.initialize(contextPath, warRoot); + + IResourceRegistry registry = ResourceRuntime.INSTANCE.getConfig(contextPath).getRegistry(); + + new ResourceConfigurator().configure(registry); + new ResourceTagConfigurator().configure(registry); + new ResourceTagLibConfigurator().configure(registry); + registry.lock(); + } + + ResourceRuntimeContext.setup(contextPath); + } + } +} diff --git a/cat-home/src/test/java/com/dianping/cat/home/spring/SpringMvcMigrationConfigurationTest.java b/cat-home/src/test/java/com/dianping/cat/home/spring/SpringMvcMigrationConfigurationTest.java index 45d811b46d..f4e908bfaf 100644 --- a/cat-home/src/test/java/com/dianping/cat/home/spring/SpringMvcMigrationConfigurationTest.java +++ b/cat-home/src/test/java/com/dianping/cat/home/spring/SpringMvcMigrationConfigurationTest.java @@ -4,11 +4,16 @@ import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import com.dianping.cat.config.business.BusinessConfigManager; import com.dianping.cat.home.spring.web.SpringMvcHealthController; +import com.dianping.cat.home.spring.web.SpringMvcBusinessController; import com.dianping.cat.home.spring.web.SpringMvcHomeController; import com.dianping.cat.home.spring.web.SpringMvcLoginController; import com.dianping.cat.home.spring.web.SpringMvcPluginController; +import com.dianping.cat.home.spring.web.SpringMvcProjectController; import com.dianping.cat.home.spring.web.SpringMvcRouterController; +import com.dianping.cat.service.ProjectService; +import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; import com.dianping.cat.system.page.login.service.SigninService; import com.dianping.cat.system.page.router.config.RouterConfigManager; import com.dianping.cat.system.page.router.service.CachedRouterConfigService; @@ -20,10 +25,12 @@ public class SpringMvcMigrationConfigurationTest { public void shouldRegisterSpringMvcMigrationController() { try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( TestConfiguration.class, SpringMvcMigrationConfiguration.class)) { + Assert.assertNotNull(context.getBean(SpringMvcBusinessController.class)); Assert.assertNotNull(context.getBean(SpringMvcHealthController.class)); Assert.assertNotNull(context.getBean(SpringMvcHomeController.class)); Assert.assertNotNull(context.getBean(SpringMvcLoginController.class)); Assert.assertNotNull(context.getBean(SpringMvcPluginController.class)); + Assert.assertNotNull(context.getBean(SpringMvcProjectController.class)); Assert.assertNotNull(context.getBean(SpringMvcRouterController.class)); } } @@ -61,5 +68,20 @@ public SampleConfigManager sampleConfigManager() { public ServerFilterConfigManager serverFilterConfigManager() { return new ServerFilterConfigManager(); } + + @org.springframework.context.annotation.Bean + public ProjectService projectService() { + return new ProjectService(); + } + + @org.springframework.context.annotation.Bean + public BusinessConfigManager businessConfigManager() { + return new BusinessConfigManager(); + } + + @org.springframework.context.annotation.Bean + public BusinessTagConfigManager businessTagConfigManager() { + return new BusinessTagConfigManager(); + } } } diff --git a/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcBusinessControllerTest.java b/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcBusinessControllerTest.java new file mode 100644 index 0000000000..1087cca628 --- /dev/null +++ b/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcBusinessControllerTest.java @@ -0,0 +1,169 @@ +package com.dianping.cat.home.spring.web; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import javax.servlet.ServletContext; + +import org.junit.Assert; +import org.junit.Test; + +import com.dianping.cat.config.business.BusinessConfigManager; +import com.dianping.cat.configuration.business.entity.BusinessItemConfig; +import com.dianping.cat.configuration.business.entity.BusinessReportConfig; +import com.dianping.cat.configuration.business.entity.CustomConfig; +import com.dianping.cat.service.ProjectService; +import com.dianping.cat.system.page.business.Context; +import com.dianping.cat.system.page.business.Model; +import com.dianping.cat.system.page.business.config.BusinessTagConfigManager; + +public class SpringMvcBusinessControllerTest { + @Test + public void shouldDefaultToListAction() { + SpringMvcBusinessController controller = new SpringMvcBusinessController(); + + Assert.assertEquals("list", controller.action(request(null, null, "/cat"))); + Assert.assertEquals("delete", controller.action(request("delete", null, "/cat"))); + } + + @Test + public void shouldBuildReadonlyBusinessModel() { + SpringMvcBusinessController controller = new SpringMvcBusinessController(); + BusinessReportConfig config = new BusinessReportConfig(); + + config.setId("cat"); + config.addBusinessItemConfig(new BusinessItemConfig("slow").setTitle("Slow").setViewOrder(2)); + config.addBusinessItemConfig(new BusinessItemConfig("fast").setTitle("Fast").setViewOrder(1)); + config.addCustomConfig(new CustomConfig("custom").setTitle("Custom").setViewOrder(3)); + controller.setProjectService(new StubProjectService("cat", "mobile-api")); + controller.setConfigManager(new StubBusinessConfigManager(config)); + controller.setTagConfigManager(new StubBusinessTagConfigManager()); + + Context context = controller.businessContext(request("list", "cat", "/cat"), response()); + Model model = controller.businessModel(context); + + Assert.assertEquals("cat", context.getPayload().getDomain()); + Assert.assertEquals("list", context.getPayload().getAction().getName()); + Assert.assertEquals("/cat/mvc/s/business", model.getPageUri()); + Assert.assertEquals("fast", model.getConfigs().get(0).getId()); + Assert.assertEquals("custom", model.getCustomConfigs().get(0).getId()); + Assert.assertTrue(model.getDomains().contains("mobile-api")); + } + + private HttpServletRequest request(String action, String domain, String contextPath) { + return (HttpServletRequest) Proxy.newProxyInstance(getClass().getClassLoader(), + new Class[] { HttpServletRequest.class }, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) { + if ("getParameter".equals(method.getName())) { + if ("op".equals(args[0])) { + return action; + } + if ("domain".equals(args[0])) { + return domain; + } + } + if ("getContextPath".equals(method.getName())) { + return contextPath; + } + if ("getQueryString".equals(method.getName())) { + return "op=list&domain=" + domain; + } + if ("getSession".equals(method.getName())) { + return session(); + } + if ("toString".equals(method.getName())) { + return "SpringMvcBusinessControllerTestRequest"; + } + return null; + } + }); + } + + private HttpServletResponse response() { + return (HttpServletResponse) Proxy.newProxyInstance(getClass().getClassLoader(), + new Class[] { HttpServletResponse.class }, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) { + if ("toString".equals(method.getName())) { + return "SpringMvcBusinessControllerTestResponse"; + } + return null; + } + }); + } + + private HttpSession session() { + return (HttpSession) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] { HttpSession.class }, + new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) { + if ("getServletContext".equals(method.getName())) { + return servletContext(); + } + if ("toString".equals(method.getName())) { + return "SpringMvcBusinessControllerTestSession"; + } + return null; + } + }); + } + + private ServletContext servletContext() { + return (ServletContext) Proxy.newProxyInstance(getClass().getClassLoader(), + new Class[] { ServletContext.class }, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) { + if ("getRealPath".equals(method.getName())) { + return "D:/workspace/cat/cat-home/src/main/webapp"; + } + if ("toString".equals(method.getName())) { + return "SpringMvcBusinessControllerTestServletContext"; + } + return null; + } + }); + } + + private static class StubProjectService extends ProjectService { + private final Set m_domains; + + StubProjectService(String... domains) { + m_domains = new HashSet(Arrays.asList(domains)); + } + + @Override + public Set findAllDomains() { + return m_domains; + } + } + + private static class StubBusinessConfigManager extends BusinessConfigManager { + private final BusinessReportConfig m_config; + + StubBusinessConfigManager(BusinessReportConfig config) { + m_config = config; + } + + @Override + public BusinessReportConfig queryConfigByDomain(String domain) { + return m_config; + } + } + + private static class StubBusinessTagConfigManager extends BusinessTagConfigManager { + @Override + public Map> findTagByDomain(String domain) { + return Collections.emptyMap(); + } + } +} diff --git a/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcProjectControllerTest.java b/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcProjectControllerTest.java new file mode 100644 index 0000000000..43e444b175 --- /dev/null +++ b/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcProjectControllerTest.java @@ -0,0 +1,69 @@ +package com.dianping.cat.home.spring.web; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Arrays; +import java.util.concurrent.ConcurrentHashMap; + +import javax.servlet.http.HttpServletRequest; + +import org.junit.Assert; +import org.junit.Test; + +import com.dianping.cat.service.ProjectService; + +public class SpringMvcProjectControllerTest { + @Test + public void shouldDefaultToDomainsAction() { + SpringMvcProjectController controller = new SpringMvcProjectController(); + + Assert.assertEquals("domains", controller.action(request(null))); + Assert.assertEquals("projectUpdate", controller.action(request("projectUpdate"))); + } + + @Test + public void shouldBuildDomainsJsonLikeLegacyProjectPage() { + SpringMvcProjectController controller = new SpringMvcProjectController(); + ProjectService service = new StubProjectService("cat", "mobile-api"); + + controller.setProjectService(service); + + String json = controller.domainsJson(); + + Assert.assertTrue(json.startsWith("{\"domains\":")); + Assert.assertTrue(json.contains("\"cat\"")); + Assert.assertTrue(json.contains("\"mobile-api\"")); + } + + private HttpServletRequest request(String action) { + return (HttpServletRequest) Proxy.newProxyInstance(getClass().getClassLoader(), + new Class[] { HttpServletRequest.class }, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) { + if ("getParameter".equals(method.getName()) && "op".equals(args[0])) { + return action; + } + if ("toString".equals(method.getName())) { + return "SpringMvcProjectControllerTestRequest"; + } + return null; + } + }); + } + + private static class StubProjectService extends ProjectService { + private final ConcurrentHashMap m_domains = new ConcurrentHashMap(); + + StubProjectService(String... domains) { + for (String domain : Arrays.asList(domains)) { + m_domains.put(domain, domain); + } + } + + @Override + public java.util.Set findAllDomains() { + return m_domains.keySet(); + } + } +} From 94acc3f4938bd16eee1a5e01c36823566c40eb4a Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 20:56:59 +0800 Subject: [PATCH 145/231] =?UTF-8?q?MyBatis=20XML=20=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alert/dao/AlertMapper.java | 4 +- .../alert/dao/data/AlertDO.java | 2 +- .../repository/alert/AlertRepository.java | 4 +- .../alarm/rule/ServerAlarmRuleRepository.java | 4 +- .../define/rule/UserDefineRuleRepository.java | 4 +- .../alarm/rule/dao/ServerAlarmRuleMapper.java | 4 +- .../rule/dao/data/ServerAlarmRuleDO.java | 2 +- .../define/rule/dao/UserDefineRuleMapper.java | 4 +- .../rule/dao/data/UserDefineRuleDO.java | 2 +- .../resources/mybatis/mapper/AlertMapper.xml | 136 +++++++------- .../mybatis/mapper/ServerAlarmRuleMapper.xml | 130 ++++++------- .../mybatis/mapper/UserDefineRuleMapper.xml | 106 ++++++----- .../config/repository/ConfigRepository.java | 10 + .../config/dao/BusinessConfigMapper.java | 4 +- .../config/dao/data/BusinessConfigDO.java | 2 +- .../dao/BusinessReportMapper.java | 4 +- .../dao/data/BusinessReportDO.java | 2 +- .../content/dao/DailyReportContentMapper.java | 4 +- .../dao/data/DailyReportContentDO.java | 2 +- .../hostinfo/dao/HostinfoMapper.java | 4 +- .../hostinfo/dao/data/HostinfoDO.java | 2 +- .../dao/HourlyReportContentMapper.java | 4 +- .../dao/data/HourlyReportContentDO.java | 2 +- .../hourlyreport/dao/HourlyreportMapper.java | 4 +- .../hourlyreport/dao/data/HourlyreportDO.java | 2 +- .../dao/MonthlyReportContentMapper.java | 4 +- .../dao/data/MonthlyReportContentDO.java | 2 +- .../monthreport/dao/MonthreportMapper.java | 4 +- .../monthreport/dao/data/MonthreportDO.java | 2 +- .../operation/dao/OperationMapper.java | 4 +- .../operation/dao/data/OperationDO.java | 2 +- .../project/dao/ProjectMapper.java | 4 +- .../project/dao/data/ProjectDO.java | 2 +- .../config/BusinessConfigRepository.java | 4 +- .../content/DailyReportContentRepository.java | 4 +- .../hostinfo/HostinfoRepository.java | 14 +- .../HourlyReportContentRepository.java | 4 +- .../hourlyreport/HourlyReportRepository.java | 4 +- .../MonthlyReportContentRepository.java | 4 +- .../monthreport/MonthlyReportRepository.java | 4 +- .../repository/project/ProjectRepository.java | 4 +- .../repository/task/TaskRepository.java | 4 +- .../WeeklyReportContentRepository.java | 4 +- .../weeklyreport/WeeklyReportRepository.java | 4 +- .../{generated => }/task/dao/TaskMapper.java | 4 +- .../{generated => }/task/dao/data/TaskDO.java | 2 +- .../dao/WeeklyReportContentMapper.java | 4 +- .../dao/data/WeeklyReportContentDO.java | 2 +- .../weeklyreport/dao/WeeklyreportMapper.java | 4 +- .../weeklyreport/dao/data/WeeklyreportDO.java | 2 +- .../dianping/cat/service/HostinfoService.java | 15 +- .../mybatis/mapper/BusinessConfigMapper.xml | 112 +++++------ .../mybatis/mapper/BusinessReportMapper.xml | 126 +++++++------ .../resources/mybatis/mapper/ConfigMapper.xml | 119 ++++++------ .../mapper/DailyReportContentMapper.xml | 111 +++++------ .../mybatis/mapper/DailyReportMapper.xml | 146 +++++++-------- .../mybatis/mapper/HostinfoMapper.xml | 112 +++++------ .../mapper/HourlyReportContentMapper.xml | 111 +++++------ .../mybatis/mapper/HourlyreportMapper.xml | 138 +++++++------- .../mapper/MonthlyReportContentMapper.xml | 111 +++++------ .../mybatis/mapper/MonthreportMapper.xml | 118 ++++++------ .../mybatis/mapper/OperationMapper.xml | 120 ++++++------ .../mybatis/mapper/ProjectMapper.xml | 148 +++++++-------- .../resources/mybatis/mapper/TaskMapper.xml | 174 +++++++++--------- .../mapper/WeeklyReportContentMapper.xml | 111 +++++------ .../mybatis/mapper/WeeklyreportMapper.xml | 118 ++++++------ .../alert/summary/dao/AlertSummaryMapper.java | 4 +- .../summary/dao/data/AlertSummaryDO.java | 2 +- .../alteration/dao/AlterationMapper.java | 4 +- .../alteration/dao/data/AlterationDO.java | 2 +- .../baseline/dao/BaselineMapper.java | 4 +- .../baseline/dao/data/BaselineDO.java | 2 +- .../dao/ConfigModificationMapper.java | 4 +- .../dao/data/ConfigModificationDO.java | 2 +- .../metric/graph/dao/MetricGraphMapper.java | 4 +- .../metric/graph/dao/data/MetricGraphDO.java | 2 +- .../metric/screen/dao/MetricScreenMapper.java | 4 +- .../screen/dao/data/MetricScreenDO.java | 2 +- .../overload/dao/OverloadMapper.java | 4 +- .../overload/dao/data/OverloadDO.java | 2 +- .../alert/summary/AlertSummaryRepository.java | 4 +- .../alteration/AlterationRepository.java | 4 +- .../baseline/BaselineRepository.java | 4 +- .../ConfigModificationRepository.java | 4 +- .../metric/graph/MetricGraphRepository.java | 4 +- .../metric/screen/MetricScreenRepository.java | 4 +- .../overload/OverloadRepository.java | 4 +- .../TopologyGraphRepository.java | 4 +- .../dao/TopologyGraphMapper.java | 4 +- .../dao/data/TopologyGraphDO.java | 2 +- .../spring/CatHomeSpringConfiguration.java | 44 ++--- .../spring/CatHomeSpringStartupVerifier.java | 44 ++--- .../mybatis/mapper/AlertSummaryMapper.xml | 108 +++++------ .../mybatis/mapper/AlterationMapper.xml | 166 +++++++++-------- .../mybatis/mapper/BaselineMapper.xml | 122 ++++++------ .../mapper/ConfigModificationMapper.xml | 120 ++++++------ .../mybatis/mapper/MetricGraphMapper.xml | 118 ++++++------ .../mybatis/mapper/MetricScreenMapper.xml | 158 ++++++++-------- .../mybatis/mapper/OverloadMapper.xml | 122 ++++++------ .../mybatis/mapper/TopologyGraphMapper.xml | 122 ++++++------ 100 files changed, 1879 insertions(+), 1759 deletions(-) rename cat-alarm/src/main/java/com/dianping/cat/core/mybatis/{generated => }/alert/dao/AlertMapper.java (82%) rename cat-alarm/src/main/java/com/dianping/cat/core/mybatis/{generated => }/alert/dao/data/AlertDO.java (85%) rename cat-alarm/src/main/java/com/dianping/cat/core/mybatis/{generated => }/server/alarm/rule/dao/ServerAlarmRuleMapper.java (72%) rename cat-alarm/src/main/java/com/dianping/cat/core/mybatis/{generated => }/server/alarm/rule/dao/data/ServerAlarmRuleDO.java (82%) rename cat-alarm/src/main/java/com/dianping/cat/core/mybatis/{generated => }/user/define/rule/dao/UserDefineRuleMapper.java (72%) rename cat-alarm/src/main/java/com/dianping/cat/core/mybatis/{generated => }/user/define/rule/dao/data/UserDefineRuleDO.java (73%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/business/config/dao/BusinessConfigMapper.java (78%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/business/config/dao/data/BusinessConfigDO.java (75%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/businessreport/dao/BusinessReportMapper.java (69%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/businessreport/dao/data/BusinessReportDO.java (79%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/daily/report/content/dao/DailyReportContentMapper.java (73%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/daily/report/content/dao/data/DailyReportContentDO.java (81%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/hostinfo/dao/HostinfoMapper.java (76%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/hostinfo/dao/data/HostinfoDO.java (79%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/hourly/report/content/dao/HourlyReportContentMapper.java (73%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/hourly/report/content/dao/data/HourlyReportContentDO.java (79%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/hourlyreport/dao/HourlyreportMapper.java (77%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/hourlyreport/dao/data/HourlyreportDO.java (79%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/monthly/report/content/dao/MonthlyReportContentMapper.java (73%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/monthly/report/content/dao/data/MonthlyReportContentDO.java (79%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/monthreport/dao/MonthreportMapper.java (77%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/monthreport/dao/data/MonthreportDO.java (79%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/operation/dao/OperationMapper.java (69%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/operation/dao/data/OperationDO.java (78%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/project/dao/ProjectMapper.java (79%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/project/dao/data/ProjectDO.java (85%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/task/dao/TaskMapper.java (83%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/task/dao/data/TaskDO.java (89%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/weekly/report/content/dao/WeeklyReportContentMapper.java (73%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/weekly/report/content/dao/data/WeeklyReportContentDO.java (79%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/weeklyreport/dao/WeeklyreportMapper.java (77%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{generated => }/weeklyreport/dao/data/WeeklyreportDO.java (79%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/alert/summary/dao/AlertSummaryMapper.java (69%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/alert/summary/dao/data/AlertSummaryDO.java (76%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/alteration/dao/AlterationMapper.java (81%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/alteration/dao/data/AlterationDO.java (87%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/baseline/dao/BaselineMapper.java (74%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/baseline/dao/data/BaselineDO.java (81%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/config/modification/dao/ConfigModificationMapper.java (68%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/config/modification/dao/data/ConfigModificationDO.java (79%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/metric/graph/dao/MetricGraphMapper.java (78%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/metric/graph/dao/data/MetricGraphDO.java (80%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/metric/screen/dao/MetricScreenMapper.java (83%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/metric/screen/dao/data/MetricScreenDO.java (82%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/overload/dao/OverloadMapper.java (79%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/overload/dao/data/OverloadDO.java (85%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/topologygraph/dao/TopologyGraphMapper.java (73%) rename cat-home/src/main/java/com/dianping/cat/core/mybatis/{generated => }/topologygraph/dao/data/TopologyGraphDO.java (77%) diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/alert/dao/AlertMapper.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/AlertMapper.java similarity index 82% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/alert/dao/AlertMapper.java rename to cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/AlertMapper.java index 91a079e216..7180c08578 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/alert/dao/AlertMapper.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/AlertMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.alert.dao; +package com.dianping.cat.core.mybatis.alert.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.alert.dao.data.AlertDO; +import com.dianping.cat.core.mybatis.alert.dao.data.AlertDO; public interface AlertMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/alert/dao/data/AlertDO.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/data/AlertDO.java similarity index 85% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/alert/dao/data/AlertDO.java rename to cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/data/AlertDO.java index e8e45f689b..da05c8384d 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/alert/dao/data/AlertDO.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/data/AlertDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.alert.dao.data; +package com.dianping.cat.core.mybatis.alert.dao.data; import java.util.Date; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java index a8bc9ba7cc..6c7dfdbaee 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java @@ -1,8 +1,8 @@ package com.dianping.cat.core.mybatis.repository.alert; import com.dianping.cat.alarm.Alert; -import com.dianping.cat.core.mybatis.generated.alert.dao.AlertMapper; -import com.dianping.cat.core.mybatis.generated.alert.dao.data.AlertDO; +import com.dianping.cat.core.mybatis.alert.dao.AlertMapper; +import com.dianping.cat.core.mybatis.alert.dao.data.AlertDO; import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import java.util.List; import java.util.stream.Collectors; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java index e77df0d59e..606ffb02c3 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java @@ -1,8 +1,8 @@ package com.dianping.cat.core.mybatis.repository.server.alarm.rule; import com.dianping.cat.alarm.ServerAlarmRule; -import com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao.ServerAlarmRuleMapper; -import com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao.data.ServerAlarmRuleDO; +import com.dianping.cat.core.mybatis.server.alarm.rule.dao.ServerAlarmRuleMapper; +import com.dianping.cat.core.mybatis.server.alarm.rule.dao.data.ServerAlarmRuleDO; import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import java.util.List; import java.util.stream.Collectors; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java index f9f0e26850..2fda36b6da 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java @@ -1,8 +1,8 @@ package com.dianping.cat.core.mybatis.repository.user.define.rule; import com.dianping.cat.alarm.UserDefineRule; -import com.dianping.cat.core.mybatis.generated.user.define.rule.dao.UserDefineRuleMapper; -import com.dianping.cat.core.mybatis.generated.user.define.rule.dao.data.UserDefineRuleDO; +import com.dianping.cat.core.mybatis.user.define.rule.dao.UserDefineRuleMapper; +import com.dianping.cat.core.mybatis.user.define.rule.dao.data.UserDefineRuleDO; import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/server/alarm/rule/dao/ServerAlarmRuleMapper.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/ServerAlarmRuleMapper.java similarity index 72% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/server/alarm/rule/dao/ServerAlarmRuleMapper.java rename to cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/ServerAlarmRuleMapper.java index 4881bdafba..a107c436db 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/server/alarm/rule/dao/ServerAlarmRuleMapper.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/ServerAlarmRuleMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao; +package com.dianping.cat.core.mybatis.server.alarm.rule.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao.data.ServerAlarmRuleDO; +import com.dianping.cat.core.mybatis.server.alarm.rule.dao.data.ServerAlarmRuleDO; public interface ServerAlarmRuleMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/server/alarm/rule/dao/data/ServerAlarmRuleDO.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/data/ServerAlarmRuleDO.java similarity index 82% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/server/alarm/rule/dao/data/ServerAlarmRuleDO.java rename to cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/data/ServerAlarmRuleDO.java index f1e2317b50..4987817886 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/server/alarm/rule/dao/data/ServerAlarmRuleDO.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/data/ServerAlarmRuleDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao.data; +package com.dianping.cat.core.mybatis.server.alarm.rule.dao.data; import java.util.Date; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/user/define/rule/dao/UserDefineRuleMapper.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/UserDefineRuleMapper.java similarity index 72% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/user/define/rule/dao/UserDefineRuleMapper.java rename to cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/UserDefineRuleMapper.java index e915bce9a4..7d16e0d17e 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/user/define/rule/dao/UserDefineRuleMapper.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/UserDefineRuleMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.user.define.rule.dao; +package com.dianping.cat.core.mybatis.user.define.rule.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.user.define.rule.dao.data.UserDefineRuleDO; +import com.dianping.cat.core.mybatis.user.define.rule.dao.data.UserDefineRuleDO; public interface UserDefineRuleMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/user/define/rule/dao/data/UserDefineRuleDO.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/data/UserDefineRuleDO.java similarity index 73% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/user/define/rule/dao/data/UserDefineRuleDO.java rename to cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/data/UserDefineRuleDO.java index db049913fc..5e278ae26b 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/generated/user/define/rule/dao/data/UserDefineRuleDO.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/data/UserDefineRuleDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.user.define.rule.dao.data; +package com.dianping.cat.core.mybatis.user.define.rule.dao.data; import java.util.Date; diff --git a/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml b/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml index 06de1f4a5a..312a7ce239 100644 --- a/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml +++ b/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml @@ -1,79 +1,83 @@ - + + + + + + + + + + + - - - - - - - - - - + + id , + domain , + alert_time , + category , + type , + content , + metric , + creation_date + - - id, - domain, - alert_time, - category, - type, - content, - metric, - creation_date - + + + id = #{id} , + domain = #{domain} , + alert_time = #{alertTime} , + category = #{category} , + type = #{type} , + content = #{content} , + metric = #{metric} , + creation_date = #{creationDate} + + - - INSERT INTO alert - (domain, alert_time, category, type, content, metric, creation_date) - VALUES - (#{domain}, #{alertTime}, #{category}, #{type}, #{content}, #{metric}, #{creationDate}) - + + INSERT INTO alert + + - + - + - - DELETE FROM alert - WHERE id = #{id} - + + delete from alert where id = #{id} + - - UPDATE alert - SET domain = #{domain}, - alert_time = #{alertTime}, - category = #{category}, - type = #{type}, - content = #{content}, - metric = #{metric}, - creation_date = #{creationDate} - WHERE id = #{id} - + + UPDATE alert + + WHERE id = #{id} + - + - + - + - - + + + \ No newline at end of file diff --git a/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml b/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml index e7fde46b35..e6c4ba66bc 100644 --- a/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml +++ b/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml @@ -1,73 +1,77 @@ - + + + + + + + + + + + + + - - - - - - - - - - - - + + id , + category , + endPoint , + measurement , + tags , + content , + type , + creator , + creation_date , + updatetime + - - id, - category, - endPoint, - measurement, - tags, - content, - type, - creator, - creation_date, - updatetime - + + + id = #{id} , + category = #{category} , + endPoint = #{endPoint} , + measurement = #{measurement} , + tags = #{tags} , + content = #{content} , + type = #{type} , + creator = #{creator} , + creation_date = #{creationDate} , + updatetime = #{updatetime} + + - - INSERT INTO server_alarm_rule - (category, endPoint, measurement, tags, content, type, creator, creation_date, updatetime) - VALUES - (#{category}, #{endPoint}, #{measurement}, #{tags}, #{content}, #{type}, #{creator}, #{creationDate}, #{updatetime}) - + + INSERT INTO server_alarm_rule + + - + - + - - DELETE FROM server_alarm_rule - WHERE id = #{id} - + + delete from server_alarm_rule where id = #{id} + - - UPDATE server_alarm_rule - SET category = #{category}, - endPoint = #{endPoint}, - measurement = #{measurement}, - tags = #{tags}, - content = #{content}, - type = #{type}, - creator = #{creator}, - creation_date = #{creationDate}, - updatetime = #{updatetime} - WHERE id = #{id} - + + UPDATE server_alarm_rule + + WHERE id = #{id} + - - + + + \ No newline at end of file diff --git a/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml b/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml index daa189fe9f..058a5ccba8 100644 --- a/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml +++ b/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml @@ -1,53 +1,57 @@ - - - - - - - - - - - id, - content, - creation_date - - - - INSERT INTO user_define_rule - (content, creation_date) - VALUES - (#{content}, #{creationDate}) - - - - - - - - DELETE FROM user_define_rule - WHERE id = #{id} - - - - UPDATE user_define_rule - SET content = #{content}, - creation_date = #{creationDate} - WHERE id = #{id} - - - - + + + + + + + + + + id , + content , + creation_date + + + + + id = #{id} , + content = #{content} , + creation_date = #{creationDate} + + + + + INSERT INTO user_define_rule + + + + + + + + + delete from user_define_rule where id = #{id} + + + + UPDATE user_define_rule + + WHERE id = #{id} + + + + + \ No newline at end of file diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java index 90f042ef0f..eab21cb8e2 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java @@ -1,5 +1,6 @@ package com.dianping.cat.core.config.repository; +import java.util.Date; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; @@ -53,6 +54,14 @@ public Config findByPK(int keyId) { public int insert(Config proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); + Date now = new Date(); + + if (proto.getCreationDate() == null) { + proto.setCreationDate(now); + } + if (proto.getModifyDate() == null) { + proto.setModifyDate(now); + } ConfigDO config = toConfigDO(proto); int count = transactionTemplate.execute(status -> springMapper().insert(config)); @@ -65,6 +74,7 @@ public int insert(Config proto) { public int updateByPK(Config proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); + proto.setModifyDate(new Date()); return transactionTemplate.execute(status -> springMapper().updateById(toConfigDO(proto))); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/business/config/dao/BusinessConfigMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/BusinessConfigMapper.java similarity index 78% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/business/config/dao/BusinessConfigMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/BusinessConfigMapper.java index 49748ea141..d7f4dbe831 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/business/config/dao/BusinessConfigMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/BusinessConfigMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.business.config.dao; +package com.dianping.cat.core.mybatis.business.config.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.business.config.dao.data.BusinessConfigDO; +import com.dianping.cat.core.mybatis.business.config.dao.data.BusinessConfigDO; public interface BusinessConfigMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/business/config/dao/data/BusinessConfigDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/data/BusinessConfigDO.java similarity index 75% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/business/config/dao/data/BusinessConfigDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/data/BusinessConfigDO.java index 9671edd381..d339aa3c8e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/business/config/dao/data/BusinessConfigDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/data/BusinessConfigDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.business.config.dao.data; +package com.dianping.cat.core.mybatis.business.config.dao.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/businessreport/dao/BusinessReportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/BusinessReportMapper.java similarity index 69% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/businessreport/dao/BusinessReportMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/BusinessReportMapper.java index 0c9e205f2e..5cd00e28a9 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/businessreport/dao/BusinessReportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/BusinessReportMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.businessreport.dao; +package com.dianping.cat.core.mybatis.businessreport.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.businessreport.dao.data.BusinessReportDO; +import com.dianping.cat.core.mybatis.businessreport.dao.data.BusinessReportDO; public interface BusinessReportMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/businessreport/dao/data/BusinessReportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/data/BusinessReportDO.java similarity index 79% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/businessreport/dao/data/BusinessReportDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/data/BusinessReportDO.java index f3b0d6d857..bc4bfdab7a 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/businessreport/dao/data/BusinessReportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/data/BusinessReportDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.businessreport.dao.data; +package com.dianping.cat.core.mybatis.businessreport.dao.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/daily/report/content/dao/DailyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/DailyReportContentMapper.java similarity index 73% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/daily/report/content/dao/DailyReportContentMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/DailyReportContentMapper.java index 940138fd32..65734a08c1 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/daily/report/content/dao/DailyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/DailyReportContentMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.daily.report.content.dao; +package com.dianping.cat.core.mybatis.daily.report.content.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.daily.report.content.dao.data.DailyReportContentDO; +import com.dianping.cat.core.mybatis.daily.report.content.dao.data.DailyReportContentDO; public interface DailyReportContentMapper { int deleteByPrimaryKey(@Param("reportId") Integer reportId); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/daily/report/content/dao/data/DailyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/data/DailyReportContentDO.java similarity index 81% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/daily/report/content/dao/data/DailyReportContentDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/data/DailyReportContentDO.java index 905dbbfb26..ff282baed5 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/daily/report/content/dao/data/DailyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/data/DailyReportContentDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.daily.report.content.dao.data; +package com.dianping.cat.core.mybatis.daily.report.content.dao.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hostinfo/dao/HostinfoMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/HostinfoMapper.java similarity index 76% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hostinfo/dao/HostinfoMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/HostinfoMapper.java index c4b2bcc352..020258b2e0 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hostinfo/dao/HostinfoMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/HostinfoMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.hostinfo.dao; +package com.dianping.cat.core.mybatis.hostinfo.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.hostinfo.dao.data.HostinfoDO; +import com.dianping.cat.core.mybatis.hostinfo.dao.data.HostinfoDO; public interface HostinfoMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hostinfo/dao/data/HostinfoDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/data/HostinfoDO.java similarity index 79% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hostinfo/dao/data/HostinfoDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/data/HostinfoDO.java index 4d2dd492f6..b65920e44f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hostinfo/dao/data/HostinfoDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/data/HostinfoDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.hostinfo.dao.data; +package com.dianping.cat.core.mybatis.hostinfo.dao.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourly/report/content/dao/HourlyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/HourlyReportContentMapper.java similarity index 73% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourly/report/content/dao/HourlyReportContentMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/HourlyReportContentMapper.java index b36076652c..262cf73ac6 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourly/report/content/dao/HourlyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/HourlyReportContentMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.hourly.report.content.dao; +package com.dianping.cat.core.mybatis.hourly.report.content.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.data.HourlyReportContentDO; +import com.dianping.cat.core.mybatis.hourly.report.content.dao.data.HourlyReportContentDO; public interface HourlyReportContentMapper { int deleteByPrimaryKey(@Param("reportId") Integer reportId); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourly/report/content/dao/data/HourlyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/data/HourlyReportContentDO.java similarity index 79% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourly/report/content/dao/data/HourlyReportContentDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/data/HourlyReportContentDO.java index d9192f8d2d..f19b9ba7b0 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourly/report/content/dao/data/HourlyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/data/HourlyReportContentDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.data; +package com.dianping.cat.core.mybatis.hourly.report.content.dao.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourlyreport/dao/HourlyreportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/HourlyreportMapper.java similarity index 77% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourlyreport/dao/HourlyreportMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/HourlyreportMapper.java index 8561d50098..466ac6a385 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourlyreport/dao/HourlyreportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/HourlyreportMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.hourlyreport.dao; +package com.dianping.cat.core.mybatis.hourlyreport.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.data.HourlyreportDO; +import com.dianping.cat.core.mybatis.hourlyreport.dao.data.HourlyreportDO; public interface HourlyreportMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourlyreport/dao/data/HourlyreportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/data/HourlyreportDO.java similarity index 79% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourlyreport/dao/data/HourlyreportDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/data/HourlyreportDO.java index 9a52c3c951..2a45c22969 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/hourlyreport/dao/data/HourlyreportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/data/HourlyreportDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.hourlyreport.dao.data; +package com.dianping.cat.core.mybatis.hourlyreport.dao.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthly/report/content/dao/MonthlyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/MonthlyReportContentMapper.java similarity index 73% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthly/report/content/dao/MonthlyReportContentMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/MonthlyReportContentMapper.java index a801bf3b1c..28d72f02a7 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthly/report/content/dao/MonthlyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/MonthlyReportContentMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.monthly.report.content.dao; +package com.dianping.cat.core.mybatis.monthly.report.content.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.data.MonthlyReportContentDO; +import com.dianping.cat.core.mybatis.monthly.report.content.dao.data.MonthlyReportContentDO; public interface MonthlyReportContentMapper { int deleteByPrimaryKey(@Param("reportId") Integer reportId); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthly/report/content/dao/data/MonthlyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/data/MonthlyReportContentDO.java similarity index 79% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthly/report/content/dao/data/MonthlyReportContentDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/data/MonthlyReportContentDO.java index ed3e179ff0..04fafc2e25 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthly/report/content/dao/data/MonthlyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/data/MonthlyReportContentDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.data; +package com.dianping.cat.core.mybatis.monthly.report.content.dao.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthreport/dao/MonthreportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/MonthreportMapper.java similarity index 77% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthreport/dao/MonthreportMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/MonthreportMapper.java index 76bbd62b05..62b85f98ec 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthreport/dao/MonthreportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/MonthreportMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.monthreport.dao; +package com.dianping.cat.core.mybatis.monthreport.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.monthreport.dao.data.MonthreportDO; +import com.dianping.cat.core.mybatis.monthreport.dao.data.MonthreportDO; public interface MonthreportMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthreport/dao/data/MonthreportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/data/MonthreportDO.java similarity index 79% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthreport/dao/data/MonthreportDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/data/MonthreportDO.java index 5312aa0adb..bbc5131fbf 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/monthreport/dao/data/MonthreportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/data/MonthreportDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.monthreport.dao.data; +package com.dianping.cat.core.mybatis.monthreport.dao.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/operation/dao/OperationMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/OperationMapper.java similarity index 69% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/operation/dao/OperationMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/OperationMapper.java index 4545ea5e39..e2abfd1c4c 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/operation/dao/OperationMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/OperationMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.operation.dao; +package com.dianping.cat.core.mybatis.operation.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.operation.dao.data.OperationDO; +import com.dianping.cat.core.mybatis.operation.dao.data.OperationDO; public interface OperationMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/operation/dao/data/OperationDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/data/OperationDO.java similarity index 78% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/operation/dao/data/OperationDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/data/OperationDO.java index cf78ee8f4a..f150eb6fc2 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/operation/dao/data/OperationDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/data/OperationDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.operation.dao.data; +package com.dianping.cat.core.mybatis.operation.dao.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/project/dao/ProjectMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/ProjectMapper.java similarity index 79% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/project/dao/ProjectMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/ProjectMapper.java index 233a83a4aa..ef973cb762 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/project/dao/ProjectMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/ProjectMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.project.dao; +package com.dianping.cat.core.mybatis.project.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.project.dao.data.ProjectDO; +import com.dianping.cat.core.mybatis.project.dao.data.ProjectDO; public interface ProjectMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/project/dao/data/ProjectDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/data/ProjectDO.java similarity index 85% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/project/dao/data/ProjectDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/data/ProjectDO.java index 1edcdae4a2..4b74378fc2 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/project/dao/data/ProjectDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/data/ProjectDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.project.dao.data; +package com.dianping.cat.core.mybatis.project.dao.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java index dc883a0975..69781d2444 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.config.BusinessConfig; -import com.dianping.cat.core.mybatis.generated.business.config.dao.BusinessConfigMapper; -import com.dianping.cat.core.mybatis.generated.business.config.dao.data.BusinessConfigDO; +import com.dianping.cat.core.mybatis.business.config.dao.BusinessConfigMapper; +import com.dianping.cat.core.mybatis.business.config.dao.data.BusinessConfigDO; public class BusinessConfigRepository { private static final Logger LOGGER = LoggerFactory.getLogger(BusinessConfigRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java index 8e1b3594f8..cdf627dc16 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.mybatis.generated.daily.report.content.dao.DailyReportContentMapper; -import com.dianping.cat.core.mybatis.generated.daily.report.content.dao.data.DailyReportContentDO; +import com.dianping.cat.core.mybatis.daily.report.content.dao.DailyReportContentMapper; +import com.dianping.cat.core.mybatis.daily.report.content.dao.data.DailyReportContentDO; public class DailyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(DailyReportContentRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java index 6e7fb9526e..f38c522783 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java @@ -1,5 +1,6 @@ package com.dianping.cat.core.mybatis.repository.hostinfo; +import java.util.Date; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; @@ -11,8 +12,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.Hostinfo; -import com.dianping.cat.core.mybatis.generated.hostinfo.dao.HostinfoMapper; -import com.dianping.cat.core.mybatis.generated.hostinfo.dao.data.HostinfoDO; +import com.dianping.cat.core.mybatis.hostinfo.dao.HostinfoMapper; +import com.dianping.cat.core.mybatis.hostinfo.dao.data.HostinfoDO; public class HostinfoRepository { private static final Logger LOGGER = LoggerFactory.getLogger(HostinfoRepository.class); @@ -60,6 +61,15 @@ public Hostinfo findByIp(String ip) { public int insert(Hostinfo proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); + Date now = new Date(); + + if (proto.getCreationDate() == null) { + proto.setCreationDate(now); + } + if (proto.getLastModifiedDate() == null) { + proto.setLastModifiedDate(now); + } + HostinfoDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper().insert(record)); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java index bf72ae498b..c1ea2de6ec 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.HourlyReportContentMapper; -import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.data.HourlyReportContentDO; +import com.dianping.cat.core.mybatis.hourly.report.content.dao.HourlyReportContentMapper; +import com.dianping.cat.core.mybatis.hourly.report.content.dao.data.HourlyReportContentDO; public class HourlyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(HourlyReportContentRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java index 99ae1c35ff..cfc01ed097 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.HourlyReport; -import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.HourlyreportMapper; -import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.data.HourlyreportDO; +import com.dianping.cat.core.mybatis.hourlyreport.dao.HourlyreportMapper; +import com.dianping.cat.core.mybatis.hourlyreport.dao.data.HourlyreportDO; public class HourlyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(HourlyReportRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java index da5c614dc9..379520f5cb 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.MonthlyReportContentMapper; -import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.data.MonthlyReportContentDO; +import com.dianping.cat.core.mybatis.monthly.report.content.dao.MonthlyReportContentMapper; +import com.dianping.cat.core.mybatis.monthly.report.content.dao.data.MonthlyReportContentDO; public class MonthlyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(MonthlyReportContentRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java index 33dc242008..fe245b3b8d 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java @@ -9,8 +9,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.MonthlyReport; -import com.dianping.cat.core.mybatis.generated.monthreport.dao.MonthreportMapper; -import com.dianping.cat.core.mybatis.generated.monthreport.dao.data.MonthreportDO; +import com.dianping.cat.core.mybatis.monthreport.dao.MonthreportMapper; +import com.dianping.cat.core.mybatis.monthreport.dao.data.MonthreportDO; public class MonthlyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(MonthlyReportRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java index 6215bba54f..b147454129 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.Project; -import com.dianping.cat.core.mybatis.generated.project.dao.ProjectMapper; -import com.dianping.cat.core.mybatis.generated.project.dao.data.ProjectDO; +import com.dianping.cat.core.mybatis.project.dao.ProjectMapper; +import com.dianping.cat.core.mybatis.project.dao.data.ProjectDO; public class ProjectRepository { private static final Logger LOGGER = LoggerFactory.getLogger(ProjectRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java index 944b5bd72b..56551b017b 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java @@ -9,8 +9,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.Task; -import com.dianping.cat.core.mybatis.generated.task.dao.TaskMapper; -import com.dianping.cat.core.mybatis.generated.task.dao.data.TaskDO; +import com.dianping.cat.core.mybatis.task.dao.TaskMapper; +import com.dianping.cat.core.mybatis.task.dao.data.TaskDO; public class TaskRepository { private static final Logger LOGGER = LoggerFactory.getLogger(TaskRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java index e5fd56d995..6eeed62587 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.WeeklyReportContentMapper; -import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.data.WeeklyReportContentDO; +import com.dianping.cat.core.mybatis.weekly.report.content.dao.WeeklyReportContentMapper; +import com.dianping.cat.core.mybatis.weekly.report.content.dao.data.WeeklyReportContentDO; public class WeeklyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(WeeklyReportContentRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java index d225fef01b..e036e8d45c 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java @@ -9,8 +9,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.WeeklyReport; -import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.WeeklyreportMapper; -import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.data.WeeklyreportDO; +import com.dianping.cat.core.mybatis.weeklyreport.dao.WeeklyreportMapper; +import com.dianping.cat.core.mybatis.weeklyreport.dao.data.WeeklyreportDO; public class WeeklyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(WeeklyReportRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/task/dao/TaskMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/TaskMapper.java similarity index 83% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/task/dao/TaskMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/TaskMapper.java index 16982d1be5..02486fde30 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/task/dao/TaskMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/TaskMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.task.dao; +package com.dianping.cat.core.mybatis.task.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.task.dao.data.TaskDO; +import com.dianping.cat.core.mybatis.task.dao.data.TaskDO; public interface TaskMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/task/dao/data/TaskDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/data/TaskDO.java similarity index 89% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/task/dao/data/TaskDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/data/TaskDO.java index 1e3b5a0fd1..7ea7258ed4 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/task/dao/data/TaskDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/data/TaskDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.task.dao.data; +package com.dianping.cat.core.mybatis.task.dao.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weekly/report/content/dao/WeeklyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/WeeklyReportContentMapper.java similarity index 73% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weekly/report/content/dao/WeeklyReportContentMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/WeeklyReportContentMapper.java index 2e30ac46b4..961aee6f15 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weekly/report/content/dao/WeeklyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/WeeklyReportContentMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.weekly.report.content.dao; +package com.dianping.cat.core.mybatis.weekly.report.content.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.data.WeeklyReportContentDO; +import com.dianping.cat.core.mybatis.weekly.report.content.dao.data.WeeklyReportContentDO; public interface WeeklyReportContentMapper { int deleteByPrimaryKey(@Param("reportId") Integer reportId); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weekly/report/content/dao/data/WeeklyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/data/WeeklyReportContentDO.java similarity index 79% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weekly/report/content/dao/data/WeeklyReportContentDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/data/WeeklyReportContentDO.java index 71cd49a357..f60cf28d37 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weekly/report/content/dao/data/WeeklyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/data/WeeklyReportContentDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.data; +package com.dianping.cat.core.mybatis.weekly.report.content.dao.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weeklyreport/dao/WeeklyreportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/WeeklyreportMapper.java similarity index 77% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weeklyreport/dao/WeeklyreportMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/WeeklyreportMapper.java index 97a90cf3b0..a38c7f22f7 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weeklyreport/dao/WeeklyreportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/WeeklyreportMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.weeklyreport.dao; +package com.dianping.cat.core.mybatis.weeklyreport.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.data.WeeklyreportDO; +import com.dianping.cat.core.mybatis.weeklyreport.dao.data.WeeklyreportDO; public interface WeeklyreportMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weeklyreport/dao/data/WeeklyreportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/data/WeeklyreportDO.java similarity index 79% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weeklyreport/dao/data/WeeklyreportDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/data/WeeklyreportDO.java index c21a6a83d3..f551251df9 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/generated/weeklyreport/dao/data/WeeklyreportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/data/WeeklyreportDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.weeklyreport.dao.data; +package com.dianping.cat.core.mybatis.weeklyreport.dao.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java index f94c9a5c2d..de43c7d0a4 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java @@ -112,10 +112,10 @@ public synchronized void initialize() { } private boolean insert(Hostinfo hostinfo) { - m_hostinfos.put(hostinfo.getIp(), hostinfo); - int result = m_hostinfoDao.insert(hostinfo); + if (result == 1) { + m_hostinfos.put(hostinfo.getIp(), hostinfo); return true; } else { return false; @@ -130,10 +130,13 @@ public boolean insert(String domain, String ip) { info.setDomain(domain); info.setIp(ip); - insert(info); - m_hostinfos.put(ip, info); - SLF4J_LOGGER.info("Inserted hostinfo, domain={}, ip={}.", domain, ip); - return true; + boolean inserted = insert(info); + + if (inserted) { + SLF4J_LOGGER.info("Inserted hostinfo, domain={}, ip={}.", domain, ip); + return true; + } + SLF4J_LOGGER.warn("Hostinfo insert affected no rows, domain={}, ip={}.", domain, ip); } catch (RuntimeException e) { SLF4J_LOGGER.error("Unable to insert hostinfo, domain={}, ip={}.", domain, ip, e); Cat.logError(e); diff --git a/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml b/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml index a9dcebb215..217e7caff0 100644 --- a/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml @@ -1,66 +1,70 @@ - + + + + + + + + - - - - - - - + + id , + name , + domain , + content , + updatetime + - - id, - name, - domain, - content, - updatetime - + + + id = #{id} , + name = #{name} , + domain = #{domain} , + content = #{content} , + updatetime = #{updatetime} + + - - INSERT INTO business_config - (name, domain, content, updatetime) - VALUES - (#{name}, #{domain}, #{content}, #{updatetime}) - + + INSERT INTO business_config + + - + - + - - DELETE FROM business_config - WHERE id = #{id} - + + delete from business_config where id = #{id} + - - UPDATE business_config - SET name = #{name}, - domain = #{domain}, - content = #{content}, - updatetime = #{updatetime} - WHERE id = #{id} - + + UPDATE business_config + + WHERE id = #{id} + - + - + - - UPDATE business_config SET content=#{record.content}, updatetime=NOW() WHERE domain = #{record.domain} AND name = #{record.name}; - - + + UPDATE business_config SET content=#{record.content}, updatetime=NOW() where domain = #{record.domain} and name = #{record.name} + + + \ No newline at end of file diff --git a/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml index 8d81d7b374..e6b7a1db01 100644 --- a/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml @@ -1,63 +1,67 @@ - - - - - - - - - - - - - - - id, - type, - name, - ip, - productLine, - period, - content, - creation_date - - - - INSERT INTO businessReport - (type, name, ip, productLine, period, content, creation_date) - VALUES - (#{type}, #{name}, #{ip}, #{productLine}, #{period}, #{content}, #{creationDate}) - - - - - - - - DELETE FROM businessReport - WHERE id = #{id} - - - - UPDATE businessReport - SET type = #{type}, - name = #{name}, - ip = #{ip}, - productLine = #{productLine}, - period = #{period}, - content = #{content}, - creation_date = #{creationDate} - WHERE id = #{id} - - + + + + + + + + + + + + + + id , + type , + name , + ip , + productLine , + period , + content , + creation_date + + + + + id = #{id} , + type = #{type} , + name = #{name} , + ip = #{ip} , + productLine = #{productLine} , + period = #{period} , + content = #{content} , + creation_date = #{creationDate} + + + + + INSERT INTO businessReport + + + + + + + + + delete from businessReport where id = #{id} + + + + UPDATE businessReport + + WHERE id = #{id} + + + \ No newline at end of file diff --git a/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml b/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml index 16115ea640..22afd86555 100644 --- a/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml @@ -1,62 +1,65 @@ + + + + + + + - - - - - - - - - - id, - name, - content, - creation_date, - modify_date - - - - INSERT INTO config - (name, content, creation_date, modify_date) - VALUES - (#{name}, #{content}, NOW(), NOW()) - - - - - - - - - - DELETE FROM config - WHERE id = #{id} - - - - UPDATE config - SET name = #{name}, - content = #{content}, - modify_date = NOW() - WHERE id = #{id} - - - + + id , + name , + content , + creation_date , + modify_date + + + + + id = #{id} , + name = #{name} , + content = #{content} , + creation_date = #{creationDate} , + modify_date = #{modifyDate} + + + + + INSERT INTO config + + + + + + + + + + + delete from config where id = #{id} + + + + UPDATE config + + WHERE id = #{id} + + + \ No newline at end of file diff --git a/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml index f9b8272505..1b33fe24e9 100644 --- a/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml @@ -1,56 +1,59 @@ - - - - - - - - - - - - report_id, - content, - period, - creation_date - - - - INSERT INTO daily_report_content - (report_id, content, period, creation_date) - VALUES - (#{reportId}, #{content}, #{period}, #{creationDate}) - - - - - - - - DELETE FROM daily_report_content - WHERE report_id = #{reportId} - - - - UPDATE daily_report_content - SET content = #{content}, - period = #{period}, - creation_date = #{creationDate} - WHERE report_id = #{reportId} - - - - + + + + + + + + + + + report_id , + content , + period , + creation_date + + + + + report_id = #{reportId} , + content = #{content} , + period = #{period} , + creation_date = #{creationDate} + + + + + INSERT INTO daily_report_content + + + + + + + + + delete from daily_report_content where report_id = #{reportId} + + + + UPDATE daily_report_content + + WHERE report_id = #{reportId} + + + + + \ No newline at end of file diff --git a/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml index 5ccd33e65f..ecc45b45a1 100644 --- a/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml @@ -1,85 +1,87 @@ + + + + + + + + + - - - - - - - - - + + id , + name , + ip , + domain , + period , + type , + creation_date + - - id, - name, - ip, - domain, - period, - type, - creation_date - + + + id = #{id} , + name = #{name} , + ip = #{ip} , + domain = #{domain} , + period = #{period} , + type = #{type} , + creation_date = #{creationDate} + + - - INSERT INTO dailyreport - (name, ip, domain, period, type, creation_date) - VALUES - (#{name}, #{ip}, #{domain}, #{period}, #{type}, #{creationDate}) - + + INSERT INTO dailyreport + + - + - + - + - - DELETE FROM dailyreport - WHERE id = #{id} - + + delete from dailyreport where id = #{id} + - - DELETE FROM dailyreport - WHERE period = #{period} - AND domain = #{domain} - AND name = #{name} - AND BINARY(domain) = BINARY(#{domain}) - + + DELETE from dailyreport + where period = #{period} + and domain = #{domain} + and name = #{name} + and BINARY(domain) = BINARY(#{domain}) + - - UPDATE dailyreport - SET name = #{name}, - ip = #{ip}, - domain = #{domain}, - period = #{period}, - type = #{type}, - creation_date = #{creationDate} - WHERE id = #{id} - + + UPDATE dailyreport + + WHERE id = #{id} + - + \ No newline at end of file diff --git a/cat-core/src/main/resources/mybatis/mapper/HostinfoMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HostinfoMapper.xml index 72ab789b22..7751f8c362 100644 --- a/cat-core/src/main/resources/mybatis/mapper/HostinfoMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/HostinfoMapper.xml @@ -1,65 +1,69 @@ - + + + + + + + + + - - - - - - - - + + id , + ip , + domain , + hostname , + creation_date , + last_modified_date + - - id, - ip, - domain, - hostname, - creation_date, - last_modified_date - + + + id = #{id} , + ip = #{ip} , + domain = #{domain} , + hostname = #{hostname} , + creation_date = #{creationDate} , + last_modified_date = #{lastModifiedDate} + + - - INSERT INTO hostinfo - (ip, domain, hostname, creation_date, last_modified_date) - VALUES - (#{ip}, #{domain}, #{hostname}, #{creationDate}, #{lastModifiedDate}) - + + INSERT INTO hostinfo + + - + - + - - DELETE FROM hostinfo - WHERE id = #{id} - + + delete from hostinfo where id = #{id} + - - UPDATE hostinfo - SET ip = #{ip}, - domain = #{domain}, - hostname = #{hostname}, - creation_date = #{creationDate}, - last_modified_date = #{lastModifiedDate} - WHERE id = #{id} - + + UPDATE hostinfo + + WHERE id = #{id} + - + - - + + + \ No newline at end of file diff --git a/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml index e141d8cd51..d3c7181087 100644 --- a/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml @@ -1,56 +1,59 @@ - - - - - - - - - - - - report_id, - content, - period, - creation_date - - - - INSERT INTO hourly_report_content - (report_id, content, period, creation_date) - VALUES - (#{reportId}, #{content}, #{period}, #{creationDate}) - - - - - - - - DELETE FROM hourly_report_content - WHERE report_id = #{reportId} - - - - UPDATE hourly_report_content - SET content = #{content}, - period = #{period}, - creation_date = #{creationDate} - WHERE report_id = #{reportId} - - - - + + + + + + + + + + + report_id , + content , + period , + creation_date + + + + + report_id = #{reportId} , + content = #{content} , + period = #{period} , + creation_date = #{creationDate} + + + + + INSERT INTO hourly_report_content + + + + + + + + + delete from hourly_report_content where report_id = #{reportId} + + + + UPDATE hourly_report_content + + WHERE report_id = #{reportId} + + + + + \ No newline at end of file diff --git a/cat-core/src/main/resources/mybatis/mapper/HourlyreportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HourlyreportMapper.xml index efa5803177..a4ca761897 100644 --- a/cat-core/src/main/resources/mybatis/mapper/HourlyreportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/HourlyreportMapper.xml @@ -1,78 +1,82 @@ - + + + + + + + + + + - - - - - - - - - + + id , + type , + name , + ip , + domain , + period , + creation_date + - - id, - type, - name, - ip, - domain, - period, - creation_date - + + + id = #{id} , + type = #{type} , + name = #{name} , + ip = #{ip} , + domain = #{domain} , + period = #{period} , + creation_date = #{creationDate} + + - - INSERT INTO hourlyreport - (type, name, ip, domain, period, creation_date) - VALUES - (#{type}, #{name}, #{ip}, #{domain}, #{period}, #{creationDate}) - + + INSERT INTO hourlyreport + + - + - + - - DELETE FROM hourlyreport - WHERE id = #{id} - + + delete from hourlyreport where id = #{id} + - - UPDATE hourlyreport - SET type = #{type}, - name = #{name}, - ip = #{ip}, - domain = #{domain}, - period = #{period}, - creation_date = #{creationDate} - WHERE id = #{id} - + + UPDATE hourlyreport + + WHERE id = #{id} + - + - - + + + \ No newline at end of file diff --git a/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml index fbec8d6384..f3b874ab02 100644 --- a/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml @@ -1,56 +1,59 @@ - - - - - - - - - - - - report_id, - content, - period, - creation_date - - - - INSERT INTO monthly_report_content - (report_id, content, period, creation_date) - VALUES - (#{reportId}, #{content}, #{period}, #{creationDate}) - - - - - - - - DELETE FROM monthly_report_content - WHERE report_id = #{reportId} - - - - UPDATE monthly_report_content - SET content = #{content}, - period = #{period}, - creation_date = #{creationDate} - WHERE report_id = #{reportId} - - - - + + + + + + + + + + + report_id , + content , + period , + creation_date + + + + + report_id = #{reportId} , + content = #{content} , + period = #{period} , + creation_date = #{creationDate} + + + + + INSERT INTO monthly_report_content + + + + + + + + + delete from monthly_report_content where report_id = #{reportId} + + + + UPDATE monthly_report_content + + WHERE report_id = #{reportId} + + + + + \ No newline at end of file diff --git a/cat-core/src/main/resources/mybatis/mapper/MonthreportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/MonthreportMapper.xml index 0750e2e643..a8a1eaf69e 100644 --- a/cat-core/src/main/resources/mybatis/mapper/MonthreportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/MonthreportMapper.xml @@ -1,68 +1,72 @@ - + + + + + + + + + + - - - - - - - - - + + id , + name , + ip , + domain , + period , + type , + creation_date + - - id, - name, - ip, - domain, - period, - type, - creation_date - + + + id = #{id} , + name = #{name} , + ip = #{ip} , + domain = #{domain} , + period = #{period} , + type = #{type} , + creation_date = #{creationDate} + + - - INSERT INTO monthreport - (name, ip, domain, period, type, creation_date) - VALUES - (#{name}, #{ip}, #{domain}, #{period}, #{type}, #{creationDate}) - + + INSERT INTO monthreport + + - + - + - - DELETE FROM monthreport - WHERE id = #{id} - + + delete from monthreport where id = #{id} + - - UPDATE monthreport - SET name = #{name}, - ip = #{ip}, - domain = #{domain}, - period = #{period}, - type = #{type}, - creation_date = #{creationDate} - WHERE id = #{id} - + + UPDATE monthreport + + WHERE id = #{id} + - + - - DELETE FROM monthreport WHERE period = #{record.period} AND domain = #{record.domain} AND name = #{record.name} - - + + DELETE from monthreport where period = #{record.period} and domain = #{record.domain} and name = #{record.name} + + + \ No newline at end of file diff --git a/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml b/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml index b0493f91d8..0b476657c5 100644 --- a/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml @@ -1,60 +1,64 @@ - - - - - - - - - - - - - - id, - user, - module, - operation, - time, - content, - creation_date - - - - INSERT INTO operation - (user, module, operation, time, content, creation_date) - VALUES - (#{user}, #{module}, #{operation}, #{time}, #{content}, #{creationDate}) - - - - - - - - DELETE FROM operation - WHERE id = #{id} - - - - UPDATE operation - SET user = #{user}, - module = #{module}, - operation = #{operation}, - time = #{time}, - content = #{content}, - creation_date = #{creationDate} - WHERE id = #{id} - - + + + + + + + + + + + + + id , + user , + module , + operation , + time , + content , + creation_date + + + + + id = #{id} , + user = #{user} , + module = #{module} , + operation = #{operation} , + time = #{time} , + content = #{content} , + creation_date = #{creationDate} + + + + + INSERT INTO operation + + + + + + + + + delete from operation where id = #{id} + + + + UPDATE operation + + WHERE id = #{id} + + + \ No newline at end of file diff --git a/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml b/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml index 87343d687c..ad3201c621 100644 --- a/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml @@ -1,84 +1,88 @@ - + + + + + + + + + + + + + + - - - - - - - - - - - - - + + id , + domain , + cmdb_domain , + level , + bu , + cmdb_productline , + owner , + email , + phone , + creation_date , + modify_date + - - id, - domain, - cmdb_domain, - level, - bu, - cmdb_productline, - owner, - email, - phone, - creation_date, - modify_date - + + + id = #{id} , + domain = #{domain} , + cmdb_domain = #{cmdbDomain} , + level = #{level} , + bu = #{bu} , + cmdb_productline = #{cmdbProductline} , + owner = #{owner} , + email = #{email} , + phone = #{phone} , + creation_date = #{creationDate} , + modify_date = #{modifyDate} + + - - INSERT INTO project - (domain, cmdb_domain, level, bu, cmdb_productline, owner, email, phone, creation_date, modify_date) - VALUES - (#{domain}, #{cmdbDomain}, #{level}, #{bu}, #{cmdbProductline}, #{owner}, #{email}, #{phone}, #{creationDate}, #{modifyDate}) - + + INSERT INTO project + + - + - + - - DELETE FROM project - WHERE id = #{id} - + + delete from project where id = #{id} + - - UPDATE project - SET domain = #{domain}, - cmdb_domain = #{cmdbDomain}, - level = #{level}, - bu = #{bu}, - cmdb_productline = #{cmdbProductline}, - owner = #{owner}, - email = #{email}, - phone = #{phone}, - creation_date = #{creationDate}, - modify_date = #{modifyDate} - WHERE id = #{id} - + + UPDATE project + + WHERE id = #{id} + - + - + - - + + + \ No newline at end of file diff --git a/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml b/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml index 01d086d69f..02e083a095 100644 --- a/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml @@ -1,100 +1,104 @@ - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + id , + producer , + consumer , + failure_count , + report_name , + report_domain , + report_period , + status , + task_type , + creation_date , + start_date , + end_date + - - id, - producer, - consumer, - failure_count, - report_name, - report_domain, - report_period, - status, - task_type, - creation_date, - start_date, - end_date - + + + id = #{id} , + producer = #{producer} , + consumer = #{consumer} , + failure_count = #{failureCount} , + report_name = #{reportName} , + report_domain = #{reportDomain} , + report_period = #{reportPeriod} , + status = #{status} , + task_type = #{taskType} , + creation_date = #{creationDate} , + start_date = #{startDate} , + end_date = #{endDate} + + - - INSERT INTO task - (producer, consumer, failure_count, report_name, report_domain, report_period, status, task_type, creation_date, start_date, end_date) - VALUES - (#{producer}, #{consumer}, #{failureCount}, #{reportName}, #{reportDomain}, #{reportPeriod}, #{status}, #{taskType}, #{creationDate}, #{startDate}, #{endDate}) - + + INSERT INTO task + + - + - + - - DELETE FROM task - WHERE id = #{id} - + + delete from task where id = #{id} + - - UPDATE task - SET producer = #{producer}, - consumer = #{consumer}, - failure_count = #{failureCount}, - report_name = #{reportName}, - report_domain = #{reportDomain}, - report_period = #{reportPeriod}, - status = #{status}, - task_type = #{taskType}, - creation_date = #{creationDate}, - start_date = #{startDate}, - end_date = #{endDate} - WHERE id = #{id} - + + UPDATE task + + WHERE id = #{id} + - + - - UPDATE task SET consumer=#{record.consumer}, status=2, start_date=#{record.startDate} WHERE status = 1 AND id = #{record.id}; - + + UPDATE task SET consumer=#{record.consumer}, status=2, start_date=#{record.startDate} where status = 1 and id = #{record.id} + - - UPDATE task SET status=3, end_date=#{record.endDate} WHERE status = 2 AND id = #{record.id}; - + + UPDATE task SET status=3, end_date=#{record.endDate} where status = 2 and id = #{record.id} + - - UPDATE task SET status=3, end_date=#{record.endDate} WHERE status =4 AND id = #{record.id}; - + + UPDATE task SET status=3, end_date=#{record.endDate} where status =4 and id = #{record.id} + - - UPDATE task SET status=1, WHERE id = #{record.id}; - + + UPDATE task SET status=1, where id = #{record.id} + - - UPDATE task SET status=4, end_date=#{record.endDate}, failure_count = failure_count + 1 WHERE status = 2 AND id = #{record.id}; - - + + UPDATE task SET status=4, end_date=#{record.endDate}, failure_count = failure_count + 1 where status = 2 and id = #{record.id} + + + \ No newline at end of file diff --git a/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml index 7d899c24c7..e642c5d83e 100644 --- a/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml @@ -1,56 +1,59 @@ - - - - - - - - - - - - report_id, - content, - period, - creation_date - - - - INSERT INTO weekly_report_content - (report_id, content, period, creation_date) - VALUES - (#{reportId}, #{content}, #{period}, #{creationDate}) - - - - - - - - DELETE FROM weekly_report_content - WHERE report_id = #{reportId} - - - - UPDATE weekly_report_content - SET content = #{content}, - period = #{period}, - creation_date = #{creationDate} - WHERE report_id = #{reportId} - - - - + + + + + + + + + + + report_id , + content , + period , + creation_date + + + + + report_id = #{reportId} , + content = #{content} , + period = #{period} , + creation_date = #{creationDate} + + + + + INSERT INTO weekly_report_content + + + + + + + + + delete from weekly_report_content where report_id = #{reportId} + + + + UPDATE weekly_report_content + + WHERE report_id = #{reportId} + + + + + \ No newline at end of file diff --git a/cat-core/src/main/resources/mybatis/mapper/WeeklyreportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/WeeklyreportMapper.xml index c0439f3ae2..aaeded2d1e 100644 --- a/cat-core/src/main/resources/mybatis/mapper/WeeklyreportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/WeeklyreportMapper.xml @@ -1,68 +1,72 @@ - + + + + + + + + + + - - - - - - - - - + + id , + name , + ip , + domain , + period , + type , + creation_date + - - id, - name, - ip, - domain, - period, - type, - creation_date - + + + id = #{id} , + name = #{name} , + ip = #{ip} , + domain = #{domain} , + period = #{period} , + type = #{type} , + creation_date = #{creationDate} + + - - INSERT INTO weeklyreport - (name, ip, domain, period, type, creation_date) - VALUES - (#{name}, #{ip}, #{domain}, #{period}, #{type}, #{creationDate}) - + + INSERT INTO weeklyreport + + - + - + - - DELETE FROM weeklyreport - WHERE id = #{id} - + + delete from weeklyreport where id = #{id} + - - UPDATE weeklyreport - SET name = #{name}, - ip = #{ip}, - domain = #{domain}, - period = #{period}, - type = #{type}, - creation_date = #{creationDate} - WHERE id = #{id} - + + UPDATE weeklyreport + + WHERE id = #{id} + - + - - DELETE FROM weeklyreport WHERE period = #{record.period} AND domain = #{record.domain} AND name = #{record.name} - - + + DELETE from weeklyreport where period = #{record.period} and domain = #{record.domain} and name = #{record.name} + + + \ No newline at end of file diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alert/summary/dao/AlertSummaryMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/AlertSummaryMapper.java similarity index 69% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alert/summary/dao/AlertSummaryMapper.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/AlertSummaryMapper.java index 44f9430146..9368209129 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alert/summary/dao/AlertSummaryMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/AlertSummaryMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.alert.summary.dao; +package com.dianping.cat.core.mybatis.alert.summary.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.alert.summary.dao.data.AlertSummaryDO; +import com.dianping.cat.core.mybatis.alert.summary.dao.data.AlertSummaryDO; public interface AlertSummaryMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alert/summary/dao/data/AlertSummaryDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/data/AlertSummaryDO.java similarity index 76% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alert/summary/dao/data/AlertSummaryDO.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/data/AlertSummaryDO.java index b4ca0601ee..758b925b87 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alert/summary/dao/data/AlertSummaryDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/data/AlertSummaryDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.alert.summary.dao.data; +package com.dianping.cat.core.mybatis.alert.summary.dao.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alteration/dao/AlterationMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/AlterationMapper.java similarity index 81% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alteration/dao/AlterationMapper.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/AlterationMapper.java index 32f788c75a..a23784c970 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alteration/dao/AlterationMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/AlterationMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.alteration.dao; +package com.dianping.cat.core.mybatis.alteration.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.alteration.dao.data.AlterationDO; +import com.dianping.cat.core.mybatis.alteration.dao.data.AlterationDO; public interface AlterationMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alteration/dao/data/AlterationDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/data/AlterationDO.java similarity index 87% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alteration/dao/data/AlterationDO.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/data/AlterationDO.java index a86880357f..212430ec25 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/alteration/dao/data/AlterationDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/data/AlterationDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.alteration.dao.data; +package com.dianping.cat.core.mybatis.alteration.dao.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/baseline/dao/BaselineMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/BaselineMapper.java similarity index 74% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/baseline/dao/BaselineMapper.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/BaselineMapper.java index 964d205fdd..c7e77629a2 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/baseline/dao/BaselineMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/BaselineMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.baseline.dao; +package com.dianping.cat.core.mybatis.baseline.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.baseline.dao.data.BaselineDO; +import com.dianping.cat.core.mybatis.baseline.dao.data.BaselineDO; public interface BaselineMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/baseline/dao/data/BaselineDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/data/BaselineDO.java similarity index 81% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/baseline/dao/data/BaselineDO.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/data/BaselineDO.java index b0b2d00e88..7363c941d2 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/baseline/dao/data/BaselineDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/data/BaselineDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.baseline.dao.data; +package com.dianping.cat.core.mybatis.baseline.dao.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/config/modification/dao/ConfigModificationMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/ConfigModificationMapper.java similarity index 68% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/config/modification/dao/ConfigModificationMapper.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/ConfigModificationMapper.java index 19ae2f9937..ac0ff1a21a 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/config/modification/dao/ConfigModificationMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/ConfigModificationMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.config.modification.dao; +package com.dianping.cat.core.mybatis.config.modification.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.config.modification.dao.data.ConfigModificationDO; +import com.dianping.cat.core.mybatis.config.modification.dao.data.ConfigModificationDO; public interface ConfigModificationMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/config/modification/dao/data/ConfigModificationDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/data/ConfigModificationDO.java similarity index 79% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/config/modification/dao/data/ConfigModificationDO.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/data/ConfigModificationDO.java index bcd5534fe4..dc1edbf45c 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/config/modification/dao/data/ConfigModificationDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/data/ConfigModificationDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.config.modification.dao.data; +package com.dianping.cat.core.mybatis.config.modification.dao.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/graph/dao/MetricGraphMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/MetricGraphMapper.java similarity index 78% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/graph/dao/MetricGraphMapper.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/MetricGraphMapper.java index 33c4aeafb9..3e7cb0bb8f 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/graph/dao/MetricGraphMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/MetricGraphMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.metric.graph.dao; +package com.dianping.cat.core.mybatis.metric.graph.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.metric.graph.dao.data.MetricGraphDO; +import com.dianping.cat.core.mybatis.metric.graph.dao.data.MetricGraphDO; public interface MetricGraphMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/graph/dao/data/MetricGraphDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/data/MetricGraphDO.java similarity index 80% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/graph/dao/data/MetricGraphDO.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/data/MetricGraphDO.java index e43e3d728b..896d63ad32 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/graph/dao/data/MetricGraphDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/data/MetricGraphDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.metric.graph.dao.data; +package com.dianping.cat.core.mybatis.metric.graph.dao.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/screen/dao/MetricScreenMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/MetricScreenMapper.java similarity index 83% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/screen/dao/MetricScreenMapper.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/MetricScreenMapper.java index 461a4529c3..86879f8683 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/screen/dao/MetricScreenMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/MetricScreenMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.metric.screen.dao; +package com.dianping.cat.core.mybatis.metric.screen.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.metric.screen.dao.data.MetricScreenDO; +import com.dianping.cat.core.mybatis.metric.screen.dao.data.MetricScreenDO; public interface MetricScreenMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/screen/dao/data/MetricScreenDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/data/MetricScreenDO.java similarity index 82% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/screen/dao/data/MetricScreenDO.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/data/MetricScreenDO.java index a4c9e77038..1f9664e2d6 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/metric/screen/dao/data/MetricScreenDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/data/MetricScreenDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.metric.screen.dao.data; +package com.dianping.cat.core.mybatis.metric.screen.dao.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/overload/dao/OverloadMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/OverloadMapper.java similarity index 79% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/overload/dao/OverloadMapper.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/OverloadMapper.java index c925b28bdc..10ce211066 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/overload/dao/OverloadMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/OverloadMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.overload.dao; +package com.dianping.cat.core.mybatis.overload.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.overload.dao.data.OverloadDO; +import com.dianping.cat.core.mybatis.overload.dao.data.OverloadDO; public interface OverloadMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/overload/dao/data/OverloadDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/data/OverloadDO.java similarity index 85% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/overload/dao/data/OverloadDO.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/data/OverloadDO.java index a6e506f75d..a32ba8292e 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/overload/dao/data/OverloadDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/data/OverloadDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.overload.dao.data; +package com.dianping.cat.core.mybatis.overload.dao.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java index e43c8ff587..96a45f2df0 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java @@ -1,8 +1,8 @@ package com.dianping.cat.core.mybatis.repository.alert.summary; import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.generated.alert.summary.dao.AlertSummaryMapper; -import com.dianping.cat.core.mybatis.generated.alert.summary.dao.data.AlertSummaryDO; +import com.dianping.cat.core.mybatis.alert.summary.dao.AlertSummaryMapper; +import com.dianping.cat.core.mybatis.alert.summary.dao.data.AlertSummaryDO; import com.dianping.cat.home.dal.report.AlertSummary; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java index 518e363fdf..b6fcea0d35 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java @@ -1,8 +1,8 @@ package com.dianping.cat.core.mybatis.repository.alteration; import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.generated.alteration.dao.AlterationMapper; -import com.dianping.cat.core.mybatis.generated.alteration.dao.data.AlterationDO; +import com.dianping.cat.core.mybatis.alteration.dao.AlterationMapper; +import com.dianping.cat.core.mybatis.alteration.dao.data.AlterationDO; import com.dianping.cat.home.dal.report.Alteration; import java.util.List; import java.util.stream.Collectors; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java index 90e54c7941..f7f48e2f7c 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java @@ -1,8 +1,8 @@ package com.dianping.cat.core.mybatis.repository.baseline; import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.generated.baseline.dao.BaselineMapper; -import com.dianping.cat.core.mybatis.generated.baseline.dao.data.BaselineDO; +import com.dianping.cat.core.mybatis.baseline.dao.BaselineMapper; +import com.dianping.cat.core.mybatis.baseline.dao.data.BaselineDO; import com.dianping.cat.home.dal.report.Baseline; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java index 00fcff1ae7..f1ed4004df 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java @@ -1,8 +1,8 @@ package com.dianping.cat.core.mybatis.repository.config.modification; import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.generated.config.modification.dao.ConfigModificationMapper; -import com.dianping.cat.core.mybatis.generated.config.modification.dao.data.ConfigModificationDO; +import com.dianping.cat.core.mybatis.config.modification.dao.ConfigModificationMapper; +import com.dianping.cat.core.mybatis.config.modification.dao.data.ConfigModificationDO; import com.dianping.cat.home.dal.report.ConfigModification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java index 6fb65ecb31..b10f45fff8 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java @@ -1,8 +1,8 @@ package com.dianping.cat.core.mybatis.repository.metric.graph; import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.generated.metric.graph.dao.MetricGraphMapper; -import com.dianping.cat.core.mybatis.generated.metric.graph.dao.data.MetricGraphDO; +import com.dianping.cat.core.mybatis.metric.graph.dao.MetricGraphMapper; +import com.dianping.cat.core.mybatis.metric.graph.dao.data.MetricGraphDO; import com.dianping.cat.home.dal.report.MetricGraph; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java index cb0b4f5da9..8f9c4760fa 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java @@ -1,8 +1,8 @@ package com.dianping.cat.core.mybatis.repository.metric.screen; import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.generated.metric.screen.dao.MetricScreenMapper; -import com.dianping.cat.core.mybatis.generated.metric.screen.dao.data.MetricScreenDO; +import com.dianping.cat.core.mybatis.metric.screen.dao.MetricScreenMapper; +import com.dianping.cat.core.mybatis.metric.screen.dao.data.MetricScreenDO; import com.dianping.cat.home.dal.report.MetricScreen; import java.util.List; import java.util.stream.Collectors; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java index 75ea3037db..487ec8efc0 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java @@ -1,8 +1,8 @@ package com.dianping.cat.core.mybatis.repository.overload; import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.generated.overload.dao.OverloadMapper; -import com.dianping.cat.core.mybatis.generated.overload.dao.data.OverloadDO; +import com.dianping.cat.core.mybatis.overload.dao.OverloadMapper; +import com.dianping.cat.core.mybatis.overload.dao.data.OverloadDO; import com.dianping.cat.home.dal.report.Overload; import java.util.List; import java.util.stream.Collectors; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java index 205b58558e..facb692574 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java @@ -1,8 +1,8 @@ package com.dianping.cat.core.mybatis.repository.topologygraph; import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.generated.topologygraph.dao.TopologyGraphMapper; -import com.dianping.cat.core.mybatis.generated.topologygraph.dao.data.TopologyGraphDO; +import com.dianping.cat.core.mybatis.topologygraph.dao.TopologyGraphMapper; +import com.dianping.cat.core.mybatis.topologygraph.dao.data.TopologyGraphDO; import com.dianping.cat.home.dal.report.TopologyGraph; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/topologygraph/dao/TopologyGraphMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/TopologyGraphMapper.java similarity index 73% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/topologygraph/dao/TopologyGraphMapper.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/TopologyGraphMapper.java index 7a9fd0f3fa..6a9c5ba48a 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/topologygraph/dao/TopologyGraphMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/TopologyGraphMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.generated.topologygraph.dao; +package com.dianping.cat.core.mybatis.topologygraph.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.generated.topologygraph.dao.data.TopologyGraphDO; +import com.dianping.cat.core.mybatis.topologygraph.dao.data.TopologyGraphDO; public interface TopologyGraphMapper { int deleteByPrimaryKey(@Param("id") Integer id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/topologygraph/dao/data/TopologyGraphDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/data/TopologyGraphDO.java similarity index 77% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/topologygraph/dao/data/TopologyGraphDO.java rename to cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/data/TopologyGraphDO.java index b8a73933a6..763249a49a 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/generated/topologygraph/dao/data/TopologyGraphDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/data/TopologyGraphDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.generated.topologygraph.dao.data; +package com.dianping.cat.core.mybatis.topologygraph.dao.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index d90618b2d0..d7d73c4e4b 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -396,28 +396,28 @@ @MapperScan(basePackages = { "com.dianping.cat.core.config.dao", "com.dianping.cat.core.report.daily.dao", - "com.dianping.cat.core.mybatis.generated.hostinfo.dao", - "com.dianping.cat.core.mybatis.generated.hourlyreport.dao", - "com.dianping.cat.core.mybatis.generated.weeklyreport.dao", - "com.dianping.cat.core.mybatis.generated.monthreport.dao", - "com.dianping.cat.core.mybatis.generated.project.dao", - "com.dianping.cat.core.mybatis.generated.daily.report.content.dao", - "com.dianping.cat.core.mybatis.generated.hourly.report.content.dao", - "com.dianping.cat.core.mybatis.generated.weekly.report.content.dao", - "com.dianping.cat.core.mybatis.generated.monthly.report.content.dao", - "com.dianping.cat.core.mybatis.generated.business.config.dao", - "com.dianping.cat.core.mybatis.generated.task.dao", - "com.dianping.cat.core.mybatis.generated.alert.summary.dao", - "com.dianping.cat.core.mybatis.generated.config.modification.dao", - "com.dianping.cat.core.mybatis.generated.baseline.dao", - "com.dianping.cat.core.mybatis.generated.overload.dao", - "com.dianping.cat.core.mybatis.generated.topologygraph.dao", - "com.dianping.cat.core.mybatis.generated.metric.graph.dao", - "com.dianping.cat.core.mybatis.generated.metric.screen.dao", - "com.dianping.cat.core.mybatis.generated.alteration.dao", - "com.dianping.cat.core.mybatis.generated.alert.dao", - "com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao", - "com.dianping.cat.core.mybatis.generated.user.define.rule.dao" + "com.dianping.cat.core.mybatis.hostinfo.dao", + "com.dianping.cat.core.mybatis.hourlyreport.dao", + "com.dianping.cat.core.mybatis.weeklyreport.dao", + "com.dianping.cat.core.mybatis.monthreport.dao", + "com.dianping.cat.core.mybatis.project.dao", + "com.dianping.cat.core.mybatis.daily.report.content.dao", + "com.dianping.cat.core.mybatis.hourly.report.content.dao", + "com.dianping.cat.core.mybatis.weekly.report.content.dao", + "com.dianping.cat.core.mybatis.monthly.report.content.dao", + "com.dianping.cat.core.mybatis.business.config.dao", + "com.dianping.cat.core.mybatis.task.dao", + "com.dianping.cat.core.mybatis.alert.summary.dao", + "com.dianping.cat.core.mybatis.config.modification.dao", + "com.dianping.cat.core.mybatis.baseline.dao", + "com.dianping.cat.core.mybatis.overload.dao", + "com.dianping.cat.core.mybatis.topologygraph.dao", + "com.dianping.cat.core.mybatis.metric.graph.dao", + "com.dianping.cat.core.mybatis.metric.screen.dao", + "com.dianping.cat.core.mybatis.alteration.dao", + "com.dianping.cat.core.mybatis.alert.dao", + "com.dianping.cat.core.mybatis.server.alarm.rule.dao", + "com.dianping.cat.core.mybatis.user.define.rule.dao" }) public class CatHomeSpringConfiguration { @Bean diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java index c6736c7409..afad346ae5 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java @@ -7,28 +7,28 @@ import org.slf4j.LoggerFactory; import com.dianping.cat.core.config.dao.ConfigMapper; -import com.dianping.cat.core.mybatis.generated.alert.dao.AlertMapper; -import com.dianping.cat.core.mybatis.generated.alert.summary.dao.AlertSummaryMapper; -import com.dianping.cat.core.mybatis.generated.alteration.dao.AlterationMapper; -import com.dianping.cat.core.mybatis.generated.baseline.dao.BaselineMapper; -import com.dianping.cat.core.mybatis.generated.business.config.dao.BusinessConfigMapper; -import com.dianping.cat.core.mybatis.generated.config.modification.dao.ConfigModificationMapper; -import com.dianping.cat.core.mybatis.generated.daily.report.content.dao.DailyReportContentMapper; -import com.dianping.cat.core.mybatis.generated.hostinfo.dao.HostinfoMapper; -import com.dianping.cat.core.mybatis.generated.hourly.report.content.dao.HourlyReportContentMapper; -import com.dianping.cat.core.mybatis.generated.hourlyreport.dao.HourlyreportMapper; -import com.dianping.cat.core.mybatis.generated.metric.graph.dao.MetricGraphMapper; -import com.dianping.cat.core.mybatis.generated.metric.screen.dao.MetricScreenMapper; -import com.dianping.cat.core.mybatis.generated.monthly.report.content.dao.MonthlyReportContentMapper; -import com.dianping.cat.core.mybatis.generated.monthreport.dao.MonthreportMapper; -import com.dianping.cat.core.mybatis.generated.overload.dao.OverloadMapper; -import com.dianping.cat.core.mybatis.generated.project.dao.ProjectMapper; -import com.dianping.cat.core.mybatis.generated.server.alarm.rule.dao.ServerAlarmRuleMapper; -import com.dianping.cat.core.mybatis.generated.task.dao.TaskMapper; -import com.dianping.cat.core.mybatis.generated.topologygraph.dao.TopologyGraphMapper; -import com.dianping.cat.core.mybatis.generated.user.define.rule.dao.UserDefineRuleMapper; -import com.dianping.cat.core.mybatis.generated.weekly.report.content.dao.WeeklyReportContentMapper; -import com.dianping.cat.core.mybatis.generated.weeklyreport.dao.WeeklyreportMapper; +import com.dianping.cat.core.mybatis.alert.dao.AlertMapper; +import com.dianping.cat.core.mybatis.alert.summary.dao.AlertSummaryMapper; +import com.dianping.cat.core.mybatis.alteration.dao.AlterationMapper; +import com.dianping.cat.core.mybatis.baseline.dao.BaselineMapper; +import com.dianping.cat.core.mybatis.business.config.dao.BusinessConfigMapper; +import com.dianping.cat.core.mybatis.config.modification.dao.ConfigModificationMapper; +import com.dianping.cat.core.mybatis.daily.report.content.dao.DailyReportContentMapper; +import com.dianping.cat.core.mybatis.hostinfo.dao.HostinfoMapper; +import com.dianping.cat.core.mybatis.hourly.report.content.dao.HourlyReportContentMapper; +import com.dianping.cat.core.mybatis.hourlyreport.dao.HourlyreportMapper; +import com.dianping.cat.core.mybatis.metric.graph.dao.MetricGraphMapper; +import com.dianping.cat.core.mybatis.metric.screen.dao.MetricScreenMapper; +import com.dianping.cat.core.mybatis.monthly.report.content.dao.MonthlyReportContentMapper; +import com.dianping.cat.core.mybatis.monthreport.dao.MonthreportMapper; +import com.dianping.cat.core.mybatis.overload.dao.OverloadMapper; +import com.dianping.cat.core.mybatis.project.dao.ProjectMapper; +import com.dianping.cat.core.mybatis.server.alarm.rule.dao.ServerAlarmRuleMapper; +import com.dianping.cat.core.mybatis.task.dao.TaskMapper; +import com.dianping.cat.core.mybatis.topologygraph.dao.TopologyGraphMapper; +import com.dianping.cat.core.mybatis.user.define.rule.dao.UserDefineRuleMapper; +import com.dianping.cat.core.mybatis.weekly.report.content.dao.WeeklyReportContentMapper; +import com.dianping.cat.core.mybatis.weeklyreport.dao.WeeklyreportMapper; import com.dianping.cat.core.report.daily.dao.DailyReportMapper; public class CatHomeSpringStartupVerifier { diff --git a/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml b/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml index 2798bab185..f18662a43b 100644 --- a/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml @@ -1,54 +1,58 @@ - - - - - - - - - - - - id, - domain, - alert_time, - content, - creation_date - - - - INSERT INTO alert_summary - (domain, alert_time, content, creation_date) - VALUES - (#{domain}, #{alertTime}, #{content}, #{creationDate}) - - - - - - - - DELETE FROM alert_summary - WHERE id = #{id} - - - - UPDATE alert_summary - SET domain = #{domain}, - alert_time = #{alertTime}, - content = #{content}, - creation_date = #{creationDate} - WHERE id = #{id} - - + + + + + + + + + + + id , + domain , + alert_time , + content , + creation_date + + + + + id = #{id} , + domain = #{domain} , + alert_time = #{alertTime} , + content = #{content} , + creation_date = #{creationDate} + + + + + INSERT INTO alert_summary + + + + + + + + + delete from alert_summary where id = #{id} + + + + UPDATE alert_summary + + WHERE id = #{id} + + + \ No newline at end of file diff --git a/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml b/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml index 2f7630de3d..332a983347 100644 --- a/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml @@ -1,94 +1,98 @@ - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + id , + type , + title , + domain , + hostname , + ip , + date , + user , + alt_group , + content , + url , + status , + creation_date + - - id, - type, - title, - domain, - hostname, - ip, - date, - user, - alt_group, - content, - url, - status, - creation_date - + + + id = #{id} , + type = #{type} , + title = #{title} , + domain = #{domain} , + hostname = #{hostname} , + ip = #{ip} , + date = #{date} , + user = #{user} , + alt_group = #{altGroup} , + content = #{content} , + url = #{url} , + status = #{status} , + creation_date = #{creationDate} + + - - INSERT INTO alteration - (type, title, domain, hostname, ip, date, user, alt_group, content, url, status, creation_date) - VALUES - (#{type}, #{title}, #{domain}, #{hostname}, #{ip}, #{date}, #{user}, #{altGroup}, #{content}, #{url}, #{status}, #{creationDate}) - + + INSERT INTO alteration + + - + - + - - DELETE FROM alteration - WHERE id = #{id} - + + delete from alteration where id = #{id} + - - UPDATE alteration - SET type = #{type}, - title = #{title}, - domain = #{domain}, - hostname = #{hostname}, - ip = #{ip}, - date = #{date}, - user = #{user}, - alt_group = #{altGroup}, - content = #{content}, - url = #{url}, - status = #{status}, - creation_date = #{creationDate} - WHERE id = #{id} - + + UPDATE alteration + + WHERE id = #{id} + - + - + - + - - + + + \ No newline at end of file diff --git a/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml b/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml index 359508384c..2c52683d7e 100644 --- a/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml @@ -1,61 +1,65 @@ - - - - - - - - - - - - - id, - report_name, - index_key, - report_period, - data, - creation_date - - - - INSERT INTO baseline - (report_name, index_key, report_period, data, creation_date) - VALUES - (#{reportName}, #{indexKey}, #{reportPeriod}, #{data}, #{creationDate}) - - - - - - - - DELETE FROM baseline - WHERE id = #{id} - - - - UPDATE baseline - SET report_name = #{reportName}, - index_key = #{indexKey}, - report_period = #{reportPeriod}, - data = #{data}, - creation_date = #{creationDate} - WHERE id = #{id} - - - - + + + + + + + + + + + + id , + report_name , + index_key , + report_period , + data , + creation_date + + + + + id = #{id} , + report_name = #{reportName} , + index_key = #{indexKey} , + report_period = #{reportPeriod} , + data = #{data} , + creation_date = #{creationDate} + + + + + INSERT INTO baseline + + + + + + + + + delete from baseline where id = #{id} + + + + UPDATE baseline + + WHERE id = #{id} + + + + + \ No newline at end of file diff --git a/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml b/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml index a09a5edde8..e5204b99e5 100644 --- a/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml @@ -1,60 +1,64 @@ - - - - - - - - - - - - - - id, - user_name, - account_name, - action_name, - argument, - date, - creation_date - - - - INSERT INTO config_modification - (user_name, account_name, action_name, argument, date, creation_date) - VALUES - (#{userName}, #{accountName}, #{actionName}, #{argument}, #{date}, #{creationDate}) - - - - - - - - DELETE FROM config_modification - WHERE id = #{id} - - - - UPDATE config_modification - SET user_name = #{userName}, - account_name = #{accountName}, - action_name = #{actionName}, - argument = #{argument}, - date = #{date}, - creation_date = #{creationDate} - WHERE id = #{id} - - + + + + + + + + + + + + + id , + user_name , + account_name , + action_name , + argument , + date , + creation_date + + + + + id = #{id} , + user_name = #{userName} , + account_name = #{accountName} , + action_name = #{actionName} , + argument = #{argument} , + date = #{date} , + creation_date = #{creationDate} + + + + + INSERT INTO config_modification + + + + + + + + + delete from config_modification where id = #{id} + + + + UPDATE config_modification + + WHERE id = #{id} + + + \ No newline at end of file diff --git a/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml b/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml index e78cdbaad5..f2c2610c3f 100644 --- a/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml @@ -1,69 +1,73 @@ - + + + + + + + + + - - - - - - - - + + id , + graph_id , + name , + content , + creation_date , + updatetime + - - id, - graph_id, - name, - content, - creation_date, - updatetime - + + + id = #{id} , + graph_id = #{graphId} , + name = #{name} , + content = #{content} , + creation_date = #{creationDate} , + updatetime = #{updatetime} + + - - INSERT INTO metric_graph - (graph_id, name, content, creation_date, updatetime) - VALUES - (#{graphId}, #{name}, #{content}, #{creationDate}, #{updatetime}) - + + INSERT INTO metric_graph + + - + - + - - DELETE FROM metric_graph - WHERE id = #{id} - + + delete from metric_graph where id = #{id} + - - UPDATE metric_graph - SET graph_id = #{graphId}, - name = #{name}, - content = #{content}, - creation_date = #{creationDate}, - updatetime = #{updatetime} - WHERE id = #{id} - + + UPDATE metric_graph + + WHERE id = #{id} + - + - + - - DELETE FROM metric_graph WHERE creation_date < #{record.creationDate} - - + + DELETE from metric_graph where creation_date < #{record.creationDate} + + + \ No newline at end of file diff --git a/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml b/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml index 1aa1a2ac1d..5e8246ee56 100644 --- a/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml @@ -1,92 +1,96 @@ - + + + + + + + + + + + + - - - - - - - - - - - + + id , + name , + graph_name , + view , + endPoints , + measurements , + content , + creation_date , + updatetime + - - id, - name, - graph_name, - view, - endPoints, - measurements, - content, - creation_date, - updatetime - + + + id = #{id} , + name = #{name} , + graph_name = #{graphName} , + view = #{view} , + endPoints = #{endPoints} , + measurements = #{measurements} , + content = #{content} , + creation_date = #{creationDate} , + updatetime = #{updatetime} + + - - INSERT INTO metric_screen - (name, graph_name, view, endPoints, measurements, content, creation_date, updatetime) - VALUES - (#{name}, #{graphName}, #{view}, #{endPoints}, #{measurements}, #{content}, #{creationDate}, #{updatetime}) - + + INSERT INTO metric_screen + + - + - + - - DELETE FROM metric_screen - WHERE id = #{id} - + + delete from metric_screen where id = #{id} + - - UPDATE metric_screen - SET name = #{name}, - graph_name = #{graphName}, - view = #{view}, - endPoints = #{endPoints}, - measurements = #{measurements}, - content = #{content}, - creation_date = #{creationDate}, - updatetime = #{updatetime} - WHERE id = #{id} - + + UPDATE metric_screen + + WHERE id = #{id} + - + - + - + - - INSERT INTO metric_screen(id, name, graph_name, view, endPoints, measurements, content, creation_date, updatetime) - VALUES(#{record.id}, #{record.name}, #{record.graphName}, #{record.view}, #{record.endPoints}, #{record.measurements}, #{record.content}, #{record.creationDate}, #{record.updatetime}) - ON DUPLICATE KEY UPDATE view = #{record.view}, endPoints = #{record.endPoints}, measurements = #{record.measurements}, content = #{record.content} - + + INSERT INTO metric_screen(id, name, graph_name, view, endPoints, measurements, content, creation_date, updatetime) + values(#{record.id}, #{record.name}, #{record.graphName}, #{record.view}, #{record.endPoints}, #{record.measurements}, #{record.content}, #{record.creationDate}, #{record.updatetime}) + ON DUPLICATE KEY UPDATE view = #{record.view}, endPoints = #{record.endPoints}, measurements = #{record.measurements}, content = #{record.content} + - - DELETE FROM metric_screen WHERE name = #{record.name} - + + DELETE from metric_screen where name = #{record.name} + - - DELETE FROM metric_screen WHERE name = #{record.name} AND graph_name = #{record.graphName} - - + + DELETE from metric_screen where name = #{record.name} and graph_name = #{record.graphName} + + + \ No newline at end of file diff --git a/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml b/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml index fa450297cc..608bcbef77 100644 --- a/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml @@ -1,71 +1,75 @@ - + + + + + + + + + + + - - - - - - - - - - + + id , + report_id , + report_type , + report_size , + period , + creation_date + - - id, - report_id, - report_type, - report_size, - period, - creation_date - + + + id = #{id} , + report_id = #{reportId} , + report_type = #{reportType} , + report_size = #{reportSize} , + period = #{period} , + creation_date = #{creationDate} + + - - INSERT INTO overload - (report_id, report_type, report_size, period, creation_date) - VALUES - (#{reportId}, #{reportType}, #{reportSize}, #{period}, #{creationDate}) - + + INSERT INTO overload + + - + - + - - DELETE FROM overload - WHERE id = #{id} - + + delete from overload where id = #{id} + - - UPDATE overload - SET report_id = #{reportId}, - report_type = #{reportType}, - report_size = #{reportSize}, - period = #{period}, - creation_date = #{creationDate} - WHERE id = #{id} - + + UPDATE overload + + WHERE id = #{id} + - + - + - - + + + \ No newline at end of file diff --git a/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml b/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml index 16a2b5278a..623036199d 100644 --- a/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml @@ -1,61 +1,65 @@ - - - - - - - - - - - - - id, - ip, - period, - type, - content, - creation_date - - - - INSERT INTO topologyGraph - (ip, period, type, content, creation_date) - VALUES - (#{ip}, #{period}, #{type}, #{content}, #{creationDate}) - - - - - - - - DELETE FROM topologyGraph - WHERE id = #{id} - - - - UPDATE topologyGraph - SET ip = #{ip}, - period = #{period}, - type = #{type}, - content = #{content}, - creation_date = #{creationDate} - WHERE id = #{id} - - - - + + + + + + + + + + + + id , + ip , + period , + type , + content , + creation_date + + + + + id = #{id} , + ip = #{ip} , + period = #{period} , + type = #{type} , + content = #{content} , + creation_date = #{creationDate} + + + + + INSERT INTO topologyGraph + + + + + + + + + delete from topologyGraph where id = #{id} + + + + UPDATE topologyGraph + + WHERE id = #{id} + + + + + \ No newline at end of file From 3dbf7fecf64c954fde6876e6a04aa73eb98db8c3 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 21:59:35 +0800 Subject: [PATCH 146/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fdaily=5Freport?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dianping/cat/core/dal/DailyReport.java | 29 +++++++++------ .../cat/core/dal/DailyReportContent.java | 24 ++++++------- .../content/dao/DailyReportContentMapper.java | 4 +-- .../dao/data/DailyReportContentDO.java | 8 ++--- .../content/DailyReportContentRepository.java | 4 +-- .../report/daily/dao/DailyReportMapper.java | 4 +-- .../report/daily/dao/data/DailyReportDO.java | 4 +-- .../repository/DailyReportRepository.java | 6 ++-- .../report/service/AbstractReportService.java | 2 +- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/DailyReportMapper.xml | 22 ++++++------ .../cross/service/CrossReportService.java | 2 +- .../event/service/EventReportService.java | 2 +- .../service/HeartbeatReportService.java | 2 +- .../matrix/service/MatrixReportService.java | 2 +- .../overload/task/DailyCapacityUpdater.java | 12 ++++--- .../problem/service/ProblemReportService.java | 2 +- .../state/service/StateReportService.java | 2 +- .../service/ClientReportService.java | 2 +- .../service/HeavyReportService.java | 2 +- .../service/ServiceReportService.java | 2 +- .../service/UtilizationReportService.java | 2 +- .../storage/task/StorageReportService.java | 2 +- .../service/TransactionReportService.java | 2 +- .../router/service/RouterConfigService.java | 2 +- script/CatApplication.sql | 35 +++++++++++-------- 26 files changed, 100 insertions(+), 82 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReport.java b/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReport.java index cd0e8e81f2..cc994b7e0e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReport.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReport.java @@ -2,7 +2,7 @@ public class DailyReport { - private int m_id; + private long m_id; private String m_name; @@ -14,9 +14,9 @@ public class DailyReport { private int m_type; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private int m_keyId; + private long m_keyId; private int m_count; @@ -34,7 +34,11 @@ public int getCount() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public String getDomain() { @@ -45,7 +49,7 @@ public java.util.Date getEndDate() { return m_endDate; } - public int getId() { + public long getId() { return m_id; } @@ -53,7 +57,7 @@ public String getIp() { return m_ip; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } @@ -83,7 +87,12 @@ public DailyReport setCount(int count) { } public DailyReport setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public DailyReport setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -97,7 +106,7 @@ public DailyReport setEndDate(java.util.Date endDate) { return this; } - public DailyReport setId(int id) { + public DailyReport setId(long id) { m_id = id; m_keyId = id; return this; @@ -108,7 +117,7 @@ public DailyReport setIp(String ip) { return this; } - public DailyReport setKeyId(int keyId) { + public DailyReport setKeyId(long keyId) { m_keyId = keyId; return this; } @@ -144,7 +153,7 @@ public String toString() { sb.append("DailyReport["); sb.append("count: ").append(m_count); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", domain: ").append(m_domain); sb.append(", end-date: ").append(m_endDate); sb.append(", id: ").append(m_id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReportContent.java b/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReportContent.java index c213bad926..8f6075af99 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReportContent.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReportContent.java @@ -2,19 +2,19 @@ public class DailyReportContent { - private int m_reportId; + private long m_reportId; private byte[] m_content; private java.util.Date m_creationDate; - private int m_keyReportId; + private long m_keyReportId; private double m_contentLength; - private int m_startId; + private long m_startId; - private int m_endId; + private long m_endId; private double m_capacity; public void afterLoad() { @@ -37,19 +37,19 @@ public java.util.Date getCreationDate() { return m_creationDate; } - public int getEndId() { + public long getEndId() { return m_endId; } - public int getKeyReportId() { + public long getKeyReportId() { return m_keyReportId; } - public int getReportId() { + public long getReportId() { return m_reportId; } - public int getStartId() { + public long getStartId() { return m_startId; } @@ -73,23 +73,23 @@ public DailyReportContent setCreationDate(java.util.Date creationDate) { return this; } - public DailyReportContent setEndId(int endId) { + public DailyReportContent setEndId(long endId) { m_endId = endId; return this; } - public DailyReportContent setKeyReportId(int keyReportId) { + public DailyReportContent setKeyReportId(long keyReportId) { m_keyReportId = keyReportId; return this; } - public DailyReportContent setReportId(int reportId) { + public DailyReportContent setReportId(long reportId) { m_reportId = reportId; m_keyReportId = reportId; return this; } - public DailyReportContent setStartId(int startId) { + public DailyReportContent setStartId(long startId) { m_startId = startId; return this; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/DailyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/DailyReportContentMapper.java index 65734a08c1..4b125ed186 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/DailyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/DailyReportContentMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.daily.report.content.dao.data.DailyReportContentDO; public interface DailyReportContentMapper { - int deleteByPrimaryKey(@Param("reportId") Integer reportId); + int deleteByPrimaryKey(@Param("reportId") Long reportId); - DailyReportContentDO findByPrimaryKey(@Param("reportId") Integer reportId); + DailyReportContentDO findByPrimaryKey(@Param("reportId") Long reportId); int insert(DailyReportContentDO record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/data/DailyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/data/DailyReportContentDO.java index ff282baed5..316f8df70e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/data/DailyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/data/DailyReportContentDO.java @@ -6,7 +6,7 @@ @Data public class DailyReportContentDO { - private Integer reportId; + private Long reportId; private byte[] content; @@ -16,11 +16,11 @@ public class DailyReportContentDO { private Double contentLength; - private Integer keyReportId; + private Long keyReportId; - private Integer startId; + private Long startId; - private Integer endId; + private Long endId; private Double capacity; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java index cdf627dc16..f9b26d2966 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java @@ -37,7 +37,7 @@ public int deleteByPK(DailyReportContent proto) { } } - public List findOverloadReport(int startId) { + public List findOverloadReport(long startId) { DailyReportContentMapper mapper = springMapper(); DailyReportContentDO record = new DailyReportContentDO(); @@ -49,7 +49,7 @@ public List findOverloadReport(int startId) { } } - public DailyReportContent findByPK(int keyReportId) { + public DailyReportContent findByPK(long keyReportId) { DailyReportContentMapper mapper = springMapper(); try { diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/DailyReportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/DailyReportMapper.java index d3ba52091f..e5923a1e4d 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/DailyReportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/DailyReportMapper.java @@ -11,12 +11,12 @@ public interface DailyReportMapper { int deleteByDomainNamePeriod(@Param("domain") String domain, @Param("name") String name, @Param("period") Date period); - int deleteById(@Param("id") Integer id); + int deleteById(@Param("id") Long id); DailyReportDO findByDomainNamePeriod(@Param("domain") String domain, @Param("name") String name, @Param("period") Date period); - DailyReportDO findById(@Param("id") Integer id); + DailyReportDO findById(@Param("id") Long id); int insert(DailyReportDO report); diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/data/DailyReportDO.java b/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/data/DailyReportDO.java index e887233dec..61e83e0f36 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/data/DailyReportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/data/DailyReportDO.java @@ -6,7 +6,7 @@ @Data public class DailyReportDO { - private Integer id; + private Long id; private String name; @@ -18,5 +18,5 @@ public class DailyReportDO { private Integer type; - private Date creationDate; + private Date createTime; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java index 9fff9faf04..ecbe94761c 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java @@ -47,7 +47,7 @@ public DailyReport findByDomainNamePeriod(String domain, String name, java.util. domain + "/" + name + "/" + period); } - public DailyReport findByPK(int keyId) { + public DailyReport findByPK(long keyId) { DailyReportMapper mapper = springMapper(); return requireFound(mapper.findById(keyId), "id", String.valueOf(keyId)); @@ -124,7 +124,7 @@ private DailyReport toDailyReport(DailyReportDO reportDO) { report.setDomain(reportDO.getDomain()); report.setPeriod(reportDO.getPeriod()); report.setType(reportDO.getType()); - report.setCreationDate(reportDO.getCreationDate()); + report.setCreateTime(reportDO.getCreateTime()); report.afterLoad(); return report; } @@ -138,7 +138,7 @@ private DailyReportDO toDailyReportDO(DailyReport report) { reportDO.setDomain(report.getDomain()); reportDO.setPeriod(report.getPeriod()); reportDO.setType(report.getType()); - reportDO.setCreationDate(report.getCreationDate()); + reportDO.setCreateTime(report.getCreateTime()); return reportDO; } diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java index ab6e32b4ad..9e569a2e26 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java @@ -118,7 +118,7 @@ public boolean insertDailyReport(DailyReport report, byte[] content) { try { m_dailyReportDao.insert(report); - int id = report.getId(); + long id = report.getId(); DailyReportContent proto = m_dailyReportContentDao.createLocal(); proto.setReportId(id); diff --git a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml index f2c5422d66..eec21d1a66 100644 --- a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -13,7 +13,7 @@
-
+
diff --git a/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml index ecc45b45a1..b17dac3fce 100644 --- a/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ domain , period , type , - creation_date + create_time @@ -29,26 +29,26 @@ domain = #{domain} , period = #{period} , type = #{type} , - creation_date = #{creationDate} + create_time = #{createTime} - INSERT INTO dailyreport + INSERT INTO t_daily_report select - from dailyreport + from t_daily_report where domain = #{domain} and name = #{name} and BINARY(domain) = BINARY(#{domain}) @@ -67,11 +67,11 @@ - delete from dailyreport where id = #{id} + delete from t_daily_report where id = #{id} - DELETE from dailyreport + DELETE from t_daily_report where period = #{period} and domain = #{domain} and name = #{name} @@ -79,9 +79,9 @@ - UPDATE dailyreport + UPDATE t_daily_report WHERE id = #{id} - \ No newline at end of file + diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java index 814e1113e7..a69c6685c3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java @@ -82,7 +82,7 @@ public CrossReport queryDailyReport(String domain, Date start, Date end) { return crossReport; } - private CrossReport queryFromDailyBinary(int id, String domain) { + private CrossReport queryFromDailyBinary(long id, String domain) { DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java index 434d52e3ac..e8aebf3024 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java @@ -111,7 +111,7 @@ public EventReport queryDailyReport(String domain, Date start, Date end) { return convert(eventReport); } - private EventReport queryFromDailyBinary(int id, String domain) { + private EventReport queryFromDailyBinary(long id, String domain) { DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java index 64c84cb323..a6138dfffa 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java @@ -84,7 +84,7 @@ public HeartbeatReport queryDailyReport(String domain, Date start, Date end) { return heartbeatReport; } - private HeartbeatReport queryFromDailyBinary(int id, String domain) { + private HeartbeatReport queryFromDailyBinary(long id, String domain) { DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java index 0b4415ad48..453e5079e1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java @@ -82,7 +82,7 @@ public MatrixReport queryDailyReport(String domain, Date start, Date end) { return matrixReport; } - private MatrixReport queryFromDailyBinary(int id, String domain) { + private MatrixReport queryFromDailyBinary(long id, String domain) { DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java index 68d9d21ece..427f79c820 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java @@ -52,7 +52,7 @@ public String getId() { @Override public void updateDBCapacity() { - int maxId = m_manager.getDailyStatus(); + long maxId = m_manager.getDailyStatus(); LOGGER.info("Starting daily report capacity scan, startMaxId={}.", maxId); while (true) { @@ -61,13 +61,17 @@ public void updateDBCapacity() { for (DailyReportContent content : reports) { try { - int reportId = content.getReportId(); + long reportId = content.getReportId(); double contentLength = content.getContentLength(); if (contentLength >= CapacityUpdater.CAPACITY) { + if (reportId > Integer.MAX_VALUE) { + LOGGER.warn("Daily report id exceeds overload table capacity, reportId={}.", reportId); + continue; + } Overload overload = m_overloadDao.createLocal(); - overload.setReportId(reportId); + overload.setReportId((int) reportId); overload.setReportSize(contentLength); overload.setReportType(CapacityUpdater.DAILY_TYPE); @@ -96,7 +100,7 @@ public void updateDBCapacity() { maxId = reports.get(size - 1).getReportId(); } } - m_manager.updateDailyStatus(maxId); + m_manager.updateDailyStatus((int) Math.min(maxId, Integer.MAX_VALUE)); LOGGER.info("Finished daily report capacity scan, finalMaxId={}.", maxId); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java index 62add1d029..85a88383eb 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java @@ -85,7 +85,7 @@ public ProblemReport queryDailyReport(String domain, Date start, Date end) { return problemReport; } - private ProblemReport queryFromDailyBinary(int id, String domain) { + private ProblemReport queryFromDailyBinary(long id, String domain) { DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java index 239b2866d1..48fbf88e2e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java @@ -82,7 +82,7 @@ public StateReport queryDailyReport(String domain, Date start, Date end) { return stateReport; } - private StateReport queryFromDailyBinary(int id, String domain) { + private StateReport queryFromDailyBinary(long id, String domain) { DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java index dcc0ce6d07..b9e74fadf8 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ClientReportService.java @@ -66,7 +66,7 @@ public ClientReport queryDailyReport(String domain, Date start, Date end) { return report; } - private ClientReport queryFromDailyBinary(int id, String domain) { + private ClientReport queryFromDailyBinary(long id, String domain) { DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java index 03a55a93b0..8a69806b5b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java @@ -82,7 +82,7 @@ public HeavyReport queryDailyReport(String domain, Date start, Date end) { return heavyReport; } - private HeavyReport queryFromDailyBinary(int id, String domain) { + private HeavyReport queryFromDailyBinary(long id, String domain) { DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java index 7ec4d0d144..2f8a40e345 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java @@ -82,7 +82,7 @@ public ServiceReport queryDailyReport(String domain, Date start, Date end) { return serviceReport; } - private ServiceReport queryFromDailyBinary(int id, String domain) { + private ServiceReport queryFromDailyBinary(long id, String domain) { DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java index 758f453202..f4d811e06b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java @@ -81,7 +81,7 @@ public UtilizationReport queryDailyReport(String domain, Date start, Date end) { return utilizationReport; } - private UtilizationReport queryFromDailyBinary(int id, String domain) { + private UtilizationReport queryFromDailyBinary(long id, String domain) { DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java index ad36ef17ee..f497540a2e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java @@ -109,7 +109,7 @@ public StorageReport queryDailyReport(String id, Date start, Date end) { return storageReport; } - private StorageReport queryFromDailyBinary(int id, String domain) { + private StorageReport queryFromDailyBinary(long id, String domain) { DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java index 65a3a9aeed..2ec8e896fb 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java @@ -116,7 +116,7 @@ public TransactionReport queryDailyReport(String domain, Date start, Date end) { return convert(transactionReport); } - private TransactionReport queryFromDailyBinary(int id, String domain) { + private TransactionReport queryFromDailyBinary(long id, String domain) { DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java index 29ef929a5c..8483d9f676 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/service/RouterConfigService.java @@ -74,7 +74,7 @@ public RouterConfig queryDailyReport(String domain, Date start, Date end) { } } - private RouterConfig queryFromDailyBinary(int id) { + private RouterConfig queryFromDailyBinary(long id) { DailyReportContent content = m_dailyReportContentDao.findByPK(id); if (content != null) { diff --git a/script/CatApplication.sql b/script/CatApplication.sql index 987d2f589c..00b74c957c 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -1,14 +1,19 @@ -CREATE TABLE `dailyreport` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(20) NOT NULL COMMENT '报表名称, transaction, problem...', - `ip` varchar(50) NOT NULL COMMENT '报表来自于哪台cat-consumer机器', - `domain` varchar(50) NOT NULL COMMENT '报表处理的Domain信息', - `period` datetime NOT NULL COMMENT '报表时间段', - `type` tinyint(4) NOT NULL COMMENT '报表数据格式, 1/xml, 2/json, 默认1', - `creation_date` datetime NOT NULL COMMENT '报表创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `period` (`period`,`domain`,`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='天报表'; +CREATE TABLE `t_daily_report` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(20) NOT NULL DEFAULT '' COMMENT '报表名称, transaction, problem...', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT '报表来自于哪台cat-consumer机器', + `domain` varchar(50) NOT NULL DEFAULT '' COMMENT '报表处理的Domain信息', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '报表数据格式, 1/xml, 2/json, 默认1', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_period_domain_name` (`period`,`domain`,`name`), + KEY `idx_domain_name` (`domain`,`name`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='天报表'; CREATE TABLE `weeklyreport` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -69,7 +74,7 @@ CREATE TABLE `hourly_report_content` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='小时报表二进制内容'; CREATE TABLE `daily_report_content` ( - `report_id` int(11) NOT NULL COMMENT '报表ID', + `report_id` bigint NOT NULL COMMENT '报表ID', `content` longblob NOT NULL COMMENT '二进制报表内容', `period` datetime COMMENT '报表时间段', `creation_date` datetime NOT NULL COMMENT '创建时间', @@ -114,9 +119,9 @@ CREATE TABLE `task` ( `consumer` varchar(20) NULL COMMENT '任务执行者ip', `failure_count` tinyint(4) NOT NULL COMMENT '任务失败次数', `report_name` varchar(20) NOT NULL COMMENT '报表名称, transaction, problem...', - `report_domain` varchar(50) NOT NULL COMMENT '报表处理的Domain信息', + `report_domain` varchar(50) NOT NULL COMMENT '报表处理的Domain信息', `report_period` datetime NOT NULL COMMENT '报表时间', - `status` tinyint(4) NOT NULL COMMENT '执行状态: 1/todo, 2/doing, 3/done 4/failed', + `status` tinyint(4) NOT NULL COMMENT '执行状态: 1/todo, 2/doing, 3/done 4/failed', `task_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '0表示小时任务,1表示天任务', `creation_date` datetime NOT NULL COMMENT '任务创建时间', `start_date` datetime NULL COMMENT '开始时间, 这次执行开始时间', @@ -129,7 +134,7 @@ CREATE TABLE `project` ( `id` int(11) NOT NULL AUTO_INCREMENT, `domain` varchar(200) NOT NULL COMMENT '项目名称', `cmdb_domain` varchar(200) DEFAULT NULL COMMENT 'cmdb项目名称', - `level` int(5) DEFAULT NULL COMMENT '项目级别', + `level` int(5) DEFAULT NULL COMMENT '项目级别', `bu` varchar(50) DEFAULT NULL COMMENT 'CMDB事业部', `cmdb_productline` varchar(50) DEFAULT NULL COMMENT 'CMDB产品线', `owner` varchar(50) DEFAULT NULL COMMENT '项目负责人', From 2dc2f414a1d16b4df38ee46b4711c38b70a17bce Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 22:19:02 +0800 Subject: [PATCH 147/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fweekly=5Freport?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dianping/cat/core/dal/WeeklyReport.java | 29 ++++++++++++------- .../cat/core/dal/WeeklyReportContent.java | 18 ++++++------ .../WeeklyReportContentRepository.java | 4 +-- .../weeklyreport/WeeklyReportRepository.java | 8 ++--- .../dao/WeeklyReportContentMapper.java | 4 +-- .../dao/data/WeeklyReportContentDO.java | 6 ++-- .../weeklyreport/dao/WeeklyreportMapper.java | 4 +-- .../weeklyreport/dao/data/WeeklyreportDO.java | 6 ++-- .../report/service/AbstractReportService.java | 2 +- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/WeeklyreportMapper.xml | 22 +++++++------- .../cross/service/CrossReportService.java | 2 +- .../event/service/EventReportService.java | 2 +- .../matrix/service/MatrixReportService.java | 2 +- .../overload/task/WeeklyCapacityUpdater.java | 12 +++++--- .../problem/service/ProblemReportService.java | 2 +- .../state/service/StateReportService.java | 2 +- .../service/HeavyReportService.java | 2 +- .../service/ServiceReportService.java | 2 +- .../service/UtilizationReportService.java | 2 +- .../storage/task/StorageReportService.java | 2 +- .../service/TransactionReportService.java | 2 +- script/CatApplication.sql | 29 +++++++++++-------- 23 files changed, 92 insertions(+), 74 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReport.java b/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReport.java index 8b5abac830..e8b139992f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReport.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReport.java @@ -2,7 +2,7 @@ public class WeeklyReport { - private int m_id; + private long m_id; private String m_name; @@ -14,22 +14,26 @@ public class WeeklyReport { private int m_type; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private int m_keyId; + private long m_keyId; public void afterLoad() { m_keyId = m_id; } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public String getDomain() { return m_domain; } - public int getId() { + public long getId() { return m_id; } @@ -37,7 +41,7 @@ public String getIp() { return m_ip; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } @@ -54,7 +58,12 @@ public int getType() { } public WeeklyReport setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public WeeklyReport setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -63,7 +72,7 @@ public WeeklyReport setDomain(String domain) { return this; } - public WeeklyReport setId(int id) { + public WeeklyReport setId(long id) { m_id = id; m_keyId = id; return this; @@ -74,7 +83,7 @@ public WeeklyReport setIp(String ip) { return this; } - public WeeklyReport setKeyId(int keyId) { + public WeeklyReport setKeyId(long keyId) { m_keyId = keyId; return this; } @@ -99,7 +108,7 @@ public String toString() { StringBuilder sb = new StringBuilder(1024); sb.append("WeeklyReport["); - sb.append("creation-date: ").append(m_creationDate); + sb.append("create-time: ").append(m_createTime); sb.append(", domain: ").append(m_domain); sb.append(", id: ").append(m_id); sb.append(", ip: ").append(m_ip); diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReportContent.java b/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReportContent.java index af21f923e6..dc5c32d127 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReportContent.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReportContent.java @@ -2,19 +2,19 @@ public class WeeklyReportContent { - private int m_reportId; + private long m_reportId; private byte[] m_content; private java.util.Date m_creationDate; - private int m_keyReportId; + private long m_keyReportId; private double m_contentLength; private double m_capacity; - private int m_startId; + private long m_startId; public void afterLoad() { m_keyReportId = m_reportId; } @@ -35,15 +35,15 @@ public java.util.Date getCreationDate() { return m_creationDate; } - public int getKeyReportId() { + public long getKeyReportId() { return m_keyReportId; } - public int getReportId() { + public long getReportId() { return m_reportId; } - public int getStartId() { + public long getStartId() { return m_startId; } @@ -67,18 +67,18 @@ public WeeklyReportContent setCreationDate(java.util.Date creationDate) { return this; } - public WeeklyReportContent setKeyReportId(int keyReportId) { + public WeeklyReportContent setKeyReportId(long keyReportId) { m_keyReportId = keyReportId; return this; } - public WeeklyReportContent setReportId(int reportId) { + public WeeklyReportContent setReportId(long reportId) { m_reportId = reportId; m_keyReportId = reportId; return this; } - public WeeklyReportContent setStartId(int startId) { + public WeeklyReportContent setStartId(long startId) { m_startId = startId; return this; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java index 6eeed62587..9345e0ae4f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java @@ -37,7 +37,7 @@ public int deleteByPK(WeeklyReportContent proto) { } } - public List findOverloadReport(int startId) { + public List findOverloadReport(long startId) { WeeklyReportContentMapper mapper = springMapper(); WeeklyReportContentDO record = new WeeklyReportContentDO(); @@ -49,7 +49,7 @@ public List findOverloadReport(int startId) { } } - public WeeklyReportContent findByPK(int keyReportId) { + public WeeklyReportContent findByPK(long keyReportId) { WeeklyReportContentMapper mapper = springMapper(); try { diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java index e036e8d45c..636daf487b 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java @@ -37,7 +37,7 @@ public int deleteReportByDomainNamePeriod(WeeklyReport proto) { return transactionTemplate.execute(status -> springMapper().deleteReportByDomainNamePeriod(toRecord(proto))); } - public WeeklyReport findByPK(int keyId) { + public WeeklyReport findByPK(long keyId) { WeeklyreportMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); @@ -130,8 +130,8 @@ private WeeklyReport toModel(WeeklyreportDO record) { if (record.getType() != null) { model.setType(record.getType()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); } model.afterLoad(); return model; @@ -146,7 +146,7 @@ private WeeklyreportDO toRecord(WeeklyReport model) { record.setDomain(model.getDomain()); record.setPeriod(model.getPeriod()); record.setType(model.getType()); - record.setCreationDate(model.getCreationDate()); + record.setCreateTime(model.getCreateTime()); record.setKeyId(model.getKeyId()); return record; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/WeeklyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/WeeklyReportContentMapper.java index 961aee6f15..d2e6c4dbaa 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/WeeklyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/WeeklyReportContentMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.weekly.report.content.dao.data.WeeklyReportContentDO; public interface WeeklyReportContentMapper { - int deleteByPrimaryKey(@Param("reportId") Integer reportId); + int deleteByPrimaryKey(@Param("reportId") Long reportId); - WeeklyReportContentDO findByPrimaryKey(@Param("reportId") Integer reportId); + WeeklyReportContentDO findByPrimaryKey(@Param("reportId") Long reportId); int insert(WeeklyReportContentDO record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/data/WeeklyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/data/WeeklyReportContentDO.java index f60cf28d37..7db146e2dd 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/data/WeeklyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/data/WeeklyReportContentDO.java @@ -6,7 +6,7 @@ @Data public class WeeklyReportContentDO { - private Integer reportId; + private Long reportId; private byte[] content; @@ -16,9 +16,9 @@ public class WeeklyReportContentDO { private Double contentLength; - private Integer keyReportId; + private Long keyReportId; private Double capacity; - private Integer startId; + private Long startId; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/WeeklyreportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/WeeklyreportMapper.java index a38c7f22f7..14a6562d0f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/WeeklyreportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/WeeklyreportMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.weeklyreport.dao.data.WeeklyreportDO; public interface WeeklyreportMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - WeeklyreportDO findByPrimaryKey(@Param("id") Integer id); + WeeklyreportDO findByPrimaryKey(@Param("id") Long id); int insert(WeeklyreportDO record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/data/WeeklyreportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/data/WeeklyreportDO.java index f551251df9..4f36b118ff 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/data/WeeklyreportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/data/WeeklyreportDO.java @@ -6,7 +6,7 @@ @Data public class WeeklyreportDO { - private Integer id; + private Long id; private String name; @@ -18,7 +18,7 @@ public class WeeklyreportDO { private Integer type; - private Date creationDate; + private Date createTime; - private Integer keyId; + private Long keyId; } diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java index 9e569a2e26..54f40305d2 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java @@ -211,7 +211,7 @@ public boolean insertWeeklyReport(WeeklyReport report, byte[] content) { try { m_weeklyReportDao.insert(report); - int id = report.getId(); + long id = report.getId(); WeeklyReportContent proto = m_weeklyReportContentDao.createLocal(); proto.setReportId(id); diff --git a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml index eec21d1a66..b12569951d 100644 --- a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -14,7 +14,7 @@
-
+
diff --git a/cat-core/src/main/resources/mybatis/mapper/WeeklyreportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/WeeklyreportMapper.xml index aaeded2d1e..cd3986e357 100644 --- a/cat-core/src/main/resources/mybatis/mapper/WeeklyreportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/WeeklyreportMapper.xml @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ domain , period , type , - creation_date + create_time @@ -29,44 +29,44 @@ domain = #{domain} , period = #{period} , type = #{type} , - creation_date = #{creationDate} + create_time = #{createTime} - INSERT INTO weeklyreport + INSERT INTO t_weekly_report - delete from weeklyreport where id = #{id} + delete from t_weekly_report where id = #{id} - UPDATE weeklyreport + UPDATE t_weekly_report WHERE id = #{id} - DELETE from weeklyreport where period = #{record.period} and domain = #{record.domain} and name = #{record.name} + DELETE from t_weekly_report where period = #{record.period} and domain = #{record.domain} and name = #{record.name} - \ No newline at end of file + diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java index a69c6685c3..1cc311623e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java @@ -113,7 +113,7 @@ private CrossReport queryFromMonthlyBinary(int id, String domain) { } } - private CrossReport queryFromWeeklyBinary(int id, String domain) { + private CrossReport queryFromWeeklyBinary(long id, String domain) { WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java index e8aebf3024..73e6c8904a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java @@ -142,7 +142,7 @@ private EventReport queryFromMonthlyBinary(int id, String domain) { } } - private EventReport queryFromWeeklyBinary(int id, String domain) { + private EventReport queryFromWeeklyBinary(long id, String domain) { WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java index 453e5079e1..7a0f97b36f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java @@ -113,7 +113,7 @@ private MatrixReport queryFromMonthlyBinary(int id, String domain) { } } - private MatrixReport queryFromWeeklyBinary(int id, String domain) { + private MatrixReport queryFromWeeklyBinary(long id, String domain) { WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java index eb95158a8a..e775c69a2d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java @@ -52,7 +52,7 @@ public String getId() { @Override public void updateDBCapacity() { - int maxId = m_manager.getWeeklyStatus(); + long maxId = m_manager.getWeeklyStatus(); LOGGER.info("Starting weekly report capacity scan, startMaxId={}.", maxId); while (true) { @@ -61,13 +61,17 @@ public void updateDBCapacity() { for (WeeklyReportContent content : reports) { try { - int reportId = content.getReportId(); + long reportId = content.getReportId(); double contentLength = content.getContentLength(); if (contentLength >= CapacityUpdater.CAPACITY) { + if (reportId > Integer.MAX_VALUE) { + LOGGER.warn("Weekly report id exceeds overload table capacity, reportId={}.", reportId); + continue; + } Overload overload = m_overloadDao.createLocal(); - overload.setReportId(reportId); + overload.setReportId((int) reportId); overload.setReportSize(contentLength); overload.setReportType(CapacityUpdater.WEEKLY_TYPE); @@ -96,7 +100,7 @@ public void updateDBCapacity() { maxId = reports.get(size - 1).getReportId(); } } - m_manager.updateWeeklyStatus(maxId); + m_manager.updateWeeklyStatus((int) Math.min(maxId, Integer.MAX_VALUE)); LOGGER.info("Finished weekly report capacity scan, finalMaxId={}.", maxId); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java index 85a88383eb..f96e17b93d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java @@ -116,7 +116,7 @@ private ProblemReport queryFromMonthlyBinary(int id, String domain) { } } - private ProblemReport queryFromWeeklyBinary(int id, String domain) { + private ProblemReport queryFromWeeklyBinary(long id, String domain) { WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java index 48fbf88e2e..acd6a18218 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java @@ -113,7 +113,7 @@ private StateReport queryFromMonthlyBinary(int id, String domain) { } } - private StateReport queryFromWeeklyBinary(int id, String domain) { + private StateReport queryFromWeeklyBinary(long id, String domain) { WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java index 8a69806b5b..13c98c7cc1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java @@ -113,7 +113,7 @@ private HeavyReport queryFromMonthlyBinary(int id, String domain) { } } - private HeavyReport queryFromWeeklyBinary(int id, String domain) { + private HeavyReport queryFromWeeklyBinary(long id, String domain) { WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java index 2f8a40e345..9beee6c91d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java @@ -113,7 +113,7 @@ private ServiceReport queryFromMonthlyBinary(int id, String domain) { } } - private ServiceReport queryFromWeeklyBinary(int id, String domain) { + private ServiceReport queryFromWeeklyBinary(long id, String domain) { WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java index f4d811e06b..a83ac39f42 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java @@ -112,7 +112,7 @@ private UtilizationReport queryFromMonthlyBinary(int id, String domain) { } } - private UtilizationReport queryFromWeeklyBinary(int id, String domain) { + private UtilizationReport queryFromWeeklyBinary(long id, String domain) { WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java index f497540a2e..6a7af5e695 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java @@ -140,7 +140,7 @@ private StorageReport queryFromMonthlyBinary(int id, String reportId) { } } - private StorageReport queryFromWeeklyBinary(int id, String reportId) { + private StorageReport queryFromWeeklyBinary(long id, String reportId) { WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java index 2ec8e896fb..80fb463302 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java @@ -147,7 +147,7 @@ private TransactionReport queryFromMonthlyBinary(int id, String domain) { } } - private TransactionReport queryFromWeeklyBinary(int id, String domain) { + private TransactionReport queryFromWeeklyBinary(long id, String domain) { WeeklyReportContent content = m_weeklyReportContentDao.findByPK(id); if (content != null) { diff --git a/script/CatApplication.sql b/script/CatApplication.sql index 00b74c957c..01103da037 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -15,17 +15,22 @@ CREATE TABLE `t_daily_report` KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='天报表'; -CREATE TABLE `weeklyreport` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(20) NOT NULL COMMENT '报表名称, transaction, problem...', - `ip` varchar(50) NOT NULL COMMENT '报表来自于哪台cat-consumer机器', - `domain` varchar(50) NOT NULL COMMENT '报表处理的Domain信息', - `period` datetime NOT NULL COMMENT '报表时间段', - `type` tinyint(4) NOT NULL COMMENT '报表数据格式, 1/xml, 2/json, 默认1', - `creation_date` datetime NOT NULL COMMENT '报表创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `period` (`period`,`domain`,`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='周报表'; +CREATE TABLE `t_weekly_report` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(20) NOT NULL DEFAULT '' COMMENT '报表名称, transaction, problem...', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT '报表来自于哪台cat-consumer机器', + `domain` varchar(50) NOT NULL DEFAULT '' COMMENT '报表处理的Domain信息', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '报表数据格式, 1/xml, 2/json, 默认1', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_period_domain_name` (`period`,`domain`,`name`), + KEY `idx_domain_name` (`domain`,`name`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='周报表'; CREATE TABLE `monthreport` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -83,7 +88,7 @@ CREATE TABLE `daily_report_content` ( )ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='天报表二进制内容'; CREATE TABLE `weekly_report_content` ( - `report_id` int(11) NOT NULL COMMENT '报表ID', + `report_id` bigint NOT NULL COMMENT '报表ID', `content` longblob NOT NULL COMMENT '二进制报表内容', `period` datetime COMMENT '报表时间段', `creation_date` datetime NOT NULL COMMENT '创建时间', From cf299a6248b12a3df3f227557bd103c414c04f57 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 22:32:45 +0800 Subject: [PATCH 148/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fmonthly=5Freport?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dianping/cat/core/dal/MonthlyReport.java | 29 ++++++++++++------- .../cat/core/dal/MonthlyReportContent.java | 18 ++++++------ .../dao/MonthlyReportContentMapper.java | 4 +-- .../dao/data/MonthlyReportContentDO.java | 6 ++-- .../monthreport/dao/MonthreportMapper.java | 4 +-- .../monthreport/dao/data/MonthreportDO.java | 6 ++-- .../MonthlyReportContentRepository.java | 4 +-- .../monthreport/MonthlyReportRepository.java | 8 ++--- .../report/service/AbstractReportService.java | 2 +- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/MonthreportMapper.xml | 22 +++++++------- .../cross/service/CrossReportService.java | 2 +- .../event/service/EventReportService.java | 2 +- .../matrix/service/MatrixReportService.java | 2 +- .../overload/task/MonthlyCapacityUpdater.java | 12 +++++--- .../problem/service/ProblemReportService.java | 2 +- .../state/service/StateReportService.java | 2 +- .../service/HeavyReportService.java | 2 +- .../service/ServiceReportService.java | 2 +- .../service/UtilizationReportService.java | 2 +- .../storage/task/StorageReportService.java | 2 +- .../service/TransactionReportService.java | 2 +- script/CatApplication.sql | 29 +++++++++++-------- 23 files changed, 92 insertions(+), 74 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReport.java b/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReport.java index 74af07fd24..5e52e788fc 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReport.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReport.java @@ -2,7 +2,7 @@ public class MonthlyReport { - private int m_id; + private long m_id; private String m_name; @@ -14,22 +14,26 @@ public class MonthlyReport { private int m_type; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private int m_keyId; + private long m_keyId; public void afterLoad() { m_keyId = m_id; } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public String getDomain() { return m_domain; } - public int getId() { + public long getId() { return m_id; } @@ -37,7 +41,7 @@ public String getIp() { return m_ip; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } @@ -54,7 +58,12 @@ public int getType() { } public MonthlyReport setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public MonthlyReport setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -63,7 +72,7 @@ public MonthlyReport setDomain(String domain) { return this; } - public MonthlyReport setId(int id) { + public MonthlyReport setId(long id) { m_id = id; m_keyId = id; return this; @@ -74,7 +83,7 @@ public MonthlyReport setIp(String ip) { return this; } - public MonthlyReport setKeyId(int keyId) { + public MonthlyReport setKeyId(long keyId) { m_keyId = keyId; return this; } @@ -99,7 +108,7 @@ public String toString() { StringBuilder sb = new StringBuilder(1024); sb.append("MonthlyReport["); - sb.append("creation-date: ").append(m_creationDate); + sb.append("create-time: ").append(m_createTime); sb.append(", domain: ").append(m_domain); sb.append(", id: ").append(m_id); sb.append(", ip: ").append(m_ip); diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReportContent.java b/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReportContent.java index ebf86b94d1..a69b91a968 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReportContent.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReportContent.java @@ -2,19 +2,19 @@ public class MonthlyReportContent { - private int m_reportId; + private long m_reportId; private byte[] m_content; private java.util.Date m_creationDate; - private int m_keyReportId; + private long m_keyReportId; private double m_contentLength; private double m_capacity; - private int m_startId; + private long m_startId; public void afterLoad() { m_keyReportId = m_reportId; } @@ -35,15 +35,15 @@ public java.util.Date getCreationDate() { return m_creationDate; } - public int getKeyReportId() { + public long getKeyReportId() { return m_keyReportId; } - public int getReportId() { + public long getReportId() { return m_reportId; } - public int getStartId() { + public long getStartId() { return m_startId; } @@ -67,18 +67,18 @@ public MonthlyReportContent setCreationDate(java.util.Date creationDate) { return this; } - public MonthlyReportContent setKeyReportId(int keyReportId) { + public MonthlyReportContent setKeyReportId(long keyReportId) { m_keyReportId = keyReportId; return this; } - public MonthlyReportContent setReportId(int reportId) { + public MonthlyReportContent setReportId(long reportId) { m_reportId = reportId; m_keyReportId = reportId; return this; } - public MonthlyReportContent setStartId(int startId) { + public MonthlyReportContent setStartId(long startId) { m_startId = startId; return this; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/MonthlyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/MonthlyReportContentMapper.java index 28d72f02a7..a121c8fd05 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/MonthlyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/MonthlyReportContentMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.monthly.report.content.dao.data.MonthlyReportContentDO; public interface MonthlyReportContentMapper { - int deleteByPrimaryKey(@Param("reportId") Integer reportId); + int deleteByPrimaryKey(@Param("reportId") Long reportId); - MonthlyReportContentDO findByPrimaryKey(@Param("reportId") Integer reportId); + MonthlyReportContentDO findByPrimaryKey(@Param("reportId") Long reportId); int insert(MonthlyReportContentDO record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/data/MonthlyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/data/MonthlyReportContentDO.java index 04fafc2e25..8c967650ed 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/data/MonthlyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/data/MonthlyReportContentDO.java @@ -6,7 +6,7 @@ @Data public class MonthlyReportContentDO { - private Integer reportId; + private Long reportId; private byte[] content; @@ -16,9 +16,9 @@ public class MonthlyReportContentDO { private Double contentLength; - private Integer keyReportId; + private Long keyReportId; private Double capacity; - private Integer startId; + private Long startId; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/MonthreportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/MonthreportMapper.java index 62b85f98ec..c1ba59d794 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/MonthreportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/MonthreportMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.monthreport.dao.data.MonthreportDO; public interface MonthreportMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - MonthreportDO findByPrimaryKey(@Param("id") Integer id); + MonthreportDO findByPrimaryKey(@Param("id") Long id); int insert(MonthreportDO record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/data/MonthreportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/data/MonthreportDO.java index bbc5131fbf..0377d57618 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/data/MonthreportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/data/MonthreportDO.java @@ -6,7 +6,7 @@ @Data public class MonthreportDO { - private Integer id; + private Long id; private String name; @@ -18,7 +18,7 @@ public class MonthreportDO { private Integer type; - private Date creationDate; + private Date createTime; - private Integer keyId; + private Long keyId; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java index 379520f5cb..804dfcf59e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java @@ -37,7 +37,7 @@ public int deleteByPK(MonthlyReportContent proto) { } } - public List findOverloadReport(int startId) { + public List findOverloadReport(long startId) { MonthlyReportContentMapper mapper = springMapper(); MonthlyReportContentDO record = new MonthlyReportContentDO(); @@ -49,7 +49,7 @@ public List findOverloadReport(int startId) { } } - public MonthlyReportContent findByPK(int keyReportId) { + public MonthlyReportContent findByPK(long keyReportId) { MonthlyReportContentMapper mapper = springMapper(); try { diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java index fe245b3b8d..7ec0285969 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java @@ -37,7 +37,7 @@ public int deleteReportByDomainNamePeriod(MonthlyReport proto) { return transactionTemplate.execute(status -> springMapper().deleteReportByDomainNamePeriod(toRecord(proto))); } - public MonthlyReport findByPK(int keyId) { + public MonthlyReport findByPK(long keyId) { MonthreportMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); @@ -130,8 +130,8 @@ private MonthlyReport toModel(MonthreportDO record) { if (record.getType() != null) { model.setType(record.getType()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); } model.afterLoad(); return model; @@ -146,7 +146,7 @@ private MonthreportDO toRecord(MonthlyReport model) { record.setDomain(model.getDomain()); record.setPeriod(model.getPeriod()); record.setType(model.getType()); - record.setCreationDate(model.getCreationDate()); + record.setCreateTime(model.getCreateTime()); record.setKeyId(model.getKeyId()); return record; } diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java index 54f40305d2..dcdc793862 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java @@ -174,7 +174,7 @@ public boolean insertMonthlyReport(MonthlyReport report, byte[] content) { try { m_monthlyReportDao.insert(report); - int id = report.getId(); + long id = report.getId(); MonthlyReportContent proto = m_monthlyReportContentDao.createLocal(); proto.setReportId(id); diff --git a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml index b12569951d..bf00cf979b 100644 --- a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -15,7 +15,7 @@
-
+
diff --git a/cat-core/src/main/resources/mybatis/mapper/MonthreportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/MonthreportMapper.xml index a8a1eaf69e..88046435b6 100644 --- a/cat-core/src/main/resources/mybatis/mapper/MonthreportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/MonthreportMapper.xml @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ domain , period , type , - creation_date + create_time @@ -29,44 +29,44 @@ domain = #{domain} , period = #{period} , type = #{type} , - creation_date = #{creationDate} + create_time = #{createTime} - INSERT INTO monthreport + INSERT INTO t_monthly_report - delete from monthreport where id = #{id} + delete from t_monthly_report where id = #{id} - UPDATE monthreport + UPDATE t_monthly_report WHERE id = #{id} - DELETE from monthreport where period = #{record.period} and domain = #{record.domain} and name = #{record.name} + DELETE from t_monthly_report where period = #{record.period} and domain = #{record.domain} and name = #{record.name} - \ No newline at end of file + diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java index 1cc311623e..f91dae6ba5 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java @@ -103,7 +103,7 @@ private CrossReport queryFromHourlyBinary(int id, Date period, String domain) { } } - private CrossReport queryFromMonthlyBinary(int id, String domain) { + private CrossReport queryFromMonthlyBinary(long id, String domain) { MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java index 73e6c8904a..760a55a30c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java @@ -132,7 +132,7 @@ private EventReport queryFromHourlyBinary(int id, Date period, String domain) { } } - private EventReport queryFromMonthlyBinary(int id, String domain) { + private EventReport queryFromMonthlyBinary(long id, String domain) { MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java index 7a0f97b36f..6e1ac47ba2 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java @@ -103,7 +103,7 @@ private MatrixReport queryFromHourlyBinary(int id, Date period, String domain) { } } - private MatrixReport queryFromMonthlyBinary(int id, String domain) { + private MatrixReport queryFromMonthlyBinary(long id, String domain) { MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java index 4f33e2c5ca..2550076a5c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java @@ -52,7 +52,7 @@ public String getId() { @Override public void updateDBCapacity() { - int maxId = m_manager.getMonthlyStatus(); + long maxId = m_manager.getMonthlyStatus(); LOGGER.info("Starting monthly report capacity scan, startMaxId={}.", maxId); while (true) { @@ -61,13 +61,17 @@ public void updateDBCapacity() { for (MonthlyReportContent content : reports) { try { - int reportId = content.getReportId(); + long reportId = content.getReportId(); double contentLength = content.getContentLength(); if (contentLength >= CapacityUpdater.CAPACITY) { + if (reportId > Integer.MAX_VALUE) { + LOGGER.warn("Monthly report id exceeds overload table capacity, reportId={}.", reportId); + continue; + } Overload overload = m_overloadDao.createLocal(); - overload.setReportId(reportId); + overload.setReportId((int) reportId); overload.setReportSize(contentLength); overload.setReportType(CapacityUpdater.MONTHLY_TYPE); @@ -96,7 +100,7 @@ public void updateDBCapacity() { maxId = reports.get(size - 1).getReportId(); } } - m_manager.updateMonthlyStatus(maxId); + m_manager.updateMonthlyStatus((int) Math.min(maxId, Integer.MAX_VALUE)); LOGGER.info("Finished monthly report capacity scan, finalMaxId={}.", maxId); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java index f96e17b93d..2ee466ae30 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java @@ -106,7 +106,7 @@ private ProblemReport queryFromHourlyBinary(int id, Date period, String domain) } } - private ProblemReport queryFromMonthlyBinary(int id, String domain) { + private ProblemReport queryFromMonthlyBinary(long id, String domain) { MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java index acd6a18218..b2baf7bf27 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java @@ -103,7 +103,7 @@ private StateReport queryFromHourlyBinary(int id, Date period, String domain) { } } - private StateReport queryFromMonthlyBinary(int id, String domain) { + private StateReport queryFromMonthlyBinary(long id, String domain) { MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java index 13c98c7cc1..059e8db9a9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java @@ -103,7 +103,7 @@ private HeavyReport queryFromHourlyBinary(int id, Date period, String domain) { } } - private HeavyReport queryFromMonthlyBinary(int id, String domain) { + private HeavyReport queryFromMonthlyBinary(long id, String domain) { MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java index 9beee6c91d..84ea78de1d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java @@ -103,7 +103,7 @@ private ServiceReport queryFromHourlyBinary(int id, Date period, String domain) } } - private ServiceReport queryFromMonthlyBinary(int id, String domain) { + private ServiceReport queryFromMonthlyBinary(long id, String domain) { MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java index a83ac39f42..6187c5f739 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java @@ -102,7 +102,7 @@ private UtilizationReport queryFromHourlyBinary(int id, Date period, String doma } } - private UtilizationReport queryFromMonthlyBinary(int id, String domain) { + private UtilizationReport queryFromMonthlyBinary(long id, String domain) { MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java index 6a7af5e695..be228ad54d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java @@ -130,7 +130,7 @@ private StorageReport queryFromHourlyBinary(int id, Date period, String reportId } } - private StorageReport queryFromMonthlyBinary(int id, String reportId) { + private StorageReport queryFromMonthlyBinary(long id, String reportId) { MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java index 80fb463302..90ce139826 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java @@ -137,7 +137,7 @@ private TransactionReport queryFromHourlyBinary(int id, Date period, String doma } } - private TransactionReport queryFromMonthlyBinary(int id, String domain) { + private TransactionReport queryFromMonthlyBinary(long id, String domain) { MonthlyReportContent content = m_monthlyReportContentDao.findByPK(id); if (content != null) { diff --git a/script/CatApplication.sql b/script/CatApplication.sql index 01103da037..cc02ec954f 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -32,17 +32,22 @@ CREATE TABLE `t_weekly_report` KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='周报表'; -CREATE TABLE `monthreport` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(20) NOT NULL COMMENT '报表名称, transaction, problem...', - `ip` varchar(50) NOT NULL COMMENT '报表来自于哪台cat-consumer机器', - `domain` varchar(50) NOT NULL COMMENT '报表处理的Domain信息', - `period` datetime NOT NULL COMMENT '报表时间段', - `type` tinyint(4) NOT NULL COMMENT '报表数据格式, 1/xml, 2/json, 默认1', - `creation_date` datetime NOT NULL COMMENT '报表创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `period` (`period`,`domain`,`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='月报表'; +CREATE TABLE `t_monthly_report` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(20) NOT NULL DEFAULT '' COMMENT '报表名称, transaction, problem...', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT '报表来自于哪台cat-consumer机器', + `domain` varchar(50) NOT NULL DEFAULT '' COMMENT '报表处理的Domain信息', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '报表数据格式, 1/xml, 2/json, 默认1', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_period_domain_name` (`period`,`domain`,`name`), + KEY `idx_domain_name` (`domain`,`name`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='月报表'; CREATE TABLE `hostinfo` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -97,7 +102,7 @@ CREATE TABLE `weekly_report_content` ( )ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='周报表二进制内容'; CREATE TABLE `monthly_report_content` ( - `report_id` int(11) NOT NULL COMMENT '报表ID', + `report_id` bigint NOT NULL COMMENT '报表ID', `content` longblob NOT NULL COMMENT '二进制报表内容', `period` datetime COMMENT '报表时间段', `creation_date` datetime NOT NULL COMMENT '创建时间', From 466ea0688d4fecc946559e12a63e5695854ec6b3 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 22:46:01 +0800 Subject: [PATCH 149/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fhost=5Finfo?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dianping/cat/core/dal/Hostinfo.java | 46 +++++++++++++------ .../mybatis/hostinfo/dao/HostinfoMapper.java | 4 +- .../mybatis/hostinfo/dao/data/HostinfoDO.java | 8 ++-- .../hostinfo/HostinfoRepository.java | 14 +++--- .../dianping/cat/service/HostinfoService.java | 2 +- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/HostinfoMapper.xml | 28 +++++------ script/CatApplication.sql | 25 ++++++---- 8 files changed, 76 insertions(+), 53 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/Hostinfo.java b/cat-core/src/main/java/com/dianping/cat/core/dal/Hostinfo.java index aa6faa2ca5..d6f838f062 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/Hostinfo.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/Hostinfo.java @@ -2,7 +2,7 @@ public class Hostinfo { - private int m_id; + private long m_id; private String m_ip; @@ -10,17 +10,21 @@ public class Hostinfo { private String m_hostname; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private java.util.Date m_lastModifiedDate; + private java.util.Date m_updateTime; - private int m_keyId; + private long m_keyId; public void afterLoad() { m_keyId = m_id; } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public String getDomain() { @@ -31,7 +35,7 @@ public String getHostname() { return m_hostname; } - public int getId() { + public long getId() { return m_id; } @@ -39,16 +43,25 @@ public String getIp() { return m_ip; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } public java.util.Date getLastModifiedDate() { - return m_lastModifiedDate; + return m_updateTime; + } + + public java.util.Date getUpdateTime() { + return m_updateTime; } public Hostinfo setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public Hostinfo setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -62,7 +75,7 @@ public Hostinfo setHostname(String hostname) { return this; } - public Hostinfo setId(int id) { + public Hostinfo setId(long id) { m_id = id; m_keyId = id; return this; @@ -73,13 +86,18 @@ public Hostinfo setIp(String ip) { return this; } - public Hostinfo setKeyId(int keyId) { + public Hostinfo setKeyId(long keyId) { m_keyId = keyId; return this; } public Hostinfo setLastModifiedDate(java.util.Date lastModifiedDate) { - m_lastModifiedDate = lastModifiedDate; + m_updateTime = lastModifiedDate; + return this; + } + + public Hostinfo setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; return this; } @@ -88,13 +106,13 @@ public String toString() { StringBuilder sb = new StringBuilder(1024); sb.append("Hostinfo["); - sb.append("creation-date: ").append(m_creationDate); + sb.append("create-time: ").append(m_createTime); sb.append(", domain: ").append(m_domain); sb.append(", hostname: ").append(m_hostname); sb.append(", id: ").append(m_id); sb.append(", ip: ").append(m_ip); sb.append(", key-id: ").append(m_keyId); - sb.append(", last-modified-date: ").append(m_lastModifiedDate); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/HostinfoMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/HostinfoMapper.java index 020258b2e0..a0b8b82c6c 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/HostinfoMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/HostinfoMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.hostinfo.dao.data.HostinfoDO; public interface HostinfoMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - HostinfoDO findByPrimaryKey(@Param("id") Integer id); + HostinfoDO findByPrimaryKey(@Param("id") Long id); int insert(HostinfoDO record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/data/HostinfoDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/data/HostinfoDO.java index b65920e44f..e617bf0ad4 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/data/HostinfoDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/data/HostinfoDO.java @@ -6,7 +6,7 @@ @Data public class HostinfoDO { - private Integer id; + private Long id; private String ip; @@ -14,9 +14,9 @@ public class HostinfoDO { private String hostname; - private Date creationDate; + private Date createTime; - private Date lastModifiedDate; + private Date updateTime; - private Integer keyId; + private Long keyId; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java index f38c522783..12a3302251 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java @@ -42,7 +42,7 @@ public List findAllIp() { return mapper.findAllIp(record).stream().map(this::toModel).collect(Collectors.toList()); } - public Hostinfo findByPK(int keyId) { + public Hostinfo findByPK(long keyId) { HostinfoMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); @@ -136,11 +136,11 @@ private Hostinfo toModel(HostinfoDO record) { if (record.getHostname() != null) { model.setHostname(record.getHostname()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); } - if (record.getLastModifiedDate() != null) { - model.setLastModifiedDate(record.getLastModifiedDate()); + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); } model.afterLoad(); return model; @@ -153,8 +153,8 @@ private HostinfoDO toRecord(Hostinfo model) { record.setIp(model.getIp()); record.setDomain(model.getDomain()); record.setHostname(model.getHostname()); - record.setCreationDate(model.getCreationDate()); - record.setLastModifiedDate(model.getLastModifiedDate()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); return record; } diff --git a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java index de43c7d0a4..919e8f266b 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java @@ -228,7 +228,7 @@ protected void refresh() { } } - public boolean update(int id, String domain, String ip) { + public boolean update(long id, String domain, String ip) { ensureInitialized(); Hostinfo info = createLocal(); diff --git a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml index bf00cf979b..fde58616ad 100644 --- a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -9,7 +9,7 @@ useUnicode=true&autoReconnect=true -
+
diff --git a/cat-core/src/main/resources/mybatis/mapper/HostinfoMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HostinfoMapper.xml index 7751f8c362..28872e49ce 100644 --- a/cat-core/src/main/resources/mybatis/mapper/HostinfoMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/HostinfoMapper.xml @@ -6,8 +6,8 @@ - - + + @@ -15,8 +15,8 @@ ip , domain , hostname , - creation_date , - last_modified_date + create_time , + update_time @@ -25,45 +25,45 @@ ip = #{ip} , domain = #{domain} , hostname = #{hostname} , - creation_date = #{creationDate} , - last_modified_date = #{lastModifiedDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO hostinfo + INSERT INTO t_host_info - delete from hostinfo where id = #{id} + delete from t_host_info where id = #{id} - UPDATE hostinfo + UPDATE t_host_info WHERE id = #{id} - \ No newline at end of file + diff --git a/script/CatApplication.sql b/script/CatApplication.sql index cc02ec954f..0263b649dc 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -49,16 +49,21 @@ CREATE TABLE `t_monthly_report` KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='月报表'; -CREATE TABLE `hostinfo` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `ip` varchar(50) NOT NULL COMMENT '部署机器IP', - `domain` varchar(200) NOT NULL COMMENT '部署机器对应的项目名', - `hostname` varchar(200) DEFAULT NULL COMMENT '机器域名', - `creation_date` datetime NOT NULL, - `last_modified_date` datetime NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `ip_index` (`ip`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='IP和项目名的对应关系'; +CREATE TABLE `t_host_info` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT '部署机器IP', + `domain` varchar(200) NOT NULL DEFAULT '' COMMENT '部署机器对应的项目名', + `hostname` varchar(200) NOT NULL DEFAULT '' COMMENT '机器域名', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_ip` (`ip`), + KEY `idx_domain` (`domain`), + KEY `idx_hostname` (`hostname`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='IP和项目名的对应关系'; CREATE TABLE `hourlyreport` ( `id` int(11) NOT NULL AUTO_INCREMENT, From a3d368bc8a860b4e883af153a8d96873fc054274 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 22:54:54 +0800 Subject: [PATCH 150/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fhourly=5Freport?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dianping/cat/core/dal/HourlyReport.java | 29 +++++++++++------ .../cat/core/dal/HourlyReportContent.java | 18 +++++------ .../dao/HourlyReportContentMapper.java | 4 +-- .../dao/data/HourlyReportContentDO.java | 6 ++-- .../hourlyreport/dao/HourlyreportMapper.java | 4 +-- .../hourlyreport/dao/data/HourlyreportDO.java | 6 ++-- .../HourlyReportContentRepository.java | 4 +-- .../hourlyreport/HourlyReportRepository.java | 8 ++--- .../cat/report/DefaultReportManager.java | 2 +- .../report/service/AbstractReportService.java | 2 +- .../resources/META-INF/wizard/jdbc/wizard.xml | 3 +- .../mybatis/mapper/HourlyreportMapper.xml | 22 ++++++------- .../service/BusinessReportService.java | 2 +- .../cross/service/CrossReportService.java | 2 +- .../service/DependencyReportService.java | 2 +- .../event/service/EventReportService.java | 2 +- .../service/HeartbeatReportService.java | 2 +- .../matrix/service/MatrixReportService.java | 2 +- .../overload/task/HourlyCapacityUpdater.java | 12 ++++--- .../problem/service/ProblemReportService.java | 2 +- .../state/service/StateReportService.java | 2 +- .../service/HeavyReportService.java | 2 +- .../statistics/service/JarReportService.java | 2 +- .../service/ServiceReportService.java | 2 +- .../service/UtilizationReportService.java | 2 +- .../storage/task/StorageReportService.java | 2 +- .../page/top/service/TopReportService.java | 2 +- .../service/TransactionReportService.java | 2 +- .../task/reload/AbstractReportReloader.java | 2 +- script/CatApplication.sql | 32 +++++++++++-------- 30 files changed, 101 insertions(+), 83 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReport.java b/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReport.java index f9b67a6d90..6903b6618b 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReport.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReport.java @@ -2,7 +2,7 @@ public class HourlyReport { - private int m_id; + private long m_id; private int m_type; @@ -14,9 +14,9 @@ public class HourlyReport { private java.util.Date m_period; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private int m_keyId; + private long m_keyId; private java.util.Date m_startDate; @@ -26,7 +26,11 @@ public void afterLoad() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public String getDomain() { @@ -37,7 +41,7 @@ public java.util.Date getEndDate() { return m_endDate; } - public int getId() { + public long getId() { return m_id; } @@ -45,7 +49,7 @@ public String getIp() { return m_ip; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } @@ -66,7 +70,12 @@ public int getType() { } public HourlyReport setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public HourlyReport setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -80,7 +89,7 @@ public HourlyReport setEndDate(java.util.Date endDate) { return this; } - public HourlyReport setId(int id) { + public HourlyReport setId(long id) { m_id = id; m_keyId = id; return this; @@ -91,7 +100,7 @@ public HourlyReport setIp(String ip) { return this; } - public HourlyReport setKeyId(int keyId) { + public HourlyReport setKeyId(long keyId) { m_keyId = keyId; return this; } @@ -121,7 +130,7 @@ public String toString() { StringBuilder sb = new StringBuilder(1024); sb.append("HourlyReport["); - sb.append("creation-date: ").append(m_creationDate); + sb.append("create-time: ").append(m_createTime); sb.append(", domain: ").append(m_domain); sb.append(", end-date: ").append(m_endDate); sb.append(", id: ").append(m_id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReportContent.java b/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReportContent.java index 12f04b1b73..61997756f8 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReportContent.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReportContent.java @@ -2,7 +2,7 @@ public class HourlyReportContent { - private int m_reportId; + private long m_reportId; private byte[] m_content; @@ -10,11 +10,11 @@ public class HourlyReportContent { private java.util.Date m_creationDate; - private int m_keyReportId; + private long m_keyReportId; private long m_contentLength; - private int m_startId; + private long m_startId; private double m_capacity; public void afterLoad() { @@ -37,7 +37,7 @@ public java.util.Date getCreationDate() { return m_creationDate; } - public int getKeyReportId() { + public long getKeyReportId() { return m_keyReportId; } @@ -45,11 +45,11 @@ public java.util.Date getPeriod() { return m_period; } - public int getReportId() { + public long getReportId() { return m_reportId; } - public int getStartId() { + public long getStartId() { return m_startId; } @@ -73,7 +73,7 @@ public HourlyReportContent setCreationDate(java.util.Date creationDate) { return this; } - public HourlyReportContent setKeyReportId(int keyReportId) { + public HourlyReportContent setKeyReportId(long keyReportId) { m_keyReportId = keyReportId; return this; } @@ -83,13 +83,13 @@ public HourlyReportContent setPeriod(java.util.Date period) { return this; } - public HourlyReportContent setReportId(int reportId) { + public HourlyReportContent setReportId(long reportId) { m_reportId = reportId; m_keyReportId = reportId; return this; } - public HourlyReportContent setStartId(int startId) { + public HourlyReportContent setStartId(long startId) { m_startId = startId; return this; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/HourlyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/HourlyReportContentMapper.java index 262cf73ac6..0d309f7886 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/HourlyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/HourlyReportContentMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.hourly.report.content.dao.data.HourlyReportContentDO; public interface HourlyReportContentMapper { - int deleteByPrimaryKey(@Param("reportId") Integer reportId); + int deleteByPrimaryKey(@Param("reportId") Long reportId); - HourlyReportContentDO findByPrimaryKey(@Param("reportId") Integer reportId); + HourlyReportContentDO findByPrimaryKey(@Param("reportId") Long reportId); int insert(HourlyReportContentDO record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/data/HourlyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/data/HourlyReportContentDO.java index f19b9ba7b0..75bbbc33cc 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/data/HourlyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/data/HourlyReportContentDO.java @@ -6,7 +6,7 @@ @Data public class HourlyReportContentDO { - private Integer reportId; + private Long reportId; private byte[] content; @@ -16,9 +16,9 @@ public class HourlyReportContentDO { private Double contentLength; - private Integer keyReportId; + private Long keyReportId; - private Integer startId; + private Long startId; private Double capacity; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/HourlyreportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/HourlyreportMapper.java index 466ac6a385..a0ecc6633a 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/HourlyreportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/HourlyreportMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.hourlyreport.dao.data.HourlyreportDO; public interface HourlyreportMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - HourlyreportDO findByPrimaryKey(@Param("id") Integer id); + HourlyreportDO findByPrimaryKey(@Param("id") Long id); int insert(HourlyreportDO record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/data/HourlyreportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/data/HourlyreportDO.java index 2a45c22969..7adda56e4a 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/data/HourlyreportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/data/HourlyreportDO.java @@ -6,7 +6,7 @@ @Data public class HourlyreportDO { - private Integer id; + private Long id; private Integer type; @@ -18,7 +18,7 @@ public class HourlyreportDO { private Date period; - private Date creationDate; + private Date createTime; - private Integer keyId; + private Long keyId; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java index c1ea2de6ec..498c49fd28 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java @@ -37,7 +37,7 @@ public int deleteByPK(HourlyReportContent proto) { } } - public List findOverloadReport(int startId) { + public List findOverloadReport(long startId) { HourlyReportContentMapper mapper = springMapper(); HourlyReportContentDO record = new HourlyReportContentDO(); @@ -49,7 +49,7 @@ public List findOverloadReport(int startId) { } } - public HourlyReportContent findByPK(int keyReportId, java.util.Date period) { + public HourlyReportContent findByPK(long keyReportId, java.util.Date period) { HourlyReportContentMapper mapper = springMapper(); try { diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java index cfc01ed097..1991f646a5 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java @@ -52,7 +52,7 @@ public List findAllByPeriodName(java.util.Date period, String name return mapper.findAllByPeriodName(record).stream().map(this::toModel).collect(Collectors.toList()); } - public HourlyReport findByPK(int keyId) { + public HourlyReport findByPK(long keyId) { HourlyreportMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); @@ -133,8 +133,8 @@ private HourlyReport toModel(HourlyreportDO record) { if (record.getPeriod() != null) { model.setPeriod(record.getPeriod()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); } model.afterLoad(); return model; @@ -149,7 +149,7 @@ private HourlyreportDO toRecord(HourlyReport model) { record.setIp(model.getIp()); record.setDomain(model.getDomain()); record.setPeriod(model.getPeriod()); - record.setCreationDate(model.getCreationDate()); + record.setCreateTime(model.getCreateTime()); record.setKeyId(model.getKeyId()); return record; } diff --git a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java index 9a728a674e..ccabe01b83 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java +++ b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java @@ -258,7 +258,7 @@ private void storeDatabase(long startTime, Map reports) { m_reportDao.insert(r); - int id = r.getId(); + long id = r.getId(); byte[] binaryContent = m_reportDelegate.buildBinary(report); HourlyReportContent content = m_reportContentDao.createLocal(); diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java index dcdc793862..9c232bff82 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java @@ -137,7 +137,7 @@ public boolean insertHourlyReport(HourlyReport report, byte[] content) { try { m_hourlyReportDao.insert(report); - int id = report.getId(); + long id = report.getId(); HourlyReportContent proto = m_hourlyReportContentDao.createLocal(); proto.setReportId(id); diff --git a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml index fde58616ad..2d3b25a93c 100644 --- a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -12,7 +12,8 @@
-
+
+
diff --git a/cat-core/src/main/resources/mybatis/mapper/HourlyreportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HourlyreportMapper.xml index a4ca761897..98e1f00ec4 100644 --- a/cat-core/src/main/resources/mybatis/mapper/HourlyreportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/HourlyreportMapper.xml @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ ip , domain , period , - creation_date + create_time @@ -29,34 +29,34 @@ ip = #{ip} , domain = #{domain} , period = #{period} , - creation_date = #{creationDate} + create_time = #{createTime} - INSERT INTO hourlyreport + INSERT INTO t_hourly_report - delete from hourlyreport where id = #{id} + delete from t_hourly_report where id = #{id} - UPDATE hourlyreport + UPDATE t_hourly_report WHERE id = #{id} @@ -64,7 +64,7 @@ select - from hourlyreport + from t_hourly_report where period = #{record.period} and name = #{record.name} - \ No newline at end of file + diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java index b87051eb45..2d48543554 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/business/service/BusinessReportService.java @@ -87,7 +87,7 @@ public BusinessReport queryHourlyReport(String domain, Date start, Date end) { return businessReport; } - private BusinessReport queryFromHourlyBinary(int id, Date period, String domain) { + private BusinessReport queryFromHourlyBinary(long id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java index f91dae6ba5..287b365516 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/cross/service/CrossReportService.java @@ -92,7 +92,7 @@ private CrossReport queryFromDailyBinary(long id, String domain) { } } - private CrossReport queryFromHourlyBinary(int id, Date period, String domain) { + private CrossReport queryFromHourlyBinary(long id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java index 9305e639a1..b0141bd733 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/service/DependencyReportService.java @@ -52,7 +52,7 @@ public DependencyReport queryDailyReport(String domain, Date start, Date end) { throw new UnsupportedOperationException("Dependency report don't support daily report"); } - private DependencyReport queryFromHourlyBinary(int id, Date period, String domain) { + private DependencyReport queryFromHourlyBinary(long id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java index 760a55a30c..8ecd2dbab5 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/service/EventReportService.java @@ -121,7 +121,7 @@ private EventReport queryFromDailyBinary(long id, String domain) { } } - private EventReport queryFromHourlyBinary(int id, Date period, String domain) { + private EventReport queryFromHourlyBinary(long id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java index a6138dfffa..116fcd56ab 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/service/HeartbeatReportService.java @@ -94,7 +94,7 @@ private HeartbeatReport queryFromDailyBinary(long id, String domain) { } } - private HeartbeatReport queryFromHourlyBinary(int id, Date period, String domain) { + private HeartbeatReport queryFromHourlyBinary(long id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java index 6e1ac47ba2..01d6148f3e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/matrix/service/MatrixReportService.java @@ -92,7 +92,7 @@ private MatrixReport queryFromDailyBinary(long id, String domain) { } } - private MatrixReport queryFromHourlyBinary(int id, Date period, String domain) { + private MatrixReport queryFromHourlyBinary(long id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java index cb7d794f6d..a598efa451 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java @@ -52,7 +52,7 @@ public String getId() { @Override public void updateDBCapacity() { - int maxId = m_manager.getHourlyStatus(); + long maxId = m_manager.getHourlyStatus(); LOGGER.info("Starting hourly report capacity scan, startMaxId={}.", maxId); while (true) { @@ -61,13 +61,17 @@ public void updateDBCapacity() { for (HourlyReportContent content : reports) { try { - int reportId = content.getReportId(); + long reportId = content.getReportId(); double contentLength = content.getContentLength(); if (contentLength >= CapacityUpdater.CAPACITY) { + if (reportId > Integer.MAX_VALUE) { + LOGGER.warn("Hourly report id exceeds overload table capacity, reportId={}.", reportId); + continue; + } Overload overload = m_overloadDao.createLocal(); - overload.setReportId(reportId); + overload.setReportId((int) reportId); overload.setReportSize(contentLength); overload.setReportType(CapacityUpdater.HOURLY_TYPE); @@ -98,7 +102,7 @@ public void updateDBCapacity() { maxId = reports.get(size - 1).getReportId(); } } - m_manager.updateHourlyStatus(maxId); + m_manager.updateHourlyStatus((int) Math.min(maxId, Integer.MAX_VALUE)); LOGGER.info("Finished hourly report capacity scan, finalMaxId={}.", maxId); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java index 2ee466ae30..4a60612857 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/problem/service/ProblemReportService.java @@ -95,7 +95,7 @@ private ProblemReport queryFromDailyBinary(long id, String domain) { } } - private ProblemReport queryFromHourlyBinary(int id, Date period, String domain) { + private ProblemReport queryFromHourlyBinary(long id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java index b2baf7bf27..ab25db9fd8 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/state/service/StateReportService.java @@ -92,7 +92,7 @@ private StateReport queryFromDailyBinary(long id, String domain) { } } - private StateReport queryFromHourlyBinary(int id, Date period, String domain) { + private StateReport queryFromHourlyBinary(long id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java index 059e8db9a9..9a2a3b9698 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/HeavyReportService.java @@ -92,7 +92,7 @@ private HeavyReport queryFromDailyBinary(long id, String domain) { } } - private HeavyReport queryFromHourlyBinary(int id, Date period, String domain) { + private HeavyReport queryFromHourlyBinary(long id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java index 317c445862..2f777793e9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/JarReportService.java @@ -46,7 +46,7 @@ public JarReport queryDailyReport(String domain, Date start, Date end) { throw new RuntimeException("JarReportService do not suppot queryDailyReport feature"); } - private JarReport queryFromHourlyBinary(int id, Date period, String domain) { + private JarReport queryFromHourlyBinary(long id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java index 84ea78de1d..23959dbc42 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/ServiceReportService.java @@ -92,7 +92,7 @@ private ServiceReport queryFromDailyBinary(long id, String domain) { } } - private ServiceReport queryFromHourlyBinary(int id, Date period, String domain) { + private ServiceReport queryFromHourlyBinary(long id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java index 6187c5f739..f28b407fcb 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/statistics/service/UtilizationReportService.java @@ -91,7 +91,7 @@ private UtilizationReport queryFromDailyBinary(long id, String domain) { } } - private UtilizationReport queryFromHourlyBinary(int id, Date period, String domain) { + private UtilizationReport queryFromHourlyBinary(long id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java index be228ad54d..252831438a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/task/StorageReportService.java @@ -119,7 +119,7 @@ private StorageReport queryFromDailyBinary(long id, String domain) { } } - private StorageReport queryFromHourlyBinary(int id, Date period, String reportId) { + private StorageReport queryFromHourlyBinary(long id, Date period, String reportId) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java index a1d3ea698f..f3c39a4e19 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/top/service/TopReportService.java @@ -52,7 +52,7 @@ public TopReport queryDailyReport(String domain, Date start, Date end) { throw new RuntimeException("Top report don't support daily report"); } - private TopReport queryFromHourlyBinary(int id, Date period, String domain) { + private TopReport queryFromHourlyBinary(long id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java index 90ce139826..6bfb972449 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/service/TransactionReportService.java @@ -126,7 +126,7 @@ private TransactionReport queryFromDailyBinary(long id, String domain) { } } - private TransactionReport queryFromHourlyBinary(int id, Date period, String domain) { + private TransactionReport queryFromHourlyBinary(long id, Date period, String domain) { HourlyReportContent content = m_hourlyReportContentDao .findByPK(id, period); diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java index 3e9836137d..86b93a616d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java @@ -48,7 +48,7 @@ public boolean insertHourlyReport(ReportReloadEntity entity) { HourlyReport report = entity.getReport(); m_hourlyReportDao.insert(report); - int id = report.getId(); + long id = report.getId(); HourlyReportContent proto = m_hourlyReportContentDao.createLocal(); proto.setReportId(id); diff --git a/script/CatApplication.sql b/script/CatApplication.sql index 0263b649dc..40b871b6d8 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -65,22 +65,26 @@ CREATE TABLE `t_host_info` KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='IP和项目名的对应关系'; -CREATE TABLE `hourlyreport` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `type` tinyint(4) NOT NULL COMMENT '报表类型, 1/xml, 9/binary 默认1', - `name` varchar(20) NOT NULL COMMENT '报表名称', - `ip` varchar(50) DEFAULT NULL COMMENT '报表来自于哪台机器', - `domain` varchar(50) NOT NULL COMMENT '报表项目', - `period` datetime NOT NULL COMMENT '报表时间段', - `creation_date` datetime NOT NULL COMMENT '报表创建时间', - PRIMARY KEY (`id`), - KEY `IX_Domain_Name_Period` (`domain`,`name`,`period`), - KEY `IX_Name_Period` (`name`,`period`), - KEY `IX_Period` (`period`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='用于存放实时报表信息,处理之后的结果'; +CREATE TABLE `t_hourly_report` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '报表类型, 1/xml, 9/binary, 默认1', + `name` varchar(20) NOT NULL DEFAULT '' COMMENT '报表名称', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT '报表来自于哪台机器', + `domain` varchar(50) NOT NULL DEFAULT '' COMMENT '报表项目', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_domain_name_period` (`domain`,`name`,`period`), + KEY `idx_name_period` (`name`,`period`), + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='小时报表'; CREATE TABLE `hourly_report_content` ( - `report_id` int(11) NOT NULL COMMENT '报表ID', + `report_id` bigint NOT NULL COMMENT '报表ID', `content` longblob NOT NULL COMMENT '二进制报表内容', `period` datetime NOT NULL COMMENT '报表时间段', `creation_date` datetime NOT NULL COMMENT '创建时间', From 4b79212bb2aafe560d5aae20409cf7f8b0e91331 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 16 Jun 2026 23:05:37 +0800 Subject: [PATCH 151/231] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/core/dal/DailyReportContent.java | 29 ++++++- .../cat/core/dal/HourlyReportContent.java | 29 ++++++- .../cat/core/dal/MonthlyReportContent.java | 29 ++++++- .../cat/core/dal/WeeklyReportContent.java | 29 ++++++- .../dao/data/DailyReportContentDO.java | 4 +- .../dao/data/HourlyReportContentDO.java | 4 +- .../dao/data/MonthlyReportContentDO.java | 4 +- .../content/DailyReportContentRepository.java | 10 ++- .../HourlyReportContentRepository.java | 10 ++- .../MonthlyReportContentRepository.java | 10 ++- .../WeeklyReportContentRepository.java | 10 ++- .../dao/data/WeeklyReportContentDO.java | 4 +- .../resources/META-INF/wizard/jdbc/wizard.xml | 13 +-- .../mapper/DailyReportContentMapper.xml | 23 +++--- .../mapper/HourlyReportContentMapper.xml | 23 +++--- .../mapper/MonthlyReportContentMapper.xml | 23 +++--- .../mapper/WeeklyReportContentMapper.xml | 23 +++--- script/CatApplication.sql | 80 +++++++++++-------- 18 files changed, 247 insertions(+), 110 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReportContent.java b/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReportContent.java index 8f6075af99..47e83525a3 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReportContent.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/DailyReportContent.java @@ -6,7 +6,9 @@ public class DailyReportContent { private byte[] m_content; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; + + private java.util.Date m_updateTime; private long m_keyReportId; @@ -34,7 +36,11 @@ public double getContentLength() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public long getEndId() { @@ -53,6 +59,10 @@ public long getStartId() { return m_startId; } + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public DailyReportContent setCapacity(double capacity) { m_capacity = capacity; return this; @@ -69,7 +79,12 @@ public DailyReportContent setContentLength(double contentLength) { } public DailyReportContent setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public DailyReportContent setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -94,6 +109,11 @@ public DailyReportContent setStartId(long startId) { return this; } + public DailyReportContent setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); @@ -102,11 +122,12 @@ public String toString() { sb.append("capacity: ").append(m_capacity); sb.append(", content: ").append(m_content == null ? null : java.util.Arrays.asList(m_content)); sb.append(", content-length: ").append(m_contentLength); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", end-id: ").append(m_endId); sb.append(", key-report-id: ").append(m_keyReportId); sb.append(", report-id: ").append(m_reportId); sb.append(", start-id: ").append(m_startId); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReportContent.java b/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReportContent.java index 61997756f8..93e46252ee 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReportContent.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/HourlyReportContent.java @@ -8,7 +8,9 @@ public class HourlyReportContent { private java.util.Date m_period; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; + + private java.util.Date m_updateTime; private long m_keyReportId; @@ -34,7 +36,11 @@ public long getContentLength() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public long getKeyReportId() { @@ -53,6 +59,10 @@ public long getStartId() { return m_startId; } + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public HourlyReportContent setCapacity(double capacity) { m_capacity = capacity; return this; @@ -69,7 +79,12 @@ public HourlyReportContent setContentLength(long contentLength) { } public HourlyReportContent setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public HourlyReportContent setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -94,6 +109,11 @@ public HourlyReportContent setStartId(long startId) { return this; } + public HourlyReportContent setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); @@ -102,11 +122,12 @@ public String toString() { sb.append("capacity: ").append(m_capacity); sb.append(", content: ").append(m_content == null ? null : java.util.Arrays.asList(m_content)); sb.append(", content-length: ").append(m_contentLength); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", key-report-id: ").append(m_keyReportId); sb.append(", period: ").append(m_period); sb.append(", report-id: ").append(m_reportId); sb.append(", start-id: ").append(m_startId); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReportContent.java b/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReportContent.java index a69b91a968..a0effba35d 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReportContent.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/MonthlyReportContent.java @@ -6,7 +6,9 @@ public class MonthlyReportContent { private byte[] m_content; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; + + private java.util.Date m_updateTime; private long m_keyReportId; @@ -32,7 +34,11 @@ public double getContentLength() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public long getKeyReportId() { @@ -47,6 +53,10 @@ public long getStartId() { return m_startId; } + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public MonthlyReportContent setCapacity(double capacity) { m_capacity = capacity; return this; @@ -63,7 +73,12 @@ public MonthlyReportContent setContentLength(double contentLength) { } public MonthlyReportContent setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public MonthlyReportContent setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -83,6 +98,11 @@ public MonthlyReportContent setStartId(long startId) { return this; } + public MonthlyReportContent setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); @@ -91,10 +111,11 @@ public String toString() { sb.append("capacity: ").append(m_capacity); sb.append(", content: ").append(m_content == null ? null : java.util.Arrays.asList(m_content)); sb.append(", content-length: ").append(m_contentLength); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", key-report-id: ").append(m_keyReportId); sb.append(", report-id: ").append(m_reportId); sb.append(", start-id: ").append(m_startId); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReportContent.java b/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReportContent.java index dc5c32d127..0d5037024f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReportContent.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/WeeklyReportContent.java @@ -6,7 +6,9 @@ public class WeeklyReportContent { private byte[] m_content; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; + + private java.util.Date m_updateTime; private long m_keyReportId; @@ -32,7 +34,11 @@ public double getContentLength() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public long getKeyReportId() { @@ -47,6 +53,10 @@ public long getStartId() { return m_startId; } + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public WeeklyReportContent setCapacity(double capacity) { m_capacity = capacity; return this; @@ -63,7 +73,12 @@ public WeeklyReportContent setContentLength(double contentLength) { } public WeeklyReportContent setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public WeeklyReportContent setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -83,6 +98,11 @@ public WeeklyReportContent setStartId(long startId) { return this; } + public WeeklyReportContent setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); @@ -91,10 +111,11 @@ public String toString() { sb.append("capacity: ").append(m_capacity); sb.append(", content: ").append(m_content == null ? null : java.util.Arrays.asList(m_content)); sb.append(", content-length: ").append(m_contentLength); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", key-report-id: ").append(m_keyReportId); sb.append(", report-id: ").append(m_reportId); sb.append(", start-id: ").append(m_startId); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/data/DailyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/data/DailyReportContentDO.java index 316f8df70e..c88899c3ad 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/data/DailyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/data/DailyReportContentDO.java @@ -12,7 +12,9 @@ public class DailyReportContentDO { private Date period; - private Date creationDate; + private Date createTime; + + private Date updateTime; private Double contentLength; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/data/HourlyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/data/HourlyReportContentDO.java index 75bbbc33cc..b8cebb1a5f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/data/HourlyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/data/HourlyReportContentDO.java @@ -12,7 +12,9 @@ public class HourlyReportContentDO { private Date period; - private Date creationDate; + private Date createTime; + + private Date updateTime; private Double contentLength; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/data/MonthlyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/data/MonthlyReportContentDO.java index 8c967650ed..e0dbe4fe4c 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/data/MonthlyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/data/MonthlyReportContentDO.java @@ -12,7 +12,9 @@ public class MonthlyReportContentDO { private Date period; - private Date creationDate; + private Date createTime; + + private Date updateTime; private Double contentLength; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java index f9b26d2966..54f44f4899 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java @@ -123,8 +123,11 @@ private DailyReportContent toModel(DailyReportContentDO record) { if (record.getContent() != null) { model.setContent(record.getContent()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); + } + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); } if (record.getContentLength() != null) { model.setContentLength(record.getContentLength()); @@ -138,7 +141,8 @@ private DailyReportContentDO toRecord(DailyReportContent model) { record.setReportId(model.getReportId()); record.setContent(model.getContent()); - record.setCreationDate(model.getCreationDate()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyReportId(model.getKeyReportId()); record.setStartId(model.getStartId()); record.setEndId(model.getEndId()); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java index 498c49fd28..64e704c121 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java @@ -126,8 +126,11 @@ private HourlyReportContent toModel(HourlyReportContentDO record) { if (record.getPeriod() != null) { model.setPeriod(record.getPeriod()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); + } + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); } if (record.getContentLength() != null) { model.setContentLength(record.getContentLength().longValue()); @@ -142,7 +145,8 @@ private HourlyReportContentDO toRecord(HourlyReportContent model) { record.setReportId(model.getReportId()); record.setContent(model.getContent()); record.setPeriod(model.getPeriod()); - record.setCreationDate(model.getCreationDate()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyReportId(model.getKeyReportId()); record.setStartId(model.getStartId()); record.setCapacity(model.getCapacity()); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java index 804dfcf59e..5da5208419 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java @@ -123,8 +123,11 @@ private MonthlyReportContent toModel(MonthlyReportContentDO record) { if (record.getContent() != null) { model.setContent(record.getContent()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); + } + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); } if (record.getContentLength() != null) { model.setContentLength(record.getContentLength()); @@ -138,7 +141,8 @@ private MonthlyReportContentDO toRecord(MonthlyReportContent model) { record.setReportId(model.getReportId()); record.setContent(model.getContent()); - record.setCreationDate(model.getCreationDate()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyReportId(model.getKeyReportId()); record.setCapacity(model.getCapacity()); record.setStartId(model.getStartId()); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java index 9345e0ae4f..8e1a6932a7 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java @@ -123,8 +123,11 @@ private WeeklyReportContent toModel(WeeklyReportContentDO record) { if (record.getContent() != null) { model.setContent(record.getContent()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); + } + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); } if (record.getContentLength() != null) { model.setContentLength(record.getContentLength()); @@ -138,7 +141,8 @@ private WeeklyReportContentDO toRecord(WeeklyReportContent model) { record.setReportId(model.getReportId()); record.setContent(model.getContent()); - record.setCreationDate(model.getCreationDate()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyReportId(model.getKeyReportId()); record.setCapacity(model.getCapacity()); record.setStartId(model.getStartId()); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/data/WeeklyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/data/WeeklyReportContentDO.java index 7db146e2dd..83d7a92450 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/data/WeeklyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/data/WeeklyReportContentDO.java @@ -12,7 +12,9 @@ public class WeeklyReportContentDO { private Date period; - private Date creationDate; + private Date createTime; + + private Date updateTime; private Double contentLength; diff --git a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml index 2d3b25a93c..4cc8fddee5 100644 --- a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -18,12 +18,13 @@
-
-
-
-
-
- +
+
+
+
+
+
+
diff --git a/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml index 1b33fe24e9..5520afa0bf 100644 --- a/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml @@ -5,7 +5,8 @@ - + + @@ -13,7 +14,8 @@ report_id , content , period , - creation_date + create_time , + update_time @@ -21,39 +23,40 @@ report_id = #{reportId} , content = #{content} , period = #{period} , - creation_date = #{creationDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO daily_report_content + INSERT INTO t_daily_report_content - delete from daily_report_content where report_id = #{reportId} + delete from t_daily_report_content where report_id = #{reportId} - UPDATE daily_report_content + UPDATE t_daily_report_content WHERE report_id = #{reportId} - \ No newline at end of file + diff --git a/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml index d3c7181087..f16fc5dba3 100644 --- a/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml @@ -5,7 +5,8 @@ - + + @@ -13,7 +14,8 @@ report_id , content , period , - creation_date + create_time , + update_time @@ -21,39 +23,40 @@ report_id = #{reportId} , content = #{content} , period = #{period} , - creation_date = #{creationDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO hourly_report_content + INSERT INTO t_hourly_report_content - delete from hourly_report_content where report_id = #{reportId} + delete from t_hourly_report_content where report_id = #{reportId} - UPDATE hourly_report_content + UPDATE t_hourly_report_content WHERE report_id = #{reportId} - \ No newline at end of file + diff --git a/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml index f3b874ab02..cf918db424 100644 --- a/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml @@ -5,7 +5,8 @@ - + + @@ -13,7 +14,8 @@ report_id , content , period , - creation_date + create_time , + update_time @@ -21,39 +23,40 @@ report_id = #{reportId} , content = #{content} , period = #{period} , - creation_date = #{creationDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO monthly_report_content + INSERT INTO t_monthly_report_content - delete from monthly_report_content where report_id = #{reportId} + delete from t_monthly_report_content where report_id = #{reportId} - UPDATE monthly_report_content + UPDATE t_monthly_report_content WHERE report_id = #{reportId} - \ No newline at end of file + diff --git a/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml index e642c5d83e..fa52d33edf 100644 --- a/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml @@ -5,7 +5,8 @@ - + + @@ -13,7 +14,8 @@ report_id , content , period , - creation_date + create_time , + update_time @@ -21,39 +23,40 @@ report_id = #{reportId} , content = #{content} , period = #{period} , - creation_date = #{creationDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO weekly_report_content + INSERT INTO t_weekly_report_content - delete from weekly_report_content where report_id = #{reportId} + delete from t_weekly_report_content where report_id = #{reportId} - UPDATE weekly_report_content + UPDATE t_weekly_report_content WHERE report_id = #{reportId} - \ No newline at end of file + diff --git a/script/CatApplication.sql b/script/CatApplication.sql index 40b871b6d8..0a859544eb 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -83,41 +83,57 @@ CREATE TABLE `t_hourly_report` KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='小时报表'; -CREATE TABLE `hourly_report_content` ( - `report_id` bigint NOT NULL COMMENT '报表ID', - `content` longblob NOT NULL COMMENT '二进制报表内容', - `period` datetime NOT NULL COMMENT '报表时间段', - `creation_date` datetime NOT NULL COMMENT '创建时间', - PRIMARY KEY (`report_id`), - KEY `IX_Period` (`period`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='小时报表二进制内容'; +CREATE TABLE `t_hourly_report_content` +( + `report_id` bigint NOT NULL COMMENT '报表ID', + `content` longblob NOT NULL COMMENT '二进制报表内容', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`report_id`), + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='小时报表二进制内容'; -CREATE TABLE `daily_report_content` ( - `report_id` bigint NOT NULL COMMENT '报表ID', - `content` longblob NOT NULL COMMENT '二进制报表内容', - `period` datetime COMMENT '报表时间段', - `creation_date` datetime NOT NULL COMMENT '创建时间', - PRIMARY KEY (`report_id`), - KEY `IX_Period` (`period`) -)ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='天报表二进制内容'; +CREATE TABLE `t_daily_report_content` +( + `report_id` bigint NOT NULL COMMENT '报表ID', + `content` longblob NOT NULL COMMENT '二进制报表内容', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`report_id`), + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='天报表二进制内容'; -CREATE TABLE `weekly_report_content` ( - `report_id` bigint NOT NULL COMMENT '报表ID', - `content` longblob NOT NULL COMMENT '二进制报表内容', - `period` datetime COMMENT '报表时间段', - `creation_date` datetime NOT NULL COMMENT '创建时间', - PRIMARY KEY (`report_id`), - KEY `IX_Period` (`period`) -)ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='周报表二进制内容'; +CREATE TABLE `t_weekly_report_content` +( + `report_id` bigint NOT NULL COMMENT '报表ID', + `content` longblob NOT NULL COMMENT '二进制报表内容', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`report_id`), + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='周报表二进制内容'; -CREATE TABLE `monthly_report_content` ( - `report_id` bigint NOT NULL COMMENT '报表ID', - `content` longblob NOT NULL COMMENT '二进制报表内容', - `period` datetime COMMENT '报表时间段', - `creation_date` datetime NOT NULL COMMENT '创建时间', - PRIMARY KEY (`report_id`), - KEY `IX_Period` (`period`) -)ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='月报表二进制内容'; +CREATE TABLE `t_monthly_report_content` +( + `report_id` bigint NOT NULL COMMENT '报表ID', + `content` longblob NOT NULL COMMENT '二进制报表内容', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`report_id`), + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='月报表二进制内容'; CREATE TABLE `businessReport` ( `id` int(11) NOT NULL AUTO_INCREMENT, From 932b12e0022687150686e9aceadf3cc08f8abaf7 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 08:17:32 +0800 Subject: [PATCH 152/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fbusiness=5Freport?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../dao/BusinessReportMapper.java | 4 +-- .../dao/data/BusinessReportDO.java | 6 ++-- .../mybatis/mapper/BusinessReportMapper.xml | 27 ++++++++------- .../templates/configmap-cat-mysql-script.yaml | 33 +++++++++++-------- script/CatApplication.sql | 30 ++++++++++------- 6 files changed, 60 insertions(+), 42 deletions(-) diff --git a/cat-consumer/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-consumer/src/main/resources/META-INF/wizard/jdbc/wizard.xml index 6999990366..dcab81b1f6 100644 --- a/cat-consumer/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-consumer/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -9,7 +9,7 @@ useUnicode=true&autoReconnect=true -
+
diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/BusinessReportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/BusinessReportMapper.java index 5cd00e28a9..69edb0eb91 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/BusinessReportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/BusinessReportMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.businessreport.dao.data.BusinessReportDO; public interface BusinessReportMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - BusinessReportDO findByPrimaryKey(@Param("id") Integer id); + BusinessReportDO findByPrimaryKey(@Param("id") Long id); int insert(BusinessReportDO record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/data/BusinessReportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/data/BusinessReportDO.java index bc4bfdab7a..36f2f33f3d 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/data/BusinessReportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/data/BusinessReportDO.java @@ -6,7 +6,7 @@ @Data public class BusinessReportDO { - private Integer id; + private Long id; private Integer type; @@ -20,5 +20,7 @@ public class BusinessReportDO { private byte[] content; - private Date creationDate; + private Date createTime; + + private Date updateTime; } diff --git a/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml index e6b7a1db01..12b797ba98 100644 --- a/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml @@ -6,10 +6,11 @@ - + - + + @@ -17,10 +18,11 @@ type , name , ip , - productLine , + product_line , period , content , - creation_date + create_time , + update_time @@ -29,39 +31,40 @@ type = #{type} , name = #{name} , ip = #{ip} , - productLine = #{productLine} , + product_line = #{productLine} , period = #{period} , content = #{content} , - creation_date = #{creationDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO businessReport + INSERT INTO t_business_report - delete from businessReport where id = #{id} + delete from t_business_report where id = #{id} - UPDATE businessReport + UPDATE t_business_report WHERE id = #{id} - \ No newline at end of file + diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index 9b834c12dc..c5aa973760 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -102,18 +102,25 @@ data: KEY `IX_Period` (`period`) )ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='月报表二进制内容'; - CREATE TABLE `businessReport` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `type` tinyint(4) NOT NULL COMMENT '报表类型 报表数据格式, 1/Binary, 2/xml , 3/json', - `name` varchar(20) NOT NULL COMMENT '报表名称', - `ip` varchar(50) NOT NULL COMMENT '报表来自于哪台机器', - `productLine` varchar(50) NOT NULL COMMENT '指标来源于哪个产品组', - `period` datetime NOT NULL COMMENT '报表时间段', - `content` longblob COMMENT '用于存放报表的具体内容', - `creation_date` datetime NOT NULL COMMENT '报表创建时间', - PRIMARY KEY (`id`), - KEY `IX_Period_productLine_name` (`period`,`productLine`,`name`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='用于存放业务监控实时报表信息,处理之后的结果'; + CREATE TABLE `t_business_report` + ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '报表数据格式, 1/binary, 2/xml, 3/json', + `name` varchar(20) NOT NULL DEFAULT '' COMMENT '报表名称', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT '报表来源机器IP', + `product_line` varchar(50) NOT NULL DEFAULT '' COMMENT '业务指标来源产品线', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `content` longblob NOT NULL COMMENT '业务报表内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_period_product_line_name` (`period`,`product_line`,`name`), + KEY `idx_product_line_name_period` (`product_line`,`name`,`period`), + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='业务监控实时报表'; + CREATE TABLE `task` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -308,4 +315,4 @@ data: `updatetime` datetime NOT NULL COMMENT '配置修改时间', PRIMARY KEY (`id`), KEY `updatetime` (`updatetime`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统告警的配置'; \ No newline at end of file + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统告警的配置'; diff --git a/script/CatApplication.sql b/script/CatApplication.sql index 0a859544eb..ed67101243 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -135,18 +135,24 @@ CREATE TABLE `t_monthly_report_content` KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='月报表二进制内容'; -CREATE TABLE `businessReport` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `type` tinyint(4) NOT NULL COMMENT '报表类型 报表数据格式, 1/Binary, 2/xml , 3/json', - `name` varchar(20) NOT NULL COMMENT '报表名称', - `ip` varchar(50) NOT NULL COMMENT '报表来自于哪台机器', - `productLine` varchar(50) NOT NULL COMMENT '指标来源于哪个产品组', - `period` datetime NOT NULL COMMENT '报表时间段', - `content` longblob COMMENT '用于存放报表的具体内容', - `creation_date` datetime NOT NULL COMMENT '报表创建时间', - PRIMARY KEY (`id`), - KEY `IX_Period_productLine_name` (`period`,`productLine`,`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='用于存放业务监控实时报表信息,处理之后的结果'; +CREATE TABLE `t_business_report` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '报表数据格式, 1/binary, 2/xml, 3/json', + `name` varchar(20) NOT NULL DEFAULT '' COMMENT '报表名称', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT '报表来源机器IP', + `product_line` varchar(50) NOT NULL DEFAULT '' COMMENT '业务指标来源产品线', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `content` longblob NOT NULL COMMENT '业务报表内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_period_product_line_name` (`period`,`product_line`,`name`), + KEY `idx_product_line_name_period` (`product_line`,`name`,`period`), + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='业务监控实时报表'; CREATE TABLE `task` ( `id` int(11) NOT NULL AUTO_INCREMENT, From 753e4d633c6e8e22ebaba680a04509354d822e58 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 08:25:53 +0800 Subject: [PATCH 153/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Ftask=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dianping/cat/core/dal/Task.java | 75 ++++++++++++++----- .../repository/task/TaskRepository.java | 26 ++++--- .../cat/core/mybatis/task/dao/TaskMapper.java | 4 +- .../core/mybatis/task/dao/data/TaskDO.java | 12 +-- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../resources/mybatis/mapper/TaskMapper.xml | 45 +++++------ .../templates/configmap-cat-mysql-script.yaml | 39 ++++++---- script/CatApplication.sql | 39 ++++++---- 8 files changed, 154 insertions(+), 88 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/Task.java b/cat-core/src/main/java/com/dianping/cat/core/dal/Task.java index ae0581f8a9..1ce25e45be 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/Task.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/Task.java @@ -2,7 +2,7 @@ public class Task { - private int m_id; + private long m_id; private String m_producer; @@ -20,13 +20,15 @@ public class Task { private int m_taskType; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private java.util.Date m_startDate; + private java.util.Date m_startTime; - private java.util.Date m_endDate; + private java.util.Date m_endTime; - private int m_keyId; + private long m_keyId; + + private java.util.Date m_updateTime; private int m_count; @@ -46,11 +48,15 @@ public int getCount() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public java.util.Date getEndDate() { - return m_endDate; + return m_endTime; } public int getEndLimit() { @@ -61,11 +67,15 @@ public int getFailureCount() { return m_failureCount; } - public int getId() { + public java.util.Date getEndTime() { + return m_endTime; + } + + public long getId() { return m_id; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } @@ -86,7 +96,7 @@ public java.util.Date getReportPeriod() { } public java.util.Date getStartDate() { - return m_startDate; + return m_startTime; } public int getStartLimit() { @@ -101,6 +111,14 @@ public int getTaskType() { return m_taskType; } + public java.util.Date getStartTime() { + return m_startTime; + } + + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public Task setConsumer(String consumer) { m_consumer = consumer; return this; @@ -112,12 +130,17 @@ public Task setCount(int count) { } public Task setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public Task setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } public Task setEndDate(java.util.Date endDate) { - m_endDate = endDate; + m_endTime = endDate; return this; } @@ -131,13 +154,18 @@ public Task setFailureCount(int failureCount) { return this; } - public Task setId(int id) { + public Task setEndTime(java.util.Date endTime) { + m_endTime = endTime; + return this; + } + + public Task setId(long id) { m_id = id; m_keyId = id; return this; } - public Task setKeyId(int keyId) { + public Task setKeyId(long keyId) { m_keyId = keyId; return this; } @@ -163,7 +191,7 @@ public Task setReportPeriod(java.util.Date reportPeriod) { } public Task setStartDate(java.util.Date startDate) { - m_startDate = startDate; + m_startTime = startDate; return this; } @@ -182,6 +210,16 @@ public Task setTaskType(int taskType) { return this; } + public Task setStartTime(java.util.Date startTime) { + m_startTime = startTime; + return this; + } + + public Task setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); @@ -189,8 +227,8 @@ public String toString() { sb.append("Task["); sb.append("consumer: ").append(m_consumer); sb.append(", count: ").append(m_count); - sb.append(", creation-date: ").append(m_creationDate); - sb.append(", end-date: ").append(m_endDate); + sb.append(", create-time: ").append(m_createTime); + sb.append(", end-time: ").append(m_endTime); sb.append(", end-limit: ").append(m_endLimit); sb.append(", failure-count: ").append(m_failureCount); sb.append(", id: ").append(m_id); @@ -199,10 +237,11 @@ public String toString() { sb.append(", report-domain: ").append(m_reportDomain); sb.append(", report-name: ").append(m_reportName); sb.append(", report-period: ").append(m_reportPeriod); - sb.append(", start-date: ").append(m_startDate); + sb.append(", start-time: ").append(m_startTime); sb.append(", start-limit: ").append(m_startLimit); sb.append(", status: ").append(m_status); sb.append(", task-type: ").append(m_taskType); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java index 56551b017b..dc4f2e0f1a 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java @@ -32,6 +32,10 @@ public int deleteByPK(Task proto) { } public Task findByPK(int keyId) { + return findByPK((long) keyId); + } + + public Task findByPK(long keyId) { TaskMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); @@ -158,14 +162,17 @@ private Task toModel(TaskDO record) { if (record.getTaskType() != null) { model.setTaskType(record.getTaskType()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); + } + if (record.getStartTime() != null) { + model.setStartTime(record.getStartTime()); } - if (record.getStartDate() != null) { - model.setStartDate(record.getStartDate()); + if (record.getEndTime() != null) { + model.setEndTime(record.getEndTime()); } - if (record.getEndDate() != null) { - model.setEndDate(record.getEndDate()); + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); } if (record.getCount() != null) { model.setCount(record.getCount()); @@ -186,9 +193,10 @@ private TaskDO toRecord(Task model) { record.setReportPeriod(model.getReportPeriod()); record.setStatus(model.getStatus()); record.setTaskType(model.getTaskType()); - record.setCreationDate(model.getCreationDate()); - record.setStartDate(model.getStartDate()); - record.setEndDate(model.getEndDate()); + record.setCreateTime(model.getCreateTime()); + record.setStartTime(model.getStartTime()); + record.setEndTime(model.getEndTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); record.setStartLimit(model.getStartLimit()); record.setEndLimit(model.getEndLimit()); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/TaskMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/TaskMapper.java index 02486fde30..6855fb9afd 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/TaskMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/TaskMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.task.dao.data.TaskDO; public interface TaskMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - TaskDO findByPrimaryKey(@Param("id") Integer id); + TaskDO findByPrimaryKey(@Param("id") Long id); int insert(TaskDO record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/data/TaskDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/data/TaskDO.java index 7ea7258ed4..e5df513f89 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/data/TaskDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/data/TaskDO.java @@ -6,7 +6,7 @@ @Data public class TaskDO { - private Integer id; + private Long id; private String producer; @@ -24,15 +24,17 @@ public class TaskDO { private Integer taskType; - private Date creationDate; + private Date createTime; - private Date startDate; + private Date startTime; - private Date endDate; + private Date endTime; + + private Date updateTime; private Integer count; - private Integer keyId; + private Long keyId; private Integer startLimit; diff --git a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml index 4cc8fddee5..b1e2b7f074 100644 --- a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -10,7 +10,7 @@
-
+
diff --git a/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml b/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml index 02e083a095..3590597b9d 100644 --- a/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml @@ -11,9 +11,10 @@ - - - + + + + @@ -27,9 +28,10 @@ report_period , status , task_type , - creation_date , - start_date , - end_date + create_time , + start_time , + end_time , + update_time @@ -43,62 +45,63 @@ report_period = #{reportPeriod} , status = #{status} , task_type = #{taskType} , - creation_date = #{creationDate} , - start_date = #{startDate} , - end_date = #{endDate} + create_time = #{createTime} , + start_time = #{startTime} , + end_time = #{endTime} , + update_time = #{updateTime} - INSERT INTO task + INSERT INTO t_task - delete from task where id = #{id} + delete from t_task where id = #{id} - UPDATE task + UPDATE t_task WHERE id = #{id} - UPDATE task SET consumer=#{record.consumer}, status=2, start_date=#{record.startDate} where status = 1 and id = #{record.id} + UPDATE t_task SET consumer=#{record.consumer}, status=2, start_time=#{record.startTime} where status = 1 and id = #{record.id} - UPDATE task SET status=3, end_date=#{record.endDate} where status = 2 and id = #{record.id} + UPDATE t_task SET status=3, end_time=#{record.endTime} where status = 2 and id = #{record.id} - UPDATE task SET status=3, end_date=#{record.endDate} where status =4 and id = #{record.id} + UPDATE t_task SET status=3, end_time=#{record.endTime} where status =4 and id = #{record.id} - UPDATE task SET status=1, where id = #{record.id} + UPDATE t_task SET status=1 where id = #{record.id} - UPDATE task SET status=4, end_date=#{record.endDate}, failure_count = failure_count + 1 where status = 2 and id = #{record.id} + UPDATE t_task SET status=4, end_time=#{record.endTime}, failure_count = failure_count + 1 where status = 2 and id = #{record.id} - \ No newline at end of file + diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index c5aa973760..e31b4be572 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -122,22 +122,29 @@ data: ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='业务监控实时报表'; - CREATE TABLE `task` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `producer` varchar(20) NOT NULL COMMENT '任务创建者ip', - `consumer` varchar(20) NULL COMMENT '任务执行者ip', - `failure_count` tinyint(4) NOT NULL COMMENT '任务失败次数', - `report_name` varchar(20) NOT NULL COMMENT '报表名称, transaction, problem...', - `report_domain` varchar(50) NOT NULL COMMENT '报表处理的Domain信息', - `report_period` datetime NOT NULL COMMENT '报表时间', - `status` tinyint(4) NOT NULL COMMENT '执行状态: 1/todo, 2/doing, 3/done 4/failed', - `task_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '0表示小时任务,1表示天任务', - `creation_date` datetime NOT NULL COMMENT '任务创建时间', - `start_date` datetime NULL COMMENT '开始时间, 这次执行开始时间', - `end_date` datetime NULL COMMENT '结束时间, 这次执行结束时间', - PRIMARY KEY (`id`), - UNIQUE KEY `task_period_domain_name_type` (`report_period`,`report_domain`,`report_name`,`task_type`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='后台任务'; + CREATE TABLE `t_task` + ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `producer` varchar(50) NOT NULL DEFAULT '' COMMENT '任务创建机器IP', + `consumer` varchar(50) NOT NULL DEFAULT '' COMMENT '任务执行机器IP', + `failure_count` int NOT NULL DEFAULT '0' COMMENT '任务失败次数', + `report_name` varchar(20) NOT NULL DEFAULT '' COMMENT '报表名称, transaction, problem...', + `report_domain` varchar(50) NOT NULL DEFAULT '' COMMENT '报表所属Domain', + `report_period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间', + `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '执行状态, 1/todo, 2/doing, 3/done, 4/failed', + `task_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '任务类型, 0/hourly, 1/daily', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `start_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '执行开始时间', + `end_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '执行结束时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_report_period_domain_name_type` (`report_period`,`report_domain`,`report_name`,`task_type`), + KEY `idx_status_consumer` (`status`,`consumer`), + KEY `idx_report_period` (`report_period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台任务'; + CREATE TABLE `project` ( `id` int(11) NOT NULL AUTO_INCREMENT, diff --git a/script/CatApplication.sql b/script/CatApplication.sql index ed67101243..fae0bbefeb 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -154,22 +154,29 @@ CREATE TABLE `t_business_report` KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='业务监控实时报表'; -CREATE TABLE `task` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `producer` varchar(20) NOT NULL COMMENT '任务创建者ip', - `consumer` varchar(20) NULL COMMENT '任务执行者ip', - `failure_count` tinyint(4) NOT NULL COMMENT '任务失败次数', - `report_name` varchar(20) NOT NULL COMMENT '报表名称, transaction, problem...', - `report_domain` varchar(50) NOT NULL COMMENT '报表处理的Domain信息', - `report_period` datetime NOT NULL COMMENT '报表时间', - `status` tinyint(4) NOT NULL COMMENT '执行状态: 1/todo, 2/doing, 3/done 4/failed', - `task_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '0表示小时任务,1表示天任务', - `creation_date` datetime NOT NULL COMMENT '任务创建时间', - `start_date` datetime NULL COMMENT '开始时间, 这次执行开始时间', - `end_date` datetime NULL COMMENT '结束时间, 这次执行结束时间', - PRIMARY KEY (`id`), - UNIQUE KEY `task_period_domain_name_type` (`report_period`,`report_domain`,`report_name`,`task_type`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='后台任务'; +CREATE TABLE `t_task` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `producer` varchar(50) NOT NULL DEFAULT '' COMMENT '任务创建机器IP', + `consumer` varchar(50) NOT NULL DEFAULT '' COMMENT '任务执行机器IP', + `failure_count` int NOT NULL DEFAULT '0' COMMENT '任务失败次数', + `report_name` varchar(20) NOT NULL DEFAULT '' COMMENT '报表名称, transaction, problem...', + `report_domain` varchar(50) NOT NULL DEFAULT '' COMMENT '报表所属Domain', + `report_period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间', + `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '执行状态, 1/todo, 2/doing, 3/done, 4/failed', + `task_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '任务类型, 0/hourly, 1/daily', + `start_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '执行开始时间', + `end_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '执行结束时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_report_period_domain_name_type` (`report_period`,`report_domain`,`report_name`,`task_type`), + KEY `idx_status_consumer` (`status`,`consumer`), + KEY `idx_report_period` (`report_period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台任务'; + CREATE TABLE `project` ( `id` int(11) NOT NULL AUTO_INCREMENT, From 82e1032c3eefb4076762d39e2072dea7e71b1456 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 08:35:27 +0800 Subject: [PATCH 154/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fproject=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dianping/cat/core/dal/Project.java | 46 +++++++++++++------ .../mybatis/project/dao/ProjectMapper.java | 4 +- .../mybatis/project/dao/data/ProjectDO.java | 8 ++-- .../repository/project/ProjectRepository.java | 16 ++++--- .../dianping/cat/service/ProjectService.java | 2 +- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/ProjectMapper.xml | 36 +++++++-------- .../templates/configmap-cat-mysql-script.yaml | 36 +++++++++------ script/CatApplication.sql | 36 +++++++++------ 9 files changed, 110 insertions(+), 76 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/core/dal/Project.java b/cat-core/src/main/java/com/dianping/cat/core/dal/Project.java index cf77e10d6c..bf5a6bef46 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/dal/Project.java +++ b/cat-core/src/main/java/com/dianping/cat/core/dal/Project.java @@ -2,7 +2,7 @@ public class Project { - private int m_id; + private long m_id; private String m_domain; @@ -20,11 +20,11 @@ public class Project { private String m_phone; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private java.util.Date m_modifyDate; + private java.util.Date m_updateTime; - private int m_keyId; + private long m_keyId; public void afterLoad() { m_keyId = m_id; } @@ -42,7 +42,11 @@ public String getCmdbProductline() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public String getDomain() { @@ -53,11 +57,11 @@ public String getEmail() { return m_email; } - public int getId() { + public long getId() { return m_id; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } @@ -66,7 +70,7 @@ public int getLevel() { } public java.util.Date getModifyDate() { - return m_modifyDate; + return m_updateTime; } public String getOwner() { @@ -77,6 +81,10 @@ public String getPhone() { return m_phone; } + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public Project setBu(String bu) { m_bu = bu; return this; @@ -93,7 +101,12 @@ public Project setCmdbProductline(String cmdbProductline) { } public Project setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public Project setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -107,13 +120,13 @@ public Project setEmail(String email) { return this; } - public Project setId(int id) { + public Project setId(long id) { m_id = id; m_keyId = id; return this; } - public Project setKeyId(int keyId) { + public Project setKeyId(long keyId) { m_keyId = keyId; return this; } @@ -124,7 +137,7 @@ public Project setLevel(int level) { } public Project setModifyDate(java.util.Date modifyDate) { - m_modifyDate = modifyDate; + m_updateTime = modifyDate; return this; } @@ -138,6 +151,11 @@ public Project setPhone(String phone) { return this; } + public Project setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); @@ -146,15 +164,15 @@ public String toString() { sb.append("bu: ").append(m_bu); sb.append(", cmdb-domain: ").append(m_cmdbDomain); sb.append(", cmdb-productline: ").append(m_cmdbProductline); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", domain: ").append(m_domain); sb.append(", email: ").append(m_email); sb.append(", id: ").append(m_id); sb.append(", key-id: ").append(m_keyId); sb.append(", level: ").append(m_level); - sb.append(", modify-date: ").append(m_modifyDate); sb.append(", owner: ").append(m_owner); sb.append(", phone: ").append(m_phone); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/ProjectMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/ProjectMapper.java index ef973cb762..c34c8f21b8 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/ProjectMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/ProjectMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.project.dao.data.ProjectDO; public interface ProjectMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - ProjectDO findByPrimaryKey(@Param("id") Integer id); + ProjectDO findByPrimaryKey(@Param("id") Long id); int insert(ProjectDO record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/data/ProjectDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/data/ProjectDO.java index 4b74378fc2..6d803e0c2c 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/data/ProjectDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/data/ProjectDO.java @@ -6,7 +6,7 @@ @Data public class ProjectDO { - private Integer id; + private Long id; private String domain; @@ -24,9 +24,9 @@ public class ProjectDO { private String phone; - private Date creationDate; + private Date createTime; - private Date modifyDate; + private Date updateTime; - private Integer keyId; + private Long keyId; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java index b147454129..d7bbb6e75f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java @@ -42,6 +42,10 @@ public List findAll() { } public Project findByPK(int keyId) { + return findByPK((long) keyId); + } + + public Project findByPK(long keyId) { ProjectMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); @@ -151,11 +155,11 @@ private Project toModel(ProjectDO record) { if (record.getPhone() != null) { model.setPhone(record.getPhone()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); } - if (record.getModifyDate() != null) { - model.setModifyDate(record.getModifyDate()); + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); } model.afterLoad(); return model; @@ -173,8 +177,8 @@ private ProjectDO toRecord(Project model) { record.setOwner(model.getOwner()); record.setEmail(model.getEmail()); record.setPhone(model.getPhone()); - record.setCreationDate(model.getCreationDate()); - record.setModifyDate(model.getModifyDate()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); return record; } diff --git a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java index dd1852b709..0d5f61d902 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java @@ -60,7 +60,7 @@ public Project create() { public boolean delete(Project project) { ensureInitialized(); - int id = project.getId(); + long id = project.getId(); String domainName = null; for (Entry entry : m_domainToProjects.entrySet()) { diff --git a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml index b1e2b7f074..41db275566 100644 --- a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -11,7 +11,7 @@
-
+
diff --git a/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml b/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml index ad3201c621..d52ffb2552 100644 --- a/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml @@ -7,12 +7,12 @@ - + - - + + @@ -21,12 +21,12 @@ cmdb_domain , level , bu , - cmdb_productline , + cmdb_product_line , owner , email , phone , - creation_date , - modify_date + create_time , + update_time @@ -36,53 +36,53 @@ cmdb_domain = #{cmdbDomain} , level = #{level} , bu = #{bu} , - cmdb_productline = #{cmdbProductline} , + cmdb_product_line = #{cmdbProductline} , owner = #{owner} , email = #{email} , phone = #{phone} , - creation_date = #{creationDate} , - modify_date = #{modifyDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO project + INSERT INTO t_project - delete from project where id = #{id} + delete from t_project where id = #{id} - UPDATE project + UPDATE t_project WHERE id = #{id} - \ No newline at end of file + diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index e31b4be572..4a0fa4eb1b 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -146,21 +146,27 @@ data: ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台任务'; - CREATE TABLE `project` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `domain` varchar(200) NOT NULL COMMENT '项目名称', - `cmdb_domain` varchar(200) DEFAULT NULL COMMENT 'cmdb项目名称', - `level` int(5) DEFAULT NULL COMMENT '项目级别', - `bu` varchar(50) DEFAULT NULL COMMENT 'CMDB事业部', - `cmdb_productline` varchar(50) DEFAULT NULL COMMENT 'CMDB产品线', - `owner` varchar(50) DEFAULT NULL COMMENT '项目负责人', - `email` longtext DEFAULT NULL COMMENT '项目组邮件', - `phone` longtext DEFAULT NULL COMMENT '联系电话', - `creation_date` datetime DEFAULT NULL COMMENT '创建时间', - `modify_date` datetime DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `domain` (`domain`) - )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='项目基本信息'; + CREATE TABLE `t_project` + ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `domain` varchar(200) NOT NULL DEFAULT '' COMMENT '项目名称', + `cmdb_domain` varchar(200) NOT NULL DEFAULT '' COMMENT 'CMDB项目名称', + `level` int NOT NULL DEFAULT '0' COMMENT '项目级别', + `bu` varchar(50) NOT NULL DEFAULT '' COMMENT 'CMDB事业部', + `cmdb_product_line` varchar(50) NOT NULL DEFAULT '' COMMENT 'CMDB产品线', + `owner` varchar(50) NOT NULL DEFAULT '' COMMENT '项目负责人', + `email` text NOT NULL COMMENT '项目组邮箱', + `phone` text NOT NULL COMMENT '联系电话', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_domain` (`domain`), + KEY `idx_cmdb_domain` (`cmdb_domain`), + KEY `idx_cmdb_product_line` (`cmdb_product_line`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目基础信息'; + CREATE TABLE `topologyGraph` ( `id` int(11) NOT NULL AUTO_INCREMENT, diff --git a/script/CatApplication.sql b/script/CatApplication.sql index fae0bbefeb..2aa5c78871 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -178,21 +178,27 @@ CREATE TABLE `t_task` ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台任务'; -CREATE TABLE `project` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `domain` varchar(200) NOT NULL COMMENT '项目名称', - `cmdb_domain` varchar(200) DEFAULT NULL COMMENT 'cmdb项目名称', - `level` int(5) DEFAULT NULL COMMENT '项目级别', - `bu` varchar(50) DEFAULT NULL COMMENT 'CMDB事业部', - `cmdb_productline` varchar(50) DEFAULT NULL COMMENT 'CMDB产品线', - `owner` varchar(50) DEFAULT NULL COMMENT '项目负责人', - `email` longtext DEFAULT NULL COMMENT '项目组邮件', - `phone` longtext DEFAULT NULL COMMENT '联系电话', - `creation_date` datetime DEFAULT NULL COMMENT '创建时间', - `modify_date` datetime DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `domain` (`domain`) -)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='项目基本信息'; +CREATE TABLE `t_project` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `domain` varchar(200) NOT NULL DEFAULT '' COMMENT '项目名称', + `cmdb_domain` varchar(200) NOT NULL DEFAULT '' COMMENT 'CMDB项目名称', + `level` int NOT NULL DEFAULT '0' COMMENT '项目级别', + `bu` varchar(50) NOT NULL DEFAULT '' COMMENT 'CMDB事业部', + `cmdb_product_line` varchar(50) NOT NULL DEFAULT '' COMMENT 'CMDB产品线', + `owner` varchar(50) NOT NULL DEFAULT '' COMMENT '项目负责人', + `email` text NOT NULL COMMENT '项目组邮箱', + `phone` text NOT NULL COMMENT '联系电话', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_domain` (`domain`), + KEY `idx_cmdb_domain` (`cmdb_domain`), + KEY `idx_cmdb_product_line` (`cmdb_product_line`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目基础信息'; + CREATE TABLE `topologyGraph` ( `id` int(11) NOT NULL AUTO_INCREMENT, From 3c8a682d99e28447ecaace4fca4bfca1b0423fc5 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 08:42:33 +0800 Subject: [PATCH 155/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Ftopology=5Fgraph?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TopologyGraphRepository.java | 14 +++++-- .../dao/TopologyGraphMapper.java | 4 +- .../dao/data/TopologyGraphDO.java | 8 ++-- .../cat/home/dal/report/TopologyGraph.java | 41 ++++++++++++++----- .../processor/GlobalConfigProcessor.java | 2 +- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/TopologyGraphMapper.xml | 23 ++++++----- .../templates/configmap-cat-mysql-script.yaml | 26 +++++++----- script/CatApplication.sql | 26 +++++++----- 9 files changed, 96 insertions(+), 50 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java index facb692574..595173ddfc 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java @@ -34,6 +34,10 @@ public int deleteByPK(TopologyGraph proto) { } public TopologyGraph findByPK(int keyId) { + return findByPK((long) keyId); + } + + public TopologyGraph findByPK(long keyId) { TopologyGraphMapper mapper = springMapper(LOGGER); try { @@ -112,8 +116,11 @@ private TopologyGraph toModel(TopologyGraphDO record) { if (record.getContent() != null) { model.setContent(record.getContent()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); + } + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); } model.afterLoad(); return model; @@ -127,7 +134,8 @@ private TopologyGraphDO toRecord(TopologyGraph model) { record.setPeriod(model.getPeriod()); record.setType(model.getType()); record.setContent(model.getContent()); - record.setCreationDate(model.getCreationDate()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); return record; } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/TopologyGraphMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/TopologyGraphMapper.java index 6a9c5ba48a..e1588149b8 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/TopologyGraphMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/TopologyGraphMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.topologygraph.dao.data.TopologyGraphDO; public interface TopologyGraphMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - TopologyGraphDO findByPrimaryKey(@Param("id") Integer id); + TopologyGraphDO findByPrimaryKey(@Param("id") Long id); int insert(TopologyGraphDO record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/data/TopologyGraphDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/data/TopologyGraphDO.java index 763249a49a..cb324c2223 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/data/TopologyGraphDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/data/TopologyGraphDO.java @@ -6,7 +6,7 @@ @Data public class TopologyGraphDO { - private Integer id; + private Long id; private String ip; @@ -16,7 +16,9 @@ public class TopologyGraphDO { private byte[] content; - private Date creationDate; + private Date createTime; - private Integer keyId; + private Date updateTime; + + private Long keyId; } diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/TopologyGraph.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/TopologyGraph.java index 8e0cbf5f82..09d0b9e6a3 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/dal/report/TopologyGraph.java +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/TopologyGraph.java @@ -2,7 +2,7 @@ public class TopologyGraph { - private int m_id; + private long m_id; private String m_ip; @@ -12,9 +12,11 @@ public class TopologyGraph { private byte[] m_content; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private int m_keyId; + private java.util.Date m_updateTime; + + private long m_keyId; public void afterLoad() { m_keyId = m_id; } @@ -24,10 +26,14 @@ public byte[] getContent() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } - public int getId() { + public long getId() { return m_id; } @@ -35,7 +41,7 @@ public String getIp() { return m_ip; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } @@ -47,17 +53,26 @@ public int getType() { return m_type; } + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public TopologyGraph setContent(byte[] content) { m_content = content; return this; } public TopologyGraph setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; return this; } - public TopologyGraph setId(int id) { + public TopologyGraph setCreateTime(java.util.Date createTime) { + m_createTime = createTime; + return this; + } + + public TopologyGraph setId(long id) { m_id = id; m_keyId = id; return this; @@ -68,7 +83,7 @@ public TopologyGraph setIp(String ip) { return this; } - public TopologyGraph setKeyId(int keyId) { + public TopologyGraph setKeyId(long keyId) { m_keyId = keyId; return this; } @@ -83,18 +98,24 @@ public TopologyGraph setType(int type) { return this; } + public TopologyGraph setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); sb.append("TopologyGraph["); sb.append("content: ").append(m_content == null ? null : java.util.Arrays.asList(m_content)); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", id: ").append(m_id); sb.append(", ip: ").append(m_ip); sb.append(", key-id: ").append(m_keyId); sb.append(", period: ").append(m_period); sb.append(", type: ").append(m_type); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java index 8721cca8bb..91ee5ac5c2 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/processor/GlobalConfigProcessor.java @@ -272,7 +272,7 @@ private boolean updateProject(Payload payload) { String domain = project.getDomain(); if (StringUtils.isNotEmpty(domain)) { - int id = project.getId(); + long id = project.getId(); Project temp = m_projectService.findByDomain(domain); if (temp != null && id > 0) { diff --git a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml index c362615833..4e23d366d8 100644 --- a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -9,7 +9,7 @@ useUnicode=true&autoReconnect=true -
+
diff --git a/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml b/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml index 623036199d..1a3d3916e2 100644 --- a/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml @@ -7,7 +7,8 @@ - + + @@ -16,7 +17,8 @@ period , type , content , - creation_date + create_time , + update_time @@ -26,40 +28,41 @@ period = #{period} , type = #{type} , content = #{content} , - creation_date = #{creationDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO topologyGraph + INSERT INTO t_topology_graph - delete from topologyGraph where id = #{id} + delete from t_topology_graph where id = #{id} - UPDATE topologyGraph + UPDATE t_topology_graph WHERE id = #{id} - \ No newline at end of file + diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index 4a0fa4eb1b..64dab220ca 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -168,16 +168,22 @@ data: ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目基础信息'; - CREATE TABLE `topologyGraph` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `ip` varchar(50) NOT NULL COMMENT '报表来自于哪台cat-client机器ip', - `period` datetime NOT NULL COMMENT '报表时间段,精确到分钟', - `type` tinyint(4) NOT NULL COMMENT '报表数据格式, 1/xml, 2/json, 3/binary', - `content` longblob COMMENT '用于存放报表的具体内容', - `creation_date` datetime NOT NULL COMMENT '报表创建时间', - PRIMARY KEY (`id`), - KEY `period` (`period`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用于存储历史的拓扑图曲线'; + CREATE TABLE `t_topology_graph` + ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT '生成拓扑图的机器IP', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '拓扑图时间段, 精确到分钟', + `type` tinyint(4) NOT NULL DEFAULT '3' COMMENT '数据格式, 1/xml, 2/json, 3/binary', + `content` longblob NOT NULL COMMENT '拓扑图内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_period` (`period`), + KEY `idx_ip_period` (`ip`,`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='历史拓扑图'; + CREATE TABLE `config` ( `id` int(11) NOT NULL AUTO_INCREMENT, diff --git a/script/CatApplication.sql b/script/CatApplication.sql index 2aa5c78871..6cf7da785f 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -200,16 +200,22 @@ CREATE TABLE `t_project` ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目基础信息'; -CREATE TABLE `topologyGraph` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `ip` varchar(50) NOT NULL COMMENT '报表来自于哪台cat-client机器ip', - `period` datetime NOT NULL COMMENT '报表时间段,精确到分钟', - `type` tinyint(4) NOT NULL COMMENT '报表数据格式, 1/xml, 2/json, 3/binary', - `content` longblob COMMENT '用于存放报表的具体内容', - `creation_date` datetime NOT NULL COMMENT '报表创建时间', - PRIMARY KEY (`id`), - KEY `period` (`period`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用于存储历史的拓扑图曲线'; +CREATE TABLE `t_topology_graph` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT '生成拓扑图的机器IP', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '拓扑图时间段, 精确到分钟', + `type` tinyint(4) NOT NULL DEFAULT '3' COMMENT '数据格式, 1/xml, 2/json, 3/binary', + `content` longblob NOT NULL COMMENT '拓扑图内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_period` (`period`), + KEY `idx_ip_period` (`ip`,`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='历史拓扑图'; + CREATE TABLE `config` ( `id` int(11) NOT NULL AUTO_INCREMENT, From 11f20b995cbbe55fb3be7ca1bec379b349179736 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 08:51:19 +0800 Subject: [PATCH 156/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fconfig=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/AtomicMessageConfigManager.java | 2 +- .../cat/config/ReportReloadConfigManager.java | 2 +- .../config/sample/SampleConfigManager.java | 2 +- .../config/server/ServerConfigManager.java | 2 +- .../server/ServerFilterConfigManager.java | 2 +- .../TpValueStatisticConfigManager.java | 2 +- .../com/dianping/cat/core/config/Config.java | 46 +++++++++++++------ .../cat/core/config/dao/ConfigMapper.java | 4 +- .../cat/core/config/dao/data/ConfigDO.java | 6 +-- .../config/repository/ConfigRepository.java | 12 +++-- .../resources/META-INF/wizard/jdbc/wizard.xml | 8 ++-- .../resources/mybatis/mapper/ConfigMapper.xml | 26 +++++------ .../exception/ExceptionRuleConfigManager.java | 2 +- .../spi/config/BaseRuleConfigManager.java | 2 +- .../report/page/DomainGroupConfigManager.java | 2 +- .../config/TopoGraphFormatConfigManager.java | 2 +- .../graph/TopologyGraphConfigManager.java | 2 +- .../config/HeartbeatDisplayPolicyManager.java | 2 +- .../task/CapacityUpdateStatusManager.java | 2 +- .../config/StorageGroupConfigManager.java | 2 +- .../permission/ResourceConfigManager.java | 2 +- .../page/permission/UserConfigManager.java | 2 +- .../router/config/RouterConfigManager.java | 2 +- .../templates/configmap-cat-mysql-script.yaml | 21 +++++---- script/CatApplication.sql | 21 +++++---- 25 files changed, 103 insertions(+), 75 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java index 3d1f4845be..aa88e5a154 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java @@ -43,7 +43,7 @@ public class AtomicMessageConfigManager { protected ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private long m_modifyTime; diff --git a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java index 35e77da175..81f48e7dc5 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java @@ -50,7 +50,7 @@ public class ReportReloadConfigManager { protected ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private long m_modifyTime; diff --git a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java index 56c199709f..5241058c8e 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java @@ -40,7 +40,7 @@ public class SampleConfigManager { protected ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private long m_modifyTime; diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java index 712fd23a6c..3b318226ff 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java @@ -89,7 +89,7 @@ public class ServerConfigManager { protected ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private long m_modifyTime; diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java index 9a756dfba5..c25c335e62 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java @@ -45,7 +45,7 @@ public class ServerFilterConfigManager { private volatile ServerFilterConfig m_config; - private int m_configId; + private long m_configId; private long m_modifyTime; diff --git a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java index ed1c76403a..06d9c0b6c3 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java @@ -45,7 +45,7 @@ public class TpValueStatisticConfigManager { private ServerConfigManager m_serverConfigManager; - private int m_configId; + private long m_configId; private long m_modifyTime; diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/Config.java b/cat-core/src/main/java/com/dianping/cat/core/config/Config.java index 51483a9db9..4074136ccf 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/config/Config.java +++ b/cat-core/src/main/java/com/dianping/cat/core/config/Config.java @@ -2,17 +2,17 @@ public class Config { - private int m_id; + private long m_id; private String m_name; private String m_content; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private java.util.Date m_modifyDate; + private java.util.Date m_updateTime; - private int m_keyId; + private long m_keyId; public void afterLoad() { m_keyId = m_id; } @@ -22,48 +22,61 @@ public String getContent() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; } - public int getId() { + public java.util.Date getCreateTime() { + return m_createTime; + } + + public long getId() { return m_id; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } public java.util.Date getModifyDate() { - return m_modifyDate; + return m_updateTime; } public String getName() { return m_name; } + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public Config setContent(String content) { m_content = content; return this; } public Config setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public Config setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } - public Config setId(int id) { + public Config setId(long id) { m_id = id; m_keyId = id; return this; } - public Config setKeyId(int keyId) { + public Config setKeyId(long keyId) { m_keyId = keyId; return this; } public Config setModifyDate(java.util.Date modifyDate) { - m_modifyDate = modifyDate; + m_updateTime = modifyDate; return this; } @@ -72,16 +85,21 @@ public Config setName(String name) { return this; } + public Config setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); sb.append("Config["); sb.append("content: ").append(m_content); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", id: ").append(m_id); sb.append(", key-id: ").append(m_keyId); - sb.append(", modify-date: ").append(m_modifyDate); + sb.append(", update-time: ").append(m_updateTime); sb.append(", name: ").append(m_name); sb.append("]"); return sb.toString(); diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/dao/ConfigMapper.java b/cat-core/src/main/java/com/dianping/cat/core/config/dao/ConfigMapper.java index eccd4b3b11..11b9d23533 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/config/dao/ConfigMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/config/dao/ConfigMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.config.dao.data.ConfigDO; public interface ConfigMapper { - int deleteById(@Param("id") Integer id); + int deleteById(@Param("id") Long id); - ConfigDO findById(@Param("id") Integer id); + ConfigDO findById(@Param("id") Long id); ConfigDO findByName(@Param("name") String name); diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/dao/data/ConfigDO.java b/cat-core/src/main/java/com/dianping/cat/core/config/dao/data/ConfigDO.java index 66bf50c658..6b939d6e39 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/config/dao/data/ConfigDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/config/dao/data/ConfigDO.java @@ -6,13 +6,13 @@ @Data public class ConfigDO { - private Integer id; + private Long id; private String name; private String content; - private Date creationDate; + private Date createTime; - private Date modifyDate; + private Date updateTime; } diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java index eab21cb8e2..1aadb0303a 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java @@ -47,6 +47,10 @@ public Config findByName(String name) { } public Config findByPK(int keyId) { + return findByPK((long) keyId); + } + + public Config findByPK(long keyId) { ConfigMapper mapper = springMapper(); return requireFound(mapper.findById(keyId), "id", String.valueOf(keyId)); @@ -121,8 +125,8 @@ private Config toConfig(ConfigDO configDO) { config.setId(configDO.getId()); config.setName(configDO.getName()); config.setContent(configDO.getContent()); - config.setCreationDate(configDO.getCreationDate()); - config.setModifyDate(configDO.getModifyDate()); + config.setCreateTime(configDO.getCreateTime()); + config.setUpdateTime(configDO.getUpdateTime()); config.afterLoad(); return config; } @@ -133,8 +137,8 @@ private ConfigDO toConfigDO(Config config) { configDO.setId(config.getKeyId() > 0 ? config.getKeyId() : config.getId()); configDO.setName(config.getName()); configDO.setContent(config.getContent()); - configDO.setCreationDate(config.getCreationDate()); - configDO.setModifyDate(config.getModifyDate()); + configDO.setCreateTime(config.getCreateTime()); + configDO.setUpdateTime(config.getUpdateTime()); return configDO; } diff --git a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml index 41db275566..12b35a68a7 100644 --- a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -25,10 +25,10 @@
- -
-
- + +
+
+ diff --git a/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml b/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml index 22afd86555..c692e1b901 100644 --- a/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml @@ -5,16 +5,16 @@ - - + + id , name , content , - creation_date , - modify_date + create_time , + update_time @@ -22,44 +22,44 @@ id = #{id} , name = #{name} , content = #{content} , - creation_date = #{creationDate} , - modify_date = #{modifyDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO config + INSERT INTO t_config - delete from config where id = #{id} + delete from t_config where id = #{id} - UPDATE config + UPDATE t_config WHERE id = #{id} - \ No newline at end of file + diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java index 2cc9747fa4..12867582f4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java @@ -47,7 +47,7 @@ public class ExceptionRuleConfigManager { private ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private ExceptionRuleConfig m_exceptionRuleConfig; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java index 49150d75f4..6dd8bc8d9a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java @@ -65,7 +65,7 @@ public abstract class BaseRuleConfigManager { protected ContentFetcher m_fetcher; - protected int m_configId; + protected long m_configId; protected MonitorRules m_config; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java index 35e4218f3e..51c0c5a5d8 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java @@ -44,7 +44,7 @@ public class DomainGroupConfigManager { private ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private DomainGroup m_domainGroup; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java index 2d72b7523c..1506de2737 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java @@ -42,7 +42,7 @@ public class TopoGraphFormatConfigManager { private ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private TopoGraphFormatConfig m_config; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java index 18fe58e977..1e0f5f14d4 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java @@ -68,7 +68,7 @@ public class TopologyGraphConfigManager { private DecimalFormat m_df = new DecimalFormat("0.0"); - private int m_configId; + private long m_configId; private String m_fileName; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java index dabc85d10b..3ac9bf6adb 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java @@ -47,7 +47,7 @@ public class HeartbeatDisplayPolicyManager { private ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private HeartbeatDisplayPolicy m_config; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java index aceb90413c..aa0b2ab9f9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java @@ -43,7 +43,7 @@ public class CapacityUpdateStatusManager { private int m_monthlyStatus; - private int m_configId; + private long m_configId; public void setConfigDao(ConfigRepository configDao) { m_configDao = configDao; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java index 67b4718df1..b8d490dc31 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java @@ -51,7 +51,7 @@ public class StorageGroupConfigManager { private ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private StorageGroupConfig m_config; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java index 53a3eb4753..be471277e1 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java @@ -48,7 +48,7 @@ public class ResourceConfigManager { protected ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private long m_modifyTime; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java index 7122072777..a7783bee1c 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java @@ -43,7 +43,7 @@ public class UserConfigManager { protected ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private long m_modifyTime; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java index c40627318b..d3e206f651 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java @@ -59,7 +59,7 @@ public class RouterConfigManager { private DailyReportContentRepository m_dailyReportContentDao; - private int m_configId; + private long m_configId; private volatile RouterConfig m_routerConfig; diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index 64dab220ca..8f89914cfd 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -185,15 +185,18 @@ data: ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='历史拓扑图'; - CREATE TABLE `config` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(50) NOT NULL COMMENT '配置名称', - `content` longtext COMMENT '配置的具体内容', - `creation_date` datetime NOT NULL COMMENT '配置创建时间', - `modify_date` datetime NOT NULL COMMENT '配置修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用于存储系统的全局配置信息'; + CREATE TABLE `t_config` + ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '配置名称', + `content` longtext NOT NULL COMMENT '配置内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_name` (`name`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统全局配置'; CREATE TABLE `baseline` ( `id` int(11) NOT NULL AUTO_INCREMENT, diff --git a/script/CatApplication.sql b/script/CatApplication.sql index 6cf7da785f..a70eed9851 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -217,15 +217,18 @@ CREATE TABLE `t_topology_graph` ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='历史拓扑图'; -CREATE TABLE `config` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(50) NOT NULL COMMENT '配置名称', - `content` longtext COMMENT '配置的具体内容', - `creation_date` datetime NOT NULL COMMENT '配置创建时间', - `modify_date` datetime NOT NULL COMMENT '配置修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用于存储系统的全局配置信息'; +CREATE TABLE `t_config` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '配置名称', + `content` longtext NOT NULL COMMENT '配置内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_name` (`name`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统全局配置'; CREATE TABLE `baseline` ( `id` int(11) NOT NULL AUTO_INCREMENT, From a29e5709a7d802f8be3bcb106e5335716664ebae Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 08:56:58 +0800 Subject: [PATCH 157/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fbaseline=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/baseline/dao/BaselineMapper.java | 4 +- .../mybatis/baseline/dao/data/BaselineDO.java | 8 ++-- .../baseline/BaselineRepository.java | 14 +++++-- .../cat/home/dal/report/Baseline.java | 41 ++++++++++++++----- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/BaselineMapper.xml | 23 ++++++----- .../templates/configmap-cat-mysql-script.yaml | 26 +++++++----- script/CatApplication.sql | 26 +++++++----- 8 files changed, 95 insertions(+), 49 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/BaselineMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/BaselineMapper.java index c7e77629a2..f3f3f51140 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/BaselineMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/BaselineMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.baseline.dao.data.BaselineDO; public interface BaselineMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - BaselineDO findByPrimaryKey(@Param("id") Integer id); + BaselineDO findByPrimaryKey(@Param("id") Long id); int insert(BaselineDO record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/data/BaselineDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/data/BaselineDO.java index 7363c941d2..53e7fbe945 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/data/BaselineDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/data/BaselineDO.java @@ -6,7 +6,7 @@ @Data public class BaselineDO { - private Integer id; + private Long id; private String reportName; @@ -16,9 +16,11 @@ public class BaselineDO { private byte[] data; - private Date creationDate; + private Date createTime; - private Integer keyId; + private Date updateTime; + + private Long keyId; private double[] dataInDoubleArray; } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java index f7f48e2f7c..0f3e8033f1 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java @@ -33,6 +33,10 @@ public int deleteByPK(Baseline proto) { } public Baseline findByPK(int keyId) { + return findByPK((long) keyId); + } + + public Baseline findByPK(long keyId) { BaselineMapper mapper = springMapper(LOGGER); try { @@ -113,8 +117,11 @@ private Baseline toModel(BaselineDO record) { if (record.getData() != null) { model.setData(record.getData()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); + } + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); } model.afterLoad(); return model; @@ -128,7 +135,8 @@ private BaselineDO toRecord(Baseline model) { record.setIndexKey(model.getIndexKey()); record.setReportPeriod(model.getReportPeriod()); record.setData(model.getData()); - record.setCreationDate(model.getCreationDate()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); record.setDataInDoubleArray(model.getDataInDoubleArray()); return record; diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/Baseline.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/Baseline.java index 5e63a25fa6..6ec87b0c0d 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/dal/report/Baseline.java +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/Baseline.java @@ -2,7 +2,7 @@ public class Baseline { - private int m_id; + private long m_id; private String m_reportName; @@ -12,9 +12,11 @@ public class Baseline { private byte[] m_data; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private int m_keyId; + private java.util.Date m_updateTime; + + private long m_keyId; private double[] m_dataInDoubleArray; public void afterLoad() { @@ -22,7 +24,11 @@ public void afterLoad() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public byte[] getData() { @@ -33,7 +39,7 @@ public double[] getDataInDoubleArray() { return m_dataInDoubleArray; } - public int getId() { + public long getId() { return m_id; } @@ -41,7 +47,7 @@ public String getIndexKey() { return m_indexKey; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } @@ -53,8 +59,17 @@ public java.util.Date getReportPeriod() { return m_reportPeriod; } + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public Baseline setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public Baseline setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -68,7 +83,7 @@ public Baseline setDataInDoubleArray(double[] dataInDoubleArray) { return this; } - public Baseline setId(int id) { + public Baseline setId(long id) { m_id = id; m_keyId = id; return this; @@ -79,7 +94,7 @@ public Baseline setIndexKey(String indexKey) { return this; } - public Baseline setKeyId(int keyId) { + public Baseline setKeyId(long keyId) { m_keyId = keyId; return this; } @@ -94,12 +109,17 @@ public Baseline setReportPeriod(java.util.Date reportPeriod) { return this; } + public Baseline setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); sb.append("Baseline["); - sb.append("creation-date: ").append(m_creationDate); + sb.append("create-time: ").append(m_createTime); sb.append(", data: ").append(m_data == null ? null : java.util.Arrays.asList(m_data)); sb.append(", dataInDoubleArray: ").append(m_dataInDoubleArray == null ? null : java.util.Arrays.asList(m_dataInDoubleArray)); sb.append(", id: ").append(m_id); @@ -107,6 +127,7 @@ public String toString() { sb.append(", key-id: ").append(m_keyId); sb.append(", report-name: ").append(m_reportName); sb.append(", report-period: ").append(m_reportPeriod); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml index 4e23d366d8..09c8f2c43a 100644 --- a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -10,7 +10,7 @@
-
+
diff --git a/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml b/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml index 2c52683d7e..dd28a7144c 100644 --- a/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml @@ -7,7 +7,8 @@ - + + @@ -16,7 +17,8 @@ index_key , report_period , data , - creation_date + create_time , + update_time @@ -26,40 +28,41 @@ index_key = #{indexKey} , report_period = #{reportPeriod} , data = #{data} , - creation_date = #{creationDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO baseline + INSERT INTO t_baseline - delete from baseline where id = #{id} + delete from t_baseline where id = #{id} - UPDATE baseline + UPDATE t_baseline WHERE id = #{id} - \ No newline at end of file + diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index 8f89914cfd..21b0814c8f 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -198,16 +198,22 @@ data: KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统全局配置'; - CREATE TABLE `baseline` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `report_name` varchar(100) DEFAULT NULL, - `index_key` varchar(100) DEFAULT NULL, - `report_period` datetime DEFAULT NULL, - `data` blob, - `creation_date` datetime DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `period_name_key` (`report_period`,`report_name`,`index_key`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + CREATE TABLE `t_baseline` + ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `report_name` varchar(100) NOT NULL DEFAULT '' COMMENT '报表名称', + `index_key` varchar(255) NOT NULL DEFAULT '' COMMENT '指标Key', + `report_period` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表时间', + `data` blob NOT NULL COMMENT '基线数据', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_period_name_key` (`report_period`, `report_name`, `index_key`), + KEY `idx_report_name` (`report_name`), + KEY `idx_index_key` (`index_key`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='指标基线数据'; CREATE TABLE `alteration` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', diff --git a/script/CatApplication.sql b/script/CatApplication.sql index a70eed9851..e0c80f2d83 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -230,16 +230,22 @@ CREATE TABLE `t_config` KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统全局配置'; -CREATE TABLE `baseline` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `report_name` varchar(100) DEFAULT NULL, - `index_key` varchar(100) DEFAULT NULL, - `report_period` datetime DEFAULT NULL, - `data` blob, - `creation_date` datetime DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `period_name_key` (`report_period`,`report_name`,`index_key`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `t_baseline` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `report_name` varchar(100) NOT NULL DEFAULT '' COMMENT '报表名称', + `index_key` varchar(255) NOT NULL DEFAULT '' COMMENT '指标Key', + `report_period` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表时间', + `data` blob NOT NULL COMMENT '基线数据', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_period_name_key` (`report_period`, `report_name`, `index_key`), + KEY `idx_report_name` (`report_name`), + KEY `idx_index_key` (`index_key`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='指标基线数据'; CREATE TABLE `alteration` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', From 9b3224493f2cc88dd5ff71da8785415d5b98a59f Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 09:03:21 +0800 Subject: [PATCH 158/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Falteration?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alteration/dao/AlterationMapper.java | 4 +- .../alteration/dao/data/AlterationDO.java | 10 ++-- .../alteration/AlterationRepository.java | 20 +++++-- .../cat/home/dal/report/Alteration.java | 58 ++++++++++++++----- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/AlterationMapper.xml | 39 +++++++------ .../templates/configmap-cat-mysql-script.yaml | 39 +++++++------ script/CatApplication.sql | 39 +++++++------ 8 files changed, 132 insertions(+), 79 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/AlterationMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/AlterationMapper.java index a23784c970..4c467a3d5a 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/AlterationMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/AlterationMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.alteration.dao.data.AlterationDO; public interface AlterationMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - AlterationDO findByPrimaryKey(@Param("id") Integer id); + AlterationDO findByPrimaryKey(@Param("id") Long id); int insert(AlterationDO record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/data/AlterationDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/data/AlterationDO.java index 212430ec25..047e770841 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/data/AlterationDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/data/AlterationDO.java @@ -6,7 +6,7 @@ @Data public class AlterationDO { - private Integer id; + private Long id; private String type; @@ -18,7 +18,7 @@ public class AlterationDO { private String ip; - private Date date; + private Date changeTime; private String user; @@ -30,9 +30,11 @@ public class AlterationDO { private Integer status; - private Date creationDate; + private Date createTime; - private Integer keyId; + private Date updateTime; + + private Long keyId; private Date startTime; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java index b6fcea0d35..4c68277f17 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java @@ -97,6 +97,10 @@ public List findByDomainAndTime(java.util.Date startTime, java.util. } public Alteration findByPK(int keyId) { + return findByPK((long) keyId); + } + + public Alteration findByPK(long keyId) { AlterationMapper mapper = springMapper(LOGGER); try { @@ -162,8 +166,8 @@ private Alteration toModel(AlterationDO record) { if (record.getIp() != null) { model.setIp(record.getIp()); } - if (record.getDate() != null) { - model.setDate(record.getDate()); + if (record.getChangeTime() != null) { + model.setChangeTime(record.getChangeTime()); } if (record.getUser() != null) { model.setUser(record.getUser()); @@ -180,8 +184,11 @@ private Alteration toModel(AlterationDO record) { if (record.getStatus() != null) { model.setStatus(record.getStatus()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); + } + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); } model.afterLoad(); return model; @@ -196,13 +203,14 @@ private AlterationDO toRecord(Alteration model) { record.setDomain(model.getDomain()); record.setHostname(model.getHostname()); record.setIp(model.getIp()); - record.setDate(model.getDate()); + record.setChangeTime(model.getChangeTime()); record.setUser(model.getUser()); record.setAltGroup(model.getAltGroup()); record.setContent(model.getContent()); record.setUrl(model.getUrl()); record.setStatus(model.getStatus()); - record.setCreationDate(model.getCreationDate()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); record.setStartTime(model.getStartTime()); record.setEndTime(model.getEndTime()); diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/Alteration.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/Alteration.java index b778f07b0a..54f2ba553f 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/dal/report/Alteration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/Alteration.java @@ -2,7 +2,7 @@ public class Alteration { - private int m_id; + private long m_id; private String m_type; @@ -14,7 +14,7 @@ public class Alteration { private String m_ip; - private java.util.Date m_date; + private java.util.Date m_changeTime; private String m_user; @@ -26,9 +26,11 @@ public class Alteration { private int m_status; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private int m_keyId; + private java.util.Date m_updateTime; + + private long m_keyId; private java.util.Date m_startTime; @@ -47,12 +49,20 @@ public String getContent() { return m_content; } + public java.util.Date getChangeTime() { + return m_changeTime; + } + public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public java.util.Date getDate() { - return m_date; + return m_changeTime; } public String getDomain() { @@ -67,7 +77,7 @@ public String getHostname() { return m_hostname; } - public int getId() { + public long getId() { return m_id; } @@ -75,7 +85,7 @@ public String getIp() { return m_ip; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } @@ -99,6 +109,10 @@ public String[] getTypes() { return m_types; } + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public String getUrl() { return m_url; } @@ -117,13 +131,23 @@ public Alteration setContent(String content) { return this; } + public Alteration setChangeTime(java.util.Date changeTime) { + m_changeTime = changeTime; + return this; + } + public Alteration setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public Alteration setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } public Alteration setDate(java.util.Date date) { - m_date = date; + m_changeTime = date; return this; } @@ -142,7 +166,7 @@ public Alteration setHostname(String hostname) { return this; } - public Alteration setId(int id) { + public Alteration setId(long id) { m_id = id; m_keyId = id; return this; @@ -153,7 +177,7 @@ public Alteration setIp(String ip) { return this; } - public Alteration setKeyId(int keyId) { + public Alteration setKeyId(long keyId) { m_keyId = keyId; return this; } @@ -183,6 +207,11 @@ public Alteration setTypes(String[] types) { return this; } + public Alteration setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + public Alteration setUrl(String url) { m_url = url; return this; @@ -199,9 +228,9 @@ public String toString() { sb.append("Alteration["); sb.append("alt-group: ").append(m_altGroup); + sb.append(", change-time: ").append(m_changeTime); sb.append(", content: ").append(m_content); - sb.append(", creation-date: ").append(m_creationDate); - sb.append(", date: ").append(m_date); + sb.append(", create-time: ").append(m_createTime); sb.append(", domain: ").append(m_domain); sb.append(", end-time: ").append(m_endTime); sb.append(", hostname: ").append(m_hostname); @@ -213,6 +242,7 @@ public String toString() { sb.append(", title: ").append(m_title); sb.append(", type: ").append(m_type); sb.append(", types: ").append(m_types == null ? null : java.util.Arrays.asList(m_types)); + sb.append(", update-time: ").append(m_updateTime); sb.append(", url: ").append(m_url); sb.append(", user: ").append(m_user); sb.append("]"); diff --git a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml index 09c8f2c43a..cffcd4806b 100644 --- a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -11,7 +11,7 @@
-
+
diff --git a/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml b/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml index 332a983347..d592ffe147 100644 --- a/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml @@ -8,13 +8,14 @@ - + - + + @@ -24,13 +25,14 @@ domain , hostname , ip , - date , - user , + change_time , + `user` , alt_group , content , url , status , - creation_date + create_time , + update_time @@ -41,58 +43,59 @@ domain = #{domain} , hostname = #{hostname} , ip = #{ip} , - date = #{date} , - user = #{user} , + change_time = #{changeTime} , + `user` = #{user} , alt_group = #{altGroup} , content = #{content} , url = #{url} , status = #{status} , - creation_date = #{creationDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO alteration + INSERT INTO t_alteration - delete from alteration where id = #{id} + delete from t_alteration where id = #{id} - UPDATE alteration + UPDATE t_alteration WHERE id = #{id} - \ No newline at end of file + diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index 21b0814c8f..6b8ac27901 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -215,23 +215,28 @@ data: KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='指标基线数据'; - CREATE TABLE `alteration` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', - `type` varchar(64) NOT NULL COMMENT '分类', - `title` varchar(128) NOT NULL COMMENT '变更标题', - `domain` varchar(128) NOT NULL COMMENT '变更项目', - `hostname` varchar(128) NOT NULL COMMENT '变更机器名', - `ip` varchar(128) DEFAULT NULL COMMENT '变更机器IP', - `date` datetime NOT NULL COMMENT '变更时间', - `user` varchar(45) NOT NULL COMMENT '变更用户', - `alt_group` varchar(45) DEFAULT NULL COMMENT '变更组别', - `content` longtext NOT NULL COMMENT '变更内容', - `url` varchar(200) DEFAULT NULL COMMENT '变更链接', - `status` tinyint(4) DEFAULT '0' COMMENT '变更状态', - `creation_date` datetime NOT NULL COMMENT '数据库创建时间', - PRIMARY KEY (`id`), - KEY `ind_date_domain_host` (`date`,`domain`,`hostname`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='变更表'; + CREATE TABLE `t_alteration` + ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `type` varchar(64) NOT NULL DEFAULT '' COMMENT '变更分类', + `title` varchar(128) NOT NULL DEFAULT '' COMMENT '变更标题', + `domain` varchar(128) NOT NULL DEFAULT '' COMMENT '变更项目', + `hostname` varchar(128) NOT NULL DEFAULT '' COMMENT '变更机器名', + `ip` varchar(128) NOT NULL DEFAULT '' COMMENT '变更机器IP', + `change_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '变更时间', + `user` varchar(64) NOT NULL DEFAULT '' COMMENT '变更用户', + `alt_group` varchar(64) NOT NULL DEFAULT '' COMMENT '变更组别', + `content` longtext NOT NULL COMMENT '变更内容', + `url` varchar(512) NOT NULL DEFAULT '' COMMENT '变更链接', + `status` tinyint NOT NULL DEFAULT '0' COMMENT '变更状态', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `ind_date_domain_host` (`change_time`, `domain`, `hostname`), + KEY `idx_type_change_time` (`type`, `change_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='变更记录'; CREATE TABLE `alert` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', diff --git a/script/CatApplication.sql b/script/CatApplication.sql index e0c80f2d83..8fa53017c4 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -247,23 +247,28 @@ CREATE TABLE `t_baseline` KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='指标基线数据'; -CREATE TABLE `alteration` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', - `type` varchar(64) NOT NULL COMMENT '分类', - `title` varchar(128) NOT NULL COMMENT '变更标题', - `domain` varchar(128) NOT NULL COMMENT '变更项目', - `hostname` varchar(128) NOT NULL COMMENT '变更机器名', - `ip` varchar(128) DEFAULT NULL COMMENT '变更机器IP', - `date` datetime NOT NULL COMMENT '变更时间', - `user` varchar(45) NOT NULL COMMENT '变更用户', - `alt_group` varchar(45) DEFAULT NULL COMMENT '变更组别', - `content` longtext NOT NULL COMMENT '变更内容', - `url` varchar(200) DEFAULT NULL COMMENT '变更链接', - `status` tinyint(4) DEFAULT '0' COMMENT '变更状态', - `creation_date` datetime NOT NULL COMMENT '数据库创建时间', - PRIMARY KEY (`id`), - KEY `ind_date_domain_host` (`date`,`domain`,`hostname`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='变更表'; +CREATE TABLE `t_alteration` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `type` varchar(64) NOT NULL DEFAULT '' COMMENT '变更分类', + `title` varchar(128) NOT NULL DEFAULT '' COMMENT '变更标题', + `domain` varchar(128) NOT NULL DEFAULT '' COMMENT '变更项目', + `hostname` varchar(128) NOT NULL DEFAULT '' COMMENT '变更机器名', + `ip` varchar(128) NOT NULL DEFAULT '' COMMENT '变更机器IP', + `change_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '变更时间', + `user` varchar(64) NOT NULL DEFAULT '' COMMENT '变更用户', + `alt_group` varchar(64) NOT NULL DEFAULT '' COMMENT '变更组别', + `content` longtext NOT NULL COMMENT '变更内容', + `url` varchar(512) NOT NULL DEFAULT '' COMMENT '变更链接', + `status` tinyint NOT NULL DEFAULT '0' COMMENT '变更状态', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_date_domain_host` (`change_time`, `domain`, `hostname`), + KEY `idx_type_change_time` (`type`, `change_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='变更记录'; CREATE TABLE `alert` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', From 71cadef45cf092e3aff54c3db90df0a65014170b Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 09:09:02 +0800 Subject: [PATCH 159/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Falert=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dianping/cat/alarm/Alert.java | 41 ++++++++++++++----- .../alarm/spi/config/AlertConfigManager.java | 2 +- .../alarm/spi/config/AlertPolicyManager.java | 2 +- .../alarm/spi/config/SenderConfigManager.java | 2 +- .../core/mybatis/alert/dao/AlertMapper.java | 4 +- .../core/mybatis/alert/dao/data/AlertDO.java | 8 ++-- .../repository/alert/AlertRepository.java | 14 +++++-- .../resources/mybatis/mapper/AlertMapper.xml | 29 +++++++------ .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../templates/configmap-cat-mysql-script.yaml | 29 ++++++++----- script/CatApplication.sql | 32 +++++++++------ 11 files changed, 106 insertions(+), 59 deletions(-) diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/Alert.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/Alert.java index 886d0c2e1a..23cfb03443 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/Alert.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/Alert.java @@ -2,7 +2,7 @@ public class Alert { - private int m_id; + private long m_id; private String m_domain; @@ -16,9 +16,11 @@ public class Alert { private String m_metric; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private int m_keyId; + private java.util.Date m_updateTime; + + private long m_keyId; private java.util.Date m_startTime; @@ -46,7 +48,11 @@ public String getContent() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public String getDomain() { @@ -57,11 +63,11 @@ public java.util.Date getEndTime() { return m_endTime; } - public int getId() { + public long getId() { return m_id; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } @@ -77,6 +83,10 @@ public String getType() { return m_type; } + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public Alert setAlertTime(java.util.Date alertTime) { m_alertTime = alertTime; return this; @@ -98,7 +108,12 @@ public Alert setContent(String content) { } public Alert setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public Alert setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -112,13 +127,13 @@ public Alert setEndTime(java.util.Date endTime) { return this; } - public Alert setId(int id) { + public Alert setId(long id) { m_id = id; m_keyId = id; return this; } - public Alert setKeyId(int keyId) { + public Alert setKeyId(long keyId) { m_keyId = keyId; return this; } @@ -138,6 +153,11 @@ public Alert setType(String type) { return this; } + public Alert setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); @@ -147,7 +167,7 @@ public String toString() { sb.append(", categories: ").append(m_categories == null ? null : java.util.Arrays.asList(m_categories)); sb.append(", category: ").append(m_category); sb.append(", content: ").append(m_content); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", domain: ").append(m_domain); sb.append(", end-time: ").append(m_endTime); sb.append(", id: ").append(m_id); @@ -155,6 +175,7 @@ public String toString() { sb.append(", metric: ").append(m_metric); sb.append(", start-time: ").append(m_startTime); sb.append(", type: ").append(m_type); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java index 1fed1615e7..eeada35bb0 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java @@ -40,7 +40,7 @@ public class AlertConfigManager { private ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private AlertConfig m_config; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java index 1eb13dabac..ee2e88c313 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java @@ -49,7 +49,7 @@ public class AlertPolicyManager { private ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private AlertPolicy m_config; diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java index b09e8d787f..2c6d0b2678 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java @@ -42,7 +42,7 @@ public class SenderConfigManager { private ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private SenderConfig m_senderConfig; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/AlertMapper.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/AlertMapper.java index 7180c08578..53621ba4a3 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/AlertMapper.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/AlertMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.alert.dao.data.AlertDO; public interface AlertMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - AlertDO findByPrimaryKey(@Param("id") Integer id); + AlertDO findByPrimaryKey(@Param("id") Long id); int insert(AlertDO record); diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/data/AlertDO.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/data/AlertDO.java index da05c8384d..62c99ed8bd 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/data/AlertDO.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/data/AlertDO.java @@ -6,7 +6,7 @@ @Data public class AlertDO { - private Integer id; + private Long id; private String domain; @@ -20,9 +20,11 @@ public class AlertDO { private String metric; - private Date creationDate; + private Date createTime; - private Integer keyId; + private Date updateTime; + + private Long keyId; private Date startTime; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java index 6c7dfdbaee..34129fca36 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java @@ -95,6 +95,10 @@ public List queryAlertsByTimeCategory(java.util.Date startTime, java.util } public Alert findByPK(int keyId) { + return findByPK((long) keyId); + } + + public Alert findByPK(long keyId) { AlertMapper mapper = springMapper(LOGGER); try { @@ -163,8 +167,11 @@ private Alert toModel(AlertDO record) { if (record.getMetric() != null) { model.setMetric(record.getMetric()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); + } + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); } model.afterLoad(); return model; @@ -180,7 +187,8 @@ private AlertDO toRecord(Alert model) { record.setType(model.getType()); record.setContent(model.getContent()); record.setMetric(model.getMetric()); - record.setCreationDate(model.getCreationDate()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); record.setStartTime(model.getStartTime()); record.setEndTime(model.getEndTime()); diff --git a/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml b/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml index 312a7ce239..8ac31e99ab 100644 --- a/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml +++ b/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml @@ -9,7 +9,8 @@ - + + @@ -20,7 +21,8 @@ type , content , metric , - creation_date + create_time , + update_time @@ -32,52 +34,53 @@ type = #{type} , content = #{content} , metric = #{metric} , - creation_date = #{creationDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO alert + INSERT INTO t_alert - delete from alert where id = #{id} + delete from t_alert where id = #{id} - UPDATE alert + UPDATE t_alert WHERE id = #{id} - \ No newline at end of file + diff --git a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml index cffcd4806b..88400e0106 100644 --- a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -12,7 +12,7 @@
-
+
diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index 6b8ac27901..cca2dd565d 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -238,17 +238,24 @@ data: KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='变更记录'; - CREATE TABLE `alert` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', - `domain` varchar(128) NOT NULL COMMENT '告警项目', - `alert_time` datetime NOT NULL COMMENT '告警时间', - `category` varchar(64) NOT NULL COMMENT '告警分类:network/business/system/exception -alert', - `type` varchar(64) NOT NULL COMMENT '告警类型:error/warning', - `content` longtext NOT NULL COMMENT '告警内容', - `metric` varchar(128) NOT NULL COMMENT '告警指标', - `creation_date` datetime NOT NULL COMMENT '数据插入时间', - PRIMARY KEY (`id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存储告警信息'; + CREATE TABLE `t_alert` + ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `domain` varchar(128) NOT NULL DEFAULT '' COMMENT '告警项目', + `alert_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '告警时间', + `category` varchar(64) NOT NULL DEFAULT '' COMMENT '告警分类', + `type` varchar(64) NOT NULL DEFAULT '' COMMENT '告警类型', + `content` longtext NOT NULL COMMENT '告警内容', + `metric` varchar(256) NOT NULL DEFAULT '' COMMENT '告警指标', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_alert_time_category_domain` (`alert_time`, `category`, `domain`), + KEY `idx_domain_alert_time` (`domain`, `alert_time`), + KEY `idx_category_alert_time` (`category`, `alert_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='告警记录'; CREATE TABLE `alert_summary` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', diff --git a/script/CatApplication.sql b/script/CatApplication.sql index 8fa53017c4..a8e2ca99ce 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -264,24 +264,30 @@ CREATE TABLE `t_alteration` `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - KEY `idx_date_domain_host` (`change_time`, `domain`, `hostname`), + KEY `ind_date_domain_host` (`change_time`, `domain`, `hostname`), KEY `idx_type_change_time` (`type`, `change_time`), KEY `idx_create_time` (`create_time`), KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='变更记录'; -CREATE TABLE `alert` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', - `domain` varchar(128) NOT NULL COMMENT '告警项目', - `alert_time` datetime NOT NULL COMMENT '告警时间', - `category` varchar(64) NOT NULL COMMENT '告警分类:network/business/system/exception -alert', - `type` varchar(64) NOT NULL COMMENT '告警类型:error/warning', - `content` longtext NOT NULL COMMENT '告警内容', - `metric` varchar(128) NOT NULL COMMENT '告警指标', - `creation_date` datetime NOT NULL COMMENT '数据插入时间', - PRIMARY KEY (`id`), - KEY `idx_alert_time_category_domain` (`alert_time`,`category`,`domain`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存储告警信息'; +CREATE TABLE `t_alert` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `domain` varchar(128) NOT NULL DEFAULT '' COMMENT '告警项目', + `alert_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '告警时间', + `category` varchar(64) NOT NULL DEFAULT '' COMMENT '告警分类', + `type` varchar(64) NOT NULL DEFAULT '' COMMENT '告警类型', + `content` longtext NOT NULL COMMENT '告警内容', + `metric` varchar(256) NOT NULL DEFAULT '' COMMENT '告警指标', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_alert_time_category_domain` (`alert_time`, `category`, `domain`), + KEY `idx_domain_alert_time` (`domain`, `alert_time`), + KEY `idx_category_alert_time` (`category`, `alert_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='告警记录'; CREATE TABLE `alert_summary` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', From de0342125ec6d94f58b609947552fd69d56a467b Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 09:14:03 +0800 Subject: [PATCH 160/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Falert=5Fsummary?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alert/summary/dao/AlertSummaryMapper.java | 4 +- .../summary/dao/data/AlertSummaryDO.java | 8 ++-- .../alert/summary/AlertSummaryRepository.java | 14 +++++-- .../cat/home/dal/report/AlertSummary.java | 41 ++++++++++++++----- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/AlertSummaryMapper.xml | 21 ++++++---- .../templates/configmap-cat-mysql-script.yaml | 22 ++++++---- script/CatApplication.sql | 22 ++++++---- 8 files changed, 90 insertions(+), 44 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/AlertSummaryMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/AlertSummaryMapper.java index 9368209129..9aa1e0b5dd 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/AlertSummaryMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/AlertSummaryMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.alert.summary.dao.data.AlertSummaryDO; public interface AlertSummaryMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - AlertSummaryDO findByPrimaryKey(@Param("id") Integer id); + AlertSummaryDO findByPrimaryKey(@Param("id") Long id); int insert(AlertSummaryDO record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/data/AlertSummaryDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/data/AlertSummaryDO.java index 758b925b87..3fd4bff0bd 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/data/AlertSummaryDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/data/AlertSummaryDO.java @@ -6,7 +6,7 @@ @Data public class AlertSummaryDO { - private Integer id; + private Long id; private String domain; @@ -14,7 +14,9 @@ public class AlertSummaryDO { private String content; - private Date creationDate; + private Date createTime; - private Integer keyId; + private Date updateTime; + + private Long keyId; } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java index 96a45f2df0..240b12f046 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java @@ -34,6 +34,10 @@ public int deleteByPK(AlertSummary proto) { } public AlertSummary findByPK(int keyId) { + return findByPK((long) keyId); + } + + public AlertSummary findByPK(long keyId) { AlertSummaryMapper mapper = springMapper(LOGGER); try { @@ -93,8 +97,11 @@ private AlertSummary toModel(AlertSummaryDO record) { if (record.getContent() != null) { model.setContent(record.getContent()); } - if (record.getCreationDate() != null) { - model.setCreationDate(record.getCreationDate()); + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); + } + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); } model.afterLoad(); return model; @@ -107,7 +114,8 @@ private AlertSummaryDO toRecord(AlertSummary model) { record.setDomain(model.getDomain()); record.setAlertTime(model.getAlertTime()); record.setContent(model.getContent()); - record.setCreationDate(model.getCreationDate()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); return record; } diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/AlertSummary.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/AlertSummary.java index 5ead595a55..9f66dcc774 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/dal/report/AlertSummary.java +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/AlertSummary.java @@ -2,7 +2,7 @@ public class AlertSummary { - private int m_id; + private long m_id; private String m_domain; @@ -10,9 +10,11 @@ public class AlertSummary { private String m_content; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private int m_keyId; + private java.util.Date m_updateTime; + + private long m_keyId; public void afterLoad() { m_keyId = m_id; } @@ -26,21 +28,29 @@ public String getContent() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public String getDomain() { return m_domain; } - public int getId() { + public long getId() { return m_id; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public AlertSummary setAlertTime(java.util.Date alertTime) { m_alertTime = alertTime; return this; @@ -52,7 +62,12 @@ public AlertSummary setContent(String content) { } public AlertSummary setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public AlertSummary setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -61,17 +76,22 @@ public AlertSummary setDomain(String domain) { return this; } - public AlertSummary setId(int id) { + public AlertSummary setId(long id) { m_id = id; m_keyId = id; return this; } - public AlertSummary setKeyId(int keyId) { + public AlertSummary setKeyId(long keyId) { m_keyId = keyId; return this; } + public AlertSummary setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); @@ -79,10 +99,11 @@ public String toString() { sb.append("AlertSummary["); sb.append("alert-time: ").append(m_alertTime); sb.append(", content: ").append(m_content); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", domain: ").append(m_domain); sb.append(", id: ").append(m_id); sb.append(", key-id: ").append(m_keyId); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml index 88400e0106..ad289a1dca 100644 --- a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -13,7 +13,7 @@
-
+
diff --git a/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml b/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml index f18662a43b..d5ad0bde5f 100644 --- a/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml @@ -6,7 +6,8 @@ - + + @@ -14,7 +15,8 @@ domain , alert_time , content , - creation_date + create_time , + update_time @@ -23,36 +25,37 @@ domain = #{domain} , alert_time = #{alertTime} , content = #{content} , - creation_date = #{creationDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO alert_summary + INSERT INTO t_alert_summary - delete from alert_summary where id = #{id} + delete from t_alert_summary where id = #{id} - UPDATE alert_summary + UPDATE t_alert_summary WHERE id = #{id} - \ No newline at end of file + diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index cca2dd565d..0dd0a8f2ec 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -257,14 +257,20 @@ data: KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='告警记录'; - CREATE TABLE `alert_summary` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', - `domain` varchar(128) NOT NULL COMMENT '告警项目', - `alert_time` datetime NOT NULL COMMENT '告警时间', - `content` longtext NOT NULL COMMENT '统一告警内容', - `creation_date` datetime NOT NULL COMMENT '数据插入时间', - PRIMARY KEY (`id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='统一告警信息'; + CREATE TABLE `t_alert_summary` + ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `domain` varchar(128) NOT NULL DEFAULT '' COMMENT '告警项目', + `alert_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '告警时间', + `content` longtext NOT NULL COMMENT '统一告警内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_alert_time_domain` (`alert_time`, `domain`), + KEY `idx_domain_alert_time` (`domain`, `alert_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='统一告警信息'; CREATE TABLE `operation` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', diff --git a/script/CatApplication.sql b/script/CatApplication.sql index a8e2ca99ce..410e311f38 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -289,14 +289,20 @@ CREATE TABLE `t_alert` KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='告警记录'; -CREATE TABLE `alert_summary` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', - `domain` varchar(128) NOT NULL COMMENT '告警项目', - `alert_time` datetime NOT NULL COMMENT '告警时间', - `content` longtext NOT NULL COMMENT '统一告警内容', - `creation_date` datetime NOT NULL COMMENT '数据插入时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='统一告警信息'; +CREATE TABLE `t_alert_summary` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `domain` varchar(128) NOT NULL DEFAULT '' COMMENT '告警项目', + `alert_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '告警时间', + `content` longtext NOT NULL COMMENT '统一告警内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_alert_time_domain` (`alert_time`, `domain`), + KEY `idx_domain_alert_time` (`domain`, `alert_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='统一告警信息'; CREATE TABLE `operation` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', From 215d91f369c1477d14e6c5007a7473138bea9817 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 09:19:19 +0800 Subject: [PATCH 161/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Foperation?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../operation/dao/OperationMapper.java | 4 +-- .../operation/dao/data/OperationDO.java | 34 +++++++++++++++++-- .../mybatis/mapper/OperationMapper.xml | 31 +++++++++-------- .../templates/configmap-cat-mysql-script.yaml | 26 ++++++++------ script/CatApplication.sql | 26 ++++++++------ 5 files changed, 82 insertions(+), 39 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/OperationMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/OperationMapper.java index e2abfd1c4c..32628c1a66 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/OperationMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/OperationMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.operation.dao.data.OperationDO; public interface OperationMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - OperationDO findByPrimaryKey(@Param("id") Integer id); + OperationDO findByPrimaryKey(@Param("id") Long id); int insert(OperationDO record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/data/OperationDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/data/OperationDO.java index f150eb6fc2..5eb29b85f6 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/data/OperationDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/data/OperationDO.java @@ -6,7 +6,7 @@ @Data public class OperationDO { - private Integer id; + private Long id; private String user; @@ -14,9 +14,37 @@ public class OperationDO { private String operation; - private Date time; + private Date operationTime; private String content; - private Date creationDate; + private Date createTime; + + private Date updateTime; + + private Long keyId; + + public Date getCreationDate() { + return createTime; + } + + public Date getTime() { + return operationTime; + } + + public void setCreationDate(Date creationDate) { + createTime = creationDate; + } + + public void setId(Integer id) { + this.id = id == null ? null : id.longValue(); + } + + public void setId(Long id) { + this.id = id; + } + + public void setTime(Date time) { + operationTime = time; + } } diff --git a/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml b/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml index 0b476657c5..0d02bb72b5 100644 --- a/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml @@ -6,59 +6,62 @@ - + - + + id , - user , + `user` , module , operation , - time , + operation_time , content , - creation_date + create_time , + update_time id = #{id} , - user = #{user} , + `user` = #{user} , module = #{module} , operation = #{operation} , - time = #{time} , + operation_time = #{operationTime} , content = #{content} , - creation_date = #{creationDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO operation + INSERT INTO t_operation - delete from operation where id = #{id} + delete from t_operation where id = #{id} - UPDATE operation + UPDATE t_operation WHERE id = #{id} - \ No newline at end of file + diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index 0dd0a8f2ec..2b2f7bcd40 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -272,16 +272,22 @@ data: KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='统一告警信息'; - CREATE TABLE `operation` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', - `user` varchar(128) NOT NULL COMMENT '用户名', - `module` varchar(128) NOT NULL COMMENT '模块', - `operation` varchar(128) NOT NULL COMMENT '操作', - `time` datetime NOT NULL COMMENT '修改时间', - `content` longtext NOT NULL COMMENT '修改内容', - `creation_date` datetime NOT NULL COMMENT '数据插入时间', - PRIMARY KEY (`id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户操作日志'; + CREATE TABLE `t_operation` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `user` varchar(128) NOT NULL DEFAULT '' COMMENT '用户名', + `module` varchar(128) NOT NULL DEFAULT '' COMMENT '模块', + `operation` varchar(128) NOT NULL DEFAULT '' COMMENT '操作', + `operation_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', + `content` longtext NOT NULL COMMENT '操作内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_operation_time` (`operation_time`), + KEY `idx_user_operation_time` (`user`, `operation_time`), + KEY `idx_module_operation_time` (`module`, `operation_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户操作日志'; CREATE TABLE `overload` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', diff --git a/script/CatApplication.sql b/script/CatApplication.sql index 410e311f38..1acecb9c87 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -304,16 +304,22 @@ CREATE TABLE `t_alert_summary` KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='统一告警信息'; -CREATE TABLE `operation` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', - `user` varchar(128) NOT NULL COMMENT '用户名', - `module` varchar(128) NOT NULL COMMENT '模块', - `operation` varchar(128) NOT NULL COMMENT '操作', - `time` datetime NOT NULL COMMENT '修改时间', - `content` longtext NOT NULL COMMENT '修改内容', - `creation_date` datetime NOT NULL COMMENT '数据插入时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户操作日志'; +CREATE TABLE `t_operation` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `user` varchar(128) NOT NULL DEFAULT '' COMMENT '用户名', + `module` varchar(128) NOT NULL DEFAULT '' COMMENT '模块', + `operation` varchar(128) NOT NULL DEFAULT '' COMMENT '操作', + `operation_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', + `content` longtext NOT NULL COMMENT '操作内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_operation_time` (`operation_time`), + KEY `idx_user_operation_time` (`user`, `operation_time`), + KEY `idx_module_operation_time` (`module`, `operation_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户操作日志'; CREATE TABLE `overload` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', From 58de12a55ae507d43bf7eb2b945e0aebe5ebc1e0 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 09:25:24 +0800 Subject: [PATCH 162/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Foverload=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/overload/dao/OverloadMapper.java | 4 +- .../mybatis/overload/dao/data/OverloadDO.java | 62 +++++++++++++-- .../overload/OverloadRepository.java | 10 ++- .../cat/home/dal/report/Overload.java | 75 +++++++++++++++---- .../task/CapacityUpdateStatusManager.java | 32 ++++---- .../overload/task/DailyCapacityUpdater.java | 8 +- .../overload/task/HourlyCapacityUpdater.java | 8 +- .../overload/task/MonthlyCapacityUpdater.java | 8 +- .../overload/task/TableCapacityService.java | 2 +- .../overload/task/WeeklyCapacityUpdater.java | 8 +- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/OverloadMapper.xml | 29 ++++--- .../templates/configmap-cat-mysql-script.yaml | 23 +++--- script/CatApplication.sql | 23 +++--- 14 files changed, 199 insertions(+), 95 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/OverloadMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/OverloadMapper.java index 10ce211066..bf66a08505 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/OverloadMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/OverloadMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.overload.dao.data.OverloadDO; public interface OverloadMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - OverloadDO findByPrimaryKey(@Param("id") Integer id); + OverloadDO findByPrimaryKey(@Param("id") Long id); int insert(OverloadDO record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/data/OverloadDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/data/OverloadDO.java index a32ba8292e..94dcd68e79 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/data/OverloadDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/data/OverloadDO.java @@ -6,9 +6,9 @@ @Data public class OverloadDO { - private Integer id; + private Long id; - private Integer reportId; + private Long reportId; private Integer reportType; @@ -16,17 +16,67 @@ public class OverloadDO { private Date period; - private Date creationDate; + private Date createTime; - private Integer maxId; + private Date updateTime; - private Integer count; + private Long maxId; - private Integer keyId; + private Long count; + + private Long keyId; private Date startTime; private Date endTime; private Integer type; + + public Date getCreationDate() { + return createTime; + } + + public void setCount(Integer count) { + this.count = count == null ? null : count.longValue(); + } + + public void setCount(Long count) { + this.count = count; + } + + public void setCreationDate(Date creationDate) { + createTime = creationDate; + } + + public void setId(Integer id) { + this.id = id == null ? null : id.longValue(); + } + + public void setId(Long id) { + this.id = id; + } + + public void setKeyId(Integer keyId) { + this.keyId = keyId == null ? null : keyId.longValue(); + } + + public void setKeyId(Long keyId) { + this.keyId = keyId; + } + + public void setMaxId(Integer maxId) { + this.maxId = maxId == null ? null : maxId.longValue(); + } + + public void setMaxId(Long maxId) { + this.maxId = maxId; + } + + public void setReportId(Integer reportId) { + this.reportId = reportId == null ? null : reportId.longValue(); + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java index 487ec8efc0..41897377c3 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java @@ -48,6 +48,10 @@ public List findIdAndSizeByDuration(java.util.Date startTime, java.uti } public Overload findByPK(int keyId) { + return findByPK((long) keyId); + } + + public Overload findByPK(long keyId) { OverloadMapper mapper = springMapper(LOGGER); try { @@ -144,6 +148,9 @@ private Overload toModel(OverloadDO record) { if (record.getCreationDate() != null) { model.setCreationDate(record.getCreationDate()); } + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); + } if (record.getMaxId() != null) { model.setMaxId(record.getMaxId()); } @@ -162,7 +169,8 @@ private OverloadDO toRecord(Overload model) { record.setReportType(model.getReportType()); record.setReportSize(model.getReportSize()); record.setPeriod(model.getPeriod()); - record.setCreationDate(model.getCreationDate()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); record.setStartTime(model.getStartTime()); record.setEndTime(model.getEndTime()); diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/Overload.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/Overload.java index 4065d8d2b3..ac85c81ab4 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/dal/report/Overload.java +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/Overload.java @@ -2,9 +2,9 @@ public class Overload { - private int m_id; + private long m_id; - private int m_reportId; + private long m_reportId; private int m_reportType; @@ -12,9 +12,11 @@ public class Overload { private java.util.Date m_period; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private int m_keyId; + private java.util.Date m_updateTime; + + private long m_keyId; private java.util.Date m_startTime; @@ -22,34 +24,38 @@ public class Overload { private int m_type; - private int m_maxId; + private long m_maxId; - private int m_count; + private long m_count; public void afterLoad() { m_keyId = m_id; } - public int getCount() { + public long getCount() { return m_count; } + public java.util.Date getCreateTime() { + return m_createTime; + } + public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; } public java.util.Date getEndTime() { return m_endTime; } - public int getId() { + public long getId() { return m_id; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } - public int getMaxId() { + public long getMaxId() { return m_maxId; } @@ -57,7 +63,7 @@ public java.util.Date getPeriod() { return m_period; } - public int getReportId() { + public long getReportId() { return m_reportId; } @@ -77,13 +83,27 @@ public int getType() { return m_type; } + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public Overload setCount(int count) { m_count = count; return this; } + public Overload setCount(long count) { + m_count = count; + return this; + } + + public Overload setCreateTime(java.util.Date createTime) { + m_createTime = createTime; + return this; + } + public Overload setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; return this; } @@ -98,16 +118,32 @@ public Overload setId(int id) { return this; } + public Overload setId(long id) { + m_id = id; + m_keyId = id; + return this; + } + public Overload setKeyId(int keyId) { m_keyId = keyId; return this; } + public Overload setKeyId(long keyId) { + m_keyId = keyId; + return this; + } + public Overload setMaxId(int maxId) { m_maxId = maxId; return this; } + public Overload setMaxId(long maxId) { + m_maxId = maxId; + return this; + } + public Overload setPeriod(java.util.Date period) { m_period = period; return this; @@ -118,6 +154,11 @@ public Overload setReportId(int reportId) { return this; } + public Overload setReportId(long reportId) { + m_reportId = reportId; + return this; + } + public Overload setReportSize(double reportSize) { m_reportSize = reportSize; return this; @@ -138,13 +179,18 @@ public Overload setType(int type) { return this; } + public Overload setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); sb.append("Overload["); sb.append("count: ").append(m_count); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", end-time: ").append(m_endTime); sb.append(", id: ").append(m_id); sb.append(", key-id: ").append(m_keyId); @@ -155,6 +201,7 @@ public String toString() { sb.append(", report-type: ").append(m_reportType); sb.append(", start-time: ").append(m_startTime); sb.append(", type: ").append(m_type); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java index aa0b2ab9f9..ce5d2a1da6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java @@ -35,13 +35,13 @@ public class CapacityUpdateStatusManager { private OverloadRepository m_overloadDao; - private int m_hourlyStatus; + private long m_hourlyStatus; - private int m_dailyStatus; + private long m_dailyStatus; - private int m_weeklyStatus; + private long m_weeklyStatus; - private int m_monthlyStatus; + private long m_monthlyStatus; private long m_configId; @@ -64,25 +64,25 @@ private String buildConfigContent() { } private void extractStatus(String content) { - m_hourlyStatus = Integer.parseInt(content.split("Hourly:")[1].split(";")[0]); - m_dailyStatus = Integer.parseInt(content.split("Daily:")[1].split(";")[0]); - m_weeklyStatus = Integer.parseInt(content.split("Weekly:")[1].split(";")[0]); - m_monthlyStatus = Integer.parseInt(content.split("Monthly:")[1].split(";")[0]); + m_hourlyStatus = Long.parseLong(content.split("Hourly:")[1].split(";")[0]); + m_dailyStatus = Long.parseLong(content.split("Daily:")[1].split(";")[0]); + m_weeklyStatus = Long.parseLong(content.split("Weekly:")[1].split(";")[0]); + m_monthlyStatus = Long.parseLong(content.split("Monthly:")[1].split(";")[0]); } - public int getDailyStatus() { + public long getDailyStatus() { return m_dailyStatus; } - public int getHourlyStatus() { + public long getHourlyStatus() { return m_hourlyStatus; } - public int getMonthlyStatus() { + public long getMonthlyStatus() { return m_monthlyStatus; } - public int getWeeklyStatus() { + public long getWeeklyStatus() { return m_weeklyStatus; } @@ -138,22 +138,22 @@ private boolean storeConfig() { return true; } - public void updateDailyStatus(int dailyStatus) { + public void updateDailyStatus(long dailyStatus) { this.m_dailyStatus = dailyStatus; storeConfig(); } - public void updateHourlyStatus(int hourlyStatus) { + public void updateHourlyStatus(long hourlyStatus) { this.m_hourlyStatus = hourlyStatus; storeConfig(); } - public void updateMonthlyStatus(int monthlyStatus) { + public void updateMonthlyStatus(long monthlyStatus) { this.m_monthlyStatus = monthlyStatus; storeConfig(); } - public void updateWeeklyStatus(int weeklyStatus) { + public void updateWeeklyStatus(long weeklyStatus) { this.m_weeklyStatus = weeklyStatus; storeConfig(); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java index 427f79c820..f19e736078 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java @@ -65,13 +65,9 @@ public void updateDBCapacity() { double contentLength = content.getContentLength(); if (contentLength >= CapacityUpdater.CAPACITY) { - if (reportId > Integer.MAX_VALUE) { - LOGGER.warn("Daily report id exceeds overload table capacity, reportId={}.", reportId); - continue; - } Overload overload = m_overloadDao.createLocal(); - overload.setReportId((int) reportId); + overload.setReportId(reportId); overload.setReportSize(contentLength); overload.setReportType(CapacityUpdater.DAILY_TYPE); @@ -100,7 +96,7 @@ public void updateDBCapacity() { maxId = reports.get(size - 1).getReportId(); } } - m_manager.updateDailyStatus((int) Math.min(maxId, Integer.MAX_VALUE)); + m_manager.updateDailyStatus(maxId); LOGGER.info("Finished daily report capacity scan, finalMaxId={}.", maxId); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java index a598efa451..11105cbde4 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java @@ -65,13 +65,9 @@ public void updateDBCapacity() { double contentLength = content.getContentLength(); if (contentLength >= CapacityUpdater.CAPACITY) { - if (reportId > Integer.MAX_VALUE) { - LOGGER.warn("Hourly report id exceeds overload table capacity, reportId={}.", reportId); - continue; - } Overload overload = m_overloadDao.createLocal(); - overload.setReportId((int) reportId); + overload.setReportId(reportId); overload.setReportSize(contentLength); overload.setReportType(CapacityUpdater.HOURLY_TYPE); @@ -102,7 +98,7 @@ public void updateDBCapacity() { maxId = reports.get(size - 1).getReportId(); } } - m_manager.updateHourlyStatus((int) Math.min(maxId, Integer.MAX_VALUE)); + m_manager.updateHourlyStatus(maxId); LOGGER.info("Finished hourly report capacity scan, finalMaxId={}.", maxId); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java index 2550076a5c..6b702e1fb1 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java @@ -65,13 +65,9 @@ public void updateDBCapacity() { double contentLength = content.getContentLength(); if (contentLength >= CapacityUpdater.CAPACITY) { - if (reportId > Integer.MAX_VALUE) { - LOGGER.warn("Monthly report id exceeds overload table capacity, reportId={}.", reportId); - continue; - } Overload overload = m_overloadDao.createLocal(); - overload.setReportId((int) reportId); + overload.setReportId(reportId); overload.setReportSize(contentLength); overload.setReportType(CapacityUpdater.MONTHLY_TYPE); @@ -100,7 +96,7 @@ public void updateDBCapacity() { maxId = reports.get(size - 1).getReportId(); } } - m_manager.updateMonthlyStatus((int) Math.min(maxId, Integer.MAX_VALUE)); + m_manager.updateMonthlyStatus(maxId); LOGGER.info("Finished monthly report capacity scan, finalMaxId={}.", maxId); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java index 401a034175..d1cb397a23 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java @@ -99,7 +99,7 @@ public List queryOverloadReports(Date startTime, Date endTime) { for (Overload overload : overloads) { try { - int reportId = overload.getReportId(); + long reportId = overload.getReportId(); int reportType = overload.getReportType(); double reportSize = overload.getReportSize(); Object report = null; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java index e775c69a2d..6f8a14ac80 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java @@ -65,13 +65,9 @@ public void updateDBCapacity() { double contentLength = content.getContentLength(); if (contentLength >= CapacityUpdater.CAPACITY) { - if (reportId > Integer.MAX_VALUE) { - LOGGER.warn("Weekly report id exceeds overload table capacity, reportId={}.", reportId); - continue; - } Overload overload = m_overloadDao.createLocal(); - overload.setReportId((int) reportId); + overload.setReportId(reportId); overload.setReportSize(contentLength); overload.setReportType(CapacityUpdater.WEEKLY_TYPE); @@ -100,7 +96,7 @@ public void updateDBCapacity() { maxId = reports.get(size - 1).getReportId(); } } - m_manager.updateWeeklyStatus((int) Math.min(maxId, Integer.MAX_VALUE)); + m_manager.updateWeeklyStatus(maxId); LOGGER.info("Finished weekly report capacity scan, finalMaxId={}.", maxId); } diff --git a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml index ad289a1dca..87636eca34 100644 --- a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -14,7 +14,7 @@
-
+
diff --git a/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml b/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml index 608bcbef77..3d78bc5af8 100644 --- a/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml @@ -7,7 +7,8 @@ - + + @@ -18,7 +19,8 @@ report_type , report_size , period , - creation_date + create_time , + update_time @@ -28,48 +30,51 @@ report_type = #{reportType} , report_size = #{reportSize} , period = #{period} , - creation_date = #{creationDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO overload + INSERT INTO t_overload - delete from overload where id = #{id} + delete from t_overload where id = #{id} - UPDATE overload + UPDATE t_overload WHERE id = #{id} - \ No newline at end of file + diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index 2b2f7bcd40..7d528c32fb 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -289,16 +289,21 @@ data: KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户操作日志'; - CREATE TABLE `overload` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', - `report_id` int(11) NOT NULL COMMENT '报告id', - `report_type` tinyint(4) NOT NULL COMMENT '报告类型 1:hourly 2:daily 3:weekly 4:monthly', - `report_size` double NOT NULL COMMENT '报告大小 单位MB', - `period` datetime NOT NULL COMMENT '报表时间', - `creation_date` datetime NOT NULL COMMENT '创建时间', + CREATE TABLE `t_overload` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `report_id` bigint NOT NULL DEFAULT '0' COMMENT '报表ID', + `report_type` tinyint NOT NULL DEFAULT '0' COMMENT '报表类型 1=hourly 2=daily 3=weekly 4=monthly', + `report_size` double NOT NULL DEFAULT '0' COMMENT '报表大小,单位MB', + `period` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - KEY `period` (`period`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='过大容量表'; + KEY `idx_period` (`period`), + KEY `idx_report_type_report_id` (`report_type`, `report_id`), + KEY `idx_period_report_type` (`period`, `report_type`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='过大容量报表'; CREATE TABLE `config_modification` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', diff --git a/script/CatApplication.sql b/script/CatApplication.sql index 1acecb9c87..cb07dc2a48 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -321,16 +321,21 @@ CREATE TABLE `t_operation` ( KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户操作日志'; -CREATE TABLE `overload` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', - `report_id` int(11) NOT NULL COMMENT '报告id', - `report_type` tinyint(4) NOT NULL COMMENT '报告类型 1:hourly 2:daily 3:weekly 4:monthly', - `report_size` double NOT NULL COMMENT '报告大小 单位MB', - `period` datetime NOT NULL COMMENT '报表时间', - `creation_date` datetime NOT NULL COMMENT '创建时间', +CREATE TABLE `t_overload` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `report_id` bigint NOT NULL DEFAULT '0' COMMENT '报表ID', + `report_type` tinyint NOT NULL DEFAULT '0' COMMENT '报表类型 1=hourly 2=daily 3=weekly 4=monthly', + `report_size` double NOT NULL DEFAULT '0' COMMENT '报表大小,单位MB', + `period` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - KEY `period` (`period`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='过大容量表'; + KEY `idx_period` (`period`), + KEY `idx_report_type_report_id` (`report_type`, `report_id`), + KEY `idx_period_report_type` (`period`, `report_type`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='过大容量报表'; CREATE TABLE `config_modification` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', From f130ce64c02778c988b7662471b5edc4d3f0675e Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 09:32:29 +0800 Subject: [PATCH 163/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fconfig=5Fmodifica?= =?UTF-8?q?tion=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dao/ConfigModificationMapper.java | 4 +- .../dao/data/ConfigModificationDO.java | 42 ++++++++++-- .../ConfigModificationRepository.java | 12 +++- .../home/dal/report/ConfigModification.java | 65 +++++++++++++++---- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mapper/ConfigModificationMapper.xml | 27 ++++---- .../templates/configmap-cat-mysql-script.yaml | 27 +++++--- script/CatApplication.sql | 27 +++++--- 8 files changed, 153 insertions(+), 53 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/ConfigModificationMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/ConfigModificationMapper.java index ac0ff1a21a..990d5591d3 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/ConfigModificationMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/ConfigModificationMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.config.modification.dao.data.ConfigModificationDO; public interface ConfigModificationMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - ConfigModificationDO findByPrimaryKey(@Param("id") Integer id); + ConfigModificationDO findByPrimaryKey(@Param("id") Long id); int insert(ConfigModificationDO record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/data/ConfigModificationDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/data/ConfigModificationDO.java index dc1edbf45c..c498ef2b35 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/data/ConfigModificationDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/data/ConfigModificationDO.java @@ -6,7 +6,7 @@ @Data public class ConfigModificationDO { - private Integer id; + private Long id; private String userName; @@ -16,9 +16,43 @@ public class ConfigModificationDO { private String argument; - private Date date; + private Date modifyTime; - private Date creationDate; + private Date createTime; - private Integer keyId; + private Date updateTime; + + private Long keyId; + + public Date getCreationDate() { + return createTime; + } + + public Date getDate() { + return modifyTime; + } + + public void setCreationDate(Date creationDate) { + createTime = creationDate; + } + + public void setDate(Date date) { + modifyTime = date; + } + + public void setId(Integer id) { + this.id = id == null ? null : id.longValue(); + } + + public void setId(Long id) { + this.id = id; + } + + public void setKeyId(Integer keyId) { + this.keyId = keyId == null ? null : keyId.longValue(); + } + + public void setKeyId(Long keyId) { + this.keyId = keyId; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java index f1ed4004df..6536906156 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java @@ -34,6 +34,10 @@ public int deleteByPK(ConfigModification proto) { } public ConfigModification findByPK(int keyId) { + return findByPK((long) keyId); + } + + public ConfigModification findByPK(long keyId) { ConfigModificationMapper mapper = springMapper(LOGGER); try { @@ -102,6 +106,9 @@ private ConfigModification toModel(ConfigModificationDO record) { if (record.getCreationDate() != null) { model.setCreationDate(record.getCreationDate()); } + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); + } model.afterLoad(); return model; } @@ -114,8 +121,9 @@ private ConfigModificationDO toRecord(ConfigModification model) { record.setAccountName(model.getAccountName()); record.setActionName(model.getActionName()); record.setArgument(model.getArgument()); - record.setDate(model.getDate()); - record.setCreationDate(model.getCreationDate()); + record.setModifyTime(model.getModifyTime()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); return record; } diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/ConfigModification.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/ConfigModification.java index f1122f9700..9f0022ad0d 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/dal/report/ConfigModification.java +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/ConfigModification.java @@ -2,7 +2,7 @@ public class ConfigModification { - private int m_id; + private long m_id; private String m_userName; @@ -12,11 +12,13 @@ public class ConfigModification { private String m_argument; - private java.util.Date m_date; + private java.util.Date m_modifyTime; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private int m_keyId; + private java.util.Date m_updateTime; + + private long m_keyId; public void afterLoad() { m_keyId = m_id; } @@ -34,21 +36,33 @@ public String getArgument() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public java.util.Date getDate() { - return m_date; + return m_modifyTime; } - public int getId() { + public long getId() { return m_id; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } + public java.util.Date getModifyTime() { + return m_modifyTime; + } + + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public String getUserName() { return m_userName; } @@ -69,12 +83,17 @@ public ConfigModification setArgument(String argument) { } public ConfigModification setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public ConfigModification setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } public ConfigModification setDate(java.util.Date date) { - m_date = date; + m_modifyTime = date; return this; } @@ -84,11 +103,32 @@ public ConfigModification setId(int id) { return this; } + public ConfigModification setId(long id) { + m_id = id; + m_keyId = id; + return this; + } + public ConfigModification setKeyId(int keyId) { m_keyId = keyId; return this; } + public ConfigModification setKeyId(long keyId) { + m_keyId = keyId; + return this; + } + + public ConfigModification setModifyTime(java.util.Date modifyTime) { + m_modifyTime = modifyTime; + return this; + } + + public ConfigModification setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + public ConfigModification setUserName(String userName) { m_userName = userName; return this; @@ -102,10 +142,11 @@ public String toString() { sb.append("account-name: ").append(m_accountName); sb.append(", action-name: ").append(m_actionName); sb.append(", argument: ").append(m_argument); - sb.append(", creation-date: ").append(m_creationDate); - sb.append(", date: ").append(m_date); + sb.append(", create-time: ").append(m_createTime); sb.append(", id: ").append(m_id); sb.append(", key-id: ").append(m_keyId); + sb.append(", modify-time: ").append(m_modifyTime); + sb.append(", update-time: ").append(m_updateTime); sb.append(", user-name: ").append(m_userName); sb.append("]"); return sb.toString(); diff --git a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml index 87636eca34..b6757ef668 100644 --- a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -15,7 +15,7 @@
-
+
diff --git a/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml b/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml index e5204b99e5..4da92945b4 100644 --- a/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml @@ -7,8 +7,9 @@ - - + + + @@ -17,8 +18,9 @@ account_name , action_name , argument , - date , - creation_date + modify_time , + create_time , + update_time @@ -28,37 +30,38 @@ account_name = #{accountName} , action_name = #{actionName} , argument = #{argument} , - date = #{date} , - creation_date = #{creationDate} + modify_time = #{modifyTime} , + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO config_modification + INSERT INTO t_config_modification - delete from config_modification where id = #{id} + delete from t_config_modification where id = #{id} - UPDATE config_modification + UPDATE t_config_modification WHERE id = #{id} - \ No newline at end of file + diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index 7d528c32fb..45020e3bc8 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -305,16 +305,23 @@ data: KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='过大容量报表'; - CREATE TABLE `config_modification` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', - `user_name` varchar(64) NOT NULL COMMENT '用户名', - `account_name` varchar(64) NOT NULL COMMENT '账户名', - `action_name` varchar(64) NOT NULL COMMENT 'action名', - `argument` longtext COMMENT '参数内容', - `date` datetime NOT NULL COMMENT '修改时间', - `creation_date` datetime NOT NULL COMMENT '创建时间', - PRIMARY KEY (`id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='配置修改记录表'; + CREATE TABLE `t_config_modification` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `user_name` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名', + `account_name` varchar(64) NOT NULL DEFAULT '' COMMENT '账号名', + `action_name` varchar(64) NOT NULL DEFAULT '' COMMENT '操作名称', + `argument` longtext NOT NULL COMMENT '参数内容', + `modify_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_modify_time` (`modify_time`), + KEY `idx_user_modify_time` (`user_name`, `modify_time`), + KEY `idx_account_modify_time` (`account_name`, `modify_time`), + KEY `idx_action_modify_time` (`action_name`, `modify_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='配置修改记录'; CREATE TABLE `user_define_rule` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', diff --git a/script/CatApplication.sql b/script/CatApplication.sql index cb07dc2a48..aca8003211 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -337,16 +337,23 @@ CREATE TABLE `t_overload` ( KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='过大容量报表'; -CREATE TABLE `config_modification` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', - `user_name` varchar(64) NOT NULL COMMENT '用户名', - `account_name` varchar(64) NOT NULL COMMENT '账户名', - `action_name` varchar(64) NOT NULL COMMENT 'action名', - `argument` longtext COMMENT '参数内容', - `date` datetime NOT NULL COMMENT '修改时间', - `creation_date` datetime NOT NULL COMMENT '创建时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='配置修改记录表'; +CREATE TABLE `t_config_modification` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `user_name` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名', + `account_name` varchar(64) NOT NULL DEFAULT '' COMMENT '账号名', + `action_name` varchar(64) NOT NULL DEFAULT '' COMMENT '操作名称', + `argument` longtext NOT NULL COMMENT '参数内容', + `modify_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_modify_time` (`modify_time`), + KEY `idx_user_modify_time` (`user_name`, `modify_time`), + KEY `idx_account_modify_time` (`account_name`, `modify_time`), + KEY `idx_action_modify_time` (`action_name`, `modify_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='配置修改记录'; CREATE TABLE `user_define_rule` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', From 8866c4bb3194a5e26be9db4da3bfadf1e4740c43 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 09:35:44 +0800 Subject: [PATCH 164/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fuser=5Fdefine=5Fr?= =?UTF-8?q?ule=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dianping/cat/alarm/UserDefineRule.java | 57 +++++++++++++++---- .../define/rule/UserDefineRuleRepository.java | 10 +++- .../define/rule/dao/UserDefineRuleMapper.java | 4 +- .../rule/dao/data/UserDefineRuleDO.java | 42 ++++++++++++-- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/UserDefineRuleMapper.xml | 23 ++++---- .../spi/config/UserDefinedRuleManager.java | 8 +-- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../templates/configmap-cat-mysql-script.yaml | 15 +++-- script/CatApplication.sql | 15 +++-- 10 files changed, 133 insertions(+), 45 deletions(-) diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/UserDefineRule.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/UserDefineRule.java index d92b48b875..70ed7ded6a 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/UserDefineRule.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/UserDefineRule.java @@ -2,15 +2,17 @@ public class UserDefineRule { - private int m_id; + private long m_id; private String m_content; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private int m_keyId; + private java.util.Date m_updateTime; - private int m_maxId; + private long m_keyId; + + private long m_maxId; public void afterLoad() { m_keyId = m_id; } @@ -20,28 +22,41 @@ public String getContent() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } - public int getId() { + public long getId() { return m_id; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } - public int getMaxId() { + public long getMaxId() { return m_maxId; } + public java.util.Date getUpdateTime() { + return m_updateTime; + } + public UserDefineRule setContent(String content) { m_content = content; return this; } public UserDefineRule setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public UserDefineRule setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -51,26 +66,48 @@ public UserDefineRule setId(int id) { return this; } + public UserDefineRule setId(long id) { + m_id = id; + m_keyId = id; + return this; + } + public UserDefineRule setKeyId(int keyId) { m_keyId = keyId; return this; } + public UserDefineRule setKeyId(long keyId) { + m_keyId = keyId; + return this; + } + public UserDefineRule setMaxId(int maxId) { m_maxId = maxId; return this; } + public UserDefineRule setMaxId(long maxId) { + m_maxId = maxId; + return this; + } + + public UserDefineRule setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; + return this; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); sb.append("UserDefineRule["); sb.append("content: ").append(m_content); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", id: ").append(m_id); sb.append(", key-id: ").append(m_keyId); sb.append(", max-id: ").append(m_maxId); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java index 2fda36b6da..04d61bad64 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java @@ -34,6 +34,10 @@ public int deleteByPK(UserDefineRule proto) { } public UserDefineRule findByPK(int keyId) { + return findByPK((long) keyId); + } + + public UserDefineRule findByPK(long keyId) { UserDefineRuleMapper mapper = springMapper(LOGGER); try { @@ -105,6 +109,9 @@ private UserDefineRule toModel(UserDefineRuleDO record) { if (record.getCreationDate() != null) { model.setCreationDate(record.getCreationDate()); } + if (record.getUpdateTime() != null) { + model.setUpdateTime(record.getUpdateTime()); + } if (record.getMaxId() != null) { model.setMaxId(record.getMaxId()); } @@ -117,7 +124,8 @@ private UserDefineRuleDO toRecord(UserDefineRule model) { record.setId(model.getId()); record.setContent(model.getContent()); - record.setCreationDate(model.getCreationDate()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); return record; } diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/UserDefineRuleMapper.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/UserDefineRuleMapper.java index 7d16e0d17e..ded5013938 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/UserDefineRuleMapper.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/UserDefineRuleMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.user.define.rule.dao.data.UserDefineRuleDO; public interface UserDefineRuleMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - UserDefineRuleDO findByPrimaryKey(@Param("id") Integer id); + UserDefineRuleDO findByPrimaryKey(@Param("id") Long id); int insert(UserDefineRuleDO record); diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/data/UserDefineRuleDO.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/data/UserDefineRuleDO.java index 5e278ae26b..6b6b4acbc4 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/data/UserDefineRuleDO.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/data/UserDefineRuleDO.java @@ -6,13 +6,47 @@ @Data public class UserDefineRuleDO { - private Integer id; + private Long id; private String content; - private Date creationDate; + private Date createTime; - private Integer maxId; + private Date updateTime; - private Integer keyId; + private Long maxId; + + private Long keyId; + + public Date getCreationDate() { + return createTime; + } + + public void setCreationDate(Date creationDate) { + createTime = creationDate; + } + + public void setId(Integer id) { + this.id = id == null ? null : id.longValue(); + } + + public void setId(Long id) { + this.id = id; + } + + public void setKeyId(Integer keyId) { + this.keyId = keyId == null ? null : keyId.longValue(); + } + + public void setKeyId(Long keyId) { + this.keyId = keyId; + } + + public void setMaxId(Integer maxId) { + this.maxId = maxId == null ? null : maxId.longValue(); + } + + public void setMaxId(Long maxId) { + this.maxId = maxId; + } } diff --git a/cat-alarm/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-alarm/src/main/resources/META-INF/wizard/jdbc/wizard.xml index 9a44d7f8bf..12ea3b7f98 100644 --- a/cat-alarm/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-alarm/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -10,7 +10,7 @@
-
+
diff --git a/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml b/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml index 058a5ccba8..f53b49c19a 100644 --- a/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml +++ b/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml @@ -4,54 +4,57 @@ - + + id , content , - creation_date + create_time , + update_time id = #{id} , content = #{content} , - creation_date = #{creationDate} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO user_define_rule + INSERT INTO t_user_define_rule - delete from user_define_rule where id = #{id} + delete from t_user_define_rule where id = #{id} - UPDATE user_define_rule + UPDATE t_user_define_rule WHERE id = #{id} - \ No newline at end of file + diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java index 3e9d9bab3f..a974800b0e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java @@ -28,7 +28,7 @@ public class UserDefinedRuleManager { public String addUserDefineText(String userDefinedText) { UserDefineRule item = m_dao.findMaxId(); - int id = 1; + long id = 1; if (item != null) { id = item.getMaxId() + 1; } @@ -38,11 +38,11 @@ public String addUserDefineText(String userDefinedText) { userDefineRule.setContent(userDefinedText); userDefineRule.setId(id); m_dao.insert(userDefineRule); - return Integer.toString(id); + return Long.toString(id); } public String getUserDefineText(String idStr) { - int id = Integer.parseInt(idStr); + long id = Long.parseLong(idStr); UserDefineRule item = m_dao.findByPK(id); return item.getContent(); @@ -51,7 +51,7 @@ public String getUserDefineText(String idStr) { public void removeById(String id) { UserDefineRule item = m_dao.createLocal(); - item.setId(Integer.parseInt(id)); + item.setId(Long.parseLong(id)); m_dao.deleteByPK(item); } diff --git a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml index b6757ef668..e4e99f0392 100644 --- a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -16,7 +16,7 @@
-
+
diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index 45020e3bc8..13d846c1b4 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -323,12 +323,15 @@ data: KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='配置修改记录'; - CREATE TABLE `user_define_rule` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', - `content` text NOT NULL COMMENT '用户定义规则', - `creation_date` datetime NOT NULL COMMENT '创建时间', - PRIMARY KEY (`id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户定义规则表'; + CREATE TABLE `t_user_define_rule` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `content` text NOT NULL COMMENT '用户自定义规则', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户自定义规则'; CREATE TABLE `business_config` ( `id` int(11) NOT NULL AUTO_INCREMENT, diff --git a/script/CatApplication.sql b/script/CatApplication.sql index aca8003211..27bd636453 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -355,12 +355,15 @@ CREATE TABLE `t_config_modification` ( KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='配置修改记录'; -CREATE TABLE `user_define_rule` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID', - `content` text NOT NULL COMMENT '用户定义规则', - `creation_date` datetime NOT NULL COMMENT '创建时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户定义规则表'; +CREATE TABLE `t_user_define_rule` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `content` text NOT NULL COMMENT '用户自定义规则', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户自定义规则'; CREATE TABLE `business_config` ( `id` int(11) NOT NULL AUTO_INCREMENT, From 04718cc5b6e6c29fb09e24887d134bb357a0545a Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 09:44:22 +0800 Subject: [PATCH 165/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fbusiness=5Fconfig?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/core/config/BusinessConfig.java | 48 +++++++++++--- .../config/dao/BusinessConfigMapper.java | 4 +- .../config/dao/data/BusinessConfigDO.java | 36 ++++++++++- .../config/BusinessConfigRepository.java | 64 +++++++------------ .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/BusinessConfigMapper.xml | 31 +++++---- .../config/BusinessTagConfigManager.java | 2 +- .../templates/configmap-cat-mysql-script.yaml | 22 ++++--- script/CatApplication.sql | 22 ++++--- 9 files changed, 145 insertions(+), 86 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/BusinessConfig.java b/cat-core/src/main/java/com/dianping/cat/core/config/BusinessConfig.java index 71a941b8be..2c83063f06 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/config/BusinessConfig.java +++ b/cat-core/src/main/java/com/dianping/cat/core/config/BusinessConfig.java @@ -2,7 +2,7 @@ public class BusinessConfig { - private int m_id; + private long m_id; private String m_name; @@ -10,9 +10,11 @@ public class BusinessConfig { private String m_content; - private java.util.Date m_updatetime; + private java.util.Date m_createTime; - private int m_keyId; + private java.util.Date m_updateTime; + + private long m_keyId; public void afterLoad() { m_keyId = m_id; } @@ -25,11 +27,15 @@ public String getDomain() { return m_domain; } - public int getId() { + public java.util.Date getCreateTime() { + return m_createTime; + } + + public long getId() { return m_id; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } @@ -38,7 +44,11 @@ public String getName() { } public java.util.Date getUpdatetime() { - return m_updatetime; + return m_updateTime; + } + + public java.util.Date getUpdateTime() { + return m_updateTime; } public BusinessConfig setContent(String content) { @@ -46,6 +56,11 @@ public BusinessConfig setContent(String content) { return this; } + public BusinessConfig setCreateTime(java.util.Date createTime) { + m_createTime = createTime; + return this; + } + public BusinessConfig setDomain(String domain) { m_domain = domain; return this; @@ -57,18 +72,34 @@ public BusinessConfig setId(int id) { return this; } + public BusinessConfig setId(long id) { + m_id = id; + m_keyId = id; + return this; + } + public BusinessConfig setKeyId(int keyId) { m_keyId = keyId; return this; } + public BusinessConfig setKeyId(long keyId) { + m_keyId = keyId; + return this; + } + public BusinessConfig setName(String name) { m_name = name; return this; } public BusinessConfig setUpdatetime(java.util.Date updatetime) { - m_updatetime = updatetime; + m_updateTime = updatetime; + return this; + } + + public BusinessConfig setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; return this; } @@ -78,11 +109,12 @@ public String toString() { sb.append("BusinessConfig["); sb.append("content: ").append(m_content); + sb.append(", create-time: ").append(m_createTime); sb.append(", domain: ").append(m_domain); sb.append(", id: ").append(m_id); sb.append(", key-id: ").append(m_keyId); sb.append(", name: ").append(m_name); - sb.append(", updatetime: ").append(m_updatetime); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/BusinessConfigMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/BusinessConfigMapper.java index d7f4dbe831..0d5be1faa7 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/BusinessConfigMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/BusinessConfigMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.business.config.dao.data.BusinessConfigDO; public interface BusinessConfigMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - BusinessConfigDO findByPrimaryKey(@Param("id") Integer id); + BusinessConfigDO findByPrimaryKey(@Param("id") Long id); int insert(BusinessConfigDO record); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/data/BusinessConfigDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/data/BusinessConfigDO.java index d339aa3c8e..aeb9fb4921 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/data/BusinessConfigDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/data/BusinessConfigDO.java @@ -6,7 +6,7 @@ @Data public class BusinessConfigDO { - private Integer id; + private Long id; private String name; @@ -14,7 +14,37 @@ public class BusinessConfigDO { private String content; - private Date updatetime; + private Date createTime; - private Integer keyId; + private Date updateTime; + + private Long keyId; + + public Date getUpdatetime() { + return updateTime; + } + + public void setId(Integer id) { + this.id = id == null ? null : id.longValue(); + } + + public void setId(Long id) { + this.id = id; + } + + public void setKeyId(Integer keyId) { + this.keyId = keyId == null ? null : keyId.longValue(); + } + + public void setKeyId(Long keyId) { + this.keyId = keyId; + } + + public void setUpdatetime(Date updatetime) { + updateTime = updatetime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java index 69781d2444..864c06e3d0 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java @@ -1,10 +1,8 @@ package com.dianping.cat.core.mybatis.repository.business.config; import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; -import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.EmptyResultDataAccessException; @@ -13,15 +11,17 @@ import com.dianping.cat.core.config.BusinessConfig; import com.dianping.cat.core.mybatis.business.config.dao.BusinessConfigMapper; import com.dianping.cat.core.mybatis.business.config.dao.data.BusinessConfigDO; +import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; -public class BusinessConfigRepository { +public class BusinessConfigRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(BusinessConfigRepository.class); - private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); + private static final String MAPPER_RESOURCE = "mybatis/mapper/BusinessConfigMapper.xml"; - private SqlSessionTemplate m_sqlSessionTemplate; - - private TransactionTemplate m_transactionTemplate; + public BusinessConfigRepository() { + super(BusinessConfigMapper.class, MAPPER_RESOURCE, + "BusinessConfigRepository is using Spring managed BusinessConfigMapper."); + } public BusinessConfig createLocal() { return new BusinessConfig(); @@ -30,11 +30,11 @@ public BusinessConfig createLocal() { public int deleteByPK(BusinessConfig proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); - return transactionTemplate.execute(status -> springMapper().deleteByPrimaryKey(proto.getKeyId())); + return transactionTemplate.execute(status -> springMapper(LOGGER).deleteByPrimaryKey(proto.getKeyId())); } public List findByName(String name) { - BusinessConfigMapper mapper = springMapper(); + BusinessConfigMapper mapper = springMapper(LOGGER); BusinessConfigDO record = new BusinessConfigDO(); record.setName(name); @@ -42,13 +42,17 @@ public List findByName(String name) { } public BusinessConfig findByPK(int keyId) { - BusinessConfigMapper mapper = springMapper(); + return findByPK((long) keyId); + } + + public BusinessConfig findByPK(long keyId) { + BusinessConfigMapper mapper = springMapper(LOGGER); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } public BusinessConfig findByNameDomain(String name, String domain) { - BusinessConfigMapper mapper = springMapper(); + BusinessConfigMapper mapper = springMapper(LOGGER); BusinessConfigDO record = new BusinessConfigDO(); record.setName(name); @@ -62,7 +66,7 @@ public int insert(BusinessConfig proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); BusinessConfigDO record = toRecord(proto); - int count = transactionTemplate.execute(status -> springMapper().insert(record)); + int count = transactionTemplate.execute(status -> springMapper(LOGGER).insert(record)); proto.setId(record.getId()); proto.setKeyId(record.getId()); @@ -72,39 +76,13 @@ public int insert(BusinessConfig proto) { public int updateByPK(BusinessConfig proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); - return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); + return transactionTemplate.execute(status -> springMapper(LOGGER).updateByPrimaryKey(toRecord(proto))); } public int updateBaseConfigByDomain(BusinessConfig proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); - return transactionTemplate.execute(status -> springMapper().updateBaseConfigByDomain(toRecord(proto))); - } - - private BusinessConfigMapper springMapper() { - if (m_sqlSessionTemplate == null) { - throw new IllegalStateException("Spring SqlSessionTemplate is not configured for BusinessConfigMapper."); - } - if (SPRING_MAPPER_LOGGED.compareAndSet(false, true)) { - LOGGER.info("BusinessConfigRepository is using Spring managed BusinessConfigMapper."); - } - - return m_sqlSessionTemplate.getMapper(BusinessConfigMapper.class); - } - - private TransactionTemplate springTransactionTemplate() { - if (m_transactionTemplate == null) { - throw new IllegalStateException("Spring TransactionTemplate is not configured for BusinessConfigMapper."); - } - return m_transactionTemplate; - } - - public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { - m_sqlSessionTemplate = sqlSessionTemplate; - } - - public void setTransactionTemplate(TransactionTemplate transactionTemplate) { - m_transactionTemplate = transactionTemplate; + return transactionTemplate.execute(status -> springMapper(LOGGER).updateBaseConfigByDomain(toRecord(proto))); } private BusinessConfig requireFound(BusinessConfigDO record, String field, String value) { @@ -133,6 +111,9 @@ private BusinessConfig toModel(BusinessConfigDO record) { if (record.getUpdatetime() != null) { model.setUpdatetime(record.getUpdatetime()); } + if (record.getCreateTime() != null) { + model.setCreateTime(record.getCreateTime()); + } model.afterLoad(); return model; } @@ -144,7 +125,8 @@ private BusinessConfigDO toRecord(BusinessConfig model) { record.setName(model.getName()); record.setDomain(model.getDomain()); record.setContent(model.getContent()); - record.setUpdatetime(model.getUpdatetime()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); return record; } diff --git a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml index 12b35a68a7..408182a272 100644 --- a/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-core/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -27,7 +27,7 @@
-
+
diff --git a/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml b/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml index 217e7caff0..3a53c81d4e 100644 --- a/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml @@ -6,7 +6,8 @@ - + + @@ -14,7 +15,8 @@ name , domain , content , - updatetime + create_time , + update_time @@ -23,48 +25,53 @@ name = #{name} , domain = #{domain} , content = #{content} , - updatetime = #{updatetime} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO business_config + INSERT INTO t_business_config - delete from business_config where id = #{id} + delete from t_business_config where id = #{id} - UPDATE business_config + UPDATE t_business_config WHERE id = #{id} - UPDATE business_config SET content=#{record.content}, updatetime=NOW() where domain = #{record.domain} and name = #{record.name} + UPDATE t_business_config SET content=#{record.content}, update_time=NOW() where domain = #{record.domain} and name = #{record.name} - \ No newline at end of file + diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java index 6bd72af602..9f18623fde 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java @@ -44,7 +44,7 @@ public class BusinessTagConfigManager { private BusinessConfigRepository m_configDao; - private int m_configId; + private long m_configId; private BusinessTagConfig m_tagConfig = new BusinessTagConfig(); diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index 13d846c1b4..1405b98bcd 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -333,16 +333,20 @@ data: KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户自定义规则'; - CREATE TABLE `business_config` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(20) NOT NULL DEFAULT '' COMMENT '配置名称', - `domain` varchar(50) NOT NULL DEFAULT '' COMMENT '项目', - `content` longtext COMMENT '配置内容', - `updatetime` datetime NOT NULL, + CREATE TABLE `t_business_config` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(64) NOT NULL DEFAULT '' COMMENT '配置名称', + `domain` varchar(128) NOT NULL DEFAULT '' COMMENT '项目', + `content` longtext NOT NULL COMMENT '配置内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - KEY `updatetime` (`updatetime`), - KEY `name_domain` (`name`,`domain`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `uk_name_domain` (`name`, `domain`), + KEY `idx_name` (`name`), + KEY `idx_domain` (`domain`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务配置'; CREATE TABLE `metric_screen` ( `id` int(11) NOT NULL AUTO_INCREMENT, diff --git a/script/CatApplication.sql b/script/CatApplication.sql index 27bd636453..e215c1cd40 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -365,16 +365,20 @@ CREATE TABLE `t_user_define_rule` ( KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户自定义规则'; -CREATE TABLE `business_config` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(20) NOT NULL DEFAULT '' COMMENT '配置名称', - `domain` varchar(50) NOT NULL DEFAULT '' COMMENT '项目', - `content` longtext COMMENT '配置内容', - `updatetime` datetime NOT NULL, +CREATE TABLE `t_business_config` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(64) NOT NULL DEFAULT '' COMMENT '配置名称', + `domain` varchar(128) NOT NULL DEFAULT '' COMMENT '项目', + `content` longtext NOT NULL COMMENT '配置内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - KEY `updatetime` (`updatetime`), - KEY `name_domain` (`name`,`domain`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `uk_name_domain` (`name`, `domain`), + KEY `idx_name` (`name`), + KEY `idx_domain` (`domain`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务配置'; CREATE TABLE `metric_screen` ( `id` int(11) NOT NULL AUTO_INCREMENT, From b10a50de7cd4ea1cb0954cefbb483ef1fa3b1f3f Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 09:48:53 +0800 Subject: [PATCH 166/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fmetric=5Fscreen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../metric/screen/dao/MetricScreenMapper.java | 4 +- .../screen/dao/data/MetricScreenDO.java | 44 +++++++++++++-- .../metric/screen/MetricScreenRepository.java | 8 ++- .../cat/home/dal/report/MetricScreen.java | 53 ++++++++++++++----- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/MetricScreenMapper.xml | 52 ++++++++++-------- .../templates/configmap-cat-mysql-script.yaml | 28 +++++----- script/CatApplication.sql | 28 +++++----- 8 files changed, 151 insertions(+), 68 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/MetricScreenMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/MetricScreenMapper.java index 86879f8683..19101a43d8 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/MetricScreenMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/MetricScreenMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.metric.screen.dao.data.MetricScreenDO; public interface MetricScreenMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - MetricScreenDO findByPrimaryKey(@Param("id") Integer id); + MetricScreenDO findByPrimaryKey(@Param("id") Long id); int insert(MetricScreenDO record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/data/MetricScreenDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/data/MetricScreenDO.java index 1f9664e2d6..7f4a78a9b4 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/data/MetricScreenDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/data/MetricScreenDO.java @@ -6,7 +6,7 @@ @Data public class MetricScreenDO { - private Integer id; + private Long id; private String name; @@ -20,9 +20,45 @@ public class MetricScreenDO { private String content; - private Date creationDate; + private Date createTime; - private Date updatetime; + private Date updateTime; - private Integer keyId; + private Long keyId; + + public Date getCreationDate() { + return createTime; + } + + public Date getUpdatetime() { + return updateTime; + } + + public void setCreationDate(Date creationDate) { + createTime = creationDate; + } + + public void setId(Integer id) { + this.id = id == null ? null : id.longValue(); + } + + public void setId(Long id) { + this.id = id; + } + + public void setKeyId(Integer keyId) { + this.keyId = keyId == null ? null : keyId.longValue(); + } + + public void setKeyId(Long keyId) { + this.keyId = keyId; + } + + public void setUpdatetime(Date updatetime) { + updateTime = updatetime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java index 8f9c4760fa..4b9bda5781 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java @@ -79,6 +79,10 @@ public List findByName(String name) { } public MetricScreen findByPK(int keyId) { + return findByPK((long) keyId); + } + + public MetricScreen findByPK(long keyId) { MetricScreenMapper mapper = springMapper(LOGGER); try { @@ -194,8 +198,8 @@ private MetricScreenDO toRecord(MetricScreen model) { record.setEndPoints(model.getEndPoints()); record.setMeasurements(model.getMeasurements()); record.setContent(model.getContent()); - record.setCreationDate(model.getCreationDate()); - record.setUpdatetime(model.getUpdatetime()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); return record; } diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricScreen.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricScreen.java index 89a33fe29b..6c0d52b28f 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricScreen.java +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricScreen.java @@ -2,7 +2,7 @@ public class MetricScreen { - private int m_id; + private long m_id; private String m_name; @@ -16,11 +16,11 @@ public class MetricScreen { private String m_content; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private java.util.Date m_updatetime; + private java.util.Date m_updateTime; - private int m_keyId; + private long m_keyId; public void afterLoad() { m_keyId = m_id; } @@ -30,7 +30,11 @@ public String getContent() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public String getEndPoints() { @@ -41,11 +45,11 @@ public String getGraphName() { return m_graphName; } - public int getId() { + public long getId() { return m_id; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } @@ -58,7 +62,11 @@ public String getName() { } public java.util.Date getUpdatetime() { - return m_updatetime; + return m_updateTime; + } + + public java.util.Date getUpdateTime() { + return m_updateTime; } public String getView() { @@ -71,7 +79,12 @@ public MetricScreen setContent(String content) { } public MetricScreen setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public MetricScreen setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -91,11 +104,22 @@ public MetricScreen setId(int id) { return this; } + public MetricScreen setId(long id) { + m_id = id; + m_keyId = id; + return this; + } + public MetricScreen setKeyId(int keyId) { m_keyId = keyId; return this; } + public MetricScreen setKeyId(long keyId) { + m_keyId = keyId; + return this; + } + public MetricScreen setMeasurements(String measurements) { m_measurements = measurements; return this; @@ -107,7 +131,12 @@ public MetricScreen setName(String name) { } public MetricScreen setUpdatetime(java.util.Date updatetime) { - m_updatetime = updatetime; + m_updateTime = updatetime; + return this; + } + + public MetricScreen setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; return this; } @@ -122,14 +151,14 @@ public String toString() { sb.append("MetricScreen["); sb.append("content: ").append(m_content); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", end-points: ").append(m_endPoints); sb.append(", graph-name: ").append(m_graphName); sb.append(", id: ").append(m_id); sb.append(", key-id: ").append(m_keyId); sb.append(", measurements: ").append(m_measurements); sb.append(", name: ").append(m_name); - sb.append(", updatetime: ").append(m_updatetime); + sb.append(", update-time: ").append(m_updateTime); sb.append(", view: ").append(m_view); sb.append("]"); return sb.toString(); diff --git a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml index e4e99f0392..d4af32094f 100644 --- a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -17,7 +17,7 @@
-
+
diff --git a/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml b/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml index 5e8246ee56..ff123bbd7d 100644 --- a/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml @@ -6,11 +6,11 @@ - + - - + + @@ -18,11 +18,11 @@ name , graph_name , view , - endPoints , + end_points , measurements , content , - creation_date , - updatetime + create_time , + update_time @@ -31,66 +31,72 @@ name = #{name} , graph_name = #{graphName} , view = #{view} , - endPoints = #{endPoints} , + end_points = #{endPoints} , measurements = #{measurements} , content = #{content} , - creation_date = #{creationDate} , - updatetime = #{updatetime} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO metric_screen + INSERT INTO t_metric_screen - delete from metric_screen where id = #{id} + delete from t_metric_screen where id = #{id} - UPDATE metric_screen + UPDATE t_metric_screen WHERE id = #{id} - INSERT INTO metric_screen(id, name, graph_name, view, endPoints, measurements, content, creation_date, updatetime) - values(#{record.id}, #{record.name}, #{record.graphName}, #{record.view}, #{record.endPoints}, #{record.measurements}, #{record.content}, #{record.creationDate}, #{record.updatetime}) - ON DUPLICATE KEY UPDATE view = #{record.view}, endPoints = #{record.endPoints}, measurements = #{record.measurements}, content = #{record.content} + INSERT INTO t_metric_screen(id, name, graph_name, view, end_points, measurements, content, create_time, update_time) + values(#{record.id}, #{record.name}, #{record.graphName}, #{record.view}, #{record.endPoints}, #{record.measurements}, #{record.content}, #{record.createTime}, #{record.updateTime}) + ON DUPLICATE KEY UPDATE view = #{record.view}, end_points = #{record.endPoints}, measurements = #{record.measurements}, content = #{record.content}, update_time = NOW() - DELETE from metric_screen where name = #{record.name} + DELETE from t_metric_screen where name = #{record.name} - DELETE from metric_screen where name = #{record.name} and graph_name = #{record.graphName} + DELETE from t_metric_screen where name = #{record.name} and graph_name = #{record.graphName} - \ No newline at end of file + diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index 1405b98bcd..f4be312872 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -348,19 +348,23 @@ data: KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务配置'; - CREATE TABLE `metric_screen` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(50) NOT NULL COMMENT '配置名称', - `graph_name` varchar(50) NOT NULL DEFAULT '' COMMENT 'Graph名称', - `view` varchar(50) NOT NULL DEFAULT '' COMMENT '视角', - `endPoints` longtext NOT NULL, - `measurements` longtext NOT NULL COMMENT '配置的指标', - `content` longtext NOT NULL COMMENT '配置的具体内容', - `creation_date` datetime NOT NULL COMMENT '配置创建时间', - `updatetime` datetime NOT NULL COMMENT '配置修改时间', + CREATE TABLE `t_metric_screen` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(64) NOT NULL DEFAULT '' COMMENT '配置名称', + `graph_name` varchar(64) NOT NULL DEFAULT '' COMMENT 'Graph名称', + `view` varchar(64) NOT NULL DEFAULT '' COMMENT '视角', + `end_points` longtext NOT NULL COMMENT '端点配置', + `measurements` longtext NOT NULL COMMENT '指标配置', + `content` longtext NOT NULL COMMENT '配置内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - UNIQUE KEY `name_graph` (`name`,`graph_name`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统监控的screen配置'; + UNIQUE KEY `uk_name_graph` (`name`, `graph_name`), + KEY `idx_name` (`name`), + KEY `idx_graph_name` (`graph_name`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统监控Screen配置'; CREATE TABLE `metric_graph` ( `id` int(11) NOT NULL AUTO_INCREMENT, diff --git a/script/CatApplication.sql b/script/CatApplication.sql index e215c1cd40..6ce79b64c7 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -380,19 +380,23 @@ CREATE TABLE `t_business_config` ( KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务配置'; -CREATE TABLE `metric_screen` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(50) NOT NULL COMMENT '配置名称', - `graph_name` varchar(50) NOT NULL DEFAULT '' COMMENT 'Graph名称', - `view` varchar(50) NOT NULL DEFAULT '' COMMENT '视角', - `endPoints` longtext NOT NULL, - `measurements` longtext NOT NULL COMMENT '配置的指标', - `content` longtext NOT NULL COMMENT '配置的具体内容', - `creation_date` datetime NOT NULL COMMENT '配置创建时间', - `updatetime` datetime NOT NULL COMMENT '配置修改时间', +CREATE TABLE `t_metric_screen` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(64) NOT NULL DEFAULT '' COMMENT '配置名称', + `graph_name` varchar(64) NOT NULL DEFAULT '' COMMENT 'Graph名称', + `view` varchar(64) NOT NULL DEFAULT '' COMMENT '视角', + `end_points` longtext NOT NULL COMMENT '端点配置', + `measurements` longtext NOT NULL COMMENT '指标配置', + `content` longtext NOT NULL COMMENT '配置内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - UNIQUE KEY `name_graph` (`name`,`graph_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统监控的screen配置'; + UNIQUE KEY `uk_name_graph` (`name`, `graph_name`), + KEY `idx_name` (`name`), + KEY `idx_graph_name` (`graph_name`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统监控Screen配置'; CREATE TABLE `metric_graph` ( `id` int(11) NOT NULL AUTO_INCREMENT, From 97330fabf0e7f48b5c440eb559077c50a5243524 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 09:57:05 +0800 Subject: [PATCH 167/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fmetric=5Fgraph?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../metric/graph/dao/MetricGraphMapper.java | 4 +- .../metric/graph/dao/data/MetricGraphDO.java | 44 +++++++++++-- .../metric/graph/MetricGraphRepository.java | 12 +++- .../cat/home/dal/report/MetricGraph.java | 65 +++++++++++++++---- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/MetricGraphMapper.xml | 34 +++++----- .../templates/configmap-cat-mysql-script.yaml | 21 +++--- script/CatApplication.sql | 21 +++--- 8 files changed, 149 insertions(+), 54 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/MetricGraphMapper.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/MetricGraphMapper.java index 3e7cb0bb8f..0396d6fa87 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/MetricGraphMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/MetricGraphMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.metric.graph.dao.data.MetricGraphDO; public interface MetricGraphMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - MetricGraphDO findByPrimaryKey(@Param("id") Integer id); + MetricGraphDO findByPrimaryKey(@Param("id") Long id); int insert(MetricGraphDO record); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/data/MetricGraphDO.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/data/MetricGraphDO.java index 896d63ad32..c5ad336ad2 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/data/MetricGraphDO.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/data/MetricGraphDO.java @@ -6,7 +6,7 @@ @Data public class MetricGraphDO { - private Integer id; + private Long id; private Long graphId; @@ -14,11 +14,47 @@ public class MetricGraphDO { private String content; - private Date creationDate; + private Date createTime; - private Date updatetime; + private Date updateTime; - private Integer keyId; + private Long keyId; private Integer number; + + public Date getCreationDate() { + return createTime; + } + + public Date getUpdatetime() { + return updateTime; + } + + public void setCreationDate(Date creationDate) { + createTime = creationDate; + } + + public void setId(Integer id) { + this.id = id == null ? null : id.longValue(); + } + + public void setId(Long id) { + this.id = id; + } + + public void setKeyId(Integer keyId) { + this.keyId = keyId == null ? null : keyId.longValue(); + } + + public void setKeyId(Long keyId) { + this.keyId = keyId; + } + + public void setUpdatetime(Date updatetime) { + updateTime = updatetime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } } diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java index b10f45fff8..0769a27c49 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java @@ -44,6 +44,10 @@ public int deleteBeforeDate(MetricGraph proto) { } public MetricGraph findByPK(int keyId) { + return findByPK((long) keyId); + } + + public MetricGraph findByPK(long keyId) { MetricGraphMapper mapper = springMapper(LOGGER); try { @@ -132,6 +136,9 @@ private MetricGraph toModel(MetricGraphDO record) { if (record.getContent() != null) { model.setContent(record.getContent()); } + if (record.getName() != null) { + model.setName(record.getName()); + } if (record.getCreationDate() != null) { model.setCreationDate(record.getCreationDate()); } @@ -147,9 +154,10 @@ private MetricGraphDO toRecord(MetricGraph model) { record.setId(model.getId()); record.setGraphId(model.getGraphId()); + record.setName(model.getName()); record.setContent(model.getContent()); - record.setCreationDate(model.getCreationDate()); - record.setUpdatetime(model.getUpdatetime()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); record.setNumber(model.getNumber()); return record; diff --git a/cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricGraph.java b/cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricGraph.java index d0e4f7f01d..0e313c012a 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricGraph.java +++ b/cat-home/src/main/java/com/dianping/cat/home/dal/report/MetricGraph.java @@ -2,17 +2,19 @@ public class MetricGraph { - private int m_id; + private long m_id; private long m_graphId; + private String m_name; + private String m_content; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private java.util.Date m_updatetime; + private java.util.Date m_updateTime; - private int m_keyId; + private long m_keyId; private int m_number; public void afterLoad() { @@ -24,27 +26,39 @@ public String getContent() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public long getGraphId() { return m_graphId; } - public int getId() { + public long getId() { return m_id; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } + public String getName() { + return m_name; + } + public int getNumber() { return m_number; } public java.util.Date getUpdatetime() { - return m_updatetime; + return m_updateTime; + } + + public java.util.Date getUpdateTime() { + return m_updateTime; } public MetricGraph setContent(String content) { @@ -53,7 +67,12 @@ public MetricGraph setContent(String content) { } public MetricGraph setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public MetricGraph setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -68,18 +87,39 @@ public MetricGraph setId(int id) { return this; } + public MetricGraph setId(long id) { + m_id = id; + m_keyId = id; + return this; + } + public MetricGraph setKeyId(int keyId) { m_keyId = keyId; return this; } + public MetricGraph setKeyId(long keyId) { + m_keyId = keyId; + return this; + } + + public MetricGraph setName(String name) { + m_name = name; + return this; + } + public MetricGraph setNumber(int number) { m_number = number; return this; } public MetricGraph setUpdatetime(java.util.Date updatetime) { - m_updatetime = updatetime; + m_updateTime = updatetime; + return this; + } + + public MetricGraph setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; return this; } @@ -89,12 +129,13 @@ public String toString() { sb.append("MetricGraph["); sb.append("content: ").append(m_content); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", graph-id: ").append(m_graphId); sb.append(", id: ").append(m_id); sb.append(", key-id: ").append(m_keyId); + sb.append(", name: ").append(m_name); sb.append(", number: ").append(m_number); - sb.append(", updatetime: ").append(m_updatetime); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml index d4af32094f..854389a488 100644 --- a/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-home/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -18,7 +18,7 @@
-
+
diff --git a/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml b/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml index f2c2610c3f..4e350d3f80 100644 --- a/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml @@ -6,8 +6,8 @@ - - + + @@ -15,8 +15,8 @@ graph_id , name , content , - creation_date , - updatetime + create_time , + update_time @@ -25,49 +25,53 @@ graph_id = #{graphId} , name = #{name} , content = #{content} , - creation_date = #{creationDate} , - updatetime = #{updatetime} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO metric_graph + INSERT INTO t_metric_graph - delete from metric_graph where id = #{id} + delete from t_metric_graph where id = #{id} - UPDATE metric_graph + UPDATE t_metric_graph WHERE id = #{id} - DELETE from metric_graph where creation_date < #{record.creationDate} + DELETE from t_metric_graph where create_time < #{record.createTime} - \ No newline at end of file + diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index f4be312872..14bad678eb 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -366,16 +366,19 @@ data: KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统监控Screen配置'; - CREATE TABLE `metric_graph` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `graph_id` int(11) NOT NULL COMMENT '大盘ID', - `name` varchar(50) NOT NULL COMMENT '配置ID', - `content` longtext COMMENT '配置的具体内容', - `creation_date` datetime NOT NULL COMMENT '配置创建时间', - `updatetime` datetime NOT NULL COMMENT '配置修改时间', + CREATE TABLE `t_metric_graph` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `graph_id` bigint NOT NULL DEFAULT '0' COMMENT '大盘ID', + `name` varchar(64) NOT NULL DEFAULT '' COMMENT '配置ID', + `content` longtext NOT NULL COMMENT '配置内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - UNIQUE `name` (`name`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统监控的graph配置'; + UNIQUE KEY `uk_name` (`name`), + KEY `idx_graph_id` (`graph_id`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统监控Graph配置'; CREATE TABLE `server_alarm_rule` ( `id` int(11) NOT NULL AUTO_INCREMENT, diff --git a/script/CatApplication.sql b/script/CatApplication.sql index 6ce79b64c7..1e5c4f6d44 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -398,16 +398,19 @@ CREATE TABLE `t_metric_screen` ( KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统监控Screen配置'; -CREATE TABLE `metric_graph` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `graph_id` int(11) NOT NULL COMMENT '大盘ID', - `name` varchar(50) NOT NULL COMMENT '配置ID', - `content` longtext COMMENT '配置的具体内容', - `creation_date` datetime NOT NULL COMMENT '配置创建时间', - `updatetime` datetime NOT NULL COMMENT '配置修改时间', +CREATE TABLE `t_metric_graph` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `graph_id` bigint NOT NULL DEFAULT '0' COMMENT '大盘ID', + `name` varchar(64) NOT NULL DEFAULT '' COMMENT '配置ID', + `content` longtext NOT NULL COMMENT '配置内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - UNIQUE `name` (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统监控的graph配置'; + UNIQUE KEY `uk_name` (`name`), + KEY `idx_graph_id` (`graph_id`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统监控Graph配置'; CREATE TABLE `server_alarm_rule` ( `id` int(11) NOT NULL AUTO_INCREMENT, From f6a92d7c71686b1860c4b73516ed6fdacaa36c45 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 10:02:39 +0800 Subject: [PATCH 168/231] =?UTF-8?q?=E9=87=8D=E6=9E=84t=5Fserver=5Falarm=5F?= =?UTF-8?q?rule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dianping/cat/alarm/ServerAlarmRule.java | 53 +++- .../alarm/rule/ServerAlarmRuleRepository.java | 8 +- .../alarm/rule/dao/ServerAlarmRuleMapper.java | 4 +- .../rule/dao/data/ServerAlarmRuleDO.java | 44 +++- .../resources/META-INF/wizard/jdbc/wizard.xml | 2 +- .../mybatis/mapper/ServerAlarmRuleMapper.xml | 34 +-- .../templates/configmap-cat-mysql-script.yaml | 249 ++++++++++-------- script/CatApplication.sql | 30 ++- 8 files changed, 271 insertions(+), 153 deletions(-) diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/ServerAlarmRule.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/ServerAlarmRule.java index b165524148..ee25153dc0 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/ServerAlarmRule.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/ServerAlarmRule.java @@ -2,7 +2,7 @@ public class ServerAlarmRule { - private int m_id; + private long m_id; private String m_category; @@ -18,11 +18,11 @@ public class ServerAlarmRule { private String m_creator; - private java.util.Date m_creationDate; + private java.util.Date m_createTime; - private java.util.Date m_updatetime; + private java.util.Date m_updateTime; - private int m_keyId; + private long m_keyId; public void afterLoad() { m_keyId = m_id; } @@ -36,7 +36,11 @@ public String getContent() { } public java.util.Date getCreationDate() { - return m_creationDate; + return m_createTime; + } + + public java.util.Date getCreateTime() { + return m_createTime; } public String getCreator() { @@ -47,11 +51,11 @@ public String getEndPoint() { return m_endPoint; } - public int getId() { + public long getId() { return m_id; } - public int getKeyId() { + public long getKeyId() { return m_keyId; } @@ -68,7 +72,11 @@ public String getType() { } public java.util.Date getUpdatetime() { - return m_updatetime; + return m_updateTime; + } + + public java.util.Date getUpdateTime() { + return m_updateTime; } public ServerAlarmRule setCategory(String category) { @@ -82,7 +90,12 @@ public ServerAlarmRule setContent(String content) { } public ServerAlarmRule setCreationDate(java.util.Date creationDate) { - m_creationDate = creationDate; + m_createTime = creationDate; + return this; + } + + public ServerAlarmRule setCreateTime(java.util.Date createTime) { + m_createTime = createTime; return this; } @@ -102,11 +115,22 @@ public ServerAlarmRule setId(int id) { return this; } + public ServerAlarmRule setId(long id) { + m_id = id; + m_keyId = id; + return this; + } + public ServerAlarmRule setKeyId(int keyId) { m_keyId = keyId; return this; } + public ServerAlarmRule setKeyId(long keyId) { + m_keyId = keyId; + return this; + } + public ServerAlarmRule setMeasurement(String measurement) { m_measurement = measurement; return this; @@ -123,7 +147,12 @@ public ServerAlarmRule setType(String type) { } public ServerAlarmRule setUpdatetime(java.util.Date updatetime) { - m_updatetime = updatetime; + m_updateTime = updatetime; + return this; + } + + public ServerAlarmRule setUpdateTime(java.util.Date updateTime) { + m_updateTime = updateTime; return this; } @@ -134,7 +163,7 @@ public String toString() { sb.append("ServerAlarmRule["); sb.append("category: ").append(m_category); sb.append(", content: ").append(m_content); - sb.append(", creation-date: ").append(m_creationDate); + sb.append(", create-time: ").append(m_createTime); sb.append(", creator: ").append(m_creator); sb.append(", end-point: ").append(m_endPoint); sb.append(", id: ").append(m_id); @@ -142,7 +171,7 @@ public String toString() { sb.append(", measurement: ").append(m_measurement); sb.append(", tags: ").append(m_tags); sb.append(", type: ").append(m_type); - sb.append(", updatetime: ").append(m_updatetime); + sb.append(", update-time: ").append(m_updateTime); sb.append("]"); return sb.toString(); } diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java index 606ffb02c3..f79cac2a19 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java @@ -47,6 +47,10 @@ public List findAll() { } public ServerAlarmRule findByPK(int keyId) { + return findByPK((long) keyId); + } + + public ServerAlarmRule findByPK(long keyId) { ServerAlarmRuleMapper mapper = springMapper(LOGGER); try { @@ -139,8 +143,8 @@ private ServerAlarmRuleDO toRecord(ServerAlarmRule model) { record.setContent(model.getContent()); record.setType(model.getType()); record.setCreator(model.getCreator()); - record.setCreationDate(model.getCreationDate()); - record.setUpdatetime(model.getUpdatetime()); + record.setCreateTime(model.getCreateTime()); + record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); return record; } diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/ServerAlarmRuleMapper.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/ServerAlarmRuleMapper.java index a107c436db..cd1bbab5c4 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/ServerAlarmRuleMapper.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/ServerAlarmRuleMapper.java @@ -7,9 +7,9 @@ import com.dianping.cat.core.mybatis.server.alarm.rule.dao.data.ServerAlarmRuleDO; public interface ServerAlarmRuleMapper { - int deleteByPrimaryKey(@Param("id") Integer id); + int deleteByPrimaryKey(@Param("id") Long id); - ServerAlarmRuleDO findByPrimaryKey(@Param("id") Integer id); + ServerAlarmRuleDO findByPrimaryKey(@Param("id") Long id); int insert(ServerAlarmRuleDO record); diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/data/ServerAlarmRuleDO.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/data/ServerAlarmRuleDO.java index 4987817886..3e70a120a2 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/data/ServerAlarmRuleDO.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/data/ServerAlarmRuleDO.java @@ -6,7 +6,7 @@ @Data public class ServerAlarmRuleDO { - private Integer id; + private Long id; private String category; @@ -22,9 +22,45 @@ public class ServerAlarmRuleDO { private String creator; - private Date creationDate; + private Date createTime; - private Date updatetime; + private Date updateTime; - private Integer keyId; + private Long keyId; + + public Date getCreationDate() { + return createTime; + } + + public Date getUpdatetime() { + return updateTime; + } + + public void setCreationDate(Date creationDate) { + createTime = creationDate; + } + + public void setId(Integer id) { + this.id = id == null ? null : id.longValue(); + } + + public void setId(Long id) { + this.id = id; + } + + public void setKeyId(Integer keyId) { + this.keyId = keyId == null ? null : keyId.longValue(); + } + + public void setKeyId(Long keyId) { + this.keyId = keyId; + } + + public void setUpdatetime(Date updatetime) { + updateTime = updatetime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } } diff --git a/cat-alarm/src/main/resources/META-INF/wizard/jdbc/wizard.xml b/cat-alarm/src/main/resources/META-INF/wizard/jdbc/wizard.xml index 12ea3b7f98..dc283842bf 100644 --- a/cat-alarm/src/main/resources/META-INF/wizard/jdbc/wizard.xml +++ b/cat-alarm/src/main/resources/META-INF/wizard/jdbc/wizard.xml @@ -11,7 +11,7 @@
-
+
diff --git a/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml b/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml index e6c4ba66bc..70f6ab578c 100644 --- a/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml +++ b/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml @@ -4,74 +4,76 @@ - + - - + + id , category , - endPoint , + endpoint , measurement , tags , content , type , creator , - creation_date , - updatetime + create_time , + update_time id = #{id} , category = #{category} , - endPoint = #{endPoint} , + endpoint = #{endPoint} , measurement = #{measurement} , tags = #{tags} , content = #{content} , type = #{type} , creator = #{creator} , - creation_date = #{creationDate} , - updatetime = #{updatetime} + create_time = #{createTime} , + update_time = #{updateTime} - INSERT INTO server_alarm_rule + INSERT INTO t_server_alarm_rule - delete from server_alarm_rule where id = #{id} + delete from t_server_alarm_rule where id = #{id} - UPDATE server_alarm_rule + UPDATE t_server_alarm_rule WHERE id = #{id} - \ No newline at end of file + diff --git a/helm/templates/configmap-cat-mysql-script.yaml b/helm/templates/configmap-cat-mysql-script.yaml index 14bad678eb..2ae80b26c0 100644 --- a/helm/templates/configmap-cat-mysql-script.yaml +++ b/helm/templates/configmap-cat-mysql-script.yaml @@ -5,102 +5,142 @@ metadata: namespace: {{ .Release.Namespace }} data: CatApplication.sql: | - CREATE TABLE `dailyreport` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(20) NOT NULL COMMENT '报表名称, transaction, problem...', - `ip` varchar(50) NOT NULL COMMENT '报表来自于哪台cat-consumer机器', - `domain` varchar(50) NOT NULL COMMENT '报表处理的Domain信息', - `period` datetime NOT NULL COMMENT '报表时间段', - `type` tinyint(4) NOT NULL COMMENT '报表数据格式, 1/xml, 2/json, 默认1', - `creation_date` datetime NOT NULL COMMENT '报表创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `period` (`period`,`domain`,`name`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='天报表'; + CREATE TABLE `t_daily_report` + ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(20) NOT NULL DEFAULT '' COMMENT '报表名称, transaction, problem...', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT '报表来自于哪台cat-consumer机器', + `domain` varchar(50) NOT NULL DEFAULT '' COMMENT '报表处理的Domain信息', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '报表数据格式, 1/xml, 2/json, 默认1', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_period_domain_name` (`period`,`domain`,`name`), + KEY `idx_domain_name` (`domain`,`name`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='天报表'; - CREATE TABLE `weeklyreport` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(20) NOT NULL COMMENT '报表名称, transaction, problem...', - `ip` varchar(50) NOT NULL COMMENT '报表来自于哪台cat-consumer机器', - `domain` varchar(50) NOT NULL COMMENT '报表处理的Domain信息', - `period` datetime NOT NULL COMMENT '报表时间段', - `type` tinyint(4) NOT NULL COMMENT '报表数据格式, 1/xml, 2/json, 默认1', - `creation_date` datetime NOT NULL COMMENT '报表创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `period` (`period`,`domain`,`name`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='周报表'; + CREATE TABLE `t_weekly_report` + ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(20) NOT NULL DEFAULT '' COMMENT '报表名称, transaction, problem...', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT '报表来自于哪台cat-consumer机器', + `domain` varchar(50) NOT NULL DEFAULT '' COMMENT '报表处理的Domain信息', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '报表数据格式, 1/xml, 2/json, 默认1', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_period_domain_name` (`period`,`domain`,`name`), + KEY `idx_domain_name` (`domain`,`name`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='周报表'; - CREATE TABLE `monthreport` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(20) NOT NULL COMMENT '报表名称, transaction, problem...', - `ip` varchar(50) NOT NULL COMMENT '报表来自于哪台cat-consumer机器', - `domain` varchar(50) NOT NULL COMMENT '报表处理的Domain信息', - `period` datetime NOT NULL COMMENT '报表时间段', - `type` tinyint(4) NOT NULL COMMENT '报表数据格式, 1/xml, 2/json, 默认1', - `creation_date` datetime NOT NULL COMMENT '报表创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `period` (`period`,`domain`,`name`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='月报表'; + CREATE TABLE `t_monthly_report` + ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(20) NOT NULL DEFAULT '' COMMENT '报表名称, transaction, problem...', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT '报表来自于哪台cat-consumer机器', + `domain` varchar(50) NOT NULL DEFAULT '' COMMENT '报表处理的Domain信息', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '报表数据格式, 1/xml, 2/json, 默认1', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_period_domain_name` (`period`,`domain`,`name`), + KEY `idx_domain_name` (`domain`,`name`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='月报表'; - CREATE TABLE `hostinfo` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `ip` varchar(50) NOT NULL COMMENT '部署机器IP', - `domain` varchar(200) NOT NULL COMMENT '部署机器对应的项目名', - `hostname` varchar(200) DEFAULT NULL COMMENT '机器域名', - `creation_date` datetime NOT NULL, - `last_modified_date` datetime NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `ip_index` (`ip`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='IP和项目名的对应关系'; + CREATE TABLE `t_host_info` + ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT '部署机器IP', + `domain` varchar(200) NOT NULL DEFAULT '' COMMENT '部署机器对应的项目名', + `hostname` varchar(200) NOT NULL DEFAULT '' COMMENT '机器域名', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_ip` (`ip`), + KEY `idx_domain` (`domain`), + KEY `idx_hostname` (`hostname`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='IP和项目名的对应关系'; - CREATE TABLE `hourlyreport` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `type` tinyint(4) NOT NULL COMMENT '报表类型, 1/xml, 9/binary 默认1', - `name` varchar(20) NOT NULL COMMENT '报表名称', - `ip` varchar(50) DEFAULT NULL COMMENT '报表来自于哪台机器', - `domain` varchar(50) NOT NULL COMMENT '报表项目', - `period` datetime NOT NULL COMMENT '报表时间段', - `creation_date` datetime NOT NULL COMMENT '报表创建时间', - PRIMARY KEY (`id`), - KEY `IX_Domain_Name_Period` (`domain`,`name`,`period`), - KEY `IX_Name_Period` (`name`,`period`), - KEY `IX_Period` (`period`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='用于存放实时报表信息,处理之后的结果'; + CREATE TABLE `t_hourly_report` + ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '报表类型, 1/xml, 9/binary, 默认1', + `name` varchar(20) NOT NULL DEFAULT '' COMMENT '报表名称', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT '报表来自于哪台机器', + `domain` varchar(50) NOT NULL DEFAULT '' COMMENT '报表项目', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_domain_name_period` (`domain`,`name`,`period`), + KEY `idx_name_period` (`name`,`period`), + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='小时报表'; - CREATE TABLE `hourly_report_content` ( - `report_id` int(11) NOT NULL COMMENT '报表ID', - `content` longblob NOT NULL COMMENT '二进制报表内容', - `period` datetime NOT NULL COMMENT '报表时间段', - `creation_date` datetime NOT NULL COMMENT '创建时间', - PRIMARY KEY (`report_id`), - KEY `IX_Period` (`period`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='小时报表二进制内容'; + CREATE TABLE `t_hourly_report_content` + ( + `report_id` bigint NOT NULL COMMENT '报表ID', + `content` longblob NOT NULL COMMENT '二进制报表内容', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`report_id`), + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='小时报表二进制内容'; - CREATE TABLE `daily_report_content` ( - `report_id` int(11) NOT NULL COMMENT '报表ID', - `content` longblob NOT NULL COMMENT '二进制报表内容', - `period` datetime COMMENT '报表时间段', - `creation_date` datetime NOT NULL COMMENT '创建时间', - PRIMARY KEY (`report_id`), - KEY `IX_Period` (`period`) - )ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='天报表二进制内容'; + CREATE TABLE `t_daily_report_content` + ( + `report_id` bigint NOT NULL COMMENT '报表ID', + `content` longblob NOT NULL COMMENT '二进制报表内容', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`report_id`), + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='天报表二进制内容'; - CREATE TABLE `weekly_report_content` ( - `report_id` int(11) NOT NULL COMMENT '报表ID', - `content` longblob NOT NULL COMMENT '二进制报表内容', - `period` datetime COMMENT '报表时间段', - `creation_date` datetime NOT NULL COMMENT '创建时间', - PRIMARY KEY (`report_id`), - KEY `IX_Period` (`period`) - )ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='周报表二进制内容'; + CREATE TABLE `t_weekly_report_content` + ( + `report_id` bigint NOT NULL COMMENT '报表ID', + `content` longblob NOT NULL COMMENT '二进制报表内容', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`report_id`), + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='周报表二进制内容'; - CREATE TABLE `monthly_report_content` ( - `report_id` int(11) NOT NULL COMMENT '报表ID', - `content` longblob NOT NULL COMMENT '二进制报表内容', - `period` datetime COMMENT '报表时间段', - `creation_date` datetime NOT NULL COMMENT '创建时间', - PRIMARY KEY (`report_id`), - KEY `IX_Period` (`period`) - )ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='月报表二进制内容'; + CREATE TABLE `t_monthly_report_content` + ( + `report_id` bigint NOT NULL COMMENT '报表ID', + `content` longblob NOT NULL COMMENT '二进制报表内容', + `period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间段', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`report_id`), + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='月报表二进制内容'; CREATE TABLE `t_business_report` ( @@ -121,7 +161,6 @@ data: KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='业务监控实时报表'; - CREATE TABLE `t_task` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', @@ -133,9 +172,9 @@ data: `report_period` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '报表时间', `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '执行状态, 1/todo, 2/doing, 3/done, 4/failed', `task_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '任务类型, 0/hourly, 1/daily', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `start_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '执行开始时间', `end_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '执行结束时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_report_period_domain_name_type` (`report_period`,`report_domain`,`report_name`,`task_type`), @@ -380,17 +419,21 @@ data: KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统监控Graph配置'; - CREATE TABLE `server_alarm_rule` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `category` varchar(50) NOT NULL COMMENT '监控分类', - `endPoint` varchar(200) NOT NULL COMMENT '监控对象ID', - `measurement` varchar(200) NOT NULL COMMENT '监控指标', - `tags` varchar(200) NOT NULL DEFAULT '' COMMENT '监控指标标签', - `content` longtext NOT NULL COMMENT '配置的具体内容', - `type` varchar(20) NOT NULL DEFAULT '' COMMENT '数据聚合方式', - `creator` varchar(100) DEFAULT '' COMMENT '创建人', - `creation_date` datetime NOT NULL COMMENT '配置创建时间', - `updatetime` datetime NOT NULL COMMENT '配置修改时间', + CREATE TABLE `t_server_alarm_rule` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `category` varchar(64) NOT NULL DEFAULT '' COMMENT '监控分类', + `endpoint` varchar(256) NOT NULL DEFAULT '' COMMENT '监控对象ID', + `measurement` varchar(256) NOT NULL DEFAULT '' COMMENT '监控指标', + `tags` varchar(512) NOT NULL DEFAULT '' COMMENT '监控指标标签', + `content` longtext NOT NULL COMMENT '配置内容', + `type` varchar(32) NOT NULL DEFAULT '' COMMENT '数据聚合方式', + `creator` varchar(128) NOT NULL DEFAULT '' COMMENT '创建人', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - KEY `updatetime` (`updatetime`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统告警的配置'; + KEY `idx_category` (`category`), + KEY `idx_type` (`type`), + KEY `idx_category_type` (`category`,`type`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统告警规则配置'; diff --git a/script/CatApplication.sql b/script/CatApplication.sql index 1e5c4f6d44..abcecd9a2b 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -412,17 +412,21 @@ CREATE TABLE `t_metric_graph` ( KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统监控Graph配置'; -CREATE TABLE `server_alarm_rule` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `category` varchar(50) NOT NULL COMMENT '监控分类', - `endPoint` varchar(200) NOT NULL COMMENT '监控对象ID', - `measurement` varchar(200) NOT NULL COMMENT '监控指标', - `tags` varchar(200) NOT NULL DEFAULT '' COMMENT '监控指标标签', - `content` longtext NOT NULL COMMENT '配置的具体内容', - `type` varchar(20) NOT NULL DEFAULT '' COMMENT '数据聚合方式', - `creator` varchar(100) DEFAULT '' COMMENT '创建人', - `creation_date` datetime NOT NULL COMMENT '配置创建时间', - `updatetime` datetime NOT NULL COMMENT '配置修改时间', +CREATE TABLE `t_server_alarm_rule` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `category` varchar(64) NOT NULL DEFAULT '' COMMENT '监控分类', + `endpoint` varchar(256) NOT NULL DEFAULT '' COMMENT '监控对象ID', + `measurement` varchar(256) NOT NULL DEFAULT '' COMMENT '监控指标', + `tags` varchar(512) NOT NULL DEFAULT '' COMMENT '监控指标标签', + `content` longtext NOT NULL COMMENT '配置内容', + `type` varchar(32) NOT NULL DEFAULT '' COMMENT '数据聚合方式', + `creator` varchar(128) NOT NULL DEFAULT '' COMMENT '创建人', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - KEY `updatetime` (`updatetime`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统告警的配置'; + KEY `idx_category` (`category`), + KEY `idx_type` (`type`), + KEY `idx_category_type` (`category`,`type`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统告警规则配置'; From db2017906a767fec51f7ad74e981cb6547a38d15 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 10:37:18 +0800 Subject: [PATCH 169/231] =?UTF-8?q?fix=E5=AD=97=E6=AE=B5=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=80=BC=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dianping/cat/consumer/config/AllReportConfigManager.java | 2 +- .../core/mybatis/repository/project/ProjectRepository.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java index 31bbf1a800..ec056ec2cc 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java @@ -48,7 +48,7 @@ public class AllReportConfigManager { private ContentFetcher m_fetcher; - private int m_configId; + private long m_configId; private volatile AllConfig m_config; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java index d7bbb6e75f..78c4926b0d 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java @@ -1,6 +1,7 @@ package com.dianping.cat.core.mybatis.repository.project; import java.util.List; +import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; @@ -175,8 +176,8 @@ private ProjectDO toRecord(Project model) { record.setBu(model.getBu()); record.setCmdbProductline(model.getCmdbProductline()); record.setOwner(model.getOwner()); - record.setEmail(model.getEmail()); - record.setPhone(model.getPhone()); + record.setEmail(Optional.ofNullable(model.getEmail()).orElse("")); + record.setPhone(Optional.ofNullable(model.getPhone()).orElse( "")); record.setCreateTime(model.getCreateTime()); record.setUpdateTime(model.getUpdateTime()); record.setKeyId(model.getKeyId()); From 3b0d1b1b22b0eed890b3db6b961c8af26d94d793 Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 11:08:32 +0800 Subject: [PATCH 170/231] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20Netty=20ByteBuf.re?= =?UTF-8?q?lease()=20=E6=B3=84=E6=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/HistoricalMessageService.java | 17 ++++--- .../logview/service/LocalMessageService.java | 46 +++++++++++++------ 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/HistoricalMessageService.java b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/HistoricalMessageService.java index 700cd542f7..37cf9b796e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/HistoricalMessageService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/HistoricalMessageService.java @@ -19,6 +19,7 @@ package com.dianping.cat.report.page.logview.service; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -32,6 +33,7 @@ import com.dianping.cat.message.Transaction; import com.dianping.cat.message.codec.HtmlMessageCodec; import com.dianping.cat.message.codec.WaterfallMessageCodec; +import com.dianping.cat.message.spi.BufReleaseHelper; import com.dianping.cat.message.spi.MessageTree; import com.dianping.cat.message.storage.MessageBucketManager; import com.dianping.cat.message.tree.MessageId; @@ -109,18 +111,19 @@ public boolean isEligable(ModelRequest request) { protected String toString(ModelRequest request, MessageTree tree) { ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(8192); - if (tree.getMessage() instanceof Transaction && request.getProperty("waterfall", "false").equals("true")) { - m_waterfall.encode(tree, buf); - } else { - m_html.encode(tree, buf); - } - try { + if (tree.getMessage() instanceof Transaction && request.getProperty("waterfall", "false").equals("true")) { + m_waterfall.encode(tree, buf); + } else { + m_html.encode(tree, buf); + } buf.readInt(); // get rid of length - return buf.toString(Charset.forName("utf-8")); + return buf.toString(StandardCharsets.UTF_8); } catch (Exception e) { LOGGER.error("Unable to render historical logview message, messageId={}, waterfall={}.", request.getProperty("messageId"), request.getProperty("waterfall", "false"), e); + } finally { + BufReleaseHelper.release(buf); } return null; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java index 246bc19bf6..63d514229f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/logview/service/LocalMessageService.java @@ -19,6 +19,7 @@ package com.dianping.cat.report.page.logview.service; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -37,6 +38,7 @@ import com.dianping.cat.message.Transaction; import com.dianping.cat.message.codec.HtmlMessageCodec; import com.dianping.cat.message.codec.WaterfallMessageCodec; +import com.dianping.cat.message.spi.BufReleaseHelper; import com.dianping.cat.message.spi.MessageTree; import com.dianping.cat.message.storage.MessageBucketManager; import com.dianping.cat.message.tree.MessageId; @@ -93,7 +95,7 @@ private String buildNewReport(ModelRequest request, ModelPeriod period, String d messageId, period, domain); } if (buf != null) { - tree = CodecHandler.decode(changeBuf(buf)); + tree = decode(buf); } if (tree == null && m_bucketManager != null) { @@ -105,7 +107,7 @@ private String buildNewReport(ModelRequest request, ModelPeriod period, String d ByteBuf data = bucket.get(id); if (data != null) { - tree = CodecHandler.decode(changeBuf(data)); + tree = decode(data); } } else { LOGGER.warn( @@ -120,18 +122,19 @@ private String buildNewReport(ModelRequest request, ModelPeriod period, String d if (tree != null) { ByteBuf content = ByteBufAllocator.DEFAULT.buffer(8192); - if (tree.getMessage() instanceof Transaction && waterfall) { - m_waterfall.encode(tree, content); - } else { - m_html.encode(tree, content); - } - try { + if (tree.getMessage() instanceof Transaction && waterfall) { + m_waterfall.encode(tree, content); + } else { + m_html.encode(tree, content); + } content.readInt(); // get rid of length - return content.toString(Charset.forName("utf-8")); + return content.toString(StandardCharsets.UTF_8); } catch (Exception e) { LOGGER.error("Unable to render new local logview message, messageId={}, waterfall={}.", messageId, waterfall, e); + } finally { + BufReleaseHelper.release(content); } } @@ -142,6 +145,18 @@ private String buildNewReport(ModelRequest request, ModelPeriod period, String d return null; } + private MessageTree decode(ByteBuf data) { + ByteBuf message = null; + + try { + message = changeBuf(data); + return CodecHandler.decode(message); + } finally { + BufReleaseHelper.release(message); + BufReleaseHelper.release(data); + } + } + private ByteBuf changeBuf(ByteBuf data) { data.markReaderIndex(); int length = data.readInt(); @@ -169,18 +184,19 @@ public String buildOldReport(ModelRequest request, ModelPeriod period, String do if (tree != null) { ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(8192); - if (tree.getMessage() instanceof Transaction && waterfall) { - m_waterfall.encode(tree, buf); - } else { - m_html.encode(tree, buf); - } - try { + if (tree.getMessage() instanceof Transaction && waterfall) { + m_waterfall.encode(tree, buf); + } else { + m_html.encode(tree, buf); + } buf.readInt(); // get rid of length return buf.toString(Charset.forName("utf-8")); } catch (Exception e) { LOGGER.error("Unable to render old local logview message, messageId={}, waterfall={}.", messageId, waterfall, e); + } finally { + BufReleaseHelper.release(buf); } } LOGGER.warn( From 525f6884d0265eb60940940a7599ec956cddba7a Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 17 Jun 2026 11:20:14 +0800 Subject: [PATCH 171/231] =?UTF-8?q?fix=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dianping/cat/task/TaskManager.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java index 9a1a2a03cd..5bc1f3d6a3 100644 --- a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java +++ b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java @@ -44,10 +44,10 @@ public class TaskManager { private TaskRepository m_taskDao; - public boolean createTask(Date period, String domain, String name, TaskCreationPolicy prolicy) { + public boolean createTask(Date period, String domain, String name, TaskCreationPolicy policy) { ensureTaskDao(); try { - if (prolicy.shouldCreateHourlyTask()) { + if (policy.shouldCreateHourlyTask()) { insertToDatabase(period, domain, name, REPORT_HOUR); } @@ -58,17 +58,17 @@ public boolean createTask(Date period, String domain, String name, TaskCreationP cal.add(Calendar.HOUR_OF_DAY, -hour); Date currentDay = cal.getTime(); - if (prolicy.shouldCreateDailyTask()) { + if (policy.shouldCreateDailyTask()) { insertToDatabase(new Date(currentDay.getTime() - ONE_DAY), domain, name, REPORT_DAILY); } - if (prolicy.shouldCreateWeeklyTask()) { + if (policy.shouldCreateWeeklyTask()) { int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); if (dayOfWeek == 7) { insertToDatabase(new Date(currentDay.getTime() - 7 * ONE_DAY), domain, name, REPORT_WEEK); } } - if (prolicy.shouldCreateMonthTask()) { + if (policy.shouldCreateMonthTask()) { int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH); if (dayOfMonth == 1) { From 9e31ab1850056db62aaebde1bece0a08394244cc Mon Sep 17 00:00:00 2001 From: Shang Date: Thu, 18 Jun 2026 09:42:07 +0800 Subject: [PATCH 172/231] =?UTF-8?q?=E9=87=8D=E6=9E=84DAO=E5=B1=82=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{config/repository => mybatis}/ConfigRepository.java | 6 +++--- .../report/content => }/DailyReportContentRepository.java | 0 .../daily/repository => mybatis}/DailyReportRepository.java | 0 .../HostinfoRepository.java => HostInfoRepository.java} | 0 .../report/content => }/HourlyReportContentRepository.java | 0 .../hourlyreport => }/HourlyReportRepository.java | 0 .../report/content => }/MonthlyReportContentRepository.java | 0 .../monthreport => }/MonthlyReportRepository.java | 0 .../mybatis/{repository/project => }/ProjectRepository.java | 0 .../{repository => }/SpringBackedRepositorySupport.java | 0 .../core/mybatis/{repository/task => }/TaskRepository.java | 0 .../report/content => }/WeeklyReportContentRepository.java | 0 .../weeklyreport => }/WeeklyReportRepository.java | 0 .../{business/config/dao => }/data/BusinessConfigDO.java | 0 .../{businessreport/dao => }/data/BusinessReportDO.java | 0 .../cat/core/{config/dao => mybatis}/data/ConfigDO.java | 0 .../report/content/dao => }/data/DailyReportContentDO.java | 0 .../{report/daily/dao => mybatis}/data/DailyReportDO.java | 0 .../dao/data/HostinfoDO.java => data/HostInfoDO.java} | 0 .../report/content/dao => }/data/HourlyReportContentDO.java | 0 .../data/HourlyreportDO.java => data/HourlyReportDO.java} | 0 .../dao/data/MonthreportDO.java => data/MonthReportDO.java} | 0 .../content/dao => }/data/MonthlyReportContentDO.java | 0 .../core/mybatis/{operation/dao => }/data/OperationDO.java | 0 .../cat/core/mybatis/{project/dao => }/data/ProjectDO.java | 0 .../cat/core/mybatis/{task/dao => }/data/TaskDO.java | 0 .../report/content/dao => }/data/WeeklyReportContentDO.java | 0 .../data/WeeklyreportDO.java => data/WeeklyReportDO.java} | 0 .../config/dao => mapper}/BusinessConfigMapper.java | 2 +- .../config => mapper}/BusinessConfigRepository.java | 2 +- .../dao => mapper}/BusinessReportMapper.java | 0 .../core/{config/dao => mybatis/mapper}/ConfigMapper.java | 0 .../content/dao => mapper}/DailyReportContentMapper.java | 0 .../daily/dao => mybatis/mapper}/DailyReportMapper.java | 0 .../dao/HostinfoMapper.java => mapper/HostInfoMapper.java} | 0 .../content/dao => mapper}/HourlyReportContentMapper.java | 0 .../HourlyReportMapper.java} | 0 .../MonthReportMapper.java} | 0 .../content/dao => mapper}/MonthlyReportContentMapper.java | 0 .../mybatis/{operation/dao => mapper}/OperationMapper.java | 0 .../core/mybatis/{project/dao => mapper}/ProjectMapper.java | 0 .../cat/core/mybatis/{task/dao => mapper}/TaskMapper.java | 0 .../content/dao => mapper}/WeeklyReportContentMapper.java | 0 .../WeeklyReportMapper.java} | 0 .../mapper/{HostinfoMapper.xml => HostInfoMapper.xml} | 0 .../{HourlyreportMapper.xml => HourlyReportMapper.xml} | 0 .../mapper/{MonthreportMapper.xml => MonthReportMapper.xml} | 0 .../{WeeklyreportMapper.xml => WeeklyReportMapper.xml} | 0 48 files changed, 5 insertions(+), 5 deletions(-) rename cat-core/src/main/java/com/dianping/cat/core/{config/repository => mybatis}/ConfigRepository.java (96%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{repository/daily/report/content => }/DailyReportContentRepository.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/{report/daily/repository => mybatis}/DailyReportRepository.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{repository/hostinfo/HostinfoRepository.java => HostInfoRepository.java} (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{repository/hourly/report/content => }/HourlyReportContentRepository.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{repository/hourlyreport => }/HourlyReportRepository.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{repository/monthly/report/content => }/MonthlyReportContentRepository.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{repository/monthreport => }/MonthlyReportRepository.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{repository/project => }/ProjectRepository.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{repository => }/SpringBackedRepositorySupport.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{repository/task => }/TaskRepository.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{repository/weekly/report/content => }/WeeklyReportContentRepository.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{repository/weeklyreport => }/WeeklyReportRepository.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{business/config/dao => }/data/BusinessConfigDO.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{businessreport/dao => }/data/BusinessReportDO.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/{config/dao => mybatis}/data/ConfigDO.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{daily/report/content/dao => }/data/DailyReportContentDO.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/{report/daily/dao => mybatis}/data/DailyReportDO.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{hostinfo/dao/data/HostinfoDO.java => data/HostInfoDO.java} (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{hourly/report/content/dao => }/data/HourlyReportContentDO.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{hourlyreport/dao/data/HourlyreportDO.java => data/HourlyReportDO.java} (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{monthreport/dao/data/MonthreportDO.java => data/MonthReportDO.java} (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{monthly/report/content/dao => }/data/MonthlyReportContentDO.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{operation/dao => }/data/OperationDO.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{project/dao => }/data/ProjectDO.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{task/dao => }/data/TaskDO.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{weekly/report/content/dao => }/data/WeeklyReportContentDO.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{weeklyreport/dao/data/WeeklyreportDO.java => data/WeeklyReportDO.java} (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{business/config/dao => mapper}/BusinessConfigMapper.java (91%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{repository/business/config => mapper}/BusinessConfigRepository.java (98%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{businessreport/dao => mapper}/BusinessReportMapper.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/{config/dao => mybatis/mapper}/ConfigMapper.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{daily/report/content/dao => mapper}/DailyReportContentMapper.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/{report/daily/dao => mybatis/mapper}/DailyReportMapper.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{hostinfo/dao/HostinfoMapper.java => mapper/HostInfoMapper.java} (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{hourly/report/content/dao => mapper}/HourlyReportContentMapper.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{hourlyreport/dao/HourlyreportMapper.java => mapper/HourlyReportMapper.java} (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{monthreport/dao/MonthreportMapper.java => mapper/MonthReportMapper.java} (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{monthly/report/content/dao => mapper}/MonthlyReportContentMapper.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{operation/dao => mapper}/OperationMapper.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{project/dao => mapper}/ProjectMapper.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{task/dao => mapper}/TaskMapper.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{weekly/report/content/dao => mapper}/WeeklyReportContentMapper.java (100%) rename cat-core/src/main/java/com/dianping/cat/core/mybatis/{weeklyreport/dao/WeeklyreportMapper.java => mapper/WeeklyReportMapper.java} (100%) rename cat-core/src/main/resources/mybatis/mapper/{HostinfoMapper.xml => HostInfoMapper.xml} (100%) rename cat-core/src/main/resources/mybatis/mapper/{HourlyreportMapper.xml => HourlyReportMapper.xml} (100%) rename cat-core/src/main/resources/mybatis/mapper/{MonthreportMapper.xml => MonthReportMapper.xml} (100%) rename cat-core/src/main/resources/mybatis/mapper/{WeeklyreportMapper.xml => WeeklyReportMapper.xml} (100%) diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/ConfigRepository.java similarity index 96% rename from cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/ConfigRepository.java index 1aadb0303a..97beb29fa1 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/config/repository/ConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/ConfigRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.config.repository; +package com.dianping.cat.core.mybatis; import java.util.Date; import java.util.List; @@ -12,8 +12,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.dao.ConfigMapper; -import com.dianping.cat.core.config.dao.data.ConfigDO; +import com.dianping.cat.core.mybatis.mapper.ConfigMapper; +import com.dianping.cat.core.mybatis.data.ConfigDO; public class ConfigRepository { private static final Logger LOGGER = LoggerFactory.getLogger(ConfigRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportContentRepository.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/daily/report/content/DailyReportContentRepository.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportContentRepository.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportRepository.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/report/daily/repository/DailyReportRepository.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportRepository.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/HostInfoRepository.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hostinfo/HostinfoRepository.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/HostInfoRepository.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportContentRepository.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourly/report/content/HourlyReportContentRepository.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportContentRepository.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportRepository.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/hourlyreport/HourlyReportRepository.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportRepository.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportContentRepository.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthly/report/content/MonthlyReportContentRepository.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportContentRepository.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportRepository.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/monthreport/MonthlyReportRepository.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportRepository.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/ProjectRepository.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/project/ProjectRepository.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/ProjectRepository.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/SpringBackedRepositorySupport.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/SpringBackedRepositorySupport.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/SpringBackedRepositorySupport.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/TaskRepository.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/task/TaskRepository.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/TaskRepository.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportContentRepository.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weekly/report/content/WeeklyReportContentRepository.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportContentRepository.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportRepository.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/weeklyreport/WeeklyReportRepository.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportRepository.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/data/BusinessConfigDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessConfigDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/data/BusinessConfigDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessConfigDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/data/BusinessReportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessReportDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/data/BusinessReportDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessReportDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/dao/data/ConfigDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ConfigDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/config/dao/data/ConfigDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ConfigDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/data/DailyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportContentDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/data/DailyReportContentDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportContentDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/data/DailyReportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/data/DailyReportDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/data/HostinfoDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HostInfoDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/data/HostinfoDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HostInfoDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/data/HourlyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportContentDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/data/HourlyReportContentDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportContentDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/data/HourlyreportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/data/HourlyreportDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/data/MonthreportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthReportDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/data/MonthreportDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthReportDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/data/MonthlyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthlyReportContentDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/data/MonthlyReportContentDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthlyReportContentDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/data/OperationDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/OperationDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/data/OperationDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/OperationDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/data/ProjectDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ProjectDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/data/ProjectDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ProjectDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/data/TaskDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/TaskDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/data/TaskDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/TaskDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/data/WeeklyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportContentDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/data/WeeklyReportContentDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportContentDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/data/WeeklyreportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportDO.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/data/WeeklyreportDO.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportDO.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/BusinessConfigMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigMapper.java similarity index 91% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/BusinessConfigMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigMapper.java index 0d5be1faa7..5b36e1d8da 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/business/config/dao/BusinessConfigMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigMapper.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.business.config.dao; +package com.dianping.cat.core.mybatis; import java.util.List; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigRepository.java similarity index 98% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigRepository.java index 864c06e3d0..837a33bc58 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/repository/business/config/BusinessConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigRepository.java @@ -9,7 +9,7 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.config.BusinessConfig; -import com.dianping.cat.core.mybatis.business.config.dao.BusinessConfigMapper; +import com.dianping.cat.core.mybatis.BusinessConfigMapper; import com.dianping.cat.core.mybatis.business.config.dao.data.BusinessConfigDO; import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/BusinessReportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessReportMapper.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/businessreport/dao/BusinessReportMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessReportMapper.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/config/dao/ConfigMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ConfigMapper.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/config/dao/ConfigMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ConfigMapper.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/DailyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportContentMapper.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/daily/report/content/dao/DailyReportContentMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportContentMapper.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/DailyReportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportMapper.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/report/daily/dao/DailyReportMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportMapper.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/HostinfoMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HostInfoMapper.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/hostinfo/dao/HostinfoMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HostInfoMapper.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/HourlyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportContentMapper.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/hourly/report/content/dao/HourlyReportContentMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportContentMapper.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/HourlyreportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportMapper.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/hourlyreport/dao/HourlyreportMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportMapper.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/MonthreportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthReportMapper.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/monthreport/dao/MonthreportMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthReportMapper.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/MonthlyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthlyReportContentMapper.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/monthly/report/content/dao/MonthlyReportContentMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthlyReportContentMapper.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/OperationMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/OperationMapper.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/operation/dao/OperationMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/OperationMapper.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/ProjectMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ProjectMapper.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/project/dao/ProjectMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ProjectMapper.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/TaskMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/TaskMapper.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/task/dao/TaskMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/TaskMapper.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/WeeklyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportContentMapper.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/weekly/report/content/dao/WeeklyReportContentMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportContentMapper.java diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/WeeklyreportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportMapper.java similarity index 100% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/weeklyreport/dao/WeeklyreportMapper.java rename to cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportMapper.java diff --git a/cat-core/src/main/resources/mybatis/mapper/HostinfoMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HostInfoMapper.xml similarity index 100% rename from cat-core/src/main/resources/mybatis/mapper/HostinfoMapper.xml rename to cat-core/src/main/resources/mybatis/mapper/HostInfoMapper.xml diff --git a/cat-core/src/main/resources/mybatis/mapper/HourlyreportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HourlyReportMapper.xml similarity index 100% rename from cat-core/src/main/resources/mybatis/mapper/HourlyreportMapper.xml rename to cat-core/src/main/resources/mybatis/mapper/HourlyReportMapper.xml diff --git a/cat-core/src/main/resources/mybatis/mapper/MonthreportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/MonthReportMapper.xml similarity index 100% rename from cat-core/src/main/resources/mybatis/mapper/MonthreportMapper.xml rename to cat-core/src/main/resources/mybatis/mapper/MonthReportMapper.xml diff --git a/cat-core/src/main/resources/mybatis/mapper/WeeklyreportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportMapper.xml similarity index 100% rename from cat-core/src/main/resources/mybatis/mapper/WeeklyreportMapper.xml rename to cat-core/src/main/resources/mybatis/mapper/WeeklyReportMapper.xml From 25bbdf3f29218de8872e86fc5fb92c310cb1f896 Mon Sep 17 00:00:00 2001 From: Shang Date: Thu, 18 Jun 2026 09:42:25 +0800 Subject: [PATCH 173/231] =?UTF-8?q?=E9=87=8D=E6=9E=84DAO=E5=B1=82=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/spi/config/AlertConfigManager.java | 2 +- .../alarm/spi/config/AlertPolicyManager.java | 2 +- .../alarm/spi/config/SenderConfigManager.java | 2 +- .../repository/alert/AlertRepository.java | 2 +- .../alarm/rule/ServerAlarmRuleRepository.java | 2 +- .../define/rule/UserDefineRuleRepository.java | 2 +- .../config/AllReportConfigManager.java | 2 +- .../config/AtomicMessageConfigManager.java | 2 +- .../cat/config/ReportReloadConfigManager.java | 2 +- .../business/BusinessConfigManager.java | 2 +- .../config/sample/SampleConfigManager.java | 2 +- .../config/server/ServerConfigManager.java | 2 +- .../server/ServerFilterConfigManager.java | 2 +- .../TpValueStatisticConfigManager.java | 2 +- .../mybatis/DailyReportContentRepository.java | 6 +- .../core/mybatis/DailyReportRepository.java | 6 +- .../cat/core/mybatis/HostInfoRepository.java | 36 +- .../HourlyReportContentRepository.java | 6 +- .../core/mybatis/HourlyReportRepository.java | 30 +- .../MonthlyReportContentRepository.java | 6 +- .../core/mybatis/MonthlyReportRepository.java | 28 +- .../cat/core/mybatis/ProjectRepository.java | 6 +- .../SpringBackedRepositorySupport.java | 2 +- .../cat/core/mybatis/TaskRepository.java | 6 +- .../WeeklyReportContentRepository.java | 6 +- .../core/mybatis/WeeklyReportRepository.java | 28 +- .../core/mybatis/data/BusinessConfigDO.java | 2 +- .../core/mybatis/data/BusinessReportDO.java | 2 +- .../cat/core/mybatis/data/ConfigDO.java | 2 +- .../mybatis/data/DailyReportContentDO.java | 2 +- .../cat/core/mybatis/data/DailyReportDO.java | 2 +- .../cat/core/mybatis/data/HostInfoDO.java | 4 +- .../mybatis/data/HourlyReportContentDO.java | 2 +- .../cat/core/mybatis/data/HourlyReportDO.java | 4 +- .../cat/core/mybatis/data/MonthReportDO.java | 4 +- .../mybatis/data/MonthlyReportContentDO.java | 2 +- .../cat/core/mybatis/data/OperationDO.java | 2 +- .../cat/core/mybatis/data/ProjectDO.java | 2 +- .../cat/core/mybatis/data/TaskDO.java | 2 +- .../mybatis/data/WeeklyReportContentDO.java | 2 +- .../cat/core/mybatis/data/WeeklyReportDO.java | 4 +- .../mybatis/mapper/BusinessConfigMapper.java | 4 +- .../mapper/BusinessConfigRepository.java | 7 +- .../mybatis/mapper/BusinessReportMapper.java | 4 +- .../cat/core/mybatis/mapper/ConfigMapper.java | 4 +- .../mapper/DailyReportContentMapper.java | 4 +- .../mybatis/mapper/DailyReportMapper.java | 4 +- .../core/mybatis/mapper/HostInfoMapper.java | 18 +- .../mapper/HourlyReportContentMapper.java | 4 +- .../mybatis/mapper/HourlyReportMapper.java | 18 +- .../mybatis/mapper/MonthReportMapper.java | 18 +- .../mapper/MonthlyReportContentMapper.java | 4 +- .../core/mybatis/mapper/OperationMapper.java | 4 +- .../core/mybatis/mapper/ProjectMapper.java | 4 +- .../cat/core/mybatis/mapper/TaskMapper.java | 4 +- .../mapper/WeeklyReportContentMapper.java | 4 +- .../mybatis/mapper/WeeklyReportMapper.java | 18 +- .../cat/report/DefaultReportManager.java | 4 +- .../report/service/AbstractReportService.java | 16 +- .../dianping/cat/service/HostinfoService.java | 6 +- .../dianping/cat/service/ProjectService.java | 2 +- .../com/dianping/cat/task/TaskManager.java | 2 +- .../mybatis/mapper/BusinessConfigMapper.xml | 8 +- .../mybatis/mapper/BusinessReportMapper.xml | 8 +- .../resources/mybatis/mapper/ConfigMapper.xml | 8 +- .../mapper/DailyReportContentMapper.xml | 8 +- .../mybatis/mapper/DailyReportMapper.xml | 8 +- .../mybatis/mapper/HostInfoMapper.xml | 8 +- .../mapper/HourlyReportContentMapper.xml | 8 +- .../mybatis/mapper/HourlyReportMapper.xml | 8 +- .../mybatis/mapper/MonthReportMapper.xml | 8 +- .../mapper/MonthlyReportContentMapper.xml | 8 +- .../mybatis/mapper/OperationMapper.xml | 8 +- .../mybatis/mapper/ProjectMapper.xml | 8 +- .../resources/mybatis/mapper/TaskMapper.xml | 8 +- .../mapper/WeeklyReportContentMapper.xml | 8 +- .../mybatis/mapper/WeeklyReportMapper.xml | 8 +- .../cat/service/DefaultReportManagerTest.java | 4 +- .../alert/summary/AlertSummaryRepository.java | 2 +- .../alteration/AlterationRepository.java | 2 +- .../baseline/BaselineRepository.java | 2 +- .../ConfigModificationRepository.java | 2 +- .../metric/graph/MetricGraphRepository.java | 2 +- .../metric/screen/MetricScreenRepository.java | 2 +- .../overload/OverloadRepository.java | 2 +- .../TopologyGraphRepository.java | 2 +- .../spring/CatHomeSpringConfiguration.java | 40 +- .../spring/CatHomeSpringStartupVerifier.java | 28 +- .../business/BusinessRuleConfigManager.java | 2 +- .../exception/ExceptionRuleConfigManager.java | 2 +- .../spi/config/BaseRuleConfigManager.java | 2 +- .../report/page/DomainGroupConfigManager.java | 2 +- .../config/TopoGraphFormatConfigManager.java | 2 +- .../graph/TopologyGraphConfigManager.java | 2 +- .../config/HeartbeatDisplayPolicyManager.java | 2 +- .../task/CapacityUpdateStatusManager.java | 2 +- .../overload/task/DailyCapacityUpdater.java | 4 +- .../overload/task/HourlyCapacityUpdater.java | 4 +- .../overload/task/MonthlyCapacityUpdater.java | 4 +- .../overload/task/TableCapacityService.java | 8 +- .../overload/task/WeeklyCapacityUpdater.java | 4 +- .../config/StorageGroupConfigManager.java | 2 +- .../cat/report/task/DefaultTaskConsumer.java | 2 +- .../task/reload/AbstractReportReloader.java | 4 +- .../config/BusinessTagConfigManager.java | 2 +- .../permission/ResourceConfigManager.java | 2 +- .../page/permission/UserConfigManager.java | 2 +- .../router/config/RouterConfigAdjustor.java | 2 +- .../router/config/RouterConfigHandler.java | 2 +- .../router/config/RouterConfigManager.java | 6 +- .../cat/report/service/ReportDaoTest.java | 8 +- .../cat/report/task/ConfigsBackupTest.java | 2 +- script/CatApplication.sql | 356 +++++++++--------- 113 files changed, 514 insertions(+), 509 deletions(-) diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java index eeada35bb0..cbdb7b4d39 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java @@ -29,7 +29,7 @@ import com.dianping.cat.alarm.receiver.transform.DefaultSaxParser; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; public class AlertConfigManager { private static final Logger LOGGER = LoggerFactory.getLogger(AlertConfigManager.class); diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java index ee2e88c313..2b97e89f29 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java @@ -34,7 +34,7 @@ import com.dianping.cat.alarm.spi.AlertChannel; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; public class AlertPolicyManager { private static final Logger LOGGER = LoggerFactory.getLogger(AlertPolicyManager.class); diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java index 2c6d0b2678..f2a5c9c1cc 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java @@ -31,7 +31,7 @@ import com.dianping.cat.alarm.sender.transform.DefaultSaxParser; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; public class SenderConfigManager { private static final Logger LOGGER = LoggerFactory.getLogger(SenderConfigManager.class); diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java index 34129fca36..7265dc023f 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java @@ -3,7 +3,7 @@ import com.dianping.cat.alarm.Alert; import com.dianping.cat.core.mybatis.alert.dao.AlertMapper; import com.dianping.cat.core.mybatis.alert.dao.data.AlertDO; -import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; +import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; import java.util.List; import java.util.stream.Collectors; import org.slf4j.Logger; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java index f79cac2a19..c9b0f2765c 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java @@ -3,7 +3,7 @@ import com.dianping.cat.alarm.ServerAlarmRule; import com.dianping.cat.core.mybatis.server.alarm.rule.dao.ServerAlarmRuleMapper; import com.dianping.cat.core.mybatis.server.alarm.rule.dao.data.ServerAlarmRuleDO; -import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; +import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; import java.util.List; import java.util.stream.Collectors; import org.slf4j.Logger; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java index 04d61bad64..dc7d015139 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java @@ -3,7 +3,7 @@ import com.dianping.cat.alarm.UserDefineRule; import com.dianping.cat.core.mybatis.user.define.rule.dao.UserDefineRuleMapper; import com.dianping.cat.core.mybatis.user.define.rule.dao.data.UserDefineRuleDO; -import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; +import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java index ec056ec2cc..36757f6cfa 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java @@ -35,7 +35,7 @@ import com.dianping.cat.consumer.all.config.entity.Type; import com.dianping.cat.consumer.all.config.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; diff --git a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java index aa88e5a154..840fbf2e5a 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java @@ -29,7 +29,7 @@ import com.dianping.cat.configuration.message.entity.Property; import com.dianping.cat.configuration.message.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.task.TimerSyncTask; public class AtomicMessageConfigManager { diff --git a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java index 81f48e7dc5..cb91c1826a 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java @@ -35,7 +35,7 @@ import com.dianping.cat.configuration.reload.entity.ReportType; import com.dianping.cat.configuration.reload.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; diff --git a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java index e6891ea3fc..03e913098a 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java @@ -35,7 +35,7 @@ import com.dianping.cat.configuration.business.entity.BusinessReportConfig; import com.dianping.cat.configuration.business.transform.DefaultSaxParser; import com.dianping.cat.core.config.BusinessConfig; -import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; +import com.dianping.cat.core.mybatis.mapper.BusinessConfigRepository; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; diff --git a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java index 5241058c8e..875cc9dedb 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java @@ -25,7 +25,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.sample.entity.SampleConfig; import com.dianping.cat.sample.transform.DefaultSaxParser; import com.dianping.cat.task.TimerSyncTask; diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java index 3b318226ff..a37034ade2 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java @@ -54,7 +54,7 @@ import com.dianping.cat.configuration.server.entity.StorageConfig; import com.dianping.cat.configuration.server.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java index c25c335e62..833e34291f 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java @@ -31,7 +31,7 @@ import com.dianping.cat.configuration.server.filter.entity.ServerFilterConfig; import com.dianping.cat.configuration.server.filter.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; diff --git a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java index 06d9c0b6c3..27f88e331f 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java @@ -30,7 +30,7 @@ import com.dianping.cat.configuration.tp.entity.TpValueStatisticConfig; import com.dianping.cat.configuration.tp.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.task.TimerSyncTask; public class TpValueStatisticConfigManager { diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportContentRepository.java index 54f44f4899..d91ad3aa8e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportContentRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.repository.daily.report.content; +package com.dianping.cat.core.mybatis; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.mybatis.daily.report.content.dao.DailyReportContentMapper; -import com.dianping.cat.core.mybatis.daily.report.content.dao.data.DailyReportContentDO; +import com.dianping.cat.core.mybatis.mapper.DailyReportContentMapper; +import com.dianping.cat.core.mybatis.data.DailyReportContentDO; public class DailyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(DailyReportContentRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportRepository.java index ecbe94761c..89430d5d85 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.report.daily.repository; +package com.dianping.cat.core.mybatis; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.DailyReport; -import com.dianping.cat.core.report.daily.dao.DailyReportMapper; -import com.dianping.cat.core.report.daily.dao.data.DailyReportDO; +import com.dianping.cat.core.mybatis.mapper.DailyReportMapper; +import com.dianping.cat.core.mybatis.data.DailyReportDO; public class DailyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(DailyReportRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/HostInfoRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/HostInfoRepository.java index 12a3302251..5cea49bccb 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/HostInfoRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/HostInfoRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.repository.hostinfo; +package com.dianping.cat.core.mybatis; import java.util.Date; import java.util.List; @@ -12,11 +12,11 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.Hostinfo; -import com.dianping.cat.core.mybatis.hostinfo.dao.HostinfoMapper; -import com.dianping.cat.core.mybatis.hostinfo.dao.data.HostinfoDO; +import com.dianping.cat.core.mybatis.mapper.HostInfoMapper; +import com.dianping.cat.core.mybatis.data.HostInfoDO; -public class HostinfoRepository { - private static final Logger LOGGER = LoggerFactory.getLogger(HostinfoRepository.class); +public class HostInfoRepository { + private static final Logger LOGGER = LoggerFactory.getLogger(HostInfoRepository.class); private static final AtomicBoolean SPRING_MAPPER_LOGGED = new AtomicBoolean(); @@ -35,25 +35,25 @@ public int deleteByPK(Hostinfo proto) { } public List findAllIp() { - HostinfoMapper mapper = springMapper(); + HostInfoMapper mapper = springMapper(); - HostinfoDO record = new HostinfoDO(); + HostInfoDO record = new HostInfoDO(); return mapper.findAllIp(record).stream().map(this::toModel).collect(Collectors.toList()); } public Hostinfo findByPK(long keyId) { - HostinfoMapper mapper = springMapper(); + HostInfoMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } public Hostinfo findByIp(String ip) { - HostinfoMapper mapper = springMapper(); - HostinfoDO record = new HostinfoDO(); + HostInfoMapper mapper = springMapper(); + HostInfoDO record = new HostInfoDO(); record.setIp(ip); - HostinfoDO result = mapper.findByIp(record).stream().findFirst().orElse(null); + HostInfoDO result = mapper.findByIp(record).stream().findFirst().orElse(null); return requireFound(result, "findByIp", record.toString()); } @@ -70,7 +70,7 @@ public int insert(Hostinfo proto) { proto.setLastModifiedDate(now); } - HostinfoDO record = toRecord(proto); + HostInfoDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper().insert(record)); proto.setId(record.getId()); @@ -84,7 +84,7 @@ public int updateByPK(Hostinfo proto) { return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } - private HostinfoMapper springMapper() { + private HostInfoMapper springMapper() { SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; if (sqlSessionTemplate == null) { @@ -95,7 +95,7 @@ private HostinfoMapper springMapper() { LOGGER.info("HostinfoRepository is using Spring managed HostinfoMapper."); } - return sqlSessionTemplate.getMapper(HostinfoMapper.class); + return sqlSessionTemplate.getMapper(HostInfoMapper.class); } private TransactionTemplate springTransactionTemplate() { @@ -113,7 +113,7 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private Hostinfo requireFound(HostinfoDO record, String field, String value) { + private Hostinfo requireFound(HostInfoDO record, String field, String value) { if (record == null) { throw new EmptyResultDataAccessException("No Hostinfo found by " + field + "(" + value + ").", 1); } @@ -121,7 +121,7 @@ private Hostinfo requireFound(HostinfoDO record, String field, String value) { return toModel(record); } - private Hostinfo toModel(HostinfoDO record) { + private Hostinfo toModel(HostInfoDO record) { Hostinfo model = new Hostinfo(); if (record.getId() != null) { @@ -146,8 +146,8 @@ private Hostinfo toModel(HostinfoDO record) { return model; } - private HostinfoDO toRecord(Hostinfo model) { - HostinfoDO record = new HostinfoDO(); + private HostInfoDO toRecord(Hostinfo model) { + HostInfoDO record = new HostInfoDO(); record.setId(model.getId()); record.setIp(model.getIp()); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportContentRepository.java index 64e704c121..bb96df9c9f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportContentRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.repository.hourly.report.content; +package com.dianping.cat.core.mybatis; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.mybatis.hourly.report.content.dao.HourlyReportContentMapper; -import com.dianping.cat.core.mybatis.hourly.report.content.dao.data.HourlyReportContentDO; +import com.dianping.cat.core.mybatis.mapper.HourlyReportContentMapper; +import com.dianping.cat.core.mybatis.data.HourlyReportContentDO; public class HourlyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(HourlyReportContentRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportRepository.java index 1991f646a5..e763f9fcf5 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.repository.hourlyreport; +package com.dianping.cat.core.mybatis; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.HourlyReport; -import com.dianping.cat.core.mybatis.hourlyreport.dao.HourlyreportMapper; -import com.dianping.cat.core.mybatis.hourlyreport.dao.data.HourlyreportDO; +import com.dianping.cat.core.mybatis.mapper.HourlyReportMapper; +import com.dianping.cat.core.mybatis.data.HourlyReportDO; public class HourlyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(HourlyReportRepository.class); @@ -34,8 +34,8 @@ public int deleteByPK(HourlyReport proto) { } public List findAllByDomainNamePeriod(java.util.Date period, String domain, String name) { - HourlyreportDO record = new HourlyreportDO(); - HourlyreportMapper mapper = springMapper(); + HourlyReportDO record = new HourlyReportDO(); + HourlyReportMapper mapper = springMapper(); record.setPeriod(period); record.setDomain(domain); @@ -44,8 +44,8 @@ public List findAllByDomainNamePeriod(java.util.Date period, Strin } public List findAllByPeriodName(java.util.Date period, String name) { - HourlyreportDO record = new HourlyreportDO(); - HourlyreportMapper mapper = springMapper(); + HourlyReportDO record = new HourlyReportDO(); + HourlyReportMapper mapper = springMapper(); record.setPeriod(period); record.setName(name); @@ -53,7 +53,7 @@ public List findAllByPeriodName(java.util.Date period, String name } public HourlyReport findByPK(long keyId) { - HourlyreportMapper mapper = springMapper(); + HourlyReportMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } @@ -61,7 +61,7 @@ public HourlyReport findByPK(long keyId) { public int insert(HourlyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); - HourlyreportDO record = toRecord(proto); + HourlyReportDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper().insert(record)); proto.setId(record.getId()); @@ -75,7 +75,7 @@ public int updateByPK(HourlyReport proto) { return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } - private HourlyreportMapper springMapper() { + private HourlyReportMapper springMapper() { SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; if (sqlSessionTemplate == null) { @@ -86,7 +86,7 @@ private HourlyreportMapper springMapper() { LOGGER.info("HourlyReportRepository is using Spring managed HourlyreportMapper."); } - return sqlSessionTemplate.getMapper(HourlyreportMapper.class); + return sqlSessionTemplate.getMapper(HourlyReportMapper.class); } private TransactionTemplate springTransactionTemplate() { @@ -104,7 +104,7 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private HourlyReport requireFound(HourlyreportDO record, String field, String value) { + private HourlyReport requireFound(HourlyReportDO record, String field, String value) { if (record == null) { throw new EmptyResultDataAccessException("No HourlyReport found by " + field + "(" + value + ").", 1); } @@ -112,7 +112,7 @@ private HourlyReport requireFound(HourlyreportDO record, String field, String va return toModel(record); } - private HourlyReport toModel(HourlyreportDO record) { + private HourlyReport toModel(HourlyReportDO record) { HourlyReport model = new HourlyReport(); if (record.getId() != null) { @@ -140,8 +140,8 @@ private HourlyReport toModel(HourlyreportDO record) { return model; } - private HourlyreportDO toRecord(HourlyReport model) { - HourlyreportDO record = new HourlyreportDO(); + private HourlyReportDO toRecord(HourlyReport model) { + HourlyReportDO record = new HourlyReportDO(); record.setId(model.getId()); record.setType(model.getType()); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportContentRepository.java index 5da5208419..57c8719db5 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportContentRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.repository.monthly.report.content; +package com.dianping.cat.core.mybatis; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.mybatis.monthly.report.content.dao.MonthlyReportContentMapper; -import com.dianping.cat.core.mybatis.monthly.report.content.dao.data.MonthlyReportContentDO; +import com.dianping.cat.core.mybatis.mapper.MonthlyReportContentMapper; +import com.dianping.cat.core.mybatis.data.MonthlyReportContentDO; public class MonthlyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(MonthlyReportContentRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportRepository.java index 7ec0285969..388d1d1a89 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.repository.monthreport; +package com.dianping.cat.core.mybatis; import java.util.concurrent.atomic.AtomicBoolean; @@ -9,8 +9,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.MonthlyReport; -import com.dianping.cat.core.mybatis.monthreport.dao.MonthreportMapper; -import com.dianping.cat.core.mybatis.monthreport.dao.data.MonthreportDO; +import com.dianping.cat.core.mybatis.mapper.MonthReportMapper; +import com.dianping.cat.core.mybatis.data.MonthReportDO; public class MonthlyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(MonthlyReportRepository.class); @@ -38,19 +38,19 @@ public int deleteReportByDomainNamePeriod(MonthlyReport proto) { } public MonthlyReport findByPK(long keyId) { - MonthreportMapper mapper = springMapper(); + MonthReportMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } public MonthlyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name) { - MonthreportDO record = new MonthreportDO(); - MonthreportMapper mapper = springMapper(); + MonthReportDO record = new MonthReportDO(); + MonthReportMapper mapper = springMapper(); record.setPeriod(period); record.setDomain(domain); record.setName(name); - MonthreportDO result = mapper.findReportByDomainNamePeriod(record).stream().findFirst().orElse(null); + MonthReportDO result = mapper.findReportByDomainNamePeriod(record).stream().findFirst().orElse(null); return requireFound(result, "findReportByDomainNamePeriod", record.toString()); } @@ -58,7 +58,7 @@ public MonthlyReport findReportByDomainNamePeriod(java.util.Date period, String public int insert(MonthlyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); - MonthreportDO record = toRecord(proto); + MonthReportDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper().insert(record)); proto.setId(record.getId()); @@ -72,7 +72,7 @@ public int updateByPK(MonthlyReport proto) { return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } - private MonthreportMapper springMapper() { + private MonthReportMapper springMapper() { SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; if (sqlSessionTemplate == null) { @@ -83,7 +83,7 @@ private MonthreportMapper springMapper() { LOGGER.info("MonthlyReportRepository is using Spring managed MonthreportMapper."); } - return sqlSessionTemplate.getMapper(MonthreportMapper.class); + return sqlSessionTemplate.getMapper(MonthReportMapper.class); } private TransactionTemplate springTransactionTemplate() { @@ -101,7 +101,7 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private MonthlyReport requireFound(MonthreportDO record, String field, String value) { + private MonthlyReport requireFound(MonthReportDO record, String field, String value) { if (record == null) { throw new EmptyResultDataAccessException("No MonthlyReport found by " + field + "(" + value + ").", 1); } @@ -109,7 +109,7 @@ private MonthlyReport requireFound(MonthreportDO record, String field, String va return toModel(record); } - private MonthlyReport toModel(MonthreportDO record) { + private MonthlyReport toModel(MonthReportDO record) { MonthlyReport model = new MonthlyReport(); if (record.getId() != null) { @@ -137,8 +137,8 @@ private MonthlyReport toModel(MonthreportDO record) { return model; } - private MonthreportDO toRecord(MonthlyReport model) { - MonthreportDO record = new MonthreportDO(); + private MonthReportDO toRecord(MonthlyReport model) { + MonthReportDO record = new MonthReportDO(); record.setId(model.getId()); record.setName(model.getName()); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/ProjectRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/ProjectRepository.java index 78c4926b0d..5af723b8c8 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/ProjectRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/ProjectRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.repository.project; +package com.dianping.cat.core.mybatis; import java.util.List; import java.util.Optional; @@ -12,8 +12,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.Project; -import com.dianping.cat.core.mybatis.project.dao.ProjectMapper; -import com.dianping.cat.core.mybatis.project.dao.data.ProjectDO; +import com.dianping.cat.core.mybatis.mapper.ProjectMapper; +import com.dianping.cat.core.mybatis.data.ProjectDO; public class ProjectRepository { private static final Logger LOGGER = LoggerFactory.getLogger(ProjectRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/SpringBackedRepositorySupport.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/SpringBackedRepositorySupport.java index 77f1ddb6c8..05bc9e2325 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/SpringBackedRepositorySupport.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/SpringBackedRepositorySupport.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.repository; +package com.dianping.cat.core.mybatis; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/TaskRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/TaskRepository.java index dc4f2e0f1a..bf6bb01449 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/TaskRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/TaskRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.repository.task; +package com.dianping.cat.core.mybatis; import java.util.concurrent.atomic.AtomicBoolean; @@ -9,8 +9,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.Task; -import com.dianping.cat.core.mybatis.task.dao.TaskMapper; -import com.dianping.cat.core.mybatis.task.dao.data.TaskDO; +import com.dianping.cat.core.mybatis.mapper.TaskMapper; +import com.dianping.cat.core.mybatis.data.TaskDO; public class TaskRepository { private static final Logger LOGGER = LoggerFactory.getLogger(TaskRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportContentRepository.java index 8e1a6932a7..beb1f15c23 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportContentRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.repository.weekly.report.content; +package com.dianping.cat.core.mybatis; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.mybatis.weekly.report.content.dao.WeeklyReportContentMapper; -import com.dianping.cat.core.mybatis.weekly.report.content.dao.data.WeeklyReportContentDO; +import com.dianping.cat.core.mybatis.mapper.WeeklyReportContentMapper; +import com.dianping.cat.core.mybatis.data.WeeklyReportContentDO; public class WeeklyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(WeeklyReportContentRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportRepository.java index 636daf487b..0825508dea 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.repository.weeklyreport; +package com.dianping.cat.core.mybatis; import java.util.concurrent.atomic.AtomicBoolean; @@ -9,8 +9,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.WeeklyReport; -import com.dianping.cat.core.mybatis.weeklyreport.dao.WeeklyreportMapper; -import com.dianping.cat.core.mybatis.weeklyreport.dao.data.WeeklyreportDO; +import com.dianping.cat.core.mybatis.mapper.WeeklyReportMapper; +import com.dianping.cat.core.mybatis.data.WeeklyReportDO; public class WeeklyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(WeeklyReportRepository.class); @@ -38,19 +38,19 @@ public int deleteReportByDomainNamePeriod(WeeklyReport proto) { } public WeeklyReport findByPK(long keyId) { - WeeklyreportMapper mapper = springMapper(); + WeeklyReportMapper mapper = springMapper(); return requireFound(mapper.findByPrimaryKey(keyId), "primary key", String.valueOf(keyId)); } public WeeklyReport findReportByDomainNamePeriod(java.util.Date period, String domain, String name) { - WeeklyreportDO record = new WeeklyreportDO(); - WeeklyreportMapper mapper = springMapper(); + WeeklyReportDO record = new WeeklyReportDO(); + WeeklyReportMapper mapper = springMapper(); record.setPeriod(period); record.setDomain(domain); record.setName(name); - WeeklyreportDO result = mapper.findReportByDomainNamePeriod(record).stream().findFirst().orElse(null); + WeeklyReportDO result = mapper.findReportByDomainNamePeriod(record).stream().findFirst().orElse(null); return requireFound(result, "findReportByDomainNamePeriod", record.toString()); } @@ -58,7 +58,7 @@ public WeeklyReport findReportByDomainNamePeriod(java.util.Date period, String d public int insert(WeeklyReport proto) { TransactionTemplate transactionTemplate = springTransactionTemplate(); - WeeklyreportDO record = toRecord(proto); + WeeklyReportDO record = toRecord(proto); int count = transactionTemplate.execute(status -> springMapper().insert(record)); proto.setId(record.getId()); @@ -72,7 +72,7 @@ public int updateByPK(WeeklyReport proto) { return transactionTemplate.execute(status -> springMapper().updateByPrimaryKey(toRecord(proto))); } - private WeeklyreportMapper springMapper() { + private WeeklyReportMapper springMapper() { SqlSessionTemplate sqlSessionTemplate = m_sqlSessionTemplate; if (sqlSessionTemplate == null) { @@ -83,7 +83,7 @@ private WeeklyreportMapper springMapper() { LOGGER.info("WeeklyReportRepository is using Spring managed WeeklyreportMapper."); } - return sqlSessionTemplate.getMapper(WeeklyreportMapper.class); + return sqlSessionTemplate.getMapper(WeeklyReportMapper.class); } private TransactionTemplate springTransactionTemplate() { @@ -101,7 +101,7 @@ public void setTransactionTemplate(TransactionTemplate transactionTemplate) { m_transactionTemplate = transactionTemplate; } - private WeeklyReport requireFound(WeeklyreportDO record, String field, String value) { + private WeeklyReport requireFound(WeeklyReportDO record, String field, String value) { if (record == null) { throw new EmptyResultDataAccessException("No WeeklyReport found by " + field + "(" + value + ").", 1); } @@ -109,7 +109,7 @@ private WeeklyReport requireFound(WeeklyreportDO record, String field, String va return toModel(record); } - private WeeklyReport toModel(WeeklyreportDO record) { + private WeeklyReport toModel(WeeklyReportDO record) { WeeklyReport model = new WeeklyReport(); if (record.getId() != null) { @@ -137,8 +137,8 @@ private WeeklyReport toModel(WeeklyreportDO record) { return model; } - private WeeklyreportDO toRecord(WeeklyReport model) { - WeeklyreportDO record = new WeeklyreportDO(); + private WeeklyReportDO toRecord(WeeklyReport model) { + WeeklyReportDO record = new WeeklyReportDO(); record.setId(model.getId()); record.setName(model.getName()); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessConfigDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessConfigDO.java index aeb9fb4921..7fb0cf7094 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessConfigDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessConfigDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.business.config.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessReportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessReportDO.java index 36f2f33f3d..ed44d66973 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessReportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessReportDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.businessreport.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ConfigDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ConfigDO.java index 6b939d6e39..c0930f4102 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ConfigDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ConfigDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.config.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportContentDO.java index c88899c3ad..d74dad47e5 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportContentDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.daily.report.content.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportDO.java index 61e83e0f36..3d283ab33b 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.report.daily.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HostInfoDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HostInfoDO.java index e617bf0ad4..73813ee138 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HostInfoDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HostInfoDO.java @@ -1,11 +1,11 @@ -package com.dianping.cat.core.mybatis.hostinfo.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; import lombok.Data; @Data -public class HostinfoDO { +public class HostInfoDO { private Long id; private String ip; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportContentDO.java index b8cebb1a5f..2289e6faa8 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportContentDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.hourly.report.content.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportDO.java index 7adda56e4a..cfd54de6ed 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportDO.java @@ -1,11 +1,11 @@ -package com.dianping.cat.core.mybatis.hourlyreport.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; import lombok.Data; @Data -public class HourlyreportDO { +public class HourlyReportDO { private Long id; private Integer type; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthReportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthReportDO.java index 0377d57618..1ac6b1f723 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthReportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthReportDO.java @@ -1,11 +1,11 @@ -package com.dianping.cat.core.mybatis.monthreport.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; import lombok.Data; @Data -public class MonthreportDO { +public class MonthReportDO { private Long id; private String name; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthlyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthlyReportContentDO.java index e0dbe4fe4c..c715e97864 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthlyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthlyReportContentDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.monthly.report.content.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/OperationDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/OperationDO.java index 5eb29b85f6..edeed536e4 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/OperationDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/OperationDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.operation.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ProjectDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ProjectDO.java index 6d803e0c2c..59599f99b5 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ProjectDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ProjectDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.project.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/TaskDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/TaskDO.java index e5df513f89..b99a3a7530 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/TaskDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/TaskDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.task.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportContentDO.java index 83d7a92450..3ff17d58e2 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportContentDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.weekly.report.content.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportDO.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportDO.java index 4f36b118ff..d5edf26441 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportDO.java @@ -1,11 +1,11 @@ -package com.dianping.cat.core.mybatis.weeklyreport.dao.data; +package com.dianping.cat.core.mybatis.data; import java.util.Date; import lombok.Data; @Data -public class WeeklyreportDO { +public class WeeklyReportDO { private Long id; private String name; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigMapper.java index 5b36e1d8da..f8dbdd41ec 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.business.config.dao.data.BusinessConfigDO; +import com.dianping.cat.core.mybatis.data.BusinessConfigDO; public interface BusinessConfigMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigRepository.java index 837a33bc58..e502e7ecc6 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.repository.business.config; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import java.util.stream.Collectors; @@ -9,9 +9,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.config.BusinessConfig; -import com.dianping.cat.core.mybatis.BusinessConfigMapper; -import com.dianping.cat.core.mybatis.business.config.dao.data.BusinessConfigDO; -import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; +import com.dianping.cat.core.mybatis.data.BusinessConfigDO; +import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; public class BusinessConfigRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(BusinessConfigRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessReportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessReportMapper.java index 69edb0eb91..2988da523a 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessReportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessReportMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.businessreport.dao; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.businessreport.dao.data.BusinessReportDO; +import com.dianping.cat.core.mybatis.data.BusinessReportDO; public interface BusinessReportMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ConfigMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ConfigMapper.java index 11b9d23533..79f6b4b39b 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ConfigMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ConfigMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.config.dao; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.config.dao.data.ConfigDO; +import com.dianping.cat.core.mybatis.data.ConfigDO; public interface ConfigMapper { int deleteById(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportContentMapper.java index 4b125ed186..a0e2c10036 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportContentMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.daily.report.content.dao; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.daily.report.content.dao.data.DailyReportContentDO; +import com.dianping.cat.core.mybatis.data.DailyReportContentDO; public interface DailyReportContentMapper { int deleteByPrimaryKey(@Param("reportId") Long reportId); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportMapper.java index e5923a1e4d..f0af21d8e9 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportMapper.java @@ -1,11 +1,11 @@ -package com.dianping.cat.core.report.daily.dao; +package com.dianping.cat.core.mybatis.mapper; import java.util.Date; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.report.daily.dao.data.DailyReportDO; +import com.dianping.cat.core.mybatis.data.DailyReportDO; public interface DailyReportMapper { int deleteByDomainNamePeriod(@Param("domain") String domain, @Param("name") String name, diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HostInfoMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HostInfoMapper.java index a0b8b82c6c..0921134a78 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HostInfoMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HostInfoMapper.java @@ -1,23 +1,23 @@ -package com.dianping.cat.core.mybatis.hostinfo.dao; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.hostinfo.dao.data.HostinfoDO; +import com.dianping.cat.core.mybatis.data.HostInfoDO; -public interface HostinfoMapper { +public interface HostInfoMapper { int deleteByPrimaryKey(@Param("id") Long id); - HostinfoDO findByPrimaryKey(@Param("id") Long id); + HostInfoDO findByPrimaryKey(@Param("id") Long id); - int insert(HostinfoDO record); + int insert(HostInfoDO record); - List queryAll(); + List queryAll(); - int updateByPrimaryKey(HostinfoDO record); + int updateByPrimaryKey(HostInfoDO record); - List findByIp(@Param("record") HostinfoDO record); + List findByIp(@Param("record") HostInfoDO record); - List findAllIp(@Param("record") HostinfoDO record); + List findAllIp(@Param("record") HostInfoDO record); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportContentMapper.java index 0d309f7886..113c389e7d 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportContentMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.hourly.report.content.dao; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.hourly.report.content.dao.data.HourlyReportContentDO; +import com.dianping.cat.core.mybatis.data.HourlyReportContentDO; public interface HourlyReportContentMapper { int deleteByPrimaryKey(@Param("reportId") Long reportId); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportMapper.java index a0ecc6633a..d7322048f3 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportMapper.java @@ -1,23 +1,23 @@ -package com.dianping.cat.core.mybatis.hourlyreport.dao; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.hourlyreport.dao.data.HourlyreportDO; +import com.dianping.cat.core.mybatis.data.HourlyReportDO; -public interface HourlyreportMapper { +public interface HourlyReportMapper { int deleteByPrimaryKey(@Param("id") Long id); - HourlyreportDO findByPrimaryKey(@Param("id") Long id); + HourlyReportDO findByPrimaryKey(@Param("id") Long id); - int insert(HourlyreportDO record); + int insert(HourlyReportDO record); - List queryAll(); + List queryAll(); - int updateByPrimaryKey(HourlyreportDO record); + int updateByPrimaryKey(HourlyReportDO record); - List findAllByDomainNamePeriod(@Param("record") HourlyreportDO record); + List findAllByDomainNamePeriod(@Param("record") HourlyReportDO record); - List findAllByPeriodName(@Param("record") HourlyreportDO record); + List findAllByPeriodName(@Param("record") HourlyReportDO record); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthReportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthReportMapper.java index c1ba59d794..cbafe514d4 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthReportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthReportMapper.java @@ -1,23 +1,23 @@ -package com.dianping.cat.core.mybatis.monthreport.dao; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.monthreport.dao.data.MonthreportDO; +import com.dianping.cat.core.mybatis.data.MonthReportDO; -public interface MonthreportMapper { +public interface MonthReportMapper { int deleteByPrimaryKey(@Param("id") Long id); - MonthreportDO findByPrimaryKey(@Param("id") Long id); + MonthReportDO findByPrimaryKey(@Param("id") Long id); - int insert(MonthreportDO record); + int insert(MonthReportDO record); - List queryAll(); + List queryAll(); - int updateByPrimaryKey(MonthreportDO record); + int updateByPrimaryKey(MonthReportDO record); - List findReportByDomainNamePeriod(@Param("record") MonthreportDO record); + List findReportByDomainNamePeriod(@Param("record") MonthReportDO record); - int deleteReportByDomainNamePeriod(@Param("record") MonthreportDO record); + int deleteReportByDomainNamePeriod(@Param("record") MonthReportDO record); } diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthlyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthlyReportContentMapper.java index a121c8fd05..9bf2a24fc9 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthlyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthlyReportContentMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.monthly.report.content.dao; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.monthly.report.content.dao.data.MonthlyReportContentDO; +import com.dianping.cat.core.mybatis.data.MonthlyReportContentDO; public interface MonthlyReportContentMapper { int deleteByPrimaryKey(@Param("reportId") Long reportId); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/OperationMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/OperationMapper.java index 32628c1a66..14ebe6550b 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/OperationMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/OperationMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.operation.dao; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.operation.dao.data.OperationDO; +import com.dianping.cat.core.mybatis.data.OperationDO; public interface OperationMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ProjectMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ProjectMapper.java index c34c8f21b8..3a198791e3 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ProjectMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ProjectMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.project.dao; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.project.dao.data.ProjectDO; +import com.dianping.cat.core.mybatis.data.ProjectDO; public interface ProjectMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/TaskMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/TaskMapper.java index 6855fb9afd..0741501035 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/TaskMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/TaskMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.task.dao; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.task.dao.data.TaskDO; +import com.dianping.cat.core.mybatis.data.TaskDO; public interface TaskMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportContentMapper.java index d2e6c4dbaa..de588af48c 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportContentMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.weekly.report.content.dao; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.weekly.report.content.dao.data.WeeklyReportContentDO; +import com.dianping.cat.core.mybatis.data.WeeklyReportContentDO; public interface WeeklyReportContentMapper { int deleteByPrimaryKey(@Param("reportId") Long reportId); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportMapper.java b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportMapper.java index 14a6562d0f..4be93c09e7 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportMapper.java @@ -1,23 +1,23 @@ -package com.dianping.cat.core.mybatis.weeklyreport.dao; +package com.dianping.cat.core.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.weeklyreport.dao.data.WeeklyreportDO; +import com.dianping.cat.core.mybatis.data.WeeklyReportDO; -public interface WeeklyreportMapper { +public interface WeeklyReportMapper { int deleteByPrimaryKey(@Param("id") Long id); - WeeklyreportDO findByPrimaryKey(@Param("id") Long id); + WeeklyReportDO findByPrimaryKey(@Param("id") Long id); - int insert(WeeklyreportDO record); + int insert(WeeklyReportDO record); - List queryAll(); + List queryAll(); - int updateByPrimaryKey(WeeklyreportDO record); + int updateByPrimaryKey(WeeklyReportDO record); - List findReportByDomainNamePeriod(@Param("record") WeeklyreportDO record); + List findReportByDomainNamePeriod(@Param("record") WeeklyReportDO record); - int deleteReportByDomainNamePeriod(@Param("record") WeeklyreportDO record); + int deleteReportByDomainNamePeriod(@Param("record") WeeklyReportDO record); } diff --git a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java index ccabe01b83..c4bddd7c53 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java +++ b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java @@ -34,8 +34,8 @@ import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; -import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.HourlyReportRepository; import com.dianping.cat.message.Message; import com.dianping.cat.message.Transaction; diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java index 9c232bff82..a3b38f0438 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java @@ -33,20 +33,20 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.DailyReportContentRepository; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; -import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.HourlyReportRepository; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; -import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.MonthlyReportRepository; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; -import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; -import com.dianping.cat.core.report.daily.repository.DailyReportRepository; +import com.dianping.cat.core.mybatis.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.WeeklyReportRepository; +import com.dianping.cat.core.mybatis.DailyReportRepository; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.message.Event; diff --git a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java index 919e8f266b..85488607a7 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java @@ -33,7 +33,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.dal.Hostinfo; -import com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository; +import com.dianping.cat.core.mybatis.HostInfoRepository; import com.dianping.cat.helper.TimeHelper; public class HostinfoService { @@ -41,7 +41,7 @@ public class HostinfoService { public static final String UNKNOWN_PROJECT = "UnknownProject"; - private HostinfoRepository m_hostinfoDao; + private HostInfoRepository m_hostinfoDao; private ServerConfigManager m_manager; @@ -260,7 +260,7 @@ public boolean updateHostinfo(Hostinfo hostinfo) { } } - public void setHostinfoDao(HostinfoRepository hostinfoDao) { + public void setHostinfoDao(HostInfoRepository hostinfoDao) { m_hostinfoDao = hostinfoDao; } diff --git a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java index 0d5f61d902..fa3702d2c9 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java @@ -21,7 +21,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.dal.Project; -import com.dianping.cat.core.mybatis.repository.project.ProjectRepository; +import com.dianping.cat.core.mybatis.ProjectRepository; import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java index 5bc1f3d6a3..5a6674601e 100644 --- a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java +++ b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java @@ -21,7 +21,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.core.dal.Task; -import com.dianping.cat.core.mybatis.repository.task.TaskRepository; +import com.dianping.cat.core.mybatis.TaskRepository; import java.util.Calendar; import java.util.Date; diff --git a/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml b/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml index 3a53c81d4e..2f496bee14 100644 --- a/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -31,7 +31,7 @@ + parameterType="com.dianping.cat.core.mybatis.data.BusinessConfigDO" keyProperty="id"> INSERT INTO t_business_config @@ -52,7 +52,7 @@ delete from t_business_config where id = #{id} - + UPDATE t_business_config WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml index 12b797ba98..a5f312f184 100644 --- a/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -40,7 +40,7 @@ + parameterType="com.dianping.cat.core.mybatis.data.BusinessReportDO" keyProperty="id"> INSERT INTO t_business_report @@ -61,7 +61,7 @@ delete from t_business_report where id = #{id} - + UPDATE t_business_report WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml b/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml index c692e1b901..ed961abcab 100644 --- a/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -28,7 +28,7 @@ + parameterType="com.dianping.cat.core.mybatis.data.ConfigDO" keyProperty="id"> INSERT INTO t_config @@ -56,7 +56,7 @@ delete from t_config where id = #{id} - + UPDATE t_config WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml index 5520afa0bf..461c9a3755 100644 --- a/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -28,7 +28,7 @@ - + INSERT INTO t_daily_report_content @@ -49,7 +49,7 @@ delete from t_daily_report_content where report_id = #{reportId} - + UPDATE t_daily_report_content WHERE report_id = #{reportId} diff --git a/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml index b17dac3fce..1565f79bc3 100644 --- a/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -34,7 +34,7 @@ + parameterType="com.dianping.cat.core.mybatis.data.DailyReportDO" keyProperty="id"> INSERT INTO t_daily_report @@ -78,7 +78,7 @@ and BINARY(domain) = BINARY(#{domain}) - + UPDATE t_daily_report WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/HostInfoMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HostInfoMapper.xml index 28872e49ce..7a9af5468b 100644 --- a/cat-core/src/main/resources/mybatis/mapper/HostInfoMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/HostInfoMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -31,7 +31,7 @@ + parameterType="com.dianping.cat.core.mybatis.data.HostInfoDO" keyProperty="id"> INSERT INTO t_host_info @@ -52,7 +52,7 @@ delete from t_host_info where id = #{id} - + UPDATE t_host_info WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml index f16fc5dba3..666790a895 100644 --- a/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -28,7 +28,7 @@ - + INSERT INTO t_hourly_report_content @@ -49,7 +49,7 @@ delete from t_hourly_report_content where report_id = #{reportId} - + UPDATE t_hourly_report_content WHERE report_id = #{reportId} diff --git a/cat-core/src/main/resources/mybatis/mapper/HourlyReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HourlyReportMapper.xml index 98e1f00ec4..abe54a2365 100644 --- a/cat-core/src/main/resources/mybatis/mapper/HourlyReportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/HourlyReportMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -34,7 +34,7 @@ + parameterType="com.dianping.cat.core.mybatis.data.HourlyReportDO" keyProperty="id"> INSERT INTO t_hourly_report @@ -55,7 +55,7 @@ delete from t_hourly_report where id = #{id} - + UPDATE t_hourly_report WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/MonthReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/MonthReportMapper.xml index 88046435b6..bdb111c1be 100644 --- a/cat-core/src/main/resources/mybatis/mapper/MonthReportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/MonthReportMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -34,7 +34,7 @@ + parameterType="com.dianping.cat.core.mybatis.data.MonthReportDO" keyProperty="id"> INSERT INTO t_monthly_report @@ -55,7 +55,7 @@ delete from t_monthly_report where id = #{id} - + UPDATE t_monthly_report WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml index cf918db424..331cf909bd 100644 --- a/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -28,7 +28,7 @@ - + INSERT INTO t_monthly_report_content @@ -49,7 +49,7 @@ delete from t_monthly_report_content where report_id = #{reportId} - + UPDATE t_monthly_report_content WHERE report_id = #{reportId} diff --git a/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml b/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml index 0d02bb72b5..d24e70019a 100644 --- a/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -37,7 +37,7 @@ + parameterType="com.dianping.cat.core.mybatis.data.OperationDO" keyProperty="id"> INSERT INTO t_operation @@ -58,7 +58,7 @@ delete from t_operation where id = #{id} - + UPDATE t_operation WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml b/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml index d52ffb2552..281a8b1bad 100644 --- a/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -46,7 +46,7 @@ + parameterType="com.dianping.cat.core.mybatis.data.ProjectDO" keyProperty="id"> INSERT INTO t_project @@ -67,7 +67,7 @@ delete from t_project where id = #{id} - + UPDATE t_project WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml b/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml index 3590597b9d..ca9b0af5eb 100644 --- a/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -53,7 +53,7 @@ + parameterType="com.dianping.cat.core.mybatis.data.TaskDO" keyProperty="id"> INSERT INTO t_task @@ -74,7 +74,7 @@ delete from t_task where id = #{id} - + UPDATE t_task WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml index fa52d33edf..8a3365d475 100644 --- a/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -28,7 +28,7 @@ - + INSERT INTO t_weekly_report_content @@ -49,7 +49,7 @@ delete from t_weekly_report_content where report_id = #{reportId} - + UPDATE t_weekly_report_content WHERE report_id = #{reportId} diff --git a/cat-core/src/main/resources/mybatis/mapper/WeeklyReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportMapper.xml index cd3986e357..536486a895 100644 --- a/cat-core/src/main/resources/mybatis/mapper/WeeklyReportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -34,7 +34,7 @@ + parameterType="com.dianping.cat.core.mybatis.data.WeeklyReportDO" keyProperty="id"> INSERT INTO t_weekly_report @@ -55,7 +55,7 @@ delete from t_weekly_report where id = #{id} - + UPDATE t_weekly_report WHERE id = #{id} diff --git a/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java b/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java index e34ba4479a..7afda0d1de 100644 --- a/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java +++ b/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java @@ -33,8 +33,8 @@ import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; -import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.HourlyReportRepository; import com.dianping.cat.report.DefaultReportManager; import com.dianping.cat.report.DefaultReportManager.StoragePolicy; import com.dianping.cat.report.DomainValidator; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java index 240b12f046..318d55c2bd 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java @@ -1,6 +1,6 @@ package com.dianping.cat.core.mybatis.repository.alert.summary; -import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; +import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.alert.summary.dao.AlertSummaryMapper; import com.dianping.cat.core.mybatis.alert.summary.dao.data.AlertSummaryDO; import com.dianping.cat.home.dal.report.AlertSummary; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java index 4c68277f17..93c6a485b2 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java @@ -1,6 +1,6 @@ package com.dianping.cat.core.mybatis.repository.alteration; -import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; +import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.alteration.dao.AlterationMapper; import com.dianping.cat.core.mybatis.alteration.dao.data.AlterationDO; import com.dianping.cat.home.dal.report.Alteration; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java index 0f3e8033f1..bf111b7e74 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java @@ -1,6 +1,6 @@ package com.dianping.cat.core.mybatis.repository.baseline; -import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; +import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.baseline.dao.BaselineMapper; import com.dianping.cat.core.mybatis.baseline.dao.data.BaselineDO; import com.dianping.cat.home.dal.report.Baseline; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java index 6536906156..a59a4e4d5d 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java @@ -1,6 +1,6 @@ package com.dianping.cat.core.mybatis.repository.config.modification; -import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; +import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.config.modification.dao.ConfigModificationMapper; import com.dianping.cat.core.mybatis.config.modification.dao.data.ConfigModificationDO; import com.dianping.cat.home.dal.report.ConfigModification; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java index 0769a27c49..d905da20c3 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java @@ -1,6 +1,6 @@ package com.dianping.cat.core.mybatis.repository.metric.graph; -import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; +import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.metric.graph.dao.MetricGraphMapper; import com.dianping.cat.core.mybatis.metric.graph.dao.data.MetricGraphDO; import com.dianping.cat.home.dal.report.MetricGraph; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java index 4b9bda5781..cb967f6edc 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java @@ -1,6 +1,6 @@ package com.dianping.cat.core.mybatis.repository.metric.screen; -import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; +import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.metric.screen.dao.MetricScreenMapper; import com.dianping.cat.core.mybatis.metric.screen.dao.data.MetricScreenDO; import com.dianping.cat.home.dal.report.MetricScreen; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java index 41897377c3..e9c5042703 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java @@ -1,6 +1,6 @@ package com.dianping.cat.core.mybatis.repository.overload; -import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; +import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.overload.dao.OverloadMapper; import com.dianping.cat.core.mybatis.overload.dao.data.OverloadDO; import com.dianping.cat.home.dal.report.Overload; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java index 595173ddfc..1c2f61b299 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java @@ -1,6 +1,6 @@ package com.dianping.cat.core.mybatis.repository.topologygraph; -import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; +import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; import com.dianping.cat.core.mybatis.topologygraph.dao.TopologyGraphMapper; import com.dianping.cat.core.mybatis.topologygraph.dao.data.TopologyGraphDO; import com.dianping.cat.home.dal.report.TopologyGraph; diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index d7d73c4e4b..514369c2ec 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -18,7 +18,6 @@ import org.unidal.cat.message.storage.BlockDumperManager; import org.unidal.cat.message.storage.BlockDumperFactory; import org.unidal.cat.message.storage.BlockWriterFactory; -import org.unidal.cat.message.storage.Index; import org.unidal.cat.message.storage.IndexFactory; import org.unidal.cat.message.storage.IndexManager; import org.unidal.cat.message.storage.MessageDumperManager; @@ -26,7 +25,6 @@ import org.unidal.cat.message.storage.MessageFinderManager; import org.unidal.cat.message.storage.MessageProcessorFactory; import org.unidal.cat.message.storage.StorageConfiguration; -import org.unidal.cat.message.storage.TokenMapping; import org.unidal.cat.message.storage.TokenMappingFactory; import org.unidal.cat.message.storage.TokenMappingManager; import org.unidal.cat.message.storage.internals.ByteBufCache; @@ -134,8 +132,8 @@ import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.consumer.transaction.TransactionDelegate; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; -import com.dianping.cat.core.config.repository.ConfigRepository; -import com.dianping.cat.core.mybatis.repository.SpringBackedRepositorySupport; +import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.config.AlertPolicyManager; import com.dianping.cat.alarm.spi.config.SenderConfigManager; @@ -161,25 +159,25 @@ import com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository; import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; import com.dianping.cat.core.mybatis.repository.baseline.BaselineRepository; -import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; +import com.dianping.cat.core.mybatis.mapper.BusinessConfigRepository; import com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository; -import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; -import com.dianping.cat.core.mybatis.repository.hostinfo.HostinfoRepository; -import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; -import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.HostInfoRepository; +import com.dianping.cat.core.mybatis.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.HourlyReportRepository; import com.dianping.cat.core.mybatis.repository.metric.graph.MetricGraphRepository; import com.dianping.cat.core.mybatis.repository.metric.screen.MetricScreenRepository; -import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; -import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.MonthlyReportRepository; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; -import com.dianping.cat.core.mybatis.repository.project.ProjectRepository; +import com.dianping.cat.core.mybatis.ProjectRepository; import com.dianping.cat.core.mybatis.repository.server.alarm.rule.ServerAlarmRuleRepository; -import com.dianping.cat.core.mybatis.repository.task.TaskRepository; +import com.dianping.cat.core.mybatis.TaskRepository; import com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository; import com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository; -import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; -import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; -import com.dianping.cat.core.report.daily.repository.DailyReportRepository; +import com.dianping.cat.core.mybatis.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.WeeklyReportRepository; +import com.dianping.cat.core.mybatis.DailyReportRepository; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.hadoop.hdfs.FileSystemManager; import com.dianping.cat.hadoop.hdfs.HdfsMessageBucketFactory; @@ -2728,9 +2726,9 @@ public ProjectRepository projectRepository(SqlSessionTemplate sqlSessionTemplate } @Bean - public HostinfoRepository hostinfoRepository(SqlSessionTemplate sqlSessionTemplate, - TransactionTemplate transactionTemplate) { - HostinfoRepository repository = new HostinfoRepository(); + public HostInfoRepository hostinfoRepository(SqlSessionTemplate sqlSessionTemplate, + TransactionTemplate transactionTemplate) { + HostInfoRepository repository = new HostInfoRepository(); repository.setSqlSessionTemplate(sqlSessionTemplate); repository.setTransactionTemplate(transactionTemplate); @@ -4472,8 +4470,8 @@ public com.dianping.cat.system.page.project.Handler systemProjectHandler( } @Bean - public HostinfoService hostinfoService(HostinfoRepository hostinfoRepository, - ServerConfigManager serverConfigManager) { + public HostinfoService hostinfoService(HostInfoRepository hostinfoRepository, + ServerConfigManager serverConfigManager) { HostinfoService service = new HostinfoService(); service.setHostinfoDao(hostinfoRepository); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java index afad346ae5..c97f917ad7 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java @@ -6,36 +6,36 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.config.dao.ConfigMapper; +import com.dianping.cat.core.mybatis.mapper.ConfigMapper; import com.dianping.cat.core.mybatis.alert.dao.AlertMapper; import com.dianping.cat.core.mybatis.alert.summary.dao.AlertSummaryMapper; import com.dianping.cat.core.mybatis.alteration.dao.AlterationMapper; import com.dianping.cat.core.mybatis.baseline.dao.BaselineMapper; -import com.dianping.cat.core.mybatis.business.config.dao.BusinessConfigMapper; +import com.dianping.cat.core.mybatis.mapper.BusinessConfigMapper; import com.dianping.cat.core.mybatis.config.modification.dao.ConfigModificationMapper; -import com.dianping.cat.core.mybatis.daily.report.content.dao.DailyReportContentMapper; -import com.dianping.cat.core.mybatis.hostinfo.dao.HostinfoMapper; -import com.dianping.cat.core.mybatis.hourly.report.content.dao.HourlyReportContentMapper; -import com.dianping.cat.core.mybatis.hourlyreport.dao.HourlyreportMapper; +import com.dianping.cat.core.mybatis.mapper.DailyReportContentMapper; +import com.dianping.cat.core.mybatis.mapper.HostInfoMapper; +import com.dianping.cat.core.mybatis.mapper.HourlyReportContentMapper; +import com.dianping.cat.core.mybatis.mapper.HourlyReportMapper; import com.dianping.cat.core.mybatis.metric.graph.dao.MetricGraphMapper; import com.dianping.cat.core.mybatis.metric.screen.dao.MetricScreenMapper; -import com.dianping.cat.core.mybatis.monthly.report.content.dao.MonthlyReportContentMapper; -import com.dianping.cat.core.mybatis.monthreport.dao.MonthreportMapper; +import com.dianping.cat.core.mybatis.mapper.MonthlyReportContentMapper; +import com.dianping.cat.core.mybatis.mapper.MonthReportMapper; import com.dianping.cat.core.mybatis.overload.dao.OverloadMapper; -import com.dianping.cat.core.mybatis.project.dao.ProjectMapper; +import com.dianping.cat.core.mybatis.mapper.ProjectMapper; import com.dianping.cat.core.mybatis.server.alarm.rule.dao.ServerAlarmRuleMapper; -import com.dianping.cat.core.mybatis.task.dao.TaskMapper; +import com.dianping.cat.core.mybatis.mapper.TaskMapper; import com.dianping.cat.core.mybatis.topologygraph.dao.TopologyGraphMapper; import com.dianping.cat.core.mybatis.user.define.rule.dao.UserDefineRuleMapper; -import com.dianping.cat.core.mybatis.weekly.report.content.dao.WeeklyReportContentMapper; -import com.dianping.cat.core.mybatis.weeklyreport.dao.WeeklyreportMapper; -import com.dianping.cat.core.report.daily.dao.DailyReportMapper; +import com.dianping.cat.core.mybatis.mapper.WeeklyReportContentMapper; +import com.dianping.cat.core.mybatis.mapper.WeeklyReportMapper; +import com.dianping.cat.core.mybatis.mapper.DailyReportMapper; public class CatHomeSpringStartupVerifier { private static final Logger LOGGER = LoggerFactory.getLogger(CatHomeSpringStartupVerifier.class); private static final List> REQUIRED_MAPPERS = List.of(ConfigMapper.class, DailyReportMapper.class, - HostinfoMapper.class, HourlyreportMapper.class, WeeklyreportMapper.class, MonthreportMapper.class, + HostInfoMapper.class, HourlyReportMapper.class, WeeklyReportMapper.class, MonthReportMapper.class, ProjectMapper.class, DailyReportContentMapper.class, HourlyReportContentMapper.class, WeeklyReportContentMapper.class, MonthlyReportContentMapper.class, BusinessConfigMapper.class, TaskMapper.class, AlertSummaryMapper.class, ConfigModificationMapper.class, BaselineMapper.class, diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java index 3e1bff476f..6202991fc6 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java @@ -38,7 +38,7 @@ import com.dianping.cat.alarm.rule.transform.DefaultSaxParser; import com.dianping.cat.configuration.business.entity.BusinessItemConfig; import com.dianping.cat.core.config.BusinessConfig; -import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; +import com.dianping.cat.core.mybatis.mapper.BusinessConfigRepository; import com.dianping.cat.helper.MetricType; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java index 12867582f4..0860eb5ba2 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java @@ -28,7 +28,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.home.exception.entity.ExceptionExclude; import com.dianping.cat.home.exception.entity.ExceptionLimit; import com.dianping.cat.home.exception.entity.ExceptionRuleConfig; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java index 6dd8bc8d9a..cf86195a2b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java @@ -46,7 +46,7 @@ import com.dianping.cat.alarm.rule.transform.DefaultSaxParser; import com.dianping.cat.alarm.spi.rule.RuleType; import com.dianping.cat.config.content.ContentFetcher; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.helper.MetricType; import com.dianping.cat.message.Event; import com.dianping.cat.report.alert.config.BaseRuleHelper; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java index 51c0c5a5d8..83e27b2c60 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java @@ -28,7 +28,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.home.group.entity.Domain; import com.dianping.cat.home.group.entity.DomainGroup; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java index 1506de2737..88ed220fe5 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java @@ -28,7 +28,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.home.dependency.format.entity.ProductLine; import com.dianping.cat.home.dependency.format.entity.TopoGraphFormatConfig; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java index 1e0f5f14d4..ad55cd0d4b 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java @@ -35,7 +35,7 @@ import com.dianping.cat.consumer.dependency.model.entity.Dependency; import com.dianping.cat.consumer.dependency.model.entity.Index; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.helper.Chinese; import com.dianping.cat.home.dependency.config.entity.DomainConfig; import com.dianping.cat.home.dependency.config.entity.EdgeConfig; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java index 3ac9bf6adb..943bb497ff 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java @@ -31,7 +31,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.home.heartbeat.entity.Group; import com.dianping.cat.home.heartbeat.entity.HeartbeatDisplayPolicy; import com.dianping.cat.home.heartbeat.entity.Metric; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java index ce5d2a1da6..4309764b05 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java @@ -23,7 +23,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; public class CapacityUpdateStatusManager { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java index f19e736078..740548785b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java @@ -27,8 +27,8 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; -import com.dianping.cat.core.report.daily.repository.DailyReportRepository; +import com.dianping.cat.core.mybatis.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.DailyReportRepository; import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java index 11105cbde4..3891a3684a 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java @@ -27,8 +27,8 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; -import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.HourlyReportRepository; import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java index 6b702e1fb1..3d5a246426 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java @@ -27,8 +27,8 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.mybatis.repository.monthly.report.content.MonthlyReportContentRepository; -import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.MonthlyReportContentRepository; +import com.dianping.cat.core.mybatis.MonthlyReportRepository; import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java index d1cb397a23..619c241eef 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java @@ -29,12 +29,12 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.HourlyReport; -import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.HourlyReportRepository; import com.dianping.cat.core.dal.MonthlyReport; -import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.MonthlyReportRepository; import com.dianping.cat.core.dal.WeeklyReport; -import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; -import com.dianping.cat.core.report.daily.repository.DailyReportRepository; +import com.dianping.cat.core.mybatis.WeeklyReportRepository; +import com.dianping.cat.core.mybatis.DailyReportRepository; import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java index 6f8a14ac80..8c5c501675 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java @@ -27,8 +27,8 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.mybatis.repository.weekly.report.content.WeeklyReportContentRepository; -import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; +import com.dianping.cat.core.mybatis.WeeklyReportContentRepository; +import com.dianping.cat.core.mybatis.WeeklyReportRepository; import com.dianping.cat.home.dal.report.Overload; import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java index b8d490dc31..715a71b548 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java @@ -30,7 +30,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.home.storage.entity.Link; import com.dianping.cat.home.storage.entity.Storage; import com.dianping.cat.home.storage.entity.StorageGroup; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java index 07d52e346f..282fb23bbe 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java @@ -30,7 +30,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.core.dal.Task; -import com.dianping.cat.core.mybatis.repository.task.TaskRepository; +import com.dianping.cat.core.mybatis.TaskRepository; import com.dianping.cat.message.Transaction; public class DefaultTaskConsumer extends TaskConsumer { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java index 86b93a616d..cc1f79dccb 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java @@ -27,8 +27,8 @@ import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.mybatis.repository.hourly.report.content.HourlyReportContentRepository; -import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; +import com.dianping.cat.core.mybatis.HourlyReportContentRepository; +import com.dianping.cat.core.mybatis.HourlyReportRepository; public abstract class AbstractReportReloader implements ReportReloader { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractReportReloader.class); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java index 9f18623fde..654bf2ad9a 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java @@ -31,7 +31,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.Constants; import com.dianping.cat.core.config.BusinessConfig; -import com.dianping.cat.core.mybatis.repository.business.config.BusinessConfigRepository; +import com.dianping.cat.core.mybatis.mapper.BusinessConfigRepository; import com.dianping.cat.home.business.entity.BusinessItem; import com.dianping.cat.home.business.entity.BusinessTagConfig; import com.dianping.cat.home.business.entity.Tag; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java index be471277e1..47b400d350 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java @@ -28,7 +28,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.home.resource.entity.Resource; import com.dianping.cat.home.resource.entity.ResourceConfig; import com.dianping.cat.home.resource.transform.DefaultSaxParser; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java index a7783bee1c..3842ec5a9f 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java @@ -25,7 +25,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.home.user.entity.User; import com.dianping.cat.home.user.entity.UserConfig; import com.dianping.cat.home.user.transform.DefaultSaxParser; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java index 194b06d742..f0dc2200e7 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java @@ -35,7 +35,7 @@ import com.dianping.cat.consumer.state.model.entity.ProcessDomain; import com.dianping.cat.consumer.state.model.entity.StateReport; import com.dianping.cat.core.dal.DailyReport; -import com.dianping.cat.core.report.daily.repository.DailyReportRepository; +import com.dianping.cat.core.mybatis.DailyReportRepository; import com.dianping.cat.helper.SortHelper; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.router.entity.DefaultServer; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java index ab181c29cb..5521b408c6 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java @@ -33,7 +33,7 @@ import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.consumer.state.model.entity.StateReport; import com.dianping.cat.core.dal.DailyReport; -import com.dianping.cat.core.report.daily.repository.DailyReportRepository; +import com.dianping.cat.core.mybatis.DailyReportRepository; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.router.entity.Domain; import com.dianping.cat.home.router.entity.Group; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java index d3e206f651..556488a2cc 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java @@ -22,10 +22,10 @@ import com.dianping.cat.Constants; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; import com.dianping.cat.core.dal.*; -import com.dianping.cat.core.mybatis.repository.daily.report.content.DailyReportContentRepository; -import com.dianping.cat.core.report.daily.repository.DailyReportRepository; +import com.dianping.cat.core.mybatis.DailyReportContentRepository; +import com.dianping.cat.core.mybatis.DailyReportRepository; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.router.entity.*; import com.dianping.cat.home.router.transform.DefaultNativeParser; diff --git a/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java b/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java index 5d4b19fef1..d6a6bd53fa 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java @@ -27,10 +27,10 @@ import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.WeeklyReport; -import com.dianping.cat.core.mybatis.repository.hourlyreport.HourlyReportRepository; -import com.dianping.cat.core.mybatis.repository.monthreport.MonthlyReportRepository; -import com.dianping.cat.core.mybatis.repository.weeklyreport.WeeklyReportRepository; -import com.dianping.cat.core.report.daily.repository.DailyReportRepository; +import com.dianping.cat.core.mybatis.HourlyReportRepository; +import com.dianping.cat.core.mybatis.MonthlyReportRepository; +import com.dianping.cat.core.mybatis.WeeklyReportRepository; +import com.dianping.cat.core.mybatis.DailyReportRepository; public class ReportDaoTest extends SpringCatHomeTestSupport { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java index a381c0aede..7ffd04867f 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java @@ -26,7 +26,7 @@ import org.junit.Test; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.config.repository.ConfigRepository; +import com.dianping.cat.core.mybatis.ConfigRepository; public class ConfigsBackupTest extends SpringTaskTestSupport { diff --git a/script/CatApplication.sql b/script/CatApplication.sql index abcecd9a2b..006d2ff7c8 100644 --- a/script/CatApplication.sql +++ b/script/CatApplication.sql @@ -27,9 +27,9 @@ CREATE TABLE `t_weekly_report` `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_period_domain_name` (`period`,`domain`,`name`), - KEY `idx_domain_name` (`domain`,`name`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_domain_name` (`domain`,`name`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='周报表'; CREATE TABLE `t_monthly_report` @@ -44,9 +44,9 @@ CREATE TABLE `t_monthly_report` `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_period_domain_name` (`period`,`domain`,`name`), - KEY `idx_domain_name` (`domain`,`name`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_domain_name` (`domain`,`name`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='月报表'; CREATE TABLE `t_host_info` @@ -59,10 +59,10 @@ CREATE TABLE `t_host_info` `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_ip` (`ip`), - KEY `idx_domain` (`domain`), - KEY `idx_hostname` (`hostname`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_domain` (`domain`), + KEY `idx_hostname` (`hostname`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='IP和项目名的对应关系'; CREATE TABLE `t_hourly_report` @@ -76,11 +76,11 @@ CREATE TABLE `t_hourly_report` `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - KEY `idx_domain_name_period` (`domain`,`name`,`period`), - KEY `idx_name_period` (`name`,`period`), - KEY `idx_period` (`period`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_domain_name_period` (`domain`,`name`,`period`), + KEY `idx_name_period` (`name`,`period`), + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='小时报表'; CREATE TABLE `t_hourly_report_content` @@ -91,9 +91,9 @@ CREATE TABLE `t_hourly_report_content` `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`report_id`), - KEY `idx_period` (`period`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='小时报表二进制内容'; CREATE TABLE `t_daily_report_content` @@ -104,9 +104,9 @@ CREATE TABLE `t_daily_report_content` `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`report_id`), - KEY `idx_period` (`period`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='天报表二进制内容'; CREATE TABLE `t_weekly_report_content` @@ -117,9 +117,9 @@ CREATE TABLE `t_weekly_report_content` `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`report_id`), - KEY `idx_period` (`period`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='周报表二进制内容'; CREATE TABLE `t_monthly_report_content` @@ -130,9 +130,9 @@ CREATE TABLE `t_monthly_report_content` `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`report_id`), - KEY `idx_period` (`period`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='月报表二进制内容'; CREATE TABLE `t_business_report` @@ -147,11 +147,11 @@ CREATE TABLE `t_business_report` `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - KEY `idx_period_product_line_name` (`period`,`product_line`,`name`), - KEY `idx_product_line_name_period` (`product_line`,`name`,`period`), - KEY `idx_period` (`period`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_period_product_line_name` (`period`,`product_line`,`name`), + KEY `idx_product_line_name_period` (`product_line`,`name`,`period`), + KEY `idx_period` (`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='业务监控实时报表'; CREATE TABLE `t_task` @@ -171,10 +171,10 @@ CREATE TABLE `t_task` `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_report_period_domain_name_type` (`report_period`,`report_domain`,`report_name`,`task_type`), - KEY `idx_status_consumer` (`status`,`consumer`), - KEY `idx_report_period` (`report_period`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_status_consumer` (`status`,`consumer`), + KEY `idx_report_period` (`report_period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台任务'; @@ -193,10 +193,10 @@ CREATE TABLE `t_project` `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_domain` (`domain`), - KEY `idx_cmdb_domain` (`cmdb_domain`), - KEY `idx_cmdb_product_line` (`cmdb_product_line`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_cmdb_domain` (`cmdb_domain`), + KEY `idx_cmdb_product_line` (`cmdb_product_line`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目基础信息'; @@ -210,10 +210,10 @@ CREATE TABLE `t_topology_graph` `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - KEY `idx_period` (`period`), - KEY `idx_ip_period` (`ip`,`period`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_period` (`period`), + KEY `idx_ip_period` (`ip`,`period`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED COMMENT='历史拓扑图'; @@ -226,8 +226,8 @@ CREATE TABLE `t_config` `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_name` (`name`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统全局配置'; CREATE TABLE `t_baseline` @@ -241,10 +241,10 @@ CREATE TABLE `t_baseline` `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_period_name_key` (`report_period`, `report_name`, `index_key`), - KEY `idx_report_name` (`report_name`), - KEY `idx_index_key` (`index_key`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_report_name` (`report_name`), + KEY `idx_index_key` (`index_key`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='指标基线数据'; CREATE TABLE `t_alteration` @@ -264,10 +264,10 @@ CREATE TABLE `t_alteration` `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - KEY `ind_date_domain_host` (`change_time`, `domain`, `hostname`), - KEY `idx_type_change_time` (`type`, `change_time`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `ind_date_domain_host` (`change_time`, `domain`, `hostname`), + KEY `idx_type_change_time` (`type`, `change_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='变更记录'; CREATE TABLE `t_alert` @@ -282,11 +282,11 @@ CREATE TABLE `t_alert` `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - KEY `idx_alert_time_category_domain` (`alert_time`, `category`, `domain`), - KEY `idx_domain_alert_time` (`domain`, `alert_time`), - KEY `idx_category_alert_time` (`category`, `alert_time`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_alert_time_category_domain` (`alert_time`, `category`, `domain`), + KEY `idx_domain_alert_time` (`domain`, `alert_time`), + KEY `idx_category_alert_time` (`category`, `alert_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='告警记录'; CREATE TABLE `t_alert_summary` @@ -298,135 +298,143 @@ CREATE TABLE `t_alert_summary` `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), - KEY `idx_alert_time_domain` (`alert_time`, `domain`), - KEY `idx_domain_alert_time` (`domain`, `alert_time`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) + KEY `idx_alert_time_domain` (`alert_time`, `domain`), + KEY `idx_domain_alert_time` (`domain`, `alert_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='统一告警信息'; -CREATE TABLE `t_operation` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `user` varchar(128) NOT NULL DEFAULT '' COMMENT '用户名', - `module` varchar(128) NOT NULL DEFAULT '' COMMENT '模块', - `operation` varchar(128) NOT NULL DEFAULT '' COMMENT '操作', - `operation_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', - `content` longtext NOT NULL COMMENT '操作内容', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `idx_operation_time` (`operation_time`), - KEY `idx_user_operation_time` (`user`, `operation_time`), - KEY `idx_module_operation_time` (`module`, `operation_time`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) +CREATE TABLE `t_operation` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `user` varchar(128) NOT NULL DEFAULT '' COMMENT '用户名', + `module` varchar(128) NOT NULL DEFAULT '' COMMENT '模块', + `operation` varchar(128) NOT NULL DEFAULT '' COMMENT '操作', + `operation_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', + `content` longtext NOT NULL COMMENT '操作内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_operation_time` (`operation_time`), + KEY `idx_user_operation_time` (`user`, `operation_time`), + KEY `idx_module_operation_time` (`module`, `operation_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户操作日志'; -CREATE TABLE `t_overload` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `report_id` bigint NOT NULL DEFAULT '0' COMMENT '报表ID', - `report_type` tinyint NOT NULL DEFAULT '0' COMMENT '报表类型 1=hourly 2=daily 3=weekly 4=monthly', - `report_size` double NOT NULL DEFAULT '0' COMMENT '报表大小,单位MB', - `period` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `idx_period` (`period`), - KEY `idx_report_type_report_id` (`report_type`, `report_id`), - KEY `idx_period_report_type` (`period`, `report_type`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) +CREATE TABLE `t_overload` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `report_id` bigint NOT NULL DEFAULT '0' COMMENT '报表ID', + `report_type` tinyint NOT NULL DEFAULT '0' COMMENT '报表类型 1=hourly 2=daily 3=weekly 4=monthly', + `report_size` double NOT NULL DEFAULT '0' COMMENT '报表大小,单位MB', + `period` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报表时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_period` (`period`), + KEY `idx_report_type_report_id` (`report_type`, `report_id`), + KEY `idx_period_report_type` (`period`, `report_type`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='过大容量报表'; -CREATE TABLE `t_config_modification` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `user_name` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名', - `account_name` varchar(64) NOT NULL DEFAULT '' COMMENT '账号名', - `action_name` varchar(64) NOT NULL DEFAULT '' COMMENT '操作名称', - `argument` longtext NOT NULL COMMENT '参数内容', - `modify_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `idx_modify_time` (`modify_time`), - KEY `idx_user_modify_time` (`user_name`, `modify_time`), - KEY `idx_account_modify_time` (`account_name`, `modify_time`), - KEY `idx_action_modify_time` (`action_name`, `modify_time`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) +CREATE TABLE `t_config_modification` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `user_name` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名', + `account_name` varchar(64) NOT NULL DEFAULT '' COMMENT '账号名', + `action_name` varchar(64) NOT NULL DEFAULT '' COMMENT '操作名称', + `argument` longtext NOT NULL COMMENT '参数内容', + `modify_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_modify_time` (`modify_time`), + KEY `idx_user_modify_time` (`user_name`, `modify_time`), + KEY `idx_account_modify_time` (`account_name`, `modify_time`), + KEY `idx_action_modify_time` (`action_name`, `modify_time`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='配置修改记录'; -CREATE TABLE `t_user_define_rule` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `content` text NOT NULL COMMENT '用户自定义规则', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) +CREATE TABLE `t_user_define_rule` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `content` text NOT NULL COMMENT '用户自定义规则', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户自定义规则'; -CREATE TABLE `t_business_config` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `name` varchar(64) NOT NULL DEFAULT '' COMMENT '配置名称', - `domain` varchar(128) NOT NULL DEFAULT '' COMMENT '项目', - `content` longtext NOT NULL COMMENT '配置内容', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_name_domain` (`name`, `domain`), - KEY `idx_name` (`name`), - KEY `idx_domain` (`domain`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) +CREATE TABLE `t_business_config` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(64) NOT NULL DEFAULT '' COMMENT '配置名称', + `domain` varchar(128) NOT NULL DEFAULT '' COMMENT '项目', + `content` longtext NOT NULL COMMENT '配置内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_name_domain` (`name`, `domain`), + KEY `idx_name` (`name`), + KEY `idx_domain` (`domain`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务配置'; -CREATE TABLE `t_metric_screen` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `name` varchar(64) NOT NULL DEFAULT '' COMMENT '配置名称', - `graph_name` varchar(64) NOT NULL DEFAULT '' COMMENT 'Graph名称', - `view` varchar(64) NOT NULL DEFAULT '' COMMENT '视角', - `end_points` longtext NOT NULL COMMENT '端点配置', - `measurements` longtext NOT NULL COMMENT '指标配置', - `content` longtext NOT NULL COMMENT '配置内容', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_name_graph` (`name`, `graph_name`), - KEY `idx_name` (`name`), - KEY `idx_graph_name` (`graph_name`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) +CREATE TABLE `t_metric_screen` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(64) NOT NULL DEFAULT '' COMMENT '配置名称', + `graph_name` varchar(64) NOT NULL DEFAULT '' COMMENT 'Graph名称', + `view` varchar(64) NOT NULL DEFAULT '' COMMENT '视角', + `end_points` longtext NOT NULL COMMENT '端点配置', + `measurements` longtext NOT NULL COMMENT '指标配置', + `content` longtext NOT NULL COMMENT '配置内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_name_graph` (`name`, `graph_name`), + KEY `idx_name` (`name`), + KEY `idx_graph_name` (`graph_name`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统监控Screen配置'; -CREATE TABLE `t_metric_graph` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `graph_id` bigint NOT NULL DEFAULT '0' COMMENT '大盘ID', - `name` varchar(64) NOT NULL DEFAULT '' COMMENT '配置ID', - `content` longtext NOT NULL COMMENT '配置内容', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_name` (`name`), - KEY `idx_graph_id` (`graph_id`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) +CREATE TABLE `t_metric_graph` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `graph_id` bigint NOT NULL DEFAULT '0' COMMENT '大盘ID', + `name` varchar(64) NOT NULL DEFAULT '' COMMENT '配置ID', + `content` longtext NOT NULL COMMENT '配置内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_name` (`name`), + KEY `idx_graph_id` (`graph_id`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统监控Graph配置'; -CREATE TABLE `t_server_alarm_rule` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `category` varchar(64) NOT NULL DEFAULT '' COMMENT '监控分类', - `endpoint` varchar(256) NOT NULL DEFAULT '' COMMENT '监控对象ID', - `measurement` varchar(256) NOT NULL DEFAULT '' COMMENT '监控指标', - `tags` varchar(512) NOT NULL DEFAULT '' COMMENT '监控指标标签', - `content` longtext NOT NULL COMMENT '配置内容', - `type` varchar(32) NOT NULL DEFAULT '' COMMENT '数据聚合方式', - `creator` varchar(128) NOT NULL DEFAULT '' COMMENT '创建人', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `idx_category` (`category`), - KEY `idx_type` (`type`), - KEY `idx_category_type` (`category`,`type`), - KEY `idx_create_time` (`create_time`), - KEY `idx_update_time` (`update_time`) +CREATE TABLE `t_server_alarm_rule` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `category` varchar(64) NOT NULL DEFAULT '' COMMENT '监控分类', + `endpoint` varchar(256) NOT NULL DEFAULT '' COMMENT '监控对象ID', + `measurement` varchar(256) NOT NULL DEFAULT '' COMMENT '监控指标', + `tags` varchar(512) NOT NULL DEFAULT '' COMMENT '监控指标标签', + `content` longtext NOT NULL COMMENT '配置内容', + `type` varchar(32) NOT NULL DEFAULT '' COMMENT '数据聚合方式', + `creator` varchar(128) NOT NULL DEFAULT '' COMMENT '创建人', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_category` (`category`), + KEY `idx_type` (`type`), + KEY `idx_category_type` (`category`,`type`), + KEY `idx_create_time` (`create_time`), + KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统告警规则配置'; From c3efeae933381a766c95999290987938f76ded1b Mon Sep 17 00:00:00 2001 From: Shang Date: Thu, 18 Jun 2026 09:49:55 +0800 Subject: [PATCH 174/231] =?UTF-8?q?=E9=87=8D=E6=9E=84DAO=E5=B1=82=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/alarm/service/AlertService.java | 2 +- .../alarm/spi/config/AlertConfigManager.java | 2 +- .../alarm/spi/config/AlertPolicyManager.java | 2 +- .../alarm/spi/config/SenderConfigManager.java | 2 +- .../mybatis/alert/dao/AlertMapper.java | 4 +- .../mybatis/alert/dao/data/AlertDO.java | 2 +- .../repository/alert/AlertRepository.java | 8 +-- .../alarm/rule/ServerAlarmRuleRepository.java | 8 +-- .../define/rule/UserDefineRuleRepository.java | 8 +-- .../alarm/rule/dao/ServerAlarmRuleMapper.java | 4 +- .../rule/dao/data/ServerAlarmRuleDO.java | 2 +- .../define/rule/dao/UserDefineRuleMapper.java | 4 +- .../rule/dao/data/UserDefineRuleDO.java | 2 +- .../resources/mybatis/mapper/AlertMapper.xml | 8 +-- .../mybatis/mapper/ServerAlarmRuleMapper.xml | 8 +-- .../mybatis/mapper/UserDefineRuleMapper.xml | 8 +-- .../config/AllReportConfigManager.java | 2 +- .../config/AtomicMessageConfigManager.java | 2 +- .../cat/config/ReportReloadConfigManager.java | 2 +- .../business/BusinessConfigManager.java | 2 +- .../config/sample/SampleConfigManager.java | 2 +- .../config/server/ServerConfigManager.java | 2 +- .../server/ServerFilterConfigManager.java | 2 +- .../TpValueStatisticConfigManager.java | 2 +- .../{core => }/mybatis/ConfigRepository.java | 6 +-- .../mybatis/DailyReportContentRepository.java | 6 +-- .../mybatis/DailyReportRepository.java | 6 +-- .../mybatis/HostInfoRepository.java | 6 +-- .../HourlyReportContentRepository.java | 6 +-- .../mybatis/HourlyReportRepository.java | 6 +-- .../MonthlyReportContentRepository.java | 6 +-- .../mybatis/MonthlyReportRepository.java | 6 +-- .../{core => }/mybatis/ProjectRepository.java | 6 +-- .../SpringBackedRepositorySupport.java | 2 +- .../{core => }/mybatis/TaskRepository.java | 6 +-- .../WeeklyReportContentRepository.java | 6 +-- .../mybatis/WeeklyReportRepository.java | 6 +-- .../mybatis/data/BusinessConfigDO.java | 2 +- .../mybatis/data/BusinessReportDO.java | 2 +- .../cat/{core => }/mybatis/data/ConfigDO.java | 2 +- .../mybatis/data/DailyReportContentDO.java | 2 +- .../mybatis/data/DailyReportDO.java | 2 +- .../{core => }/mybatis/data/HostInfoDO.java | 2 +- .../mybatis/data/HourlyReportContentDO.java | 2 +- .../mybatis/data/HourlyReportDO.java | 2 +- .../mybatis/data/MonthReportDO.java | 2 +- .../mybatis/data/MonthlyReportContentDO.java | 2 +- .../{core => }/mybatis/data/OperationDO.java | 2 +- .../{core => }/mybatis/data/ProjectDO.java | 2 +- .../cat/{core => }/mybatis/data/TaskDO.java | 2 +- .../mybatis/data/WeeklyReportContentDO.java | 2 +- .../mybatis/data/WeeklyReportDO.java | 2 +- .../mybatis/mapper/BusinessConfigMapper.java | 4 +- .../mapper/BusinessConfigRepository.java | 6 +-- .../mybatis/mapper/BusinessReportMapper.java | 4 +- .../mybatis/mapper/ConfigMapper.java | 4 +- .../mapper/DailyReportContentMapper.java | 4 +- .../mybatis/mapper/DailyReportMapper.java | 4 +- .../mybatis/mapper/HostInfoMapper.java | 4 +- .../mapper/HourlyReportContentMapper.java | 4 +- .../mybatis/mapper/HourlyReportMapper.java | 4 +- .../mybatis/mapper/MonthReportMapper.java | 4 +- .../mapper/MonthlyReportContentMapper.java | 4 +- .../mybatis/mapper/OperationMapper.java | 4 +- .../mybatis/mapper/ProjectMapper.java | 4 +- .../{core => }/mybatis/mapper/TaskMapper.java | 4 +- .../mapper/WeeklyReportContentMapper.java | 4 +- .../mybatis/mapper/WeeklyReportMapper.java | 4 +- .../cat/report/DefaultReportManager.java | 4 +- .../report/service/AbstractReportService.java | 16 +++--- .../dianping/cat/service/HostinfoService.java | 2 +- .../dianping/cat/service/ProjectService.java | 2 +- .../com/dianping/cat/task/TaskManager.java | 2 +- .../mybatis/mapper/BusinessConfigMapper.xml | 8 +-- .../mybatis/mapper/BusinessReportMapper.xml | 8 +-- .../resources/mybatis/mapper/ConfigMapper.xml | 8 +-- .../mapper/DailyReportContentMapper.xml | 8 +-- .../mybatis/mapper/DailyReportMapper.xml | 8 +-- .../mybatis/mapper/HostInfoMapper.xml | 8 +-- .../mapper/HourlyReportContentMapper.xml | 8 +-- .../mybatis/mapper/HourlyReportMapper.xml | 8 +-- .../mybatis/mapper/MonthReportMapper.xml | 8 +-- .../mapper/MonthlyReportContentMapper.xml | 8 +-- .../mybatis/mapper/OperationMapper.xml | 8 +-- .../mybatis/mapper/ProjectMapper.xml | 8 +-- .../resources/mybatis/mapper/TaskMapper.xml | 8 +-- .../mapper/WeeklyReportContentMapper.xml | 8 +-- .../mybatis/mapper/WeeklyReportMapper.xml | 8 +-- .../cat/service/DefaultReportManagerTest.java | 4 +- .../spring/CatHomeSpringConfiguration.java | 50 +++++++++---------- .../spring/CatHomeSpringStartupVerifier.java | 48 +++++++++--------- .../AlertSummaryRepository.java | 7 ++- .../AlterationRepository.java | 7 ++- .../BaselineRepository.java | 7 ++- .../ConfigModificationRepository.java | 7 ++- .../MetricGraphRepository.java | 7 ++- .../MetricScreenRepository.java | 7 ++- .../OverloadRepository.java | 7 ++- .../TopologyGraphRepository.java | 7 ++- .../dao => mybatis}/data/AlertSummaryDO.java | 2 +- .../dao => mybatis}/data/AlterationDO.java | 2 +- .../dao => mybatis}/data/BaselineDO.java | 2 +- .../data/ConfigModificationDO.java | 2 +- .../dao => mybatis}/data/MetricGraphDO.java | 2 +- .../dao => mybatis}/data/MetricScreenDO.java | 2 +- .../dao => mybatis}/data/OverloadDO.java | 2 +- .../dao => mybatis}/data/TopologyGraphDO.java | 2 +- .../mapper}/AlertSummaryMapper.java | 4 +- .../mapper}/AlterationMapper.java | 4 +- .../mapper}/BaselineMapper.java | 4 +- .../mapper}/ConfigModificationMapper.java | 4 +- .../mapper}/MetricGraphMapper.java | 4 +- .../mapper}/MetricScreenMapper.java | 4 +- .../mapper}/OverloadMapper.java | 4 +- .../mapper}/TopologyGraphMapper.java | 4 +- .../business/BusinessRuleConfigManager.java | 2 +- .../exception/ExceptionRuleConfigManager.java | 2 +- .../spi/config/BaseRuleConfigManager.java | 2 +- .../spi/config/UserDefinedRuleManager.java | 2 +- .../alert/summary/AlertSummaryService.java | 2 +- .../alert/summary/build/AlertInfoBuilder.java | 2 +- .../build/AlterationSummaryBuilder.java | 2 +- .../report/page/DomainGroupConfigManager.java | 2 +- .../cat/report/page/alert/Handler.java | 2 +- .../cat/report/page/alteration/Handler.java | 2 +- .../config/TopoGraphFormatConfigManager.java | 2 +- .../graph/TopologyGraphConfigManager.java | 2 +- .../graph/TopologyGraphManager.java | 3 +- .../task/DependencyReportBuilder.java | 2 +- .../config/HeartbeatDisplayPolicyManager.java | 2 +- .../service/DefaultBaselineService.java | 2 +- .../task/CapacityUpdateStatusManager.java | 4 +- .../overload/task/DailyCapacityUpdater.java | 6 +-- .../overload/task/HourlyCapacityUpdater.java | 6 +-- .../overload/task/MonthlyCapacityUpdater.java | 6 +-- .../overload/task/TableCapacityService.java | 10 ++-- .../overload/task/WeeklyCapacityUpdater.java | 6 +-- .../cat/report/page/storage/Handler.java | 3 +- .../config/StorageGroupConfigManager.java | 2 +- .../cat/report/task/DefaultTaskConsumer.java | 2 +- .../task/reload/AbstractReportReloader.java | 4 +- .../config/BusinessTagConfigManager.java | 2 +- .../cat/system/page/config/Handler.java | 2 +- .../permission/ResourceConfigManager.java | 2 +- .../page/permission/UserConfigManager.java | 2 +- .../router/config/RouterConfigAdjustor.java | 2 +- .../router/config/RouterConfigHandler.java | 2 +- .../router/config/RouterConfigManager.java | 6 +-- .../mybatis/mapper/AlertSummaryMapper.xml | 8 +-- .../mybatis/mapper/AlterationMapper.xml | 8 +-- .../mybatis/mapper/BaselineMapper.xml | 8 +-- .../mapper/ConfigModificationMapper.xml | 8 +-- .../mybatis/mapper/MetricGraphMapper.xml | 8 +-- .../mybatis/mapper/MetricScreenMapper.xml | 8 +-- .../mybatis/mapper/OverloadMapper.xml | 8 +-- .../mybatis/mapper/TopologyGraphMapper.xml | 8 +-- .../cat/report/service/ReportDaoTest.java | 8 +-- .../cat/report/task/ConfigsBackupTest.java | 2 +- 158 files changed, 388 insertions(+), 398 deletions(-) rename cat-alarm/src/main/java/com/dianping/cat/{core => }/mybatis/alert/dao/AlertMapper.java (84%) rename cat-alarm/src/main/java/com/dianping/cat/{core => }/mybatis/alert/dao/data/AlertDO.java (88%) rename cat-alarm/src/main/java/com/dianping/cat/{core => }/mybatis/repository/alert/AlertRepository.java (96%) rename cat-alarm/src/main/java/com/dianping/cat/{core => }/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java (94%) rename cat-alarm/src/main/java/com/dianping/cat/{core => }/mybatis/repository/user/define/rule/UserDefineRuleRepository.java (93%) rename cat-alarm/src/main/java/com/dianping/cat/{core => }/mybatis/server/alarm/rule/dao/ServerAlarmRuleMapper.java (74%) rename cat-alarm/src/main/java/com/dianping/cat/{core => }/mybatis/server/alarm/rule/dao/data/ServerAlarmRuleDO.java (93%) rename cat-alarm/src/main/java/com/dianping/cat/{core => }/mybatis/user/define/rule/dao/UserDefineRuleMapper.java (75%) rename cat-alarm/src/main/java/com/dianping/cat/{core => }/mybatis/user/define/rule/dao/data/UserDefineRuleDO.java (92%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/ConfigRepository.java (96%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/DailyReportContentRepository.java (96%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/DailyReportRepository.java (96%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/HostInfoRepository.java (96%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/HourlyReportContentRepository.java (96%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/HourlyReportRepository.java (96%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/MonthlyReportContentRepository.java (96%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/MonthlyReportRepository.java (96%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/ProjectRepository.java (97%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/SpringBackedRepositorySupport.java (97%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/TaskRepository.java (97%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/WeeklyReportContentRepository.java (96%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/WeeklyReportRepository.java (96%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/BusinessConfigDO.java (94%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/BusinessReportDO.java (87%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/ConfigDO.java (81%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/DailyReportContentDO.java (88%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/DailyReportDO.java (84%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/HostInfoDO.java (84%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/HourlyReportContentDO.java (88%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/HourlyReportDO.java (85%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/MonthReportDO.java (85%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/MonthlyReportContentDO.java (88%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/OperationDO.java (94%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/ProjectDO.java (89%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/TaskDO.java (92%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/WeeklyReportContentDO.java (88%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/data/WeeklyReportDO.java (85%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/BusinessConfigMapper.java (84%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/BusinessConfigRepository.java (95%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/BusinessReportMapper.java (76%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/ConfigMapper.java (77%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/DailyReportContentMapper.java (81%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/DailyReportMapper.java (87%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/HostInfoMapper.java (81%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/HourlyReportContentMapper.java (81%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/HourlyReportMapper.java (83%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/MonthReportMapper.java (82%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/MonthlyReportContentMapper.java (81%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/OperationMapper.java (76%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/ProjectMapper.java (83%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/TaskMapper.java (87%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/WeeklyReportContentMapper.java (81%) rename cat-core/src/main/java/com/dianping/cat/{core => }/mybatis/mapper/WeeklyReportMapper.java (82%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/repository/alert/summary => mybatis}/AlertSummaryRepository.java (92%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/repository/alteration => mybatis}/AlterationRepository.java (96%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/repository/baseline => mybatis}/BaselineRepository.java (94%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/repository/config/modification => mybatis}/ConfigModificationRepository.java (93%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/repository/metric/graph => mybatis}/MetricGraphRepository.java (94%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/repository/metric/screen => mybatis}/MetricScreenRepository.java (95%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/repository/overload => mybatis}/OverloadRepository.java (95%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/repository/topologygraph => mybatis}/TopologyGraphRepository.java (93%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/alert/summary/dao => mybatis}/data/AlertSummaryDO.java (80%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/alteration/dao => mybatis}/data/AlterationDO.java (89%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/baseline/dao => mybatis}/data/BaselineDO.java (84%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/config/modification/dao => mybatis}/data/ConfigModificationDO.java (92%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/metric/graph/dao => mybatis}/data/MetricGraphDO.java (93%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/metric/screen/dao => mybatis}/data/MetricScreenDO.java (94%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/overload/dao => mybatis}/data/OverloadDO.java (95%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/topologygraph/dao => mybatis}/data/TopologyGraphDO.java (81%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/alert/summary/dao => mybatis/mapper}/AlertSummaryMapper.java (71%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/alteration/dao => mybatis/mapper}/AlterationMapper.java (83%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/baseline/dao => mybatis/mapper}/BaselineMapper.java (76%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/config/modification/dao => mybatis/mapper}/ConfigModificationMapper.java (70%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/metric/graph/dao => mybatis/mapper}/MetricGraphMapper.java (80%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/metric/screen/dao => mybatis/mapper}/MetricScreenMapper.java (85%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/overload/dao => mybatis/mapper}/OverloadMapper.java (81%) rename cat-home/src/main/java/com/dianping/cat/{core/mybatis/topologygraph/dao => mybatis/mapper}/TopologyGraphMapper.java (75%) diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java index 2271f9b959..7b2e0aa80a 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/service/AlertService.java @@ -30,7 +30,7 @@ import com.dianping.cat.alarm.Alert; import com.dianping.cat.alarm.spi.AlertEntity; import com.dianping.cat.alarm.spi.sender.SendMessageEntity; -import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; +import com.dianping.cat.mybatis.repository.alert.AlertRepository; public class AlertService { private static final Logger LOGGER = LoggerFactory.getLogger(AlertService.class); diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java index cbdb7b4d39..96af390483 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertConfigManager.java @@ -29,7 +29,7 @@ import com.dianping.cat.alarm.receiver.transform.DefaultSaxParser; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; public class AlertConfigManager { private static final Logger LOGGER = LoggerFactory.getLogger(AlertConfigManager.class); diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java index 2b97e89f29..ba7e620ef9 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/AlertPolicyManager.java @@ -34,7 +34,7 @@ import com.dianping.cat.alarm.spi.AlertChannel; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; public class AlertPolicyManager { private static final Logger LOGGER = LoggerFactory.getLogger(AlertPolicyManager.class); diff --git a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java index f2a5c9c1cc..2091facbb4 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java +++ b/cat-alarm/src/main/java/com/dianping/cat/alarm/spi/config/SenderConfigManager.java @@ -31,7 +31,7 @@ import com.dianping.cat.alarm.sender.transform.DefaultSaxParser; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; public class SenderConfigManager { private static final Logger LOGGER = LoggerFactory.getLogger(SenderConfigManager.class); diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/AlertMapper.java b/cat-alarm/src/main/java/com/dianping/cat/mybatis/alert/dao/AlertMapper.java similarity index 84% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/AlertMapper.java rename to cat-alarm/src/main/java/com/dianping/cat/mybatis/alert/dao/AlertMapper.java index 53621ba4a3..438f42255c 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/AlertMapper.java +++ b/cat-alarm/src/main/java/com/dianping/cat/mybatis/alert/dao/AlertMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.alert.dao; +package com.dianping.cat.mybatis.alert.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.alert.dao.data.AlertDO; +import com.dianping.cat.mybatis.alert.dao.data.AlertDO; public interface AlertMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/data/AlertDO.java b/cat-alarm/src/main/java/com/dianping/cat/mybatis/alert/dao/data/AlertDO.java similarity index 88% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/data/AlertDO.java rename to cat-alarm/src/main/java/com/dianping/cat/mybatis/alert/dao/data/AlertDO.java index 62c99ed8bd..36d77baaca 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/alert/dao/data/AlertDO.java +++ b/cat-alarm/src/main/java/com/dianping/cat/mybatis/alert/dao/data/AlertDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.alert.dao.data; +package com.dianping.cat.mybatis.alert.dao.data; import java.util.Date; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java b/cat-alarm/src/main/java/com/dianping/cat/mybatis/repository/alert/AlertRepository.java similarity index 96% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java rename to cat-alarm/src/main/java/com/dianping/cat/mybatis/repository/alert/AlertRepository.java index 7265dc023f..685016cf80 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/alert/AlertRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/mybatis/repository/alert/AlertRepository.java @@ -1,9 +1,9 @@ -package com.dianping.cat.core.mybatis.repository.alert; +package com.dianping.cat.mybatis.repository.alert; import com.dianping.cat.alarm.Alert; -import com.dianping.cat.core.mybatis.alert.dao.AlertMapper; -import com.dianping.cat.core.mybatis.alert.dao.data.AlertDO; -import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; +import com.dianping.cat.mybatis.alert.dao.AlertMapper; +import com.dianping.cat.mybatis.alert.dao.data.AlertDO; +import com.dianping.cat.mybatis.SpringBackedRepositorySupport; import java.util.List; import java.util.stream.Collectors; import org.slf4j.Logger; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java similarity index 94% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java rename to cat-alarm/src/main/java/com/dianping/cat/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java index c9b0f2765c..afec1c9533 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/mybatis/repository/server/alarm/rule/ServerAlarmRuleRepository.java @@ -1,9 +1,9 @@ -package com.dianping.cat.core.mybatis.repository.server.alarm.rule; +package com.dianping.cat.mybatis.repository.server.alarm.rule; import com.dianping.cat.alarm.ServerAlarmRule; -import com.dianping.cat.core.mybatis.server.alarm.rule.dao.ServerAlarmRuleMapper; -import com.dianping.cat.core.mybatis.server.alarm.rule.dao.data.ServerAlarmRuleDO; -import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; +import com.dianping.cat.mybatis.server.alarm.rule.dao.ServerAlarmRuleMapper; +import com.dianping.cat.mybatis.server.alarm.rule.dao.data.ServerAlarmRuleDO; +import com.dianping.cat.mybatis.SpringBackedRepositorySupport; import java.util.List; import java.util.stream.Collectors; import org.slf4j.Logger; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java b/cat-alarm/src/main/java/com/dianping/cat/mybatis/repository/user/define/rule/UserDefineRuleRepository.java similarity index 93% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java rename to cat-alarm/src/main/java/com/dianping/cat/mybatis/repository/user/define/rule/UserDefineRuleRepository.java index dc7d015139..9798bedee0 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/repository/user/define/rule/UserDefineRuleRepository.java +++ b/cat-alarm/src/main/java/com/dianping/cat/mybatis/repository/user/define/rule/UserDefineRuleRepository.java @@ -1,9 +1,9 @@ -package com.dianping.cat.core.mybatis.repository.user.define.rule; +package com.dianping.cat.mybatis.repository.user.define.rule; import com.dianping.cat.alarm.UserDefineRule; -import com.dianping.cat.core.mybatis.user.define.rule.dao.UserDefineRuleMapper; -import com.dianping.cat.core.mybatis.user.define.rule.dao.data.UserDefineRuleDO; -import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; +import com.dianping.cat.mybatis.user.define.rule.dao.UserDefineRuleMapper; +import com.dianping.cat.mybatis.user.define.rule.dao.data.UserDefineRuleDO; +import com.dianping.cat.mybatis.SpringBackedRepositorySupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionTemplate; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/ServerAlarmRuleMapper.java b/cat-alarm/src/main/java/com/dianping/cat/mybatis/server/alarm/rule/dao/ServerAlarmRuleMapper.java similarity index 74% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/ServerAlarmRuleMapper.java rename to cat-alarm/src/main/java/com/dianping/cat/mybatis/server/alarm/rule/dao/ServerAlarmRuleMapper.java index cd1bbab5c4..3f77a94e6c 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/ServerAlarmRuleMapper.java +++ b/cat-alarm/src/main/java/com/dianping/cat/mybatis/server/alarm/rule/dao/ServerAlarmRuleMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.server.alarm.rule.dao; +package com.dianping.cat.mybatis.server.alarm.rule.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.server.alarm.rule.dao.data.ServerAlarmRuleDO; +import com.dianping.cat.mybatis.server.alarm.rule.dao.data.ServerAlarmRuleDO; public interface ServerAlarmRuleMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/data/ServerAlarmRuleDO.java b/cat-alarm/src/main/java/com/dianping/cat/mybatis/server/alarm/rule/dao/data/ServerAlarmRuleDO.java similarity index 93% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/data/ServerAlarmRuleDO.java rename to cat-alarm/src/main/java/com/dianping/cat/mybatis/server/alarm/rule/dao/data/ServerAlarmRuleDO.java index 3e70a120a2..b9084610a4 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/server/alarm/rule/dao/data/ServerAlarmRuleDO.java +++ b/cat-alarm/src/main/java/com/dianping/cat/mybatis/server/alarm/rule/dao/data/ServerAlarmRuleDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.server.alarm.rule.dao.data; +package com.dianping.cat.mybatis.server.alarm.rule.dao.data; import java.util.Date; diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/UserDefineRuleMapper.java b/cat-alarm/src/main/java/com/dianping/cat/mybatis/user/define/rule/dao/UserDefineRuleMapper.java similarity index 75% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/UserDefineRuleMapper.java rename to cat-alarm/src/main/java/com/dianping/cat/mybatis/user/define/rule/dao/UserDefineRuleMapper.java index ded5013938..dbf4ca5001 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/UserDefineRuleMapper.java +++ b/cat-alarm/src/main/java/com/dianping/cat/mybatis/user/define/rule/dao/UserDefineRuleMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.user.define.rule.dao; +package com.dianping.cat.mybatis.user.define.rule.dao; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.user.define.rule.dao.data.UserDefineRuleDO; +import com.dianping.cat.mybatis.user.define.rule.dao.data.UserDefineRuleDO; public interface UserDefineRuleMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/data/UserDefineRuleDO.java b/cat-alarm/src/main/java/com/dianping/cat/mybatis/user/define/rule/dao/data/UserDefineRuleDO.java similarity index 92% rename from cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/data/UserDefineRuleDO.java rename to cat-alarm/src/main/java/com/dianping/cat/mybatis/user/define/rule/dao/data/UserDefineRuleDO.java index 6b6b4acbc4..0b144da653 100644 --- a/cat-alarm/src/main/java/com/dianping/cat/core/mybatis/user/define/rule/dao/data/UserDefineRuleDO.java +++ b/cat-alarm/src/main/java/com/dianping/cat/mybatis/user/define/rule/dao/data/UserDefineRuleDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.user.define.rule.dao.data; +package com.dianping.cat.mybatis.user.define.rule.dao.data; import java.util.Date; diff --git a/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml b/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml index 8ac31e99ab..927922b7b5 100644 --- a/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml +++ b/cat-alarm/src/main/resources/mybatis/mapper/AlertMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -40,7 +40,7 @@ + parameterType="com.dianping.cat.mybatis.alert.dao.data.AlertDO" keyProperty="id"> INSERT INTO t_alert @@ -61,7 +61,7 @@ delete from t_alert where id = #{id} - + UPDATE t_alert WHERE id = #{id} diff --git a/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml b/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml index 70f6ab578c..db8a4a056e 100644 --- a/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml +++ b/cat-alarm/src/main/resources/mybatis/mapper/ServerAlarmRuleMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -43,7 +43,7 @@ + parameterType="com.dianping.cat.mybatis.server.alarm.rule.dao.data.ServerAlarmRuleDO" keyProperty="id"> INSERT INTO t_server_alarm_rule @@ -64,7 +64,7 @@ delete from t_server_alarm_rule where id = #{id} - + UPDATE t_server_alarm_rule WHERE id = #{id} diff --git a/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml b/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml index f53b49c19a..55729142c6 100644 --- a/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml +++ b/cat-alarm/src/main/resources/mybatis/mapper/UserDefineRuleMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -26,7 +26,7 @@ + parameterType="com.dianping.cat.mybatis.user.define.rule.dao.data.UserDefineRuleDO" keyProperty="id"> INSERT INTO t_user_define_rule @@ -47,7 +47,7 @@ delete from t_user_define_rule where id = #{id} - + UPDATE t_user_define_rule WHERE id = #{id} diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java index 36757f6cfa..dc2ed09566 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/config/AllReportConfigManager.java @@ -35,7 +35,7 @@ import com.dianping.cat.consumer.all.config.entity.Type; import com.dianping.cat.consumer.all.config.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; diff --git a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java index 840fbf2e5a..58ac0c1063 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/AtomicMessageConfigManager.java @@ -29,7 +29,7 @@ import com.dianping.cat.configuration.message.entity.Property; import com.dianping.cat.configuration.message.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.task.TimerSyncTask; public class AtomicMessageConfigManager { diff --git a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java index cb91c1826a..62b2fb874c 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/ReportReloadConfigManager.java @@ -35,7 +35,7 @@ import com.dianping.cat.configuration.reload.entity.ReportType; import com.dianping.cat.configuration.reload.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; diff --git a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java index 03e913098a..56d3d6af2f 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/business/BusinessConfigManager.java @@ -35,7 +35,7 @@ import com.dianping.cat.configuration.business.entity.BusinessReportConfig; import com.dianping.cat.configuration.business.transform.DefaultSaxParser; import com.dianping.cat.core.config.BusinessConfig; -import com.dianping.cat.core.mybatis.mapper.BusinessConfigRepository; +import com.dianping.cat.mybatis.mapper.BusinessConfigRepository; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; diff --git a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java index 875cc9dedb..5bf20c7298 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/sample/SampleConfigManager.java @@ -25,7 +25,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.sample.entity.SampleConfig; import com.dianping.cat.sample.transform.DefaultSaxParser; import com.dianping.cat.task.TimerSyncTask; diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java index a37034ade2..2915d90f40 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java @@ -54,7 +54,7 @@ import com.dianping.cat.configuration.server.entity.StorageConfig; import com.dianping.cat.configuration.server.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; diff --git a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java index 833e34291f..3849ce73b7 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/server/ServerFilterConfigManager.java @@ -31,7 +31,7 @@ import com.dianping.cat.configuration.server.filter.entity.ServerFilterConfig; import com.dianping.cat.configuration.server.filter.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; diff --git a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java index 27f88e331f..a99936132a 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/transaction/TpValueStatisticConfigManager.java @@ -30,7 +30,7 @@ import com.dianping.cat.configuration.tp.entity.TpValueStatisticConfig; import com.dianping.cat.configuration.tp.transform.DefaultSaxParser; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.task.TimerSyncTask; public class TpValueStatisticConfigManager { diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/ConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/mybatis/ConfigRepository.java similarity index 96% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/ConfigRepository.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/ConfigRepository.java index 97beb29fa1..066c6f2d58 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/ConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/ConfigRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.mybatis; import java.util.Date; import java.util.List; @@ -12,8 +12,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.mapper.ConfigMapper; -import com.dianping.cat.core.mybatis.data.ConfigDO; +import com.dianping.cat.mybatis.mapper.ConfigMapper; +import com.dianping.cat.mybatis.data.ConfigDO; public class ConfigRepository { private static final Logger LOGGER = LoggerFactory.getLogger(ConfigRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/mybatis/DailyReportContentRepository.java similarity index 96% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportContentRepository.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/DailyReportContentRepository.java index d91ad3aa8e..701a1bab01 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/DailyReportContentRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.mybatis; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.mybatis.mapper.DailyReportContentMapper; -import com.dianping.cat.core.mybatis.data.DailyReportContentDO; +import com.dianping.cat.mybatis.mapper.DailyReportContentMapper; +import com.dianping.cat.mybatis.data.DailyReportContentDO; public class DailyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(DailyReportContentRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/mybatis/DailyReportRepository.java similarity index 96% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportRepository.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/DailyReportRepository.java index 89430d5d85..5ec161ed1c 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/DailyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/DailyReportRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.mybatis; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.DailyReport; -import com.dianping.cat.core.mybatis.mapper.DailyReportMapper; -import com.dianping.cat.core.mybatis.data.DailyReportDO; +import com.dianping.cat.mybatis.mapper.DailyReportMapper; +import com.dianping.cat.mybatis.data.DailyReportDO; public class DailyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(DailyReportRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/HostInfoRepository.java b/cat-core/src/main/java/com/dianping/cat/mybatis/HostInfoRepository.java similarity index 96% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/HostInfoRepository.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/HostInfoRepository.java index 5cea49bccb..621298e0a4 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/HostInfoRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/HostInfoRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.mybatis; import java.util.Date; import java.util.List; @@ -12,8 +12,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.Hostinfo; -import com.dianping.cat.core.mybatis.mapper.HostInfoMapper; -import com.dianping.cat.core.mybatis.data.HostInfoDO; +import com.dianping.cat.mybatis.mapper.HostInfoMapper; +import com.dianping.cat.mybatis.data.HostInfoDO; public class HostInfoRepository { private static final Logger LOGGER = LoggerFactory.getLogger(HostInfoRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/mybatis/HourlyReportContentRepository.java similarity index 96% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportContentRepository.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/HourlyReportContentRepository.java index bb96df9c9f..12ab0eaa30 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/HourlyReportContentRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.mybatis; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.mybatis.mapper.HourlyReportContentMapper; -import com.dianping.cat.core.mybatis.data.HourlyReportContentDO; +import com.dianping.cat.mybatis.mapper.HourlyReportContentMapper; +import com.dianping.cat.mybatis.data.HourlyReportContentDO; public class HourlyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(HourlyReportContentRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/mybatis/HourlyReportRepository.java similarity index 96% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportRepository.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/HourlyReportRepository.java index e763f9fcf5..4d891bb1a9 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/HourlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/HourlyReportRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.mybatis; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.HourlyReport; -import com.dianping.cat.core.mybatis.mapper.HourlyReportMapper; -import com.dianping.cat.core.mybatis.data.HourlyReportDO; +import com.dianping.cat.mybatis.mapper.HourlyReportMapper; +import com.dianping.cat.mybatis.data.HourlyReportDO; public class HourlyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(HourlyReportRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/mybatis/MonthlyReportContentRepository.java similarity index 96% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportContentRepository.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/MonthlyReportContentRepository.java index 57c8719db5..9d594d33ea 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/MonthlyReportContentRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.mybatis; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.mybatis.mapper.MonthlyReportContentMapper; -import com.dianping.cat.core.mybatis.data.MonthlyReportContentDO; +import com.dianping.cat.mybatis.mapper.MonthlyReportContentMapper; +import com.dianping.cat.mybatis.data.MonthlyReportContentDO; public class MonthlyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(MonthlyReportContentRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/mybatis/MonthlyReportRepository.java similarity index 96% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportRepository.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/MonthlyReportRepository.java index 388d1d1a89..945c153f02 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/MonthlyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/MonthlyReportRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.mybatis; import java.util.concurrent.atomic.AtomicBoolean; @@ -9,8 +9,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.MonthlyReport; -import com.dianping.cat.core.mybatis.mapper.MonthReportMapper; -import com.dianping.cat.core.mybatis.data.MonthReportDO; +import com.dianping.cat.mybatis.mapper.MonthReportMapper; +import com.dianping.cat.mybatis.data.MonthReportDO; public class MonthlyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(MonthlyReportRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/ProjectRepository.java b/cat-core/src/main/java/com/dianping/cat/mybatis/ProjectRepository.java similarity index 97% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/ProjectRepository.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/ProjectRepository.java index 5af723b8c8..3843406a4a 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/ProjectRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/ProjectRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.mybatis; import java.util.List; import java.util.Optional; @@ -12,8 +12,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.Project; -import com.dianping.cat.core.mybatis.mapper.ProjectMapper; -import com.dianping.cat.core.mybatis.data.ProjectDO; +import com.dianping.cat.mybatis.mapper.ProjectMapper; +import com.dianping.cat.mybatis.data.ProjectDO; public class ProjectRepository { private static final Logger LOGGER = LoggerFactory.getLogger(ProjectRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/SpringBackedRepositorySupport.java b/cat-core/src/main/java/com/dianping/cat/mybatis/SpringBackedRepositorySupport.java similarity index 97% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/SpringBackedRepositorySupport.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/SpringBackedRepositorySupport.java index 05bc9e2325..0abae1cb63 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/SpringBackedRepositorySupport.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/SpringBackedRepositorySupport.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.mybatis; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/TaskRepository.java b/cat-core/src/main/java/com/dianping/cat/mybatis/TaskRepository.java similarity index 97% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/TaskRepository.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/TaskRepository.java index bf6bb01449..c0097b2211 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/TaskRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/TaskRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.mybatis; import java.util.concurrent.atomic.AtomicBoolean; @@ -9,8 +9,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.Task; -import com.dianping.cat.core.mybatis.mapper.TaskMapper; -import com.dianping.cat.core.mybatis.data.TaskDO; +import com.dianping.cat.mybatis.mapper.TaskMapper; +import com.dianping.cat.mybatis.data.TaskDO; public class TaskRepository { private static final Logger LOGGER = LoggerFactory.getLogger(TaskRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportContentRepository.java b/cat-core/src/main/java/com/dianping/cat/mybatis/WeeklyReportContentRepository.java similarity index 96% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportContentRepository.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/WeeklyReportContentRepository.java index beb1f15c23..6b7b63d3a3 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportContentRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/WeeklyReportContentRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.mybatis; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,8 +11,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.mybatis.mapper.WeeklyReportContentMapper; -import com.dianping.cat.core.mybatis.data.WeeklyReportContentDO; +import com.dianping.cat.mybatis.mapper.WeeklyReportContentMapper; +import com.dianping.cat.mybatis.data.WeeklyReportContentDO; public class WeeklyReportContentRepository { private static final Logger LOGGER = LoggerFactory.getLogger(WeeklyReportContentRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportRepository.java b/cat-core/src/main/java/com/dianping/cat/mybatis/WeeklyReportRepository.java similarity index 96% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportRepository.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/WeeklyReportRepository.java index 0825508dea..813570ddb0 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/WeeklyReportRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/WeeklyReportRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis; +package com.dianping.cat.mybatis; import java.util.concurrent.atomic.AtomicBoolean; @@ -9,8 +9,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.dal.WeeklyReport; -import com.dianping.cat.core.mybatis.mapper.WeeklyReportMapper; -import com.dianping.cat.core.mybatis.data.WeeklyReportDO; +import com.dianping.cat.mybatis.mapper.WeeklyReportMapper; +import com.dianping.cat.mybatis.data.WeeklyReportDO; public class WeeklyReportRepository { private static final Logger LOGGER = LoggerFactory.getLogger(WeeklyReportRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessConfigDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/BusinessConfigDO.java similarity index 94% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessConfigDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/BusinessConfigDO.java index 7fb0cf7094..eab759c214 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessConfigDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/BusinessConfigDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessReportDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/BusinessReportDO.java similarity index 87% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessReportDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/BusinessReportDO.java index ed44d66973..fa060a290b 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/BusinessReportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/BusinessReportDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ConfigDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/ConfigDO.java similarity index 81% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ConfigDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/ConfigDO.java index c0930f4102..ad6e879d5a 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ConfigDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/ConfigDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/DailyReportContentDO.java similarity index 88% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportContentDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/DailyReportContentDO.java index d74dad47e5..ddfd01310f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/DailyReportContentDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/DailyReportDO.java similarity index 84% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/DailyReportDO.java index 3d283ab33b..fa9037e6b0 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/DailyReportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/DailyReportDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HostInfoDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/HostInfoDO.java similarity index 84% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HostInfoDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/HostInfoDO.java index 73813ee138..53f3b3532f 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HostInfoDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/HostInfoDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/HourlyReportContentDO.java similarity index 88% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportContentDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/HourlyReportContentDO.java index 2289e6faa8..d69d080af4 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/HourlyReportContentDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/HourlyReportDO.java similarity index 85% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/HourlyReportDO.java index cfd54de6ed..36480074e3 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/HourlyReportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/HourlyReportDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthReportDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/MonthReportDO.java similarity index 85% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthReportDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/MonthReportDO.java index 1ac6b1f723..3c643a6190 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthReportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/MonthReportDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthlyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/MonthlyReportContentDO.java similarity index 88% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthlyReportContentDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/MonthlyReportContentDO.java index c715e97864..8854334780 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/MonthlyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/MonthlyReportContentDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/OperationDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/OperationDO.java similarity index 94% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/OperationDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/OperationDO.java index edeed536e4..141bd7053e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/OperationDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/OperationDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ProjectDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/ProjectDO.java similarity index 89% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ProjectDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/ProjectDO.java index 59599f99b5..78d4e51000 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/ProjectDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/ProjectDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/TaskDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/TaskDO.java similarity index 92% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/TaskDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/TaskDO.java index b99a3a7530..a1f0d8f768 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/TaskDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/TaskDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportContentDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/WeeklyReportContentDO.java similarity index 88% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportContentDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/WeeklyReportContentDO.java index 3ff17d58e2..46b46f5dec 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportContentDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/WeeklyReportContentDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportDO.java b/cat-core/src/main/java/com/dianping/cat/mybatis/data/WeeklyReportDO.java similarity index 85% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportDO.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/data/WeeklyReportDO.java index d5edf26441..f955c68504 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/data/WeeklyReportDO.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/data/WeeklyReportDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/BusinessConfigMapper.java similarity index 84% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/BusinessConfigMapper.java index f8dbdd41ec..14ec94a261 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/BusinessConfigMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.BusinessConfigDO; +import com.dianping.cat.mybatis.data.BusinessConfigDO; public interface BusinessConfigMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigRepository.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/BusinessConfigRepository.java similarity index 95% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigRepository.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/BusinessConfigRepository.java index e502e7ecc6..d568598fe6 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessConfigRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/BusinessConfigRepository.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import java.util.stream.Collectors; @@ -9,8 +9,8 @@ import org.springframework.transaction.support.TransactionTemplate; import com.dianping.cat.core.config.BusinessConfig; -import com.dianping.cat.core.mybatis.data.BusinessConfigDO; -import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; +import com.dianping.cat.mybatis.data.BusinessConfigDO; +import com.dianping.cat.mybatis.SpringBackedRepositorySupport; public class BusinessConfigRepository extends SpringBackedRepositorySupport { private static final Logger LOGGER = LoggerFactory.getLogger(BusinessConfigRepository.class); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessReportMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/BusinessReportMapper.java similarity index 76% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessReportMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/BusinessReportMapper.java index 2988da523a..81c1c3f3dd 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/BusinessReportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/BusinessReportMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.BusinessReportDO; +import com.dianping.cat.mybatis.data.BusinessReportDO; public interface BusinessReportMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ConfigMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/ConfigMapper.java similarity index 77% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ConfigMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/ConfigMapper.java index 79f6b4b39b..4c53a0b6ac 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ConfigMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/ConfigMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.ConfigDO; +import com.dianping.cat.mybatis.data.ConfigDO; public interface ConfigMapper { int deleteById(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/DailyReportContentMapper.java similarity index 81% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportContentMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/DailyReportContentMapper.java index a0e2c10036..f9d1d48707 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/DailyReportContentMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.DailyReportContentDO; +import com.dianping.cat.mybatis.data.DailyReportContentDO; public interface DailyReportContentMapper { int deleteByPrimaryKey(@Param("reportId") Long reportId); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/DailyReportMapper.java similarity index 87% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/DailyReportMapper.java index f0af21d8e9..d49f7d144c 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/DailyReportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/DailyReportMapper.java @@ -1,11 +1,11 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.Date; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.DailyReportDO; +import com.dianping.cat.mybatis.data.DailyReportDO; public interface DailyReportMapper { int deleteByDomainNamePeriod(@Param("domain") String domain, @Param("name") String name, diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HostInfoMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/HostInfoMapper.java similarity index 81% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HostInfoMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/HostInfoMapper.java index 0921134a78..40582edf9a 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HostInfoMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/HostInfoMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.HostInfoDO; +import com.dianping.cat.mybatis.data.HostInfoDO; public interface HostInfoMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/HourlyReportContentMapper.java similarity index 81% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportContentMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/HourlyReportContentMapper.java index 113c389e7d..ebbbe4a4c6 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/HourlyReportContentMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.HourlyReportContentDO; +import com.dianping.cat.mybatis.data.HourlyReportContentDO; public interface HourlyReportContentMapper { int deleteByPrimaryKey(@Param("reportId") Long reportId); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/HourlyReportMapper.java similarity index 83% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/HourlyReportMapper.java index d7322048f3..6d8703891e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/HourlyReportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/HourlyReportMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.HourlyReportDO; +import com.dianping.cat.mybatis.data.HourlyReportDO; public interface HourlyReportMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthReportMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/MonthReportMapper.java similarity index 82% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthReportMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/MonthReportMapper.java index cbafe514d4..3fc3c99e89 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthReportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/MonthReportMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.MonthReportDO; +import com.dianping.cat.mybatis.data.MonthReportDO; public interface MonthReportMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthlyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/MonthlyReportContentMapper.java similarity index 81% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthlyReportContentMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/MonthlyReportContentMapper.java index 9bf2a24fc9..3cf6bf6293 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/MonthlyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/MonthlyReportContentMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.MonthlyReportContentDO; +import com.dianping.cat.mybatis.data.MonthlyReportContentDO; public interface MonthlyReportContentMapper { int deleteByPrimaryKey(@Param("reportId") Long reportId); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/OperationMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/OperationMapper.java similarity index 76% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/OperationMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/OperationMapper.java index 14ebe6550b..a404a61c2e 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/OperationMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/OperationMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.OperationDO; +import com.dianping.cat.mybatis.data.OperationDO; public interface OperationMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ProjectMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/ProjectMapper.java similarity index 83% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ProjectMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/ProjectMapper.java index 3a198791e3..d6f62e012b 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/ProjectMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/ProjectMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.ProjectDO; +import com.dianping.cat.mybatis.data.ProjectDO; public interface ProjectMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/TaskMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/TaskMapper.java similarity index 87% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/TaskMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/TaskMapper.java index 0741501035..55ae6e05d9 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/TaskMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/TaskMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.TaskDO; +import com.dianping.cat.mybatis.data.TaskDO; public interface TaskMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportContentMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/WeeklyReportContentMapper.java similarity index 81% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportContentMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/WeeklyReportContentMapper.java index de588af48c..e74ba7ecb4 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportContentMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/WeeklyReportContentMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.WeeklyReportContentDO; +import com.dianping.cat.mybatis.data.WeeklyReportContentDO; public interface WeeklyReportContentMapper { int deleteByPrimaryKey(@Param("reportId") Long reportId); diff --git a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportMapper.java b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/WeeklyReportMapper.java similarity index 82% rename from cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportMapper.java rename to cat-core/src/main/java/com/dianping/cat/mybatis/mapper/WeeklyReportMapper.java index 4be93c09e7..a60bc1b8ad 100644 --- a/cat-core/src/main/java/com/dianping/cat/core/mybatis/mapper/WeeklyReportMapper.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/mapper/WeeklyReportMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.mapper; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.data.WeeklyReportDO; +import com.dianping.cat.mybatis.data.WeeklyReportDO; public interface WeeklyReportMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java index c4bddd7c53..77b157d8f5 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java +++ b/cat-core/src/main/java/com/dianping/cat/report/DefaultReportManager.java @@ -34,8 +34,8 @@ import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.mybatis.HourlyReportContentRepository; -import com.dianping.cat.core.mybatis.HourlyReportRepository; +import com.dianping.cat.mybatis.HourlyReportContentRepository; +import com.dianping.cat.mybatis.HourlyReportRepository; import com.dianping.cat.message.Message; import com.dianping.cat.message.Transaction; diff --git a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java index a3b38f0438..263b9e4411 100644 --- a/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java +++ b/cat-core/src/main/java/com/dianping/cat/report/service/AbstractReportService.java @@ -33,20 +33,20 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.mybatis.DailyReportContentRepository; +import com.dianping.cat.mybatis.DailyReportContentRepository; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.mybatis.HourlyReportContentRepository; -import com.dianping.cat.core.mybatis.HourlyReportRepository; +import com.dianping.cat.mybatis.HourlyReportContentRepository; +import com.dianping.cat.mybatis.HourlyReportRepository; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.mybatis.MonthlyReportContentRepository; -import com.dianping.cat.core.mybatis.MonthlyReportRepository; +import com.dianping.cat.mybatis.MonthlyReportContentRepository; +import com.dianping.cat.mybatis.MonthlyReportRepository; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.mybatis.WeeklyReportContentRepository; -import com.dianping.cat.core.mybatis.WeeklyReportRepository; -import com.dianping.cat.core.mybatis.DailyReportRepository; +import com.dianping.cat.mybatis.WeeklyReportContentRepository; +import com.dianping.cat.mybatis.WeeklyReportRepository; +import com.dianping.cat.mybatis.DailyReportRepository; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.message.Event; diff --git a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java index 85488607a7..959f5729c7 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/HostinfoService.java @@ -33,7 +33,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.dal.Hostinfo; -import com.dianping.cat.core.mybatis.HostInfoRepository; +import com.dianping.cat.mybatis.HostInfoRepository; import com.dianping.cat.helper.TimeHelper; public class HostinfoService { diff --git a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java index fa3702d2c9..ed2cd60c14 100644 --- a/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java +++ b/cat-core/src/main/java/com/dianping/cat/service/ProjectService.java @@ -21,7 +21,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.dal.Project; -import com.dianping.cat.core.mybatis.ProjectRepository; +import com.dianping.cat.mybatis.ProjectRepository; import org.springframework.dao.EmptyResultDataAccessException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java index 5a6674601e..72c4b0f297 100644 --- a/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java +++ b/cat-core/src/main/java/com/dianping/cat/task/TaskManager.java @@ -21,7 +21,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.core.dal.Task; -import com.dianping.cat.core.mybatis.TaskRepository; +import com.dianping.cat.mybatis.TaskRepository; import java.util.Calendar; import java.util.Date; diff --git a/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml b/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml index 2f496bee14..5abb439bce 100644 --- a/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/BusinessConfigMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -31,7 +31,7 @@ + parameterType="com.dianping.cat.mybatis.data.BusinessConfigDO" keyProperty="id"> INSERT INTO t_business_config @@ -52,7 +52,7 @@ delete from t_business_config where id = #{id} - + UPDATE t_business_config WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml index a5f312f184..15f25a60ae 100644 --- a/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/BusinessReportMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -40,7 +40,7 @@ + parameterType="com.dianping.cat.mybatis.data.BusinessReportDO" keyProperty="id"> INSERT INTO t_business_report @@ -61,7 +61,7 @@ delete from t_business_report where id = #{id} - + UPDATE t_business_report WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml b/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml index ed961abcab..b739a47a59 100644 --- a/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/ConfigMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -28,7 +28,7 @@ + parameterType="com.dianping.cat.mybatis.data.ConfigDO" keyProperty="id"> INSERT INTO t_config @@ -56,7 +56,7 @@ delete from t_config where id = #{id} - + UPDATE t_config WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml index 461c9a3755..3ba5a8656a 100644 --- a/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/DailyReportContentMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -28,7 +28,7 @@ - + INSERT INTO t_daily_report_content @@ -49,7 +49,7 @@ delete from t_daily_report_content where report_id = #{reportId} - + UPDATE t_daily_report_content WHERE report_id = #{reportId} diff --git a/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml index 1565f79bc3..f1afd9224c 100644 --- a/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/DailyReportMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -34,7 +34,7 @@ + parameterType="com.dianping.cat.mybatis.data.DailyReportDO" keyProperty="id"> INSERT INTO t_daily_report @@ -78,7 +78,7 @@ and BINARY(domain) = BINARY(#{domain}) - + UPDATE t_daily_report WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/HostInfoMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HostInfoMapper.xml index 7a9af5468b..6678b0ce3b 100644 --- a/cat-core/src/main/resources/mybatis/mapper/HostInfoMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/HostInfoMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -31,7 +31,7 @@ + parameterType="com.dianping.cat.mybatis.data.HostInfoDO" keyProperty="id"> INSERT INTO t_host_info @@ -52,7 +52,7 @@ delete from t_host_info where id = #{id} - + UPDATE t_host_info WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml index 666790a895..f50b92258c 100644 --- a/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/HourlyReportContentMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -28,7 +28,7 @@ - + INSERT INTO t_hourly_report_content @@ -49,7 +49,7 @@ delete from t_hourly_report_content where report_id = #{reportId} - + UPDATE t_hourly_report_content WHERE report_id = #{reportId} diff --git a/cat-core/src/main/resources/mybatis/mapper/HourlyReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/HourlyReportMapper.xml index abe54a2365..ba1e8ecdcf 100644 --- a/cat-core/src/main/resources/mybatis/mapper/HourlyReportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/HourlyReportMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -34,7 +34,7 @@ + parameterType="com.dianping.cat.mybatis.data.HourlyReportDO" keyProperty="id"> INSERT INTO t_hourly_report @@ -55,7 +55,7 @@ delete from t_hourly_report where id = #{id} - + UPDATE t_hourly_report WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/MonthReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/MonthReportMapper.xml index bdb111c1be..5a0c658404 100644 --- a/cat-core/src/main/resources/mybatis/mapper/MonthReportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/MonthReportMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -34,7 +34,7 @@ + parameterType="com.dianping.cat.mybatis.data.MonthReportDO" keyProperty="id"> INSERT INTO t_monthly_report @@ -55,7 +55,7 @@ delete from t_monthly_report where id = #{id} - + UPDATE t_monthly_report WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml index 331cf909bd..4c93b3644f 100644 --- a/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/MonthlyReportContentMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -28,7 +28,7 @@ - + INSERT INTO t_monthly_report_content @@ -49,7 +49,7 @@ delete from t_monthly_report_content where report_id = #{reportId} - + UPDATE t_monthly_report_content WHERE report_id = #{reportId} diff --git a/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml b/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml index d24e70019a..58f4f2b0b2 100644 --- a/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/OperationMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -37,7 +37,7 @@ + parameterType="com.dianping.cat.mybatis.data.OperationDO" keyProperty="id"> INSERT INTO t_operation @@ -58,7 +58,7 @@ delete from t_operation where id = #{id} - + UPDATE t_operation WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml b/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml index 281a8b1bad..06a10c42e7 100644 --- a/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/ProjectMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -46,7 +46,7 @@ + parameterType="com.dianping.cat.mybatis.data.ProjectDO" keyProperty="id"> INSERT INTO t_project @@ -67,7 +67,7 @@ delete from t_project where id = #{id} - + UPDATE t_project WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml b/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml index ca9b0af5eb..c7aab596a4 100644 --- a/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -53,7 +53,7 @@ + parameterType="com.dianping.cat.mybatis.data.TaskDO" keyProperty="id"> INSERT INTO t_task @@ -74,7 +74,7 @@ delete from t_task where id = #{id} - + UPDATE t_task WHERE id = #{id} diff --git a/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml index 8a3365d475..53a38868e5 100644 --- a/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportContentMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -28,7 +28,7 @@ - + INSERT INTO t_weekly_report_content @@ -49,7 +49,7 @@ delete from t_weekly_report_content where report_id = #{reportId} - + UPDATE t_weekly_report_content WHERE report_id = #{reportId} diff --git a/cat-core/src/main/resources/mybatis/mapper/WeeklyReportMapper.xml b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportMapper.xml index 536486a895..0524c9f382 100644 --- a/cat-core/src/main/resources/mybatis/mapper/WeeklyReportMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/WeeklyReportMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -34,7 +34,7 @@ + parameterType="com.dianping.cat.mybatis.data.WeeklyReportDO" keyProperty="id"> INSERT INTO t_weekly_report @@ -55,7 +55,7 @@ delete from t_weekly_report where id = #{id} - + UPDATE t_weekly_report WHERE id = #{id} diff --git a/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java b/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java index 7afda0d1de..67c896a31e 100644 --- a/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java +++ b/cat-core/src/test/java/com/dianping/cat/service/DefaultReportManagerTest.java @@ -33,8 +33,8 @@ import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.mybatis.HourlyReportContentRepository; -import com.dianping.cat.core.mybatis.HourlyReportRepository; +import com.dianping.cat.mybatis.HourlyReportContentRepository; +import com.dianping.cat.mybatis.HourlyReportRepository; import com.dianping.cat.report.DefaultReportManager; import com.dianping.cat.report.DefaultReportManager.StoragePolicy; import com.dianping.cat.report.DomainValidator; diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 514369c2ec..51bc4096f8 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -132,8 +132,8 @@ import com.dianping.cat.consumer.transaction.TransactionAnalyzer; import com.dianping.cat.consumer.transaction.TransactionDelegate; import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; -import com.dianping.cat.core.mybatis.ConfigRepository; -import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; +import com.dianping.cat.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.SpringBackedRepositorySupport; import com.dianping.cat.alarm.spi.config.AlertConfigManager; import com.dianping.cat.alarm.spi.config.AlertPolicyManager; import com.dianping.cat.alarm.spi.config.SenderConfigManager; @@ -155,29 +155,29 @@ import com.dianping.cat.alarm.spi.spliter.Spliter; import com.dianping.cat.alarm.spi.spliter.SpliterManager; import com.dianping.cat.alarm.spi.spliter.WeixinSpliter; -import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; -import com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository; -import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; -import com.dianping.cat.core.mybatis.repository.baseline.BaselineRepository; -import com.dianping.cat.core.mybatis.mapper.BusinessConfigRepository; -import com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository; -import com.dianping.cat.core.mybatis.DailyReportContentRepository; -import com.dianping.cat.core.mybatis.HostInfoRepository; -import com.dianping.cat.core.mybatis.HourlyReportContentRepository; -import com.dianping.cat.core.mybatis.HourlyReportRepository; -import com.dianping.cat.core.mybatis.repository.metric.graph.MetricGraphRepository; -import com.dianping.cat.core.mybatis.repository.metric.screen.MetricScreenRepository; -import com.dianping.cat.core.mybatis.MonthlyReportContentRepository; -import com.dianping.cat.core.mybatis.MonthlyReportRepository; -import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; -import com.dianping.cat.core.mybatis.ProjectRepository; -import com.dianping.cat.core.mybatis.repository.server.alarm.rule.ServerAlarmRuleRepository; -import com.dianping.cat.core.mybatis.TaskRepository; -import com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository; -import com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository; -import com.dianping.cat.core.mybatis.WeeklyReportContentRepository; -import com.dianping.cat.core.mybatis.WeeklyReportRepository; -import com.dianping.cat.core.mybatis.DailyReportRepository; +import com.dianping.cat.mybatis.repository.alert.AlertRepository; +import com.dianping.cat.mybatis.AlertSummaryRepository; +import com.dianping.cat.mybatis.AlterationRepository; +import com.dianping.cat.mybatis.BaselineRepository; +import com.dianping.cat.mybatis.mapper.BusinessConfigRepository; +import com.dianping.cat.mybatis.ConfigModificationRepository; +import com.dianping.cat.mybatis.DailyReportContentRepository; +import com.dianping.cat.mybatis.HostInfoRepository; +import com.dianping.cat.mybatis.HourlyReportContentRepository; +import com.dianping.cat.mybatis.HourlyReportRepository; +import com.dianping.cat.mybatis.MetricGraphRepository; +import com.dianping.cat.mybatis.MetricScreenRepository; +import com.dianping.cat.mybatis.MonthlyReportContentRepository; +import com.dianping.cat.mybatis.MonthlyReportRepository; +import com.dianping.cat.mybatis.OverloadRepository; +import com.dianping.cat.mybatis.ProjectRepository; +import com.dianping.cat.mybatis.repository.server.alarm.rule.ServerAlarmRuleRepository; +import com.dianping.cat.mybatis.TaskRepository; +import com.dianping.cat.mybatis.TopologyGraphRepository; +import com.dianping.cat.mybatis.repository.user.define.rule.UserDefineRuleRepository; +import com.dianping.cat.mybatis.WeeklyReportContentRepository; +import com.dianping.cat.mybatis.WeeklyReportRepository; +import com.dianping.cat.mybatis.DailyReportRepository; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.hadoop.hdfs.FileSystemManager; import com.dianping.cat.hadoop.hdfs.HdfsMessageBucketFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java index c97f917ad7..157490e9dc 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringStartupVerifier.java @@ -6,30 +6,30 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dianping.cat.core.mybatis.mapper.ConfigMapper; -import com.dianping.cat.core.mybatis.alert.dao.AlertMapper; -import com.dianping.cat.core.mybatis.alert.summary.dao.AlertSummaryMapper; -import com.dianping.cat.core.mybatis.alteration.dao.AlterationMapper; -import com.dianping.cat.core.mybatis.baseline.dao.BaselineMapper; -import com.dianping.cat.core.mybatis.mapper.BusinessConfigMapper; -import com.dianping.cat.core.mybatis.config.modification.dao.ConfigModificationMapper; -import com.dianping.cat.core.mybatis.mapper.DailyReportContentMapper; -import com.dianping.cat.core.mybatis.mapper.HostInfoMapper; -import com.dianping.cat.core.mybatis.mapper.HourlyReportContentMapper; -import com.dianping.cat.core.mybatis.mapper.HourlyReportMapper; -import com.dianping.cat.core.mybatis.metric.graph.dao.MetricGraphMapper; -import com.dianping.cat.core.mybatis.metric.screen.dao.MetricScreenMapper; -import com.dianping.cat.core.mybatis.mapper.MonthlyReportContentMapper; -import com.dianping.cat.core.mybatis.mapper.MonthReportMapper; -import com.dianping.cat.core.mybatis.overload.dao.OverloadMapper; -import com.dianping.cat.core.mybatis.mapper.ProjectMapper; -import com.dianping.cat.core.mybatis.server.alarm.rule.dao.ServerAlarmRuleMapper; -import com.dianping.cat.core.mybatis.mapper.TaskMapper; -import com.dianping.cat.core.mybatis.topologygraph.dao.TopologyGraphMapper; -import com.dianping.cat.core.mybatis.user.define.rule.dao.UserDefineRuleMapper; -import com.dianping.cat.core.mybatis.mapper.WeeklyReportContentMapper; -import com.dianping.cat.core.mybatis.mapper.WeeklyReportMapper; -import com.dianping.cat.core.mybatis.mapper.DailyReportMapper; +import com.dianping.cat.mybatis.mapper.ConfigMapper; +import com.dianping.cat.mybatis.alert.dao.AlertMapper; +import com.dianping.cat.mybatis.mapper.AlertSummaryMapper; +import com.dianping.cat.mybatis.mapper.AlterationMapper; +import com.dianping.cat.mybatis.mapper.BaselineMapper; +import com.dianping.cat.mybatis.mapper.BusinessConfigMapper; +import com.dianping.cat.mybatis.mapper.ConfigModificationMapper; +import com.dianping.cat.mybatis.mapper.DailyReportContentMapper; +import com.dianping.cat.mybatis.mapper.HostInfoMapper; +import com.dianping.cat.mybatis.mapper.HourlyReportContentMapper; +import com.dianping.cat.mybatis.mapper.HourlyReportMapper; +import com.dianping.cat.mybatis.mapper.MetricGraphMapper; +import com.dianping.cat.mybatis.mapper.MetricScreenMapper; +import com.dianping.cat.mybatis.mapper.MonthlyReportContentMapper; +import com.dianping.cat.mybatis.mapper.MonthReportMapper; +import com.dianping.cat.mybatis.mapper.OverloadMapper; +import com.dianping.cat.mybatis.mapper.ProjectMapper; +import com.dianping.cat.mybatis.server.alarm.rule.dao.ServerAlarmRuleMapper; +import com.dianping.cat.mybatis.mapper.TaskMapper; +import com.dianping.cat.mybatis.mapper.TopologyGraphMapper; +import com.dianping.cat.mybatis.user.define.rule.dao.UserDefineRuleMapper; +import com.dianping.cat.mybatis.mapper.WeeklyReportContentMapper; +import com.dianping.cat.mybatis.mapper.WeeklyReportMapper; +import com.dianping.cat.mybatis.mapper.DailyReportMapper; public class CatHomeSpringStartupVerifier { private static final Logger LOGGER = LoggerFactory.getLogger(CatHomeSpringStartupVerifier.class); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java b/cat-home/src/main/java/com/dianping/cat/mybatis/AlertSummaryRepository.java similarity index 92% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/AlertSummaryRepository.java index 318d55c2bd..9fc96020fe 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alert/summary/AlertSummaryRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/AlertSummaryRepository.java @@ -1,8 +1,7 @@ -package com.dianping.cat.core.mybatis.repository.alert.summary; +package com.dianping.cat.mybatis; -import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.alert.summary.dao.AlertSummaryMapper; -import com.dianping.cat.core.mybatis.alert.summary.dao.data.AlertSummaryDO; +import com.dianping.cat.mybatis.data.AlertSummaryDO; +import com.dianping.cat.mybatis.mapper.AlertSummaryMapper; import com.dianping.cat.home.dal.report.AlertSummary; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java b/cat-home/src/main/java/com/dianping/cat/mybatis/AlterationRepository.java similarity index 96% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/AlterationRepository.java index 93c6a485b2..955a9fdddf 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/alteration/AlterationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/AlterationRepository.java @@ -1,8 +1,7 @@ -package com.dianping.cat.core.mybatis.repository.alteration; +package com.dianping.cat.mybatis; -import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.alteration.dao.AlterationMapper; -import com.dianping.cat.core.mybatis.alteration.dao.data.AlterationDO; +import com.dianping.cat.mybatis.data.AlterationDO; +import com.dianping.cat.mybatis.mapper.AlterationMapper; import com.dianping.cat.home.dal.report.Alteration; import java.util.List; import java.util.stream.Collectors; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java b/cat-home/src/main/java/com/dianping/cat/mybatis/BaselineRepository.java similarity index 94% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/BaselineRepository.java index bf111b7e74..dd52d5357a 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/baseline/BaselineRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/BaselineRepository.java @@ -1,8 +1,7 @@ -package com.dianping.cat.core.mybatis.repository.baseline; +package com.dianping.cat.mybatis; -import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.baseline.dao.BaselineMapper; -import com.dianping.cat.core.mybatis.baseline.dao.data.BaselineDO; +import com.dianping.cat.mybatis.data.BaselineDO; +import com.dianping.cat.mybatis.mapper.BaselineMapper; import com.dianping.cat.home.dal.report.Baseline; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java b/cat-home/src/main/java/com/dianping/cat/mybatis/ConfigModificationRepository.java similarity index 93% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/ConfigModificationRepository.java index a59a4e4d5d..56903998cc 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/config/modification/ConfigModificationRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/ConfigModificationRepository.java @@ -1,8 +1,7 @@ -package com.dianping.cat.core.mybatis.repository.config.modification; +package com.dianping.cat.mybatis; -import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.config.modification.dao.ConfigModificationMapper; -import com.dianping.cat.core.mybatis.config.modification.dao.data.ConfigModificationDO; +import com.dianping.cat.mybatis.data.ConfigModificationDO; +import com.dianping.cat.mybatis.mapper.ConfigModificationMapper; import com.dianping.cat.home.dal.report.ConfigModification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/mybatis/MetricGraphRepository.java similarity index 94% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/MetricGraphRepository.java index d905da20c3..e85b932039 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/graph/MetricGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/MetricGraphRepository.java @@ -1,8 +1,7 @@ -package com.dianping.cat.core.mybatis.repository.metric.graph; +package com.dianping.cat.mybatis; -import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.metric.graph.dao.MetricGraphMapper; -import com.dianping.cat.core.mybatis.metric.graph.dao.data.MetricGraphDO; +import com.dianping.cat.mybatis.data.MetricGraphDO; +import com.dianping.cat.mybatis.mapper.MetricGraphMapper; import com.dianping.cat.home.dal.report.MetricGraph; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java b/cat-home/src/main/java/com/dianping/cat/mybatis/MetricScreenRepository.java similarity index 95% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/MetricScreenRepository.java index cb967f6edc..49212e0308 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/metric/screen/MetricScreenRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/MetricScreenRepository.java @@ -1,8 +1,7 @@ -package com.dianping.cat.core.mybatis.repository.metric.screen; +package com.dianping.cat.mybatis; -import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.metric.screen.dao.MetricScreenMapper; -import com.dianping.cat.core.mybatis.metric.screen.dao.data.MetricScreenDO; +import com.dianping.cat.mybatis.data.MetricScreenDO; +import com.dianping.cat.mybatis.mapper.MetricScreenMapper; import com.dianping.cat.home.dal.report.MetricScreen; import java.util.List; import java.util.stream.Collectors; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java b/cat-home/src/main/java/com/dianping/cat/mybatis/OverloadRepository.java similarity index 95% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/OverloadRepository.java index e9c5042703..b5cdf1280c 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/overload/OverloadRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/OverloadRepository.java @@ -1,8 +1,7 @@ -package com.dianping.cat.core.mybatis.repository.overload; +package com.dianping.cat.mybatis; -import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.overload.dao.OverloadMapper; -import com.dianping.cat.core.mybatis.overload.dao.data.OverloadDO; +import com.dianping.cat.mybatis.data.OverloadDO; +import com.dianping.cat.mybatis.mapper.OverloadMapper; import com.dianping.cat.home.dal.report.Overload; import java.util.List; import java.util.stream.Collectors; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java b/cat-home/src/main/java/com/dianping/cat/mybatis/TopologyGraphRepository.java similarity index 93% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/TopologyGraphRepository.java index 1c2f61b299..5c1370740e 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/repository/topologygraph/TopologyGraphRepository.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/TopologyGraphRepository.java @@ -1,8 +1,7 @@ -package com.dianping.cat.core.mybatis.repository.topologygraph; +package com.dianping.cat.mybatis; -import com.dianping.cat.core.mybatis.SpringBackedRepositorySupport; -import com.dianping.cat.core.mybatis.topologygraph.dao.TopologyGraphMapper; -import com.dianping.cat.core.mybatis.topologygraph.dao.data.TopologyGraphDO; +import com.dianping.cat.mybatis.data.TopologyGraphDO; +import com.dianping.cat.mybatis.mapper.TopologyGraphMapper; import com.dianping.cat.home.dal.report.TopologyGraph; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/data/AlertSummaryDO.java b/cat-home/src/main/java/com/dianping/cat/mybatis/data/AlertSummaryDO.java similarity index 80% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/data/AlertSummaryDO.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/data/AlertSummaryDO.java index 3fd4bff0bd..da0b4c9564 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/data/AlertSummaryDO.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/data/AlertSummaryDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.alert.summary.dao.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/data/AlterationDO.java b/cat-home/src/main/java/com/dianping/cat/mybatis/data/AlterationDO.java similarity index 89% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/data/AlterationDO.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/data/AlterationDO.java index 047e770841..809b0a412d 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/data/AlterationDO.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/data/AlterationDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.alteration.dao.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/data/BaselineDO.java b/cat-home/src/main/java/com/dianping/cat/mybatis/data/BaselineDO.java similarity index 84% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/data/BaselineDO.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/data/BaselineDO.java index 53e7fbe945..6faae4ff38 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/data/BaselineDO.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/data/BaselineDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.baseline.dao.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/data/ConfigModificationDO.java b/cat-home/src/main/java/com/dianping/cat/mybatis/data/ConfigModificationDO.java similarity index 92% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/data/ConfigModificationDO.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/data/ConfigModificationDO.java index c498ef2b35..dd9e8ad496 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/data/ConfigModificationDO.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/data/ConfigModificationDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.config.modification.dao.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/data/MetricGraphDO.java b/cat-home/src/main/java/com/dianping/cat/mybatis/data/MetricGraphDO.java similarity index 93% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/data/MetricGraphDO.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/data/MetricGraphDO.java index c5ad336ad2..d71e0dd1af 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/data/MetricGraphDO.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/data/MetricGraphDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.metric.graph.dao.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/data/MetricScreenDO.java b/cat-home/src/main/java/com/dianping/cat/mybatis/data/MetricScreenDO.java similarity index 94% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/data/MetricScreenDO.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/data/MetricScreenDO.java index 7f4a78a9b4..35b0b412bf 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/data/MetricScreenDO.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/data/MetricScreenDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.metric.screen.dao.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/data/OverloadDO.java b/cat-home/src/main/java/com/dianping/cat/mybatis/data/OverloadDO.java similarity index 95% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/data/OverloadDO.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/data/OverloadDO.java index 94dcd68e79..79ac3c9301 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/data/OverloadDO.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/data/OverloadDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.overload.dao.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/data/TopologyGraphDO.java b/cat-home/src/main/java/com/dianping/cat/mybatis/data/TopologyGraphDO.java similarity index 81% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/data/TopologyGraphDO.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/data/TopologyGraphDO.java index cb324c2223..d705cf1940 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/data/TopologyGraphDO.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/data/TopologyGraphDO.java @@ -1,4 +1,4 @@ -package com.dianping.cat.core.mybatis.topologygraph.dao.data; +package com.dianping.cat.mybatis.data; import java.util.Date; diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/AlertSummaryMapper.java b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/AlertSummaryMapper.java similarity index 71% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/AlertSummaryMapper.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/mapper/AlertSummaryMapper.java index 9aa1e0b5dd..f937b9838e 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alert/summary/dao/AlertSummaryMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/AlertSummaryMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.alert.summary.dao; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.alert.summary.dao.data.AlertSummaryDO; +import com.dianping.cat.mybatis.data.AlertSummaryDO; public interface AlertSummaryMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/AlterationMapper.java b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/AlterationMapper.java similarity index 83% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/AlterationMapper.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/mapper/AlterationMapper.java index 4c467a3d5a..5ff27f2730 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/alteration/dao/AlterationMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/AlterationMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.alteration.dao; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.alteration.dao.data.AlterationDO; +import com.dianping.cat.mybatis.data.AlterationDO; public interface AlterationMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/BaselineMapper.java b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/BaselineMapper.java similarity index 76% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/BaselineMapper.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/mapper/BaselineMapper.java index f3f3f51140..66a1b55052 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/baseline/dao/BaselineMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/BaselineMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.baseline.dao; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.baseline.dao.data.BaselineDO; +import com.dianping.cat.mybatis.data.BaselineDO; public interface BaselineMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/ConfigModificationMapper.java b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/ConfigModificationMapper.java similarity index 70% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/ConfigModificationMapper.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/mapper/ConfigModificationMapper.java index 990d5591d3..5c135f7d2d 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/config/modification/dao/ConfigModificationMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/ConfigModificationMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.config.modification.dao; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.config.modification.dao.data.ConfigModificationDO; +import com.dianping.cat.mybatis.data.ConfigModificationDO; public interface ConfigModificationMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/MetricGraphMapper.java b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/MetricGraphMapper.java similarity index 80% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/MetricGraphMapper.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/mapper/MetricGraphMapper.java index 0396d6fa87..7d4aff30ef 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/graph/dao/MetricGraphMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/MetricGraphMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.metric.graph.dao; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.metric.graph.dao.data.MetricGraphDO; +import com.dianping.cat.mybatis.data.MetricGraphDO; public interface MetricGraphMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/MetricScreenMapper.java b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/MetricScreenMapper.java similarity index 85% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/MetricScreenMapper.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/mapper/MetricScreenMapper.java index 19101a43d8..b9b9e3f7ef 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/metric/screen/dao/MetricScreenMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/MetricScreenMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.metric.screen.dao; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.metric.screen.dao.data.MetricScreenDO; +import com.dianping.cat.mybatis.data.MetricScreenDO; public interface MetricScreenMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/OverloadMapper.java b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/OverloadMapper.java similarity index 81% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/OverloadMapper.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/mapper/OverloadMapper.java index bf66a08505..3cacbf2673 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/overload/dao/OverloadMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/OverloadMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.overload.dao; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.overload.dao.data.OverloadDO; +import com.dianping.cat.mybatis.data.OverloadDO; public interface OverloadMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/TopologyGraphMapper.java b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/TopologyGraphMapper.java similarity index 75% rename from cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/TopologyGraphMapper.java rename to cat-home/src/main/java/com/dianping/cat/mybatis/mapper/TopologyGraphMapper.java index e1588149b8..fefe3da450 100644 --- a/cat-home/src/main/java/com/dianping/cat/core/mybatis/topologygraph/dao/TopologyGraphMapper.java +++ b/cat-home/src/main/java/com/dianping/cat/mybatis/mapper/TopologyGraphMapper.java @@ -1,10 +1,10 @@ -package com.dianping.cat.core.mybatis.topologygraph.dao; +package com.dianping.cat.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.dianping.cat.core.mybatis.topologygraph.dao.data.TopologyGraphDO; +import com.dianping.cat.mybatis.data.TopologyGraphDO; public interface TopologyGraphMapper { int deleteByPrimaryKey(@Param("id") Long id); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java index 6202991fc6..7441e566de 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/business/BusinessRuleConfigManager.java @@ -38,7 +38,7 @@ import com.dianping.cat.alarm.rule.transform.DefaultSaxParser; import com.dianping.cat.configuration.business.entity.BusinessItemConfig; import com.dianping.cat.core.config.BusinessConfig; -import com.dianping.cat.core.mybatis.mapper.BusinessConfigRepository; +import com.dianping.cat.mybatis.mapper.BusinessConfigRepository; import com.dianping.cat.helper.MetricType; import com.dianping.cat.task.TimerSyncTask; import com.dianping.cat.task.TimerSyncTask.SyncHandler; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java index 0860eb5ba2..804350e21d 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/exception/ExceptionRuleConfigManager.java @@ -28,7 +28,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.home.exception.entity.ExceptionExclude; import com.dianping.cat.home.exception.entity.ExceptionLimit; import com.dianping.cat.home.exception.entity.ExceptionRuleConfig; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java index cf86195a2b..9c6ecb84ac 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/BaseRuleConfigManager.java @@ -46,7 +46,7 @@ import com.dianping.cat.alarm.rule.transform.DefaultSaxParser; import com.dianping.cat.alarm.spi.rule.RuleType; import com.dianping.cat.config.content.ContentFetcher; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.helper.MetricType; import com.dianping.cat.message.Event; import com.dianping.cat.report.alert.config.BaseRuleHelper; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java index a974800b0e..aa04228549 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/spi/config/UserDefinedRuleManager.java @@ -20,7 +20,7 @@ import com.dianping.cat.alarm.UserDefineRule; -import com.dianping.cat.core.mybatis.repository.user.define.rule.UserDefineRuleRepository; +import com.dianping.cat.mybatis.repository.user.define.rule.UserDefineRuleRepository; public class UserDefinedRuleManager { diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java index 283d9d0f91..4fdc310222 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/AlertSummaryService.java @@ -23,7 +23,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.home.dal.report.AlertSummary; -import com.dianping.cat.core.mybatis.repository.alert.summary.AlertSummaryRepository; +import com.dianping.cat.mybatis.AlertSummaryRepository; public class AlertSummaryService { private static final Logger LOGGER = LoggerFactory.getLogger(AlertSummaryService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java index 71c1dcaa65..488eb8ca47 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlertInfoBuilder.java @@ -31,7 +31,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.alarm.Alert; -import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; +import com.dianping.cat.mybatis.repository.alert.AlertRepository; import com.dianping.cat.alarm.spi.AlertType; import com.dianping.cat.home.alert.summary.entity.AlertSummary; import com.dianping.cat.home.alert.summary.entity.Category; diff --git a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java index fafd1f4fab..aad03f47bf 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/alert/summary/build/AlterationSummaryBuilder.java @@ -28,7 +28,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.home.dal.report.Alteration; -import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; +import com.dianping.cat.mybatis.AlterationRepository; import com.dianping.cat.report.alert.summary.AlertSummaryExecutor; public class AlterationSummaryBuilder extends SummaryBuilder { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java index 83e27b2c60..21ed085129 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/DomainGroupConfigManager.java @@ -28,7 +28,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.home.group.entity.Domain; import com.dianping.cat.home.group.entity.DomainGroup; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java index fc4adacf00..118e558b27 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alert/Handler.java @@ -43,7 +43,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.alarm.Alert; -import com.dianping.cat.core.mybatis.repository.alert.AlertRepository; +import com.dianping.cat.mybatis.repository.alert.AlertRepository; import com.dianping.cat.alarm.spi.AlertChannel; import com.dianping.cat.alarm.spi.sender.SendMessageEntity; import com.dianping.cat.alarm.spi.sender.SenderManager; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java index 8e18ca77e4..189012f4e9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/alteration/Handler.java @@ -45,7 +45,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.consumer.storage.builder.StorageSQLBuilder; import com.dianping.cat.home.dal.report.Alteration; -import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; +import com.dianping.cat.mybatis.AlterationRepository; import com.dianping.cat.report.ReportPage; public class Handler implements PageHandler { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java index 88ed220fe5..d25cbb500c 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/config/TopoGraphFormatConfigManager.java @@ -28,7 +28,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.home.dependency.format.entity.ProductLine; import com.dianping.cat.home.dependency.format.entity.TopoGraphFormatConfig; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java index ad55cd0d4b..ebc000e0dd 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphConfigManager.java @@ -35,7 +35,7 @@ import com.dianping.cat.consumer.dependency.model.entity.Dependency; import com.dianping.cat.consumer.dependency.model.entity.Index; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.helper.Chinese; import com.dianping.cat.home.dependency.config.entity.DomainConfig; import com.dianping.cat.home.dependency.config.entity.EdgeConfig; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java index 17e96d8946..d8a73c2fd8 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/graph/TopologyGraphManager.java @@ -35,10 +35,9 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.config.server.ServerFilterConfigManager; -import com.dianping.cat.consumer.dependency.DependencyAnalyzer; import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; import com.dianping.cat.helper.TimeHelper; -import com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository; +import com.dianping.cat.mybatis.TopologyGraphRepository; import com.dianping.cat.home.dependency.format.entity.Domain; import com.dianping.cat.home.dependency.format.entity.ProductLine; import com.dianping.cat.home.dependency.graph.entity.TopologyEdge; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java index fe316b23c4..8ae3d992d2 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/dependency/task/DependencyReportBuilder.java @@ -31,7 +31,7 @@ import com.dianping.cat.consumer.dependency.DependencyAnalyzer; import com.dianping.cat.consumer.dependency.model.entity.DependencyReport; import com.dianping.cat.helper.TimeHelper; -import com.dianping.cat.core.mybatis.repository.topologygraph.TopologyGraphRepository; +import com.dianping.cat.mybatis.TopologyGraphRepository; import com.dianping.cat.home.dependency.graph.entity.TopologyGraph; import com.dianping.cat.home.dependency.graph.transform.DefaultNativeBuilder; import com.dianping.cat.report.page.dependency.graph.TopologyGraphBuilder; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java index 943bb497ff..097c309c94 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/heartbeat/config/HeartbeatDisplayPolicyManager.java @@ -31,7 +31,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.home.heartbeat.entity.Group; import com.dianping.cat.home.heartbeat.entity.HeartbeatDisplayPolicy; import com.dianping.cat.home.heartbeat.entity.Metric; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java b/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java index 5deaf72bb2..da01459217 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/metric/service/DefaultBaselineService.java @@ -34,7 +34,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.dal.report.Baseline; -import com.dianping.cat.core.mybatis.repository.baseline.BaselineRepository; +import com.dianping.cat.mybatis.BaselineRepository; import com.dianping.cat.report.service.ModelPeriod; import com.dianping.cat.report.task.TaskHelper; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java index 4309764b05..4e45c6feb3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/CapacityUpdateStatusManager.java @@ -23,8 +23,8 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; -import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; +import com.dianping.cat.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.OverloadRepository; public class CapacityUpdateStatusManager { private static final Logger LOGGER = LoggerFactory.getLogger(CapacityUpdateStatusManager.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java index 740548785b..b1ac813595 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/DailyCapacityUpdater.java @@ -27,10 +27,10 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.DailyReportContent; -import com.dianping.cat.core.mybatis.DailyReportContentRepository; -import com.dianping.cat.core.mybatis.DailyReportRepository; +import com.dianping.cat.mybatis.DailyReportContentRepository; +import com.dianping.cat.mybatis.DailyReportRepository; import com.dianping.cat.home.dal.report.Overload; -import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; +import com.dianping.cat.mybatis.OverloadRepository; public class DailyCapacityUpdater implements CapacityUpdater { private static final Logger LOGGER = LoggerFactory.getLogger(DailyCapacityUpdater.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java index 3891a3684a..0b9eafc56e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/HourlyCapacityUpdater.java @@ -27,10 +27,10 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.mybatis.HourlyReportContentRepository; -import com.dianping.cat.core.mybatis.HourlyReportRepository; +import com.dianping.cat.mybatis.HourlyReportContentRepository; +import com.dianping.cat.mybatis.HourlyReportRepository; import com.dianping.cat.home.dal.report.Overload; -import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; +import com.dianping.cat.mybatis.OverloadRepository; public class HourlyCapacityUpdater implements CapacityUpdater { private static final Logger LOGGER = LoggerFactory.getLogger(HourlyCapacityUpdater.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java index 3d5a246426..f356edfea3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/MonthlyCapacityUpdater.java @@ -27,10 +27,10 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.MonthlyReportContent; -import com.dianping.cat.core.mybatis.MonthlyReportContentRepository; -import com.dianping.cat.core.mybatis.MonthlyReportRepository; +import com.dianping.cat.mybatis.MonthlyReportContentRepository; +import com.dianping.cat.mybatis.MonthlyReportRepository; import com.dianping.cat.home.dal.report.Overload; -import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; +import com.dianping.cat.mybatis.OverloadRepository; public class MonthlyCapacityUpdater implements CapacityUpdater { private static final Logger LOGGER = LoggerFactory.getLogger(MonthlyCapacityUpdater.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java index 619c241eef..a5967aa4fd 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/TableCapacityService.java @@ -29,14 +29,14 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.DailyReport; import com.dianping.cat.core.dal.HourlyReport; -import com.dianping.cat.core.mybatis.HourlyReportRepository; +import com.dianping.cat.mybatis.HourlyReportRepository; import com.dianping.cat.core.dal.MonthlyReport; -import com.dianping.cat.core.mybatis.MonthlyReportRepository; +import com.dianping.cat.mybatis.MonthlyReportRepository; import com.dianping.cat.core.dal.WeeklyReport; -import com.dianping.cat.core.mybatis.WeeklyReportRepository; -import com.dianping.cat.core.mybatis.DailyReportRepository; +import com.dianping.cat.mybatis.WeeklyReportRepository; +import com.dianping.cat.mybatis.DailyReportRepository; import com.dianping.cat.home.dal.report.Overload; -import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; +import com.dianping.cat.mybatis.OverloadRepository; public class TableCapacityService { private static final Logger LOGGER = LoggerFactory.getLogger(TableCapacityService.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java index 8c5c501675..e51cf45211 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/overload/task/WeeklyCapacityUpdater.java @@ -27,10 +27,10 @@ import com.dianping.cat.Cat; import com.dianping.cat.core.dal.WeeklyReport; import com.dianping.cat.core.dal.WeeklyReportContent; -import com.dianping.cat.core.mybatis.WeeklyReportContentRepository; -import com.dianping.cat.core.mybatis.WeeklyReportRepository; +import com.dianping.cat.mybatis.WeeklyReportContentRepository; +import com.dianping.cat.mybatis.WeeklyReportRepository; import com.dianping.cat.home.dal.report.Overload; -import com.dianping.cat.core.mybatis.repository.overload.OverloadRepository; +import com.dianping.cat.mybatis.OverloadRepository; public class WeeklyCapacityUpdater implements CapacityUpdater { private static final Logger LOGGER = LoggerFactory.getLogger(WeeklyCapacityUpdater.class); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java index c589324dfa..99a7fc1e7e 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/Handler.java @@ -46,14 +46,13 @@ import com.dianping.cat.Constants; import com.dianping.cat.alarm.Alert; import com.dianping.cat.alarm.service.AlertService; -import com.dianping.cat.consumer.storage.StorageAnalyzer; import com.dianping.cat.consumer.storage.builder.StorageBuilderManager; import com.dianping.cat.consumer.storage.model.entity.StorageReport; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.helper.SortHelper; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.dal.report.Alteration; -import com.dianping.cat.core.mybatis.repository.alteration.AlterationRepository; +import com.dianping.cat.mybatis.AlterationRepository; import com.dianping.cat.home.storage.alert.entity.Storage; import com.dianping.cat.home.storage.alert.entity.StorageAlertInfo; import com.dianping.cat.mvc.PayloadNormalizer; diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java index 715a71b548..965d0ecec9 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/storage/config/StorageGroupConfigManager.java @@ -30,7 +30,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.home.storage.entity.Link; import com.dianping.cat.home.storage.entity.Storage; import com.dianping.cat.home.storage.entity.StorageGroup; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java index 282fb23bbe..060c86119f 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/DefaultTaskConsumer.java @@ -30,7 +30,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.core.dal.Task; -import com.dianping.cat.core.mybatis.TaskRepository; +import com.dianping.cat.mybatis.TaskRepository; import com.dianping.cat.message.Transaction; public class DefaultTaskConsumer extends TaskConsumer { diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java index cc1f79dccb..230e3a00ee 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/reload/AbstractReportReloader.java @@ -27,8 +27,8 @@ import com.dianping.cat.config.server.ServerConfigManager; import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.HourlyReportContent; -import com.dianping.cat.core.mybatis.HourlyReportContentRepository; -import com.dianping.cat.core.mybatis.HourlyReportRepository; +import com.dianping.cat.mybatis.HourlyReportContentRepository; +import com.dianping.cat.mybatis.HourlyReportRepository; public abstract class AbstractReportReloader implements ReportReloader { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractReportReloader.class); diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java index 654bf2ad9a..f8ebe9b3e8 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/business/config/BusinessTagConfigManager.java @@ -31,7 +31,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.Constants; import com.dianping.cat.core.config.BusinessConfig; -import com.dianping.cat.core.mybatis.mapper.BusinessConfigRepository; +import com.dianping.cat.mybatis.mapper.BusinessConfigRepository; import com.dianping.cat.home.business.entity.BusinessItem; import com.dianping.cat.home.business.entity.BusinessTagConfig; import com.dianping.cat.home.business.entity.Tag; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java index 97062d466a..cd71f141f9 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java @@ -33,7 +33,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.helper.JsonBuilder; import com.dianping.cat.home.dal.report.ConfigModification; -import com.dianping.cat.core.mybatis.repository.config.modification.ConfigModificationRepository; +import com.dianping.cat.mybatis.ConfigModificationRepository; import com.dianping.cat.system.SystemPage; import com.dianping.cat.system.page.config.processor.AlertConfigProcessor; import com.dianping.cat.system.page.config.processor.DependencyConfigProcessor; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java index 47b400d350..70a835dbe2 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/ResourceConfigManager.java @@ -28,7 +28,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.home.resource.entity.Resource; import com.dianping.cat.home.resource.entity.ResourceConfig; import com.dianping.cat.home.resource.transform.DefaultSaxParser; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java index 3842ec5a9f..22eee44475 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/permission/UserConfigManager.java @@ -25,7 +25,7 @@ import com.dianping.cat.Cat; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.home.user.entity.User; import com.dianping.cat.home.user.entity.UserConfig; import com.dianping.cat.home.user.transform.DefaultSaxParser; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java index f0dc2200e7..5c6c21dddc 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigAdjustor.java @@ -35,7 +35,7 @@ import com.dianping.cat.consumer.state.model.entity.ProcessDomain; import com.dianping.cat.consumer.state.model.entity.StateReport; import com.dianping.cat.core.dal.DailyReport; -import com.dianping.cat.core.mybatis.DailyReportRepository; +import com.dianping.cat.mybatis.DailyReportRepository; import com.dianping.cat.helper.SortHelper; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.router.entity.DefaultServer; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java index 5521b408c6..68ef2439b1 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigHandler.java @@ -33,7 +33,7 @@ import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.consumer.state.model.entity.StateReport; import com.dianping.cat.core.dal.DailyReport; -import com.dianping.cat.core.mybatis.DailyReportRepository; +import com.dianping.cat.mybatis.DailyReportRepository; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.router.entity.Domain; import com.dianping.cat.home.router.entity.Group; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java index 556488a2cc..a06dd8dcf0 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/router/config/RouterConfigManager.java @@ -22,10 +22,10 @@ import com.dianping.cat.Constants; import com.dianping.cat.config.content.ContentFetcher; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; import com.dianping.cat.core.dal.*; -import com.dianping.cat.core.mybatis.DailyReportContentRepository; -import com.dianping.cat.core.mybatis.DailyReportRepository; +import com.dianping.cat.mybatis.DailyReportContentRepository; +import com.dianping.cat.mybatis.DailyReportRepository; import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.home.router.entity.*; import com.dianping.cat.home.router.transform.DefaultNativeParser; diff --git a/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml b/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml index d5ad0bde5f..4ab5fbee96 100644 --- a/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/AlertSummaryMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -31,7 +31,7 @@ + parameterType="com.dianping.cat.mybatis.data.AlertSummaryDO" keyProperty="id"> INSERT INTO t_alert_summary @@ -52,7 +52,7 @@ delete from t_alert_summary where id = #{id} - + UPDATE t_alert_summary WHERE id = #{id} diff --git a/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml b/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml index d592ffe147..0c054e21a0 100644 --- a/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/AlterationMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -55,7 +55,7 @@ + parameterType="com.dianping.cat.mybatis.data.AlterationDO" keyProperty="id"> INSERT INTO t_alteration @@ -76,7 +76,7 @@ delete from t_alteration where id = #{id} - + UPDATE t_alteration WHERE id = #{id} diff --git a/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml b/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml index dd28a7144c..abdb507c83 100644 --- a/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/BaselineMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -34,7 +34,7 @@ + parameterType="com.dianping.cat.mybatis.data.BaselineDO" keyProperty="id"> INSERT INTO t_baseline @@ -55,7 +55,7 @@ delete from t_baseline where id = #{id} - + UPDATE t_baseline WHERE id = #{id} diff --git a/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml b/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml index 4da92945b4..838be5c5dc 100644 --- a/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/ConfigModificationMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -37,7 +37,7 @@ + parameterType="com.dianping.cat.mybatis.data.ConfigModificationDO" keyProperty="id"> INSERT INTO t_config_modification @@ -58,7 +58,7 @@ delete from t_config_modification where id = #{id} - + UPDATE t_config_modification WHERE id = #{id} diff --git a/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml b/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml index 4e350d3f80..7fbf880551 100644 --- a/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/MetricGraphMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -31,7 +31,7 @@ + parameterType="com.dianping.cat.mybatis.data.MetricGraphDO" keyProperty="id"> INSERT INTO t_metric_graph @@ -52,7 +52,7 @@ delete from t_metric_graph where id = #{id} - + UPDATE t_metric_graph WHERE id = #{id} diff --git a/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml b/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml index ff123bbd7d..c19cb13708 100644 --- a/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/MetricScreenMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -40,7 +40,7 @@ + parameterType="com.dianping.cat.mybatis.data.MetricScreenDO" keyProperty="id"> INSERT INTO t_metric_screen @@ -61,7 +61,7 @@ delete from t_metric_screen where id = #{id} - + UPDATE t_metric_screen WHERE id = #{id} diff --git a/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml b/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml index 3d78bc5af8..da68892655 100644 --- a/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/OverloadMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -36,7 +36,7 @@ + parameterType="com.dianping.cat.mybatis.data.OverloadDO" keyProperty="id"> INSERT INTO t_overload @@ -57,7 +57,7 @@ delete from t_overload where id = #{id} - + UPDATE t_overload WHERE id = #{id} diff --git a/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml b/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml index 1a3d3916e2..11ecb7259e 100644 --- a/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml +++ b/cat-home/src/main/resources/mybatis/mapper/TopologyGraphMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -34,7 +34,7 @@ + parameterType="com.dianping.cat.mybatis.data.TopologyGraphDO" keyProperty="id"> INSERT INTO t_topology_graph @@ -55,7 +55,7 @@ delete from t_topology_graph where id = #{id} - + UPDATE t_topology_graph WHERE id = #{id} diff --git a/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java b/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java index d6a6bd53fa..e798777000 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/service/ReportDaoTest.java @@ -27,10 +27,10 @@ import com.dianping.cat.core.dal.HourlyReport; import com.dianping.cat.core.dal.MonthlyReport; import com.dianping.cat.core.dal.WeeklyReport; -import com.dianping.cat.core.mybatis.HourlyReportRepository; -import com.dianping.cat.core.mybatis.MonthlyReportRepository; -import com.dianping.cat.core.mybatis.WeeklyReportRepository; -import com.dianping.cat.core.mybatis.DailyReportRepository; +import com.dianping.cat.mybatis.HourlyReportRepository; +import com.dianping.cat.mybatis.MonthlyReportRepository; +import com.dianping.cat.mybatis.WeeklyReportRepository; +import com.dianping.cat.mybatis.DailyReportRepository; public class ReportDaoTest extends SpringCatHomeTestSupport { diff --git a/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java b/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java index 7ffd04867f..7ad733dd00 100644 --- a/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java +++ b/cat-home/src/test/java/com/dianping/cat/report/task/ConfigsBackupTest.java @@ -26,7 +26,7 @@ import org.junit.Test; import com.dianping.cat.core.config.Config; -import com.dianping.cat.core.mybatis.ConfigRepository; +import com.dianping.cat.mybatis.ConfigRepository; public class ConfigsBackupTest extends SpringTaskTestSupport { From 314dc0dd19d7efa849e8c38efa8159cd963746d1 Mon Sep 17 00:00:00 2001 From: Shang Date: Thu, 18 Jun 2026 10:12:29 +0800 Subject: [PATCH 175/231] add log --- .../com/dianping/cat/home/spring/CatHomeRuntimeBootstrap.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeRuntimeBootstrap.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeRuntimeBootstrap.java index a54355cb43..cf688a45ea 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeRuntimeBootstrap.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeRuntimeBootstrap.java @@ -62,10 +62,11 @@ public void start() { m_tcpSocketReceiver.init(); Threads.forGroup("Cat").start(m_logviewProcessor); Threads.forGroup("Cat").start(m_reportReloadTask); - + LOGGER.info("isJobMachine: {}", m_serverConfigManager.isJobMachine()); if (m_serverConfigManager.isJobMachine()) { Threads.forGroup("Cat").start(m_taskConsumer); } + LOGGER.info("isAlertMachine: {}", m_serverConfigManager.isAlertMachine()); if (m_serverConfigManager.isAlertMachine()) { m_alarmManager.startAlarm(); } From 6c7963c4cccf5a136af311c602bec67ad215f725 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 19 Jun 2026 10:11:41 +0800 Subject: [PATCH 176/231] =?UTF-8?q?fix=20transaction=20=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=80=BC=E9=83=BD=E6=98=AF0=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dianping/cat/message/codec/NativeMessageCodec.java | 1 + cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml | 5 ++++- .../cat/home/spring/CatHomeSpringConfiguration.java | 8 ++++---- cat-home/src/main/webapp/jsp/report/home/index.jsp | 1 - 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/message/codec/NativeMessageCodec.java b/cat-core/src/main/java/com/dianping/cat/message/codec/NativeMessageCodec.java index b939a93f03..f9d8f2971f 100644 --- a/cat-core/src/main/java/com/dianping/cat/message/codec/NativeMessageCodec.java +++ b/cat-core/src/main/java/com/dianping/cat/message/codec/NativeMessageCodec.java @@ -242,6 +242,7 @@ protected Message decode(Context ctx, ByteBuf buf) { t.setStatus(status); t.addData(data); t.setDurationInMicros(durationInMicros); + t.setCompleted(); return t; } diff --git a/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml b/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml index c7aab596a4..753421840a 100644 --- a/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml +++ b/cat-core/src/main/resources/mybatis/mapper/TaskMapper.xml @@ -81,7 +81,10 @@ diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 51bc4096f8..5abb0e308f 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -4541,10 +4541,10 @@ public SqlSessionFactory sqlSessionFactory(DataSource catDataSource) throws Exce factory.setMapperLocations( resolver.getResource("classpath:mybatis/mapper/ConfigMapper.xml"), resolver.getResource("classpath:mybatis/mapper/DailyReportMapper.xml"), - resolver.getResource("classpath:mybatis/mapper/HostinfoMapper.xml"), - resolver.getResource("classpath:mybatis/mapper/HourlyreportMapper.xml"), - resolver.getResource("classpath:mybatis/mapper/WeeklyreportMapper.xml"), - resolver.getResource("classpath:mybatis/mapper/MonthreportMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/HostInfoMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/HourlyReportMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/WeeklyReportMapper.xml"), + resolver.getResource("classpath:mybatis/mapper/MonthReportMapper.xml"), resolver.getResource("classpath:mybatis/mapper/ProjectMapper.xml"), resolver.getResource("classpath:mybatis/mapper/DailyReportContentMapper.xml"), resolver.getResource("classpath:mybatis/mapper/HourlyReportContentMapper.xml"), diff --git a/cat-home/src/main/webapp/jsp/report/home/index.jsp b/cat-home/src/main/webapp/jsp/report/home/index.jsp index df7555ce67..6142ee7b18 100644 --- a/cat-home/src/main/webapp/jsp/report/home/index.jsp +++ b/cat-home/src/main/webapp/jsp/report/home/index.jsp @@ -33,7 +33,6 @@
- From 315b1f338da16de2ddb0a2aff1045d259c05bca8 Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 19 Jun 2026 20:28:09 +0800 Subject: [PATCH 177/231] =?UTF-8?q?fix=20transaction=E4=B8=ADmax=E4=B8=BA0?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9Bfix=E6=89=93=E7=82=B9?= =?UTF-8?q?=E6=95=B0=E6=8D=AE*2=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat/message/internal/DefaultTransaction.java | 6 ++++-- .../cat/message/codec/NativeMessageCodec.java | 1 - .../cat/home/spring/CatHomeSpringConfiguration.java | 11 +++++++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/cat-client/src/main/java/com/dianping/cat/message/internal/DefaultTransaction.java b/cat-client/src/main/java/com/dianping/cat/message/internal/DefaultTransaction.java index 77415174d5..3cc454e15a 100644 --- a/cat-client/src/main/java/com/dianping/cat/message/internal/DefaultTransaction.java +++ b/cat-client/src/main/java/com/dianping/cat/message/internal/DefaultTransaction.java @@ -136,7 +136,8 @@ public List getChildren() { @Override public long getDurationInMicros() { - if (super.isCompleted()) { + // 解码出来的 transaction 没有运行中的 TraceContext,但已经带有编码后的耗时。 + if (super.isCompleted() || (m_ctx == null && m_durationInMicros > 0)) { return m_durationInMicros; } else { return 0; @@ -145,7 +146,8 @@ public long getDurationInMicros() { @Override public long getDurationInMillis() { - if (super.isCompleted()) { + // 解码出来的 transaction 没有运行中的 TraceContext,但已经带有编码后的耗时。 + if (super.isCompleted() || (m_ctx == null && m_durationInMicros > 0)) { return m_durationInMicros / 1000L; } else { return 0; diff --git a/cat-core/src/main/java/com/dianping/cat/message/codec/NativeMessageCodec.java b/cat-core/src/main/java/com/dianping/cat/message/codec/NativeMessageCodec.java index f9d8f2971f..b939a93f03 100644 --- a/cat-core/src/main/java/com/dianping/cat/message/codec/NativeMessageCodec.java +++ b/cat-core/src/main/java/com/dianping/cat/message/codec/NativeMessageCodec.java @@ -242,7 +242,6 @@ protected Message decode(Context ctx, ByteBuf buf) { t.setStatus(status); t.addData(data); t.setDurationInMicros(durationInMicros); - t.setCompleted(); return t; } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java index 5abb0e308f..183873d022 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeSpringConfiguration.java @@ -813,6 +813,7 @@ public ReportDelegate stateDelegate(TaskManager taskManager, Report } @Bean(name = BusinessAnalyzer.ID + "ReportManager", initMethod = "initialize") + @Scope("prototype") public ReportManager businessReportManager(ReportDelegate businessDelegate, ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator) { @@ -828,6 +829,7 @@ public ReportManager businessReportManager(ReportDelegate transactionReportManager( ReportDelegate transactionDelegate, ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, @@ -844,6 +846,7 @@ public ReportManager transactionReportManager( } @Bean(name = CrossAnalyzer.ID + "ReportManager", initMethod = "initialize") + @Scope("prototype") public ReportManager crossReportManager(ReportDelegate crossDelegate, ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator) { @@ -859,6 +862,7 @@ public ReportManager crossReportManager(ReportDelegate } @Bean(name = DependencyAnalyzer.ID + "ReportManager", initMethod = "initialize") + @Scope("prototype") public ReportManager dependencyReportManager( ReportDelegate dependencyDelegate, ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, @@ -875,6 +879,7 @@ public ReportManager dependencyReportManager( } @Bean(name = EventAnalyzer.ID + "ReportManager", initMethod = "initialize") + @Scope("prototype") public ReportManager eventReportManager(ReportDelegate eventDelegate, ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator) { @@ -890,6 +895,7 @@ public ReportManager eventReportManager(ReportDelegate } @Bean(name = HeartbeatAnalyzer.ID + "ReportManager", initMethod = "initialize") + @Scope("prototype") public ReportManager heartbeatReportManager(ReportDelegate heartbeatDelegate, ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator) { @@ -905,6 +911,7 @@ public ReportManager heartbeatReportManager(ReportDelegate matrixReportManager(ReportDelegate matrixDelegate, ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator) { @@ -920,6 +927,7 @@ public ReportManager matrixReportManager(ReportDelegate problemReportManager(ReportDelegate problemDelegate, ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator) { @@ -935,6 +943,7 @@ public ReportManager problemReportManager(ReportDelegate storageReportManager(ReportDelegate storageDelegate, ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator) { @@ -950,6 +959,7 @@ public ReportManager storageReportManager(ReportDelegate topReportManager(ReportDelegate topDelegate, ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator) { @@ -965,6 +975,7 @@ public ReportManager topReportManager(ReportDelegate topDe } @Bean(name = StateAnalyzer.ID + "ReportManager", initMethod = "initialize") + @Scope("prototype") public ReportManager stateReportManager(ReportDelegate stateDelegate, ReportBucketManager reportBucketManager, HourlyReportRepository hourlyReportRepository, HourlyReportContentRepository hourlyReportContentRepository, DomainValidator domainValidator) { From e160d5fea2282d72330888e854d0bdf7e1a59e2e Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 19 Jun 2026 21:06:36 +0800 Subject: [PATCH 178/231] =?UTF-8?q?fix=20=E9=87=8D=E5=90=AF=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=B8=A2=E5=A4=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../home/spring/CatHomeRuntimeBootstrap.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeRuntimeBootstrap.java b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeRuntimeBootstrap.java index cf688a45ea..8d0f719e51 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeRuntimeBootstrap.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/CatHomeRuntimeBootstrap.java @@ -20,6 +20,10 @@ public class CatHomeRuntimeBootstrap { private final AtomicBoolean m_started = new AtomicBoolean(); + private final AtomicBoolean m_stopped = new AtomicBoolean(); + + private Thread m_shutdownHook; + private AlarmManager m_alarmManager; private DefaultTaskConsumer m_taskConsumer; @@ -37,15 +41,17 @@ public class CatHomeRuntimeBootstrap { private TcpSocketReceiver m_tcpSocketReceiver; public void shutdown() { - if (!m_started.get()) { + if (!m_started.get() || !m_stopped.compareAndSet(false, true)) { return; } + try { m_messageConsumer.doCheckpoint(); } catch (RuntimeException e) { LOGGER.warn("Unable to checkpoint message consumer during shutdown.", e); } m_tcpSocketReceiver.destory(); + removeShutdownHook(); LOGGER.info("CAT home runtime bootstrap stopped."); } @@ -59,6 +65,7 @@ public void start() { } LOGGER.info("Resolved ServersUpdaterManager for CAT home runtime bootstrap."); + registerShutdownHook(); m_tcpSocketReceiver.init(); Threads.forGroup("Cat").start(m_logviewProcessor); Threads.forGroup("Cat").start(m_reportReloadTask); @@ -73,6 +80,25 @@ public void start() { LOGGER.info("CAT home runtime bootstrap started."); } + private void registerShutdownHook() { + m_shutdownHook = new Thread(this::shutdown); + Runtime.getRuntime().addShutdownHook(m_shutdownHook); + } + + private void removeShutdownHook() { + Thread shutdownHook = m_shutdownHook; + + if (shutdownHook == null || shutdownHook == Thread.currentThread()) { + return; + } + + try { + Runtime.getRuntime().removeShutdownHook(shutdownHook); + } catch (IllegalStateException e) { + // JVM is already shutting down, so the hook no longer needs removal. + } + } + public void setAlarmManager(AlarmManager alarmManager) { m_alarmManager = alarmManager; } From 5b9bf3246b7e95a7eeab365bf21839702b06cc5d Mon Sep 17 00:00:00 2001 From: Shang Date: Fri, 19 Jun 2026 21:25:37 +0800 Subject: [PATCH 179/231] =?UTF-8?q?fix=E6=9F=A5=E8=AF=A2task=E4=B8=BAnull?= =?UTF-8?q?=E6=97=B6=E4=B8=8D=E5=90=88=E7=90=86=E7=9A=84=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/dianping/cat/mybatis/TaskRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cat-core/src/main/java/com/dianping/cat/mybatis/TaskRepository.java b/cat-core/src/main/java/com/dianping/cat/mybatis/TaskRepository.java index c0097b2211..c71ea07aa1 100644 --- a/cat-core/src/main/java/com/dianping/cat/mybatis/TaskRepository.java +++ b/cat-core/src/main/java/com/dianping/cat/mybatis/TaskRepository.java @@ -49,7 +49,7 @@ public Task findByStatusConsumer(int status, String consumer) { record.setConsumer(consumer); TaskDO result = mapper.findByStatusConsumer(record).stream().findFirst().orElse(null); - return requireFound(result, "findByStatusConsumer", record.toString()); + return result == null ? null : toModel(result); } public int insert(Task proto) { From c83654819c9de1268de8a760a02286478150aff9 Mon Sep 17 00:00:00 2001 From: Shang Date: Sat, 20 Jun 2026 21:38:26 +0800 Subject: [PATCH 180/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E9=83=A8=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=88=B0springmvc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/web/SpringMvcHomeController.java | 34 +- .../spring/web/SpringMvcMigrationServlet.java | 4 + .../spring/web/SpringMvcTopController.java | 220 +++++++++++++ .../webapp/jsp/spring/report/home/home.jsp | 236 ++++++++++--- .../main/webapp/jsp/spring/report/top/top.jsp | 310 ++++++++++++++++++ .../web/SpringMvcHomeControllerTest.java | 10 +- 6 files changed, 762 insertions(+), 52 deletions(-) create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTopController.java create mode 100644 cat-home/src/main/webapp/jsp/spring/report/top/top.jsp diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHomeController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHomeController.java index 07cf310c15..3b965850e4 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHomeController.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcHomeController.java @@ -14,7 +14,7 @@ @Controller public class SpringMvcHomeController { - @GetMapping("/r/home") + @GetMapping("/mvc/r/home") public void home(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map model = homeModel(request); @@ -29,17 +29,37 @@ public void home(HttpServletRequest request, HttpServletResponse response) throw Map homeModel(HttpServletRequest request) { Map model = new LinkedHashMap(); + String docName = docName(request); + + model.put("docName", docName); + model.put("webapp", request.getContextPath()); + model.put("domain", parameter(request, "domain", "cat")); + model.put("ipAddress", parameter(request, "ip", "All")); + model.put("date", parameter(request, "date", "")); + model.put("reportType", parameter(request, "reportType", "day")); + model.put("actionName", parameter(request, "op", "view")); + model.put("runtime", "spring-mvc-migration"); + model.put("homeUrl", request.getContextPath() + "/mvc/r/home"); + model.put("loginUrl", request.getContextPath() + "/mvc/s/login"); + model.put("model", model); + return model; + } + + private String docName(HttpServletRequest request) { String docName = request.getParameter("docName"); if (docName == null || docName.length() == 0) { - docName = "index"; + return "index"; } + return docName; + } - model.put("docName", docName); - model.put("runtime", "spring-mvc-migration"); - model.put("legacyHomeUrl", request.getContextPath() + "/r/home"); - model.put("loginUrl", request.getContextPath() + "/mvc/s/login"); + private String parameter(HttpServletRequest request, String name, String defaultValue) { + String value = request.getParameter(name); - return model; + if (value == null || value.length() == 0) { + return defaultValue; + } + return value; } } diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java index 2a7f861fb3..ee2667fa83 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java @@ -34,6 +34,8 @@ public class SpringMvcMigrationServlet extends HttpServlet { private SpringMvcRouterController m_routerController; + private SpringMvcTopController m_topController; + private Map m_routes = Collections.emptyMap(); @Override @@ -53,6 +55,7 @@ public void init(ServletConfig config) throws ServletException { m_pluginController = context.getBean(SpringMvcPluginController.class); m_projectController = context.getBean(SpringMvcProjectController.class); m_routerController = context.getBean(SpringMvcRouterController.class); + m_topController = context.getBean(SpringMvcTopController.class); m_routes = buildRoutes(); } @@ -78,6 +81,7 @@ private Map buildRoutes() { register(routes, "GET", "/s/plugin/chrome", m_pluginController::chrome); register(routes, "GET", "/s/project", m_projectController::project); register(routes, "GET", "/s/router", m_routerController::router); + register(routes, "GET", "/r/top", m_topController::top); register(routes, "POST", "/s/login", m_loginController::submit); return Collections.unmodifiableMap(routes); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTopController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTopController.java new file mode 100644 index 0000000000..9a897c2904 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTopController.java @@ -0,0 +1,220 @@ +package com.dianping.cat.home.spring.web; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.dianping.cat.Constants; +import com.dianping.cat.consumer.top.model.entity.TopReport; +import com.dianping.cat.helper.TimeHelper; +import com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager; +import com.dianping.cat.report.page.dependency.TopExceptionExclude; +import com.dianping.cat.report.page.dependency.TopMetric; +import com.dianping.cat.report.page.state.StateBuilder; +import com.dianping.cat.report.page.top.service.TopReportService; +import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.report.service.ModelResponse; +import com.dianping.cat.report.service.ModelService; +import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class SpringMvcTopController { + private final SimpleDateFormat m_hourlyFormat = new SimpleDateFormat("yyyyMMddHH"); + + private final SimpleDateFormat m_subtitleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + @Resource + private ExceptionRuleConfigManager m_configManager; + + @Resource + private StateBuilder m_stateBuilder; + + @Resource + private TopReportService m_topReportService; + + @Resource + @Qualifier("topModelService") + private ModelService m_topService; + + @GetMapping("/mvc/r/top") + public void top(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Map model = topModel(request); + + for (Map.Entry entry : model.entrySet()) { + request.setAttribute(entry.getKey(), entry.getValue()); + } + + RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/spring/report/top/top.jsp"); + + dispatcher.forward(request, response); + } + + Map topModel(HttpServletRequest request) { + Map model = new LinkedHashMap(); + String contextPath = request.getContextPath(); + String domain = parameter(request, "domain", Constants.CAT); + String ipAddress = parameter(request, "ip", Constants.ALL); + long date = date(request.getParameter("date")); + int step = intParameter(request, "step", 0); + int minuteCount = intParameter(request, "count", 8); + int topCount = intParameter(request, "tops", 11); + + if (step != 0) { + date = date + step * TimeHelper.ONE_HOUR; + long currentHour = System.currentTimeMillis() - System.currentTimeMillis() % TimeHelper.ONE_HOUR; + + if (date > currentHour) { + date = currentHour; + } + } + + int minute = minute(request, date); + int maxMinute = maxMinute(date); + TopReport report = queryTopReport(date); + Date end = new Date(date + TimeHelper.ONE_MINUTE * minute); + Date start = new Date(end.getTime() - TimeHelper.ONE_MINUTE * minuteCount); + TopMetric topMetric = new TopMetric(minuteCount, topCount, m_configManager, Arrays.asList(Constants.FRONT_END)); + + topMetric.setStart(start).setEnd(end); + if (minuteCount > minute) { + TopReport lastReport = queryTopReport(date - TimeHelper.ONE_HOUR); + + topMetric.visitTopReport(lastReport); + } + topMetric.visitTopReport(report); + + model.put("webapp", contextPath); + model.put("domain", domain); + model.put("ipAddress", ipAddress); + model.put("date", m_hourlyFormat.format(new Date(date))); + model.put("longDate", date); + model.put("minute", minute); + model.put("maxMinute", maxMinute); + model.put("minutes", minutes()); + model.put("minuteCount", minuteCount); + model.put("topCount", topCount); + model.put("fullScreen", booleanParameter(request, "fullScreen")); + model.put("refresh", booleanParameter(request, "refresh")); + model.put("frequency", intParameter(request, "frequency", 10)); + model.put("reportStart", m_subtitleFormat.format(new Date(date))); + model.put("reportEnd", m_subtitleFormat.format(new Date(date + TimeHelper.ONE_HOUR - 1))); + model.put("message", m_stateBuilder.buildStateMessage(date, ipAddress)); + model.put("topReport", report); + model.put("topMetric", topMetric); + model.put("topResult", topMetric.getError().getResult()); + model.put("homeUrl", contextPath + "/mvc/r/home"); + model.put("model", model); + return model; + } + + private boolean booleanParameter(HttpServletRequest request, String name) { + return "true".equalsIgnoreCase(request.getParameter(name)); + } + + private long date(String value) { + if (value != null && value.length() > 0) { + try { + Date date = value.length() == 10 ? m_hourlyFormat.parse(value) : new SimpleDateFormat("yyyyMMdd").parse(value); + + return date.getTime(); + } catch (ParseException e) { + // use current hour + } + } + + long now = System.currentTimeMillis(); + + return now - now % TimeHelper.ONE_HOUR; + } + + private int intParameter(HttpServletRequest request, String name, int defaultValue) { + String value = request.getParameter(name); + + if (value != null && value.length() > 0) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + // use default value + } + } + return defaultValue; + } + + private int maxMinute(long date) { + long currentHour = System.currentTimeMillis() - System.currentTimeMillis() % TimeHelper.ONE_HOUR; + + if (date == currentHour) { + long current = System.currentTimeMillis() / 1000 / 60; + + return (int) (current % 60); + } + return 60; + } + + private int minute(HttpServletRequest request, long date) { + String value = request.getParameter("minute"); + + if (value != null && value.length() > 0) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + // use current minute + } + } + return maxMinute(date); + } + + private List minutes() { + List minutes = new ArrayList(); + + for (int i = 0; i < 60; i++) { + minutes.add(i); + } + return minutes; + } + + private String parameter(HttpServletRequest request, String name, String defaultValue) { + String value = request.getParameter(name); + + if (value == null || value.length() == 0) { + return defaultValue; + } + return value; + } + + private TopReport queryTopReport(long date) { + ModelRequest request = new ModelRequest(Constants.CAT, date).setProperty("date", String.valueOf(date)); + + if (m_topService.isEligable(request)) { + ModelResponse response = m_topService.invoke(request); + TopReport report = response.getModel(); + + if (report == null || report.getDomains().size() == 0) { + report = m_topReportService.queryReport(Constants.CAT, new Date(date), new Date(date + TimeHelper.ONE_HOUR)); + } + if (report == null) { + report = new TopReport(); + report.setStartTime(new Date(date)); + report.setEndTime(new Date(date + TimeHelper.ONE_HOUR)); + } + report.accept(new TopExceptionExclude(m_configManager)); + return report; + } + return new TopReport().setStartTime(new Date(date)).setEndTime(new Date(date + TimeHelper.ONE_HOUR)); + } +} diff --git a/cat-home/src/main/webapp/jsp/spring/report/home/home.jsp b/cat-home/src/main/webapp/jsp/spring/report/home/home.jsp index 28038893e5..221c4abf32 100644 --- a/cat-home/src/main/webapp/jsp/spring/report/home/home.jsp +++ b/cat-home/src/main/webapp/jsp/spring/report/home/home.jsp @@ -1,58 +1,214 @@ <%@ page session="false" language="java" pageEncoding="UTF-8" %> <%@ page contentType="text/html; charset=utf-8" %> +<%@ page import="java.util.LinkedHashMap" %> +<%@ page import="java.util.Map" %> <% String contextPath = request.getContextPath(); String docName = (String) request.getAttribute("docName"); - String runtime = (String) request.getAttribute("runtime"); - String legacyHomeUrl = (String) request.getAttribute("legacyHomeUrl"); - String loginUrl = (String) request.getAttribute("loginUrl"); + String domain = (String) request.getAttribute("domain"); + String ipAddress = (String) request.getAttribute("ipAddress"); + String date = (String) request.getAttribute("date"); + String reportType = (String) request.getAttribute("reportType"); + String actionName = (String) request.getAttribute("actionName"); if (docName == null || docName.length() == 0) { docName = "index"; } + if (domain == null || domain.length() == 0) { + domain = "cat"; + } + if (ipAddress == null || ipAddress.length() == 0) { + ipAddress = "All"; + } + if (reportType == null || reportType.length() == 0) { + reportType = "day"; + } + if (actionName == null || actionName.length() == 0) { + actionName = "view"; + } + + Map jspModel = new LinkedHashMap(); + + jspModel.put("webapp", contextPath); + jspModel.put("domain", domain); + jspModel.put("ipAddress", ipAddress); + jspModel.put("date", date); + jspModel.put("reportType", reportType); + pageContext.setAttribute("model", jspModel); %> - + + - CAT Spring MVC Home - - + CAT + + + + + + + + + + + + + + + + + + + + - -
- - - - - - - - - - -
Path<%=request.getRequestURI()%>
Document<%=docName%>
- + diff --git a/cat-home/src/main/webapp/jsp/spring/report/top/top.jsp b/cat-home/src/main/webapp/jsp/spring/report/top/top.jsp new file mode 100644 index 0000000000..e070aed421 --- /dev/null +++ b/cat-home/src/main/webapp/jsp/spring/report/top/top.jsp @@ -0,0 +1,310 @@ +<%@ page session="false" language="java" pageEncoding="UTF-8" %> +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page import="java.text.DecimalFormat" %> +<%@ page import="java.util.List" %> +<%@ page import="java.util.Map" %> +<%@ page import="com.dianping.cat.report.page.dependency.TopMetric" %> +<% + String contextPath = request.getContextPath(); + String domain = (String) request.getAttribute("domain"); + String ipAddress = (String) request.getAttribute("ipAddress"); + String date = (String) request.getAttribute("date"); + String reportStart = (String) request.getAttribute("reportStart"); + String reportEnd = (String) request.getAttribute("reportEnd"); + String message = (String) request.getAttribute("message"); + String navPrefix = "domain=" + domain + "&op=view"; + Integer minute = (Integer) request.getAttribute("minute"); + Integer maxMinute = (Integer) request.getAttribute("maxMinute"); + Integer frequency = (Integer) request.getAttribute("frequency"); + Boolean refresh = (Boolean) request.getAttribute("refresh"); + Boolean fullScreen = (Boolean) request.getAttribute("fullScreen"); + List minutes = (List) request.getAttribute("minutes"); + Map> topResult = (Map>) request.getAttribute("topResult"); + DecimalFormat countFormat = new DecimalFormat("0"); + + if (domain == null || domain.length() == 0) { + domain = "cat"; + } + if (ipAddress == null || ipAddress.length() == 0) { + ipAddress = "All"; + } + if (date == null) { + date = ""; + } + navPrefix = "domain=" + domain + "&op=view"; + if (minute == null) { + minute = Integer.valueOf(0); + } + if (maxMinute == null) { + maxMinute = Integer.valueOf(60); + } + if (frequency == null) { + frequency = Integer.valueOf(10); + } + if (refresh == null) { + refresh = Boolean.FALSE; + } + if (fullScreen == null) { + fullScreen = Boolean.FALSE; + } +%> + + + + + + CAT + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+
    + <% + if (minutes != null) { + for (Integer item : minutes) { + boolean disabled = item.intValue() > maxMinute.intValue(); + String label = item.intValue() < 10 ? "0" + item : String.valueOf(item); + %> +
  • "> + <%=label%> +
  • + <% + } + } + %> +
+
+
+ <% + if (message != null && message.length() > 0) { + %> +

出问题CAT的服务端:<%=message%>

+ <% + } else { + %> +

CAT服务端正常

+ <% + } + if (topResult != null) { + for (Map.Entry> entry : topResult.entrySet()) { + %> + + + + <% + for (TopMetric.Item item : entry.getValue()) { + String style = ""; + String linkStyle = ""; + + if (item.getAlert() == 2) { + style = "background-color:red;color:white;"; + linkStyle = "color:white;"; + } else if (item.getAlert() == 1) { + style = "background-color:#bfa22f;color:white;"; + linkStyle = "color:white;"; + } + %> + + + + + <% + } + %> +
<%=entry.getKey()%>
系统
+ <%=shorten(item.getDomain(), 18)%> + <%=countFormat.format(item.getValue())%>
+ <% + } + } + %> +
+
+
+
+
+ + + +<%! + private String shorten(String value, int max) { + if (value == null) { + return ""; + } + if (value.length() <= max) { + return value; + } + return value.substring(0, max); + } +%> diff --git a/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcHomeControllerTest.java b/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcHomeControllerTest.java index d413f175da..0505f0164a 100644 --- a/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcHomeControllerTest.java +++ b/cat-home/src/test/java/com/dianping/cat/home/spring/web/SpringMvcHomeControllerTest.java @@ -15,29 +15,29 @@ public class SpringMvcHomeControllerTest { @Test public void shouldBuildDefaultHomeModel() { SpringMvcHomeController controller = new SpringMvcHomeController(); - Map model = controller.homeModel(request("/cat", Collections.emptyMap())); + Map model = controller.homeModel(request(Collections.emptyMap())); Assert.assertEquals("index", model.get("docName")); Assert.assertEquals("spring-mvc-migration", model.get("runtime")); - Assert.assertEquals("/cat/r/home", model.get("legacyHomeUrl")); + Assert.assertEquals("/cat/mvc/r/home", model.get("homeUrl")); Assert.assertEquals("/cat/mvc/s/login", model.get("loginUrl")); } @Test public void shouldPreserveRequestedDocName() { SpringMvcHomeController controller = new SpringMvcHomeController(); - Map model = controller.homeModel(request("/cat", Collections.singletonMap("docName", "plugin"))); + Map model = controller.homeModel(request(Collections.singletonMap("docName", "plugin"))); Assert.assertEquals("plugin", model.get("docName")); } - private HttpServletRequest request(String contextPath, Map parameters) { + private HttpServletRequest request(Map parameters) { return (HttpServletRequest) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] { HttpServletRequest.class }, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) { if ("getContextPath".equals(method.getName())) { - return contextPath; + return "/cat"; } if ("getParameter".equals(method.getName())) { return parameters.get(args[0]); From 61d48ad2a5aec20715d1cb9db98f9ce43690255c Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 21 Jun 2026 08:41:12 +0800 Subject: [PATCH 181/231] add install maven script --- script/install_maven.cmd | 0 script/install_maven.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 script/install_maven.cmd create mode 100644 script/install_maven.sh diff --git a/script/install_maven.cmd b/script/install_maven.cmd new file mode 100644 index 0000000000..e69de29bb2 diff --git a/script/install_maven.sh b/script/install_maven.sh new file mode 100644 index 0000000000..e69de29bb2 From abc860cb5387e77f1bc32d15ea184bfb2d29a469 Mon Sep 17 00:00:00 2001 From: Shang Date: Sun, 21 Jun 2026 15:15:19 +0800 Subject: [PATCH 182/231] add install maven script --- script/install_maven.cmd | 3 +++ script/install_maven.sh | 3 +++ 2 files changed, 6 insertions(+) diff --git a/script/install_maven.cmd b/script/install_maven.cmd index e69de29bb2..a5ce1929e5 100644 --- a/script/install_maven.cmd +++ b/script/install_maven.cmd @@ -0,0 +1,3 @@ +mvn install:install-file ` + -Dfile=D:\workspace\cat\cat-client\target\cat-client-4.0-RC1.jar ` + -DpomFile=D:\workspace\cat\cat-client\target\pom.xml \ No newline at end of file diff --git a/script/install_maven.sh b/script/install_maven.sh index e69de29bb2..f3df4d07a3 100644 --- a/script/install_maven.sh +++ b/script/install_maven.sh @@ -0,0 +1,3 @@ +mvn install:install-file ^ + -Dfile=D:\workspace\cat\cat-client\target\cat-client-4.0-RC1.jar ^ + -DpomFile=D:\workspace\cat\cat-client\target\pom.xml \ No newline at end of file From f3765e481e8e4197135727a124113b6a3c737174 Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 23 Jun 2026 22:48:15 +0800 Subject: [PATCH 183/231] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E8=87=B3SpringMVC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/web/SpringMvcEventController.java | 318 +++++++++++ .../spring/web/SpringMvcMigrationServlet.java | 8 + .../web/SpringMvcTransactionController.java | 319 +++++++++++ .../report/page/event/EventGraphBuilder.java | 17 + .../transaction/TransactionGraphBuilder.java | 24 + .../webapp/jsp/spring/report/event/event.jsp | 485 ++++++++++++++++ .../jsp/spring/report/event/eventGraphs.jsp | 75 +++ .../spring/report/transaction/transaction.jsp | 534 ++++++++++++++++++ .../report/transaction/transactionGraphs.jsp | 82 +++ 9 files changed, 1862 insertions(+) create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcEventController.java create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTransactionController.java create mode 100644 cat-home/src/main/java/com/dianping/cat/report/page/event/EventGraphBuilder.java create mode 100644 cat-home/src/main/java/com/dianping/cat/report/page/transaction/TransactionGraphBuilder.java create mode 100644 cat-home/src/main/webapp/jsp/spring/report/event/event.jsp create mode 100644 cat-home/src/main/webapp/jsp/spring/report/event/eventGraphs.jsp create mode 100644 cat-home/src/main/webapp/jsp/spring/report/transaction/transaction.jsp create mode 100644 cat-home/src/main/webapp/jsp/spring/report/transaction/transactionGraphs.jsp diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcEventController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcEventController.java new file mode 100644 index 0000000000..3a3201ff29 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcEventController.java @@ -0,0 +1,318 @@ +package com.dianping.cat.home.spring.web; + +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.dianping.cat.Cat; +import com.dianping.cat.Constants; +import com.dianping.cat.config.sample.SampleConfigManager; +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.consumer.event.model.entity.EventReport; +import com.dianping.cat.consumer.event.model.entity.EventType; +import com.dianping.cat.helper.JsonBuilder; +import com.dianping.cat.helper.SortHelper; +import com.dianping.cat.helper.TimeHelper; +import com.dianping.cat.mvc.UrlNav; +import com.dianping.cat.report.graph.PieChart; +import com.dianping.cat.report.graph.svg.GraphBuilder; +import com.dianping.cat.report.page.DomainGroupConfigManager; +import com.dianping.cat.report.page.event.DisplayNames; +import com.dianping.cat.report.page.event.DisplayNames.EventNameModel; +import com.dianping.cat.report.page.event.DisplayTypes; +import com.dianping.cat.report.page.event.EventGraphBuilder; +import com.dianping.cat.report.page.event.service.EventReportService; +import com.dianping.cat.report.page.event.transform.DistributionDetailVisitor; +import com.dianping.cat.report.page.event.transform.EventMergeHelper; +import com.dianping.cat.report.page.event.transform.PieGraphChartVisitor; +import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.report.service.ModelResponse; +import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.sample.entity.Domain; +import com.dianping.cat.service.HostinfoService; +import com.dianping.cat.service.ProjectService; +import com.dianping.cat.service.ProjectService.Department; +import jakarta.annotation.Resource; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class SpringMvcEventController { + private final SimpleDateFormat m_hourlyFormat = new SimpleDateFormat("yyyyMMddHH"); + + private final SimpleDateFormat m_subtitleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + private final EventGraphBuilder m_eventGraphBuilder = new EventGraphBuilder(); + + @Resource + private DomainGroupConfigManager m_configManager; + + @Resource + private GraphBuilder m_graphBuilder; + + @Resource + private HostinfoService m_hostinfoService; + + @Resource + private ProjectService m_projectService; + + @Resource + private SampleConfigManager m_sampleConfigManager; + + @Resource + private EventMergeHelper m_mergeHelper; + + @Resource + private EventReportService m_reportService; + + @Resource + @Qualifier("eventModelService") + private ModelService m_eventService; + + @GetMapping("/mvc/r/e") + public void event(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Map model = eventModel(request); + String view = "graphs".equals(model.get("action")) ? "/jsp/spring/report/event/eventGraphs.jsp" + : "/jsp/spring/report/event/event.jsp"; + + for (Map.Entry entry : model.entrySet()) { + request.setAttribute(entry.getKey(), entry.getValue()); + } + + RequestDispatcher dispatcher = request.getRequestDispatcher(view); + + dispatcher.forward(request, response); + } + + Map eventModel(HttpServletRequest request) { + Cat.logMetricForCount("http-request-event"); + + Map model = new LinkedHashMap(); + String contextPath = request.getContextPath(); + String action = parameter(request, "op", "view"); + String domain = parameter(request, "domain", Constants.CAT); + String ipAddress = parameter(request, "ip", Constants.ALL); + String reportType = parameter(request, "reportType", "day"); + String type = emptyToNull(request.getParameter("type")); + String name = emptyToNull(request.getParameter("name")); + String sortBy = emptyToNull(request.getParameter("sort")); + String group = emptyToNull(request.getParameter("group")); + long date = date(request.getParameter("date"), intParameter(request, "step", 0)); + + if (StringUtils.isEmpty(group)) { + group = m_configManager.queryDefaultGroup(domain); + } + + EventReport report = queryHourlyReport(domain, ipAddress, type, date); + + if (report != null) { + report = m_mergeHelper.mergeAllIps(report, ipAddress); + } + if (report == null) { + report = new EventReport(domain); + report.setStartTime(new Date(date)); + report.setEndTime(new Date(date + TimeHelper.ONE_HOUR)); + } + + if ("graphs".equals(action)) { + buildGraphs(model, domain, ipAddress, type, name, date); + } else if (StringUtils.isEmpty(type)) { + model.put("displayTypeReport", new DisplayTypes().display(sortBy, ipAddress, report)); + } else { + DisplayNames displayNames = new DisplayNames().display(sortBy, type, ipAddress, report); + + model.put("displayNameReport", displayNames); + model.put("pieChart", buildEventNamePieChart(displayNames.getResults())); + } + + List ips = report.getIps() == null ? new ArrayList() : SortHelper.sortIpAddress(report.getIps()); + + model.put("action", action); + model.put("contextPath", contextPath); + model.put("domain", report.getDomain()); + model.put("displayDomain", domain); + model.put("ipAddress", ipAddress); + model.put("reportType", reportType); + model.put("type", type); + model.put("encodedType", encode(type)); + model.put("name", name); + model.put("sortBy", sortBy); + model.put("date", m_hourlyFormat.format(new Date(date))); + model.put("longDate", date); + model.put("report", report); + model.put("reportStart", m_subtitleFormat.format(report.getStartTime())); + model.put("reportEnd", m_subtitleFormat.format(report.getEndTime())); + model.put("ips", ips); + model.put("ipToHostnameStr", new JsonBuilder().toJson(ipToHostname(ips))); + model.put("groups", m_configManager.queryDomainGroup(domain)); + model.put("group", group); + model.put("groupIps", m_configManager.queryIpByDomainAndGroup(domain, group)); + model.put("domainGroups", domainGroups()); + model.put("navs", UrlNav.values()); + model.put("baseUri", contextPath + "/mvc/r/e"); + model.put("sample", sample(report.getDomain())); + model.put("model", model); + return model; + } + + private void buildGraphs(Map model, String domain, String ipAddress, String type, String name, + long date) { + EventReport report = queryHourlyGraphReport(domain, ipAddress, type, name, date); + + if (report != null) { + if (Constants.ALL.equalsIgnoreCase(ipAddress)) { + PieGraphChartVisitor chartVisitor = new PieGraphChartVisitor(type, name); + DistributionDetailVisitor detailVisitor = new DistributionDetailVisitor(type, name); + + chartVisitor.visitEventReport(report); + detailVisitor.visitEventReport(report); + model.put("distributionChart", chartVisitor.getPieChart().getJsonString()); + model.put("distributionDetails", detailVisitor.getDetails()); + } + + report = m_mergeHelper.mergeAllIps(report, ipAddress); + String graphName = StringUtils.isEmpty(name) ? Constants.ALL : name; + + if (StringUtils.isEmpty(name)) { + report = m_mergeHelper.mergeAllNames(report, ipAddress, graphName); + } + buildEventNameGraph(model, report, type, graphName, ipAddress); + } + } + + private void buildEventNameGraph(Map model, EventReport report, String type, String name, String ip) { + EventType eventType = report.findOrCreateMachine(ip).findOrCreateType(type); + EventName eventName = eventType.findOrCreateName(name); + + model.putAll(m_eventGraphBuilder.build(m_graphBuilder, eventName)); + } + + private String buildEventNamePieChart(List names) { + PieChart chart = new PieChart(); + List items = new ArrayList(); + + for (int i = 1; i < names.size(); i++) { + EventNameModel name = names.get(i); + PieChart.Item item = new PieChart.Item(); + EventName event = name.getDetail(); + + item.setNumber(event.getTotalCount()).setTitle(event.getId()); + items.add(item); + } + chart.addItems(items); + return new JsonBuilder().toJson(chart); + } + + private long date(String value, int step) { + long current = System.currentTimeMillis(); + long currentHour = current - current % TimeHelper.ONE_HOUR; + long result = currentHour; + + if (value != null && value.length() > 0) { + try { + result = value.length() == 10 ? m_hourlyFormat.parse(value).getTime() + : new SimpleDateFormat("yyyyMMdd").parse(value).getTime(); + } catch (ParseException e) { + result = currentHour; + } + } + result = result + step * TimeHelper.ONE_HOUR; + return Math.min(result, currentHour); + } + + private Map domainGroups() { + Collection domains = m_projectService.findAllDomains(); + + return m_projectService.findDepartments(domains); + } + + private String emptyToNull(String value) { + if (value == null || value.length() == 0) { + return null; + } + return value; + } + + private String encode(String value) { + if (value == null) { + return ""; + } + return URLEncoder.encode(value, StandardCharsets.UTF_8); + } + + private int intParameter(HttpServletRequest request, String name, int defaultValue) { + String value = request.getParameter(name); + + if (value != null && value.length() > 0) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + return defaultValue; + } + } + return defaultValue; + } + + private Map ipToHostname(List ips) { + Map result = new LinkedHashMap(); + + for (String ip : ips) { + String hostname = m_hostinfoService.queryHostnameByIp(ip); + + if (hostname != null && !"null".equalsIgnoreCase(hostname)) { + result.put(ip, hostname); + } + } + return result; + } + + private String parameter(HttpServletRequest request, String name, String defaultValue) { + String value = request.getParameter(name); + + if (value == null || value.length() == 0) { + return defaultValue; + } + return value; + } + + private EventReport queryHourlyGraphReport(String domain, String ipAddress, String type, String name, long date) { + String graphName = StringUtils.isEmpty(name) ? "*" : name; + ModelRequest request = new ModelRequest(domain, date).setProperty("type", type).setProperty("name", graphName) + .setProperty("ip", ipAddress); + ModelResponse response = m_eventService.invoke(request); + + return response.getModel(); + } + + private EventReport queryHourlyReport(String domain, String ipAddress, String type, long date) { + ModelRequest request = new ModelRequest(domain, date).setProperty("type", type).setProperty("ip", ipAddress); + + if (m_eventService.isEligable(request)) { + ModelResponse response = m_eventService.invoke(request); + + return response.getModel(); + } + return m_reportService.queryReport(domain, new Date(date), new Date(date + TimeHelper.ONE_HOUR)); + } + + private double sample(String domain) { + Domain sampleDomain = m_sampleConfigManager.getConfig().findDomain(domain); + + return sampleDomain == null ? 1.0 : sampleDomain.getSample(); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java index ee2667fa83..4f3c444464 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java @@ -24,6 +24,8 @@ public class SpringMvcMigrationServlet extends HttpServlet { private SpringMvcBusinessController m_businessController; + private SpringMvcEventController m_eventController; + private SpringMvcHomeController m_homeController; private SpringMvcLoginController m_loginController; @@ -36,6 +38,8 @@ public class SpringMvcMigrationServlet extends HttpServlet { private SpringMvcTopController m_topController; + private SpringMvcTransactionController m_transactionController; + private Map m_routes = Collections.emptyMap(); @Override @@ -49,6 +53,7 @@ public void init(ServletConfig config) throws ServletException { throw new ServletException("CAT home Spring context is not initialized."); } m_businessController = context.getBean(SpringMvcBusinessController.class); + m_eventController = context.getBean(SpringMvcEventController.class); m_healthController = context.getBean(SpringMvcHealthController.class); m_homeController = context.getBean(SpringMvcHomeController.class); m_loginController = context.getBean(SpringMvcLoginController.class); @@ -56,6 +61,7 @@ public void init(ServletConfig config) throws ServletException { m_projectController = context.getBean(SpringMvcProjectController.class); m_routerController = context.getBean(SpringMvcRouterController.class); m_topController = context.getBean(SpringMvcTopController.class); + m_transactionController = context.getBean(SpringMvcTransactionController.class); m_routes = buildRoutes(); } @@ -82,6 +88,8 @@ private Map buildRoutes() { register(routes, "GET", "/s/project", m_projectController::project); register(routes, "GET", "/s/router", m_routerController::router); register(routes, "GET", "/r/top", m_topController::top); + register(routes, "GET", "/r/t", m_transactionController::transaction); + register(routes, "GET", "/r/e", m_eventController::event); register(routes, "POST", "/s/login", m_loginController::submit); return Collections.unmodifiableMap(routes); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTransactionController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTransactionController.java new file mode 100644 index 0000000000..e7bff2022c --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTransactionController.java @@ -0,0 +1,319 @@ +package com.dianping.cat.home.spring.web; + +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.dianping.cat.Cat; +import com.dianping.cat.Constants; +import com.dianping.cat.config.sample.SampleConfigManager; +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.consumer.transaction.model.entity.TransactionReport; +import com.dianping.cat.consumer.transaction.model.entity.TransactionType; +import com.dianping.cat.helper.JsonBuilder; +import com.dianping.cat.helper.SortHelper; +import com.dianping.cat.helper.TimeHelper; +import com.dianping.cat.mvc.UrlNav; +import com.dianping.cat.report.graph.PieChart; +import com.dianping.cat.report.graph.svg.GraphBuilder; +import com.dianping.cat.report.page.DomainGroupConfigManager; +import com.dianping.cat.report.page.transaction.DisplayNames; +import com.dianping.cat.report.page.transaction.DisplayNames.TransactionNameModel; +import com.dianping.cat.report.page.transaction.DisplayTypes; +import com.dianping.cat.report.page.transaction.TransactionGraphBuilder; +import com.dianping.cat.report.page.transaction.service.TransactionReportService; +import com.dianping.cat.report.page.transaction.transform.DistributionDetailVisitor; +import com.dianping.cat.report.page.transaction.transform.PieGraphChartVisitor; +import com.dianping.cat.report.page.transaction.transform.TransactionMergeHelper; +import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.report.service.ModelResponse; +import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.sample.entity.Domain; +import com.dianping.cat.service.HostinfoService; +import com.dianping.cat.service.ProjectService; +import com.dianping.cat.service.ProjectService.Department; +import jakarta.annotation.Resource; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class SpringMvcTransactionController { + private final SimpleDateFormat m_hourlyFormat = new SimpleDateFormat("yyyyMMddHH"); + + private final SimpleDateFormat m_subtitleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + private final TransactionGraphBuilder m_transactionGraphBuilder = new TransactionGraphBuilder(); + + @Resource + private DomainGroupConfigManager m_configManager; + + @Resource + private GraphBuilder m_graphBuilder; + + @Resource + private HostinfoService m_hostinfoService; + + @Resource + private ProjectService m_projectService; + + @Resource + private SampleConfigManager m_sampleConfigManager; + + @Resource + private TransactionMergeHelper m_mergeHelper; + + @Resource + private TransactionReportService m_reportService; + + @Resource + @Qualifier("transactionModelService") + private ModelService m_transactionService; + + @GetMapping("/mvc/r/t") + public void transaction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Map model = transactionModel(request); + String view = "graphs".equals(model.get("action")) ? "/jsp/spring/report/transaction/transactionGraphs.jsp" + : "/jsp/spring/report/transaction/transaction.jsp"; + + for (Map.Entry entry : model.entrySet()) { + request.setAttribute(entry.getKey(), entry.getValue()); + } + + RequestDispatcher dispatcher = request.getRequestDispatcher(view); + + dispatcher.forward(request, response); + } + + Map transactionModel(HttpServletRequest request) { + Cat.logMetricForCount("http-request-transaction"); + + Map model = new LinkedHashMap(); + String contextPath = request.getContextPath(); + String action = parameter(request, "op", "view"); + String domain = parameter(request, "domain", Constants.CAT); + String ipAddress = parameter(request, "ip", Constants.ALL); + String reportType = parameter(request, "reportType", "day"); + String type = emptyToNull(request.getParameter("type")); + String name = emptyToNull(request.getParameter("name")); + String queryName = emptyToNull(request.getParameter("queryname")); + String sortBy = emptyToNull(request.getParameter("sort")); + String group = emptyToNull(request.getParameter("group")); + long date = date(request.getParameter("date"), intParameter(request, "step", 0)); + + if (StringUtils.isEmpty(group)) { + group = m_configManager.queryDefaultGroup(domain); + } + + TransactionReport report = queryHourlyReport(domain, ipAddress, type, date); + + if (report != null) { + report = m_mergeHelper.mergeAllMachines(report, ipAddress); + } + if (report == null) { + report = new TransactionReport(domain); + report.setStartTime(new Date(date)); + report.setEndTime(new Date(date + TimeHelper.ONE_HOUR)); + } + + if ("graphs".equals(action)) { + buildGraphs(model, domain, ipAddress, type, name, date); + } else if (StringUtils.isEmpty(type)) { + model.put("displayTypeReport", new DisplayTypes().display(sortBy, ipAddress, report)); + } else { + DisplayNames displayNames = new DisplayNames().display(sortBy, type, ipAddress, report, queryName); + + model.put("displayNameReport", displayNames); + model.put("pieChart", buildTransactionNamePieChart(displayNames.getResults())); + } + + List ips = report.getIps() == null ? new ArrayList() : SortHelper.sortIpAddress(report.getIps()); + + model.put("action", action); + model.put("contextPath", contextPath); + model.put("domain", report.getDomain()); + model.put("displayDomain", domain); + model.put("ipAddress", ipAddress); + model.put("reportType", reportType); + model.put("type", type); + model.put("encodedType", encode(type)); + model.put("name", name); + model.put("queryName", queryName); + model.put("sortBy", sortBy); + model.put("date", m_hourlyFormat.format(new Date(date))); + model.put("longDate", date); + model.put("report", report); + model.put("reportStart", m_subtitleFormat.format(report.getStartTime())); + model.put("reportEnd", m_subtitleFormat.format(report.getEndTime())); + model.put("ips", ips); + model.put("ipToHostnameStr", new JsonBuilder().toJson(ipToHostname(ips))); + model.put("groups", m_configManager.queryDomainGroup(domain)); + model.put("group", group); + model.put("groupIps", m_configManager.queryIpByDomainAndGroup(domain, group)); + model.put("domainGroups", domainGroups()); + model.put("navs", UrlNav.values()); + model.put("baseUri", contextPath + "/mvc/r/t"); + model.put("sample", sample(report.getDomain())); + model.put("model", model); + return model; + } + + private void buildGraphs(Map model, String domain, String ipAddress, String type, String name, + long date) { + TransactionReport report = queryHourlyGraphReport(domain, ipAddress, type, name, date); + + if (report != null) { + if (Constants.ALL.equalsIgnoreCase(ipAddress)) { + PieGraphChartVisitor chartVisitor = new PieGraphChartVisitor(type, name); + DistributionDetailVisitor detailVisitor = new DistributionDetailVisitor(type, name); + + chartVisitor.visitTransactionReport(report); + detailVisitor.visitTransactionReport(report); + model.put("distributionChart", chartVisitor.getPieChart().getJsonString()); + model.put("distributionDetails", detailVisitor.getDetails()); + } + + String graphName = StringUtils.isEmpty(name) ? Constants.ALL : name; + + report = m_mergeHelper.mergeAllNames(report, ipAddress, graphName); + buildTransactionNameGraph(model, report, type, graphName, ipAddress); + } + } + + private void buildTransactionNameGraph(Map model, TransactionReport report, String type, String name, + String ip) { + TransactionType transactionType = report.findOrCreateMachine(ip).findOrCreateType(type); + TransactionName transactionName = transactionType.findOrCreateName(name); + + model.putAll(m_transactionGraphBuilder.build(m_graphBuilder, transactionName)); + } + + private String buildTransactionNamePieChart(List names) { + PieChart chart = new PieChart(); + List items = new ArrayList(); + + for (int i = 1; i < names.size(); i++) { + TransactionNameModel name = names.get(i); + PieChart.Item item = new PieChart.Item(); + TransactionName transaction = name.getDetail(); + + item.setNumber(transaction.getTotalCount()).setTitle(transaction.getId()); + items.add(item); + } + chart.addItems(items); + return new JsonBuilder().toJson(chart); + } + + private long date(String value, int step) { + long current = System.currentTimeMillis(); + long currentHour = current - current % TimeHelper.ONE_HOUR; + long result = currentHour; + + if (value != null && value.length() > 0) { + try { + result = value.length() == 10 ? m_hourlyFormat.parse(value).getTime() + : new SimpleDateFormat("yyyyMMdd").parse(value).getTime(); + } catch (ParseException e) { + result = currentHour; + } + } + result = result + step * TimeHelper.ONE_HOUR; + return Math.min(result, currentHour); + } + + private Map domainGroups() { + Collection domains = m_projectService.findAllDomains(); + + return m_projectService.findDepartments(domains); + } + + private String emptyToNull(String value) { + if (value == null || value.length() == 0) { + return null; + } + return value; + } + + private String encode(String value) { + if (value == null) { + return ""; + } + return URLEncoder.encode(value, StandardCharsets.UTF_8); + } + + private int intParameter(HttpServletRequest request, String name, int defaultValue) { + String value = request.getParameter(name); + + if (value != null && value.length() > 0) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + return defaultValue; + } + } + return defaultValue; + } + + private Map ipToHostname(List ips) { + Map result = new LinkedHashMap(); + + for (String ip : ips) { + String hostname = m_hostinfoService.queryHostnameByIp(ip); + + if (hostname != null && !"null".equalsIgnoreCase(hostname)) { + result.put(ip, hostname); + } + } + return result; + } + + private String parameter(HttpServletRequest request, String name, String defaultValue) { + String value = request.getParameter(name); + + if (value == null || value.length() == 0) { + return defaultValue; + } + return value; + } + + private TransactionReport queryHourlyGraphReport(String domain, String ipAddress, String type, String name, long date) { + String graphName = StringUtils.isEmpty(name) ? "*" : name; + ModelRequest request = new ModelRequest(domain, date).setProperty("type", type).setProperty("name", graphName) + .setProperty("ip", ipAddress); + ModelResponse response = m_transactionService.invoke(request); + + return response.getModel(); + } + + private TransactionReport queryHourlyReport(String domain, String ipAddress, String type, long date) { + ModelRequest request = new ModelRequest(domain, date).setProperty("type", type).setProperty("ip", ipAddress); + + if (m_transactionService.isEligable(request)) { + ModelResponse response = m_transactionService.invoke(request); + + return response.getModel(); + } + return m_reportService.queryReport(domain, new Date(date), new Date(date + TimeHelper.ONE_HOUR)); + } + + private double sample(String domain) { + Domain sampleDomain = m_sampleConfigManager.getConfig().findDomain(domain); + + return sampleDomain == null ? 1.0 : sampleDomain.getSample(); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/event/EventGraphBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/event/EventGraphBuilder.java new file mode 100644 index 0000000000..57014bda05 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/page/event/EventGraphBuilder.java @@ -0,0 +1,17 @@ +package com.dianping.cat.report.page.event; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.event.model.entity.EventName; +import com.dianping.cat.report.graph.svg.GraphBuilder; + +public class EventGraphBuilder { + public Map build(GraphBuilder builder, EventName eventName) { + Map graphs = new LinkedHashMap(); + + graphs.put("graph1", builder.build(new HitPayload("Hits Over Time", "Time (min)", "Count", eventName))); + graphs.put("graph2", builder.build(new FailurePayload("Failures Over Time", "Time (min)", "Count", eventName))); + return graphs; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/TransactionGraphBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/TransactionGraphBuilder.java new file mode 100644 index 0000000000..8f06bc2a0f --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/TransactionGraphBuilder.java @@ -0,0 +1,24 @@ +package com.dianping.cat.report.page.transaction; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.dianping.cat.consumer.transaction.model.entity.TransactionName; +import com.dianping.cat.report.graph.svg.GraphBuilder; +import com.dianping.cat.report.page.transaction.GraphPayload.AverageTimePayload; +import com.dianping.cat.report.page.transaction.GraphPayload.DurationPayload; +import com.dianping.cat.report.page.transaction.GraphPayload.FailurePayload; +import com.dianping.cat.report.page.transaction.GraphPayload.HitPayload; + +public class TransactionGraphBuilder { + public Map build(GraphBuilder builder, TransactionName transactionName) { + Map graphs = new LinkedHashMap(); + + graphs.put("graph1", builder.build(new DurationPayload("Duration Distribution", "Duration (ms)", "Count", transactionName))); + graphs.put("graph2", builder.build(new HitPayload("Hits Over Time", "Time (min)", "Count", transactionName))); + graphs.put("graph3", builder.build(new AverageTimePayload("Average Duration Over Time", "Time (min)", + "Average Duration (ms)", transactionName))); + graphs.put("graph4", builder.build(new FailurePayload("Failures Over Time", "Time (min)", "Count", transactionName))); + return graphs; + } +} diff --git a/cat-home/src/main/webapp/jsp/spring/report/event/event.jsp b/cat-home/src/main/webapp/jsp/spring/report/event/event.jsp new file mode 100644 index 0000000000..c88e2e9c4e --- /dev/null +++ b/cat-home/src/main/webapp/jsp/spring/report/event/event.jsp @@ -0,0 +1,485 @@ +<%@ page session="false" language="java" pageEncoding="UTF-8" %> +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page import="java.text.DecimalFormat" %> +<%@ page import="java.util.List" %> +<%@ page import="java.util.Map" %> +<%@ page import="com.dianping.cat.Constants" %> +<%@ page import="com.dianping.cat.consumer.event.model.entity.EventName" %> +<%@ page import="com.dianping.cat.consumer.event.model.entity.EventReport" %> +<%@ page import="com.dianping.cat.consumer.event.model.entity.EventType" %> +<%@ page import="com.dianping.cat.mvc.UrlNav" %> +<%@ page import="com.dianping.cat.report.page.event.DisplayNames" %> +<%@ page import="com.dianping.cat.report.page.event.DisplayNames.EventNameModel" %> +<%@ page import="com.dianping.cat.report.page.event.DisplayTypes" %> +<%@ page import="com.dianping.cat.report.page.event.DisplayTypes.EventTypeModel" %> +<%@ page import="com.dianping.cat.service.ProjectService.Department" %> +<%@ page import="com.dianping.cat.service.ProjectService.ProjectLine" %> +<% + String contextPath = (String) request.getAttribute("contextPath"); + String domain = (String) request.getAttribute("domain"); + String displayDomain = (String) request.getAttribute("displayDomain"); + String ipAddress = (String) request.getAttribute("ipAddress"); + String date = (String) request.getAttribute("date"); + String reportType = (String) request.getAttribute("reportType"); + String type = (String) request.getAttribute("type"); + String encodedType = (String) request.getAttribute("encodedType"); + String reportStart = (String) request.getAttribute("reportStart"); + String reportEnd = (String) request.getAttribute("reportEnd"); + String ipToHostnameStr = (String) request.getAttribute("ipToHostnameStr"); + String pieChart = (String) request.getAttribute("pieChart"); + EventReport report = (EventReport) request.getAttribute("report"); + DisplayTypes displayTypeReport = (DisplayTypes) request.getAttribute("displayTypeReport"); + DisplayNames displayNameReport = (DisplayNames) request.getAttribute("displayNameReport"); + List ips = (List) request.getAttribute("ips"); + List groups = (List) request.getAttribute("groups"); + Map domainGroups = (Map) request.getAttribute("domainGroups"); + UrlNav[] navs = (UrlNav[]) request.getAttribute("navs"); + Number sample = (Number) request.getAttribute("sample"); + DecimalFormat integerFormat = new DecimalFormat("#,###,###,###,##0"); + DecimalFormat percentFormat = new DecimalFormat("0.0000%"); + DecimalFormat oneDecimalFormat = new DecimalFormat("###,##0.0"); + DecimalFormat totalPercentFormat = new DecimalFormat("0.0000%"); + int lastIndex = -1; + + if (contextPath == null) { + contextPath = request.getContextPath(); + } + if (domain == null) { + domain = Constants.CAT; + } + if (displayDomain == null) { + displayDomain = domain; + } + if (ipAddress == null) { + ipAddress = Constants.ALL; + } + if (date == null) { + date = ""; + } + if (reportType == null || reportType.length() == 0) { + reportType = "day"; + } + if (encodedType == null) { + encodedType = ""; + } + String navPrefix = "ip=" + ipAddress + "&domain=" + domain + (type == null ? "" : "&type=" + encodedType); +%> + + + + + + CAT + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + + + +
 [  + ">All +  ]  + <% if (ips != null) { for (String ip : ips) { %> +  [ "><%=html(ip)%> ]  + <% } } %> +
+ + + + + + +
+ <% if (groups != null) { for (String itemGroup : groups) { %> +  [ <%=html(itemGroup)%> ]  + <% } } %> +
+ + <% if (type == null || type.length() == 0) { %> + + + + + + + + + <% if (displayTypeReport != null) { + int index = 0; + for (EventTypeModel item : displayTypeReport.getResults()) { + EventType e = item.getDetail(); + lastIndex = index; + %> + + + + + + + + + + + <% index++; } } %> + <% } else { %> + + + + + + + + + + + <% if (displayNameReport != null) { + int index = 0; + for (EventNameModel item : displayNameReport.getResults()) { + EventName e = item.getDetail(); + lastIndex = index; + %> + + + + + + + + + + + + <% index++; } } %> + <% } %> +
TypeTotalFailureFailure%Sample LinkQPS
[:: show ::] +   <%=html(e.getId())%><%=integerFormat.format(e.getTotalCount())%><%=integerFormat.format(e.getFailCount())%> <%=percentFormat.format(e.getFailPercent() / 100)%>Log View<%=oneDecimalFormat.format(e.getTps())%>
[:: show ::] + NameTotalFailureFailure%Sample LinkQPSPercent%
+ <% if (index > 0) { %> + [:: show ::] + <% } %> +   <%=html(e.getId())%> + <%=integerFormat.format(e.getTotalCount())%><%=integerFormat.format(e.getFailCount())%> <%=percentFormat.format(e.getFailPercent() / 100)%>Log View<%=oneDecimalFormat.format(e.getTps())%><%=totalPercentFormat.format(e.getTotalPercent())%>
+ <%=lastIndex + 1%> + <% if (type != null && type.length() > 0) { %> +
+ + <% } %> +
+
+
+
+ + + + +<%! + private String html(String value) { + if (value == null) { + return ""; + } + return value.replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """); + } + + private String js(String value) { + if (value == null) { + return ""; + } + return value.replace("\\", "\\\\").replace("'", "\\'").replace("\r", "\\r").replace("\n", "\\n"); + } + + private String messageUrl(String failMessageUrl, String successMessageUrl) { + if (failMessageUrl != null && failMessageUrl.length() > 0) { + return failMessageUrl; + } + return successMessageUrl == null ? "" : successMessageUrl; + } +%> diff --git a/cat-home/src/main/webapp/jsp/spring/report/event/eventGraphs.jsp b/cat-home/src/main/webapp/jsp/spring/report/event/eventGraphs.jsp new file mode 100644 index 0000000000..67f8e1f29c --- /dev/null +++ b/cat-home/src/main/webapp/jsp/spring/report/event/eventGraphs.jsp @@ -0,0 +1,75 @@ +<%@ page session="false" language="java" pageEncoding="UTF-8" %> +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page import="java.text.DecimalFormat" %> +<%@ page import="java.util.List" %> +<%@ page import="com.dianping.cat.report.page.event.transform.DistributionDetailVisitor.DistributionDetail" %> +<% + String contextPath = (String) request.getAttribute("contextPath"); + String ipAddress = (String) request.getAttribute("ipAddress"); + String graph1 = (String) request.getAttribute("graph1"); + String graph2 = (String) request.getAttribute("graph2"); + String distributionChart = (String) request.getAttribute("distributionChart"); + List distributionDetails = (List) request.getAttribute("distributionDetails"); + DecimalFormat integerFormat = new DecimalFormat("#,###,###,###,##0"); + DecimalFormat percentFormat = new DecimalFormat("0.0000%"); + + if (contextPath == null) { + contextPath = request.getContextPath(); + } +%> + + + + + + + <%=graph1 == null ? "" : graph1%> + <%=graph2 == null ? "" : graph2%> + + +<% if ("All".equals(ipAddress) && distributionDetails != null) { %> + + + + + + + + + <% for (DistributionDetail item : distributionDetails) { %> + + + + + + + <% } %> +
分布统计
IpTotalFailureFailure%
<%=html(item.getIp())%><%=integerFormat.format(item.getTotalCount())%><%=integerFormat.format(item.getFailCount())%><%=percentFormat.format(item.getFailPercent() / 100)%>
+
+ +
+ + +<% } %> + +
+<%! + private String html(String value) { + if (value == null) { + return ""; + } + return value.replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """); + } +%> diff --git a/cat-home/src/main/webapp/jsp/spring/report/transaction/transaction.jsp b/cat-home/src/main/webapp/jsp/spring/report/transaction/transaction.jsp new file mode 100644 index 0000000000..dfa6d43e9d --- /dev/null +++ b/cat-home/src/main/webapp/jsp/spring/report/transaction/transaction.jsp @@ -0,0 +1,534 @@ +<%@ page session="false" language="java" pageEncoding="UTF-8" %> +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page import="java.text.DecimalFormat" %> +<%@ page import="java.util.List" %> +<%@ page import="java.util.Map" %> +<%@ page import="com.dianping.cat.Constants" %> +<%@ page import="com.dianping.cat.consumer.transaction.model.entity.TransactionName" %> +<%@ page import="com.dianping.cat.consumer.transaction.model.entity.TransactionReport" %> +<%@ page import="com.dianping.cat.consumer.transaction.model.entity.TransactionType" %> +<%@ page import="com.dianping.cat.mvc.UrlNav" %> +<%@ page import="com.dianping.cat.report.page.transaction.DisplayNames" %> +<%@ page import="com.dianping.cat.report.page.transaction.DisplayNames.TransactionNameModel" %> +<%@ page import="com.dianping.cat.report.page.transaction.DisplayTypes" %> +<%@ page import="com.dianping.cat.report.page.transaction.DisplayTypes.TransactionTypeModel" %> +<%@ page import="com.dianping.cat.service.ProjectService.Department" %> +<%@ page import="com.dianping.cat.service.ProjectService.ProjectLine" %> +<% + String contextPath = (String) request.getAttribute("contextPath"); + String domain = (String) request.getAttribute("domain"); + String displayDomain = (String) request.getAttribute("displayDomain"); + String ipAddress = (String) request.getAttribute("ipAddress"); + String date = (String) request.getAttribute("date"); + String reportType = (String) request.getAttribute("reportType"); + String type = (String) request.getAttribute("type"); + String encodedType = (String) request.getAttribute("encodedType"); + String queryName = (String) request.getAttribute("queryName"); + String reportStart = (String) request.getAttribute("reportStart"); + String reportEnd = (String) request.getAttribute("reportEnd"); + String ipToHostnameStr = (String) request.getAttribute("ipToHostnameStr"); + String pieChart = (String) request.getAttribute("pieChart"); + TransactionReport report = (TransactionReport) request.getAttribute("report"); + DisplayTypes displayTypeReport = (DisplayTypes) request.getAttribute("displayTypeReport"); + DisplayNames displayNameReport = (DisplayNames) request.getAttribute("displayNameReport"); + List ips = (List) request.getAttribute("ips"); + List groups = (List) request.getAttribute("groups"); + Map domainGroups = (Map) request.getAttribute("domainGroups"); + UrlNav[] navs = (UrlNav[]) request.getAttribute("navs"); + Double sample = (Double) request.getAttribute("sample"); + DecimalFormat integerFormat = new DecimalFormat("#,###,###,###,##0"); + DecimalFormat percentFormat = new DecimalFormat("0.0000%"); + DecimalFormat totalPercentFormat = new DecimalFormat("0.00%"); + DecimalFormat oneDecimalFormat = new DecimalFormat("###,##0.0"); + DecimalFormat optionalDecimalFormat = new DecimalFormat("###,##0.#"); + + if (contextPath == null) { + contextPath = request.getContextPath(); + } + if (displayDomain == null) { + displayDomain = domain; + } + if (queryName == null) { + queryName = ""; + } + if (encodedType == null) { + encodedType = ""; + } + if (reportType == null || reportType.length() == 0) { + reportType = "day"; + } + String navPrefix = "ip=" + ipAddress + "&queryname=" + queryName + "&domain=" + domain + + (type == null ? "" : "&type=" + encodedType); +%> + + + + + + CAT + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + <% if (sample != null && sample.doubleValue() != 1.0) { %> +
+
閲囨牱
+
+
+
+
+
+
+
+
+ <% } %> + + + + +
 [  + ">All +  ]  + <% if (ips != null) { for (String ip : ips) { %> +  [ "><%=ip%> ]  + <% } } %> +
+ + + + + + +
+ <% if (groups != null) { for (String itemGroup : groups) { %> +  [ <%=html(itemGroup)%> ]  + <% } } %> +
+ + <% if (type == null || type.length() == 0) { %> + + + + + + + + + + + + + + + <% if (displayTypeReport != null) { + int index = 0; + for (TransactionTypeModel item : displayTypeReport.getResults()) { + TransactionType e = item.getDetail(); + %> + + + + + + + + + + + + + + + + + <% index++; } } %> + <% } else { %> + + + + + + + + + + + + + + + + + + <% if (displayNameReport != null) { + int index = 0; + for (TransactionNameModel item : displayNameReport.getResults()) { + TransactionName e = item.getDetail(); + %> + + <% if (index > 0) { %> + + <% } else { %> + + <% } %> + + + + + + + + <% if (index > 0) { %> + + + <% } else { %> + + + <% } %> + + + + + + + <% index++; } } %> + <% } %> +
TypeTotalFailureFailure%Sample LinkMin(ms)Max(ms)Avg(ms)95Line(ms)99.9Line(ms)Std(ms)QPS
[:: show ::] +    <%=html(e.getId())%><%=integerFormat.format(e.getTotalCount())%><%=integerFormat.format(e.getFailCount())%> <%=percentFormat.format(e.getFailPercent() / 100)%>Log View<%=optionalDecimalFormat.format(e.getMin())%><%=optionalDecimalFormat.format(e.getMax())%><%=oneDecimalFormat.format(e.getAvg())%><%=oneDecimalFormat.format(e.getLine95Value())%><%=oneDecimalFormat.format(e.getLine99Value())%><%=oneDecimalFormat.format(e.getStd())%><%=oneDecimalFormat.format(e.getTps())%>
+ + 鏀寔澶氫釜瀛楃涓叉煡璇紝渚嬪sql|url|task锛屾煡璇㈢粨鏋滀负鍖呭惈浠讳竴sql銆乽rl銆乼ask鐨勫垪銆? +
[:: show ::] + NameTotalFailureFailure%Sample LinkMin(ms)Max(ms)Avg(ms)95Line(ms)99.9Line(ms)Std(ms)QPSPercent%
+ [:: show ::] +   <%=html(shorten(e.getId(), 120))%> + <%=html(shorten(e.getId(), 120))%><%=integerFormat.format(e.getTotalCount())%><%=integerFormat.format(e.getFailCount())%> <%=percentFormat.format(e.getFailPercent() / 100)%>Log View<%=optionalDecimalFormat.format(e.getMin())%><%=optionalDecimalFormat.format(e.getMax())%><%=oneDecimalFormat.format(e.getAvg())%><%=oneDecimalFormat.format(e.getLine95Value())%><%=oneDecimalFormat.format(e.getLine99Value())%>--<%=oneDecimalFormat.format(e.getStd())%><%=oneDecimalFormat.format(e.getTps())%><%=totalPercentFormat.format(e.getTotalPercent())%>
+ + <% if (type != null && type.length() > 0) { %> +
+ + <% } %> +
+
+
+
+ + + + +<%! + private String html(String value) { + if (value == null) { + return ""; + } + return value.replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """); + } + + private String messageUrl(String failMessageUrl, String successMessageUrl) { + if (failMessageUrl != null && failMessageUrl.length() > 0) { + return failMessageUrl; + } + return successMessageUrl == null ? "" : successMessageUrl; + } + + private String js(String value) { + if (value == null) { + return ""; + } + return value.replace("\\", "\\\\").replace("'", "\\'").replace("\r", "\\r").replace("\n", "\\n"); + } + + private String shorten(String value, int max) { + if (value == null) { + return ""; + } + if (value.length() <= max) { + return value; + } + return value.substring(0, max); + } +%> diff --git a/cat-home/src/main/webapp/jsp/spring/report/transaction/transactionGraphs.jsp b/cat-home/src/main/webapp/jsp/spring/report/transaction/transactionGraphs.jsp new file mode 100644 index 0000000000..c0837a9e13 --- /dev/null +++ b/cat-home/src/main/webapp/jsp/spring/report/transaction/transactionGraphs.jsp @@ -0,0 +1,82 @@ +<%@ page session="false" language="java" pageEncoding="UTF-8" %> +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page import="java.text.DecimalFormat" %> +<%@ page import="java.util.List" %> +<%@ page import="com.dianping.cat.report.page.transaction.transform.DistributionDetailVisitor.DistributionDetail" %> +<% + String contextPath = (String) request.getAttribute("contextPath"); + String ipAddress = (String) request.getAttribute("ipAddress"); + String graph1 = (String) request.getAttribute("graph1"); + String graph2 = (String) request.getAttribute("graph2"); + String graph3 = (String) request.getAttribute("graph3"); + String graph4 = (String) request.getAttribute("graph4"); + String distributionChart = (String) request.getAttribute("distributionChart"); + List distributionDetails = (List) request.getAttribute("distributionDetails"); + DecimalFormat integerFormat = new DecimalFormat("#,###,###,###,##0"); + DecimalFormat percentFormat = new DecimalFormat("0.0000%"); + DecimalFormat oneDecimalFormat = new DecimalFormat("###,##0.0"); + DecimalFormat optionalDecimalFormat = new DecimalFormat("###,##0.#"); + + if (contextPath == null) { + contextPath = request.getContextPath(); + } +%> + + + + + + + + + <%=graph1 == null ? "" : graph1%> + <%=graph2 == null ? "" : graph2%> + <%=graph3 == null ? "" : graph3%> + <%=graph4 == null ? "" : graph4%> + +<% if ("All".equals(ipAddress) && distributionDetails != null) { %> + + + + + + + + + + + + + <% for (DistributionDetail item : distributionDetails) { %> + + + + + + + + + + + <% } %> +
鍒嗗竷缁熻
IpTotalFailureFailure%Min(ms)Max(ms)Avg(ms)Std(ms)
<%=item.getIp()%><%=integerFormat.format(item.getTotalCount())%><%=integerFormat.format(item.getFailCount())%><%=percentFormat.format(item.getFailPercent() / 100)%><%=optionalDecimalFormat.format(item.getMin())%><%=optionalDecimalFormat.format(item.getMax())%><%=oneDecimalFormat.format(item.getAvg())%><%=oneDecimalFormat.format(item.getStd())%>
+
+ +
+ + +<% } %> + +
From e7ae61f78d4451b50551c0f3c894d70da237d72f Mon Sep 17 00:00:00 2001 From: Shang Date: Tue, 23 Jun 2026 23:14:56 +0800 Subject: [PATCH 184/231] =?UTF-8?q?=E6=96=B0=E9=A1=B5=E9=9D=A2=E8=A7=84?= =?UTF-8?q?=E8=8C=83=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/web/SpringMvcEventController.java | 2 + .../web/SpringMvcTransactionController.java | 2 + .../webapp/jsp/spring/report/event/event.jsp | 394 ++++++--------- .../jsp/spring/report/event/eventGraphs.jsp | 64 +-- .../spring/report/transaction/transaction.jsp | 459 +++++++----------- .../report/transaction/transactionGraphs.jsp | 72 ++- 6 files changed, 385 insertions(+), 608 deletions(-) diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcEventController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcEventController.java index 3a3201ff29..629fe9e73a 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcEventController.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcEventController.java @@ -164,6 +164,8 @@ Map eventModel(HttpServletRequest request) { model.put("groupIps", m_configManager.queryIpByDomainAndGroup(domain, group)); model.put("domainGroups", domainGroups()); model.put("navs", UrlNav.values()); + model.put("navPrefix", "ip=" + ipAddress + "&domain=" + report.getDomain() + + (type == null ? "" : "&type=" + encode(type))); model.put("baseUri", contextPath + "/mvc/r/e"); model.put("sample", sample(report.getDomain())); model.put("model", model); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTransactionController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTransactionController.java index e7bff2022c..fede13b454 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTransactionController.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTransactionController.java @@ -167,6 +167,8 @@ Map transactionModel(HttpServletRequest request) { model.put("groupIps", m_configManager.queryIpByDomainAndGroup(domain, group)); model.put("domainGroups", domainGroups()); model.put("navs", UrlNav.values()); + model.put("navPrefix", "ip=" + ipAddress + "&queryname=" + (queryName == null ? "" : queryName) + "&domain=" + + report.getDomain() + (type == null ? "" : "&type=" + encode(type))); model.put("baseUri", contextPath + "/mvc/r/t"); model.put("sample", sample(report.getDomain())); model.put("model", model); diff --git a/cat-home/src/main/webapp/jsp/spring/report/event/event.jsp b/cat-home/src/main/webapp/jsp/spring/report/event/event.jsp index c88e2e9c4e..6949afa796 100644 --- a/cat-home/src/main/webapp/jsp/spring/report/event/event.jsp +++ b/cat-home/src/main/webapp/jsp/spring/report/event/event.jsp @@ -1,69 +1,15 @@ <%@ page session="false" language="java" pageEncoding="UTF-8" %> <%@ page contentType="text/html; charset=utf-8" %> -<%@ page import="java.text.DecimalFormat" %> -<%@ page import="java.util.List" %> -<%@ page import="java.util.Map" %> -<%@ page import="com.dianping.cat.Constants" %> -<%@ page import="com.dianping.cat.consumer.event.model.entity.EventName" %> -<%@ page import="com.dianping.cat.consumer.event.model.entity.EventReport" %> -<%@ page import="com.dianping.cat.consumer.event.model.entity.EventType" %> -<%@ page import="com.dianping.cat.mvc.UrlNav" %> -<%@ page import="com.dianping.cat.report.page.event.DisplayNames" %> -<%@ page import="com.dianping.cat.report.page.event.DisplayNames.EventNameModel" %> -<%@ page import="com.dianping.cat.report.page.event.DisplayTypes" %> -<%@ page import="com.dianping.cat.report.page.event.DisplayTypes.EventTypeModel" %> -<%@ page import="com.dianping.cat.service.ProjectService.Department" %> -<%@ page import="com.dianping.cat.service.ProjectService.ProjectLine" %> -<% - String contextPath = (String) request.getAttribute("contextPath"); - String domain = (String) request.getAttribute("domain"); - String displayDomain = (String) request.getAttribute("displayDomain"); - String ipAddress = (String) request.getAttribute("ipAddress"); - String date = (String) request.getAttribute("date"); - String reportType = (String) request.getAttribute("reportType"); - String type = (String) request.getAttribute("type"); - String encodedType = (String) request.getAttribute("encodedType"); - String reportStart = (String) request.getAttribute("reportStart"); - String reportEnd = (String) request.getAttribute("reportEnd"); - String ipToHostnameStr = (String) request.getAttribute("ipToHostnameStr"); - String pieChart = (String) request.getAttribute("pieChart"); - EventReport report = (EventReport) request.getAttribute("report"); - DisplayTypes displayTypeReport = (DisplayTypes) request.getAttribute("displayTypeReport"); - DisplayNames displayNameReport = (DisplayNames) request.getAttribute("displayNameReport"); - List ips = (List) request.getAttribute("ips"); - List groups = (List) request.getAttribute("groups"); - Map domainGroups = (Map) request.getAttribute("domainGroups"); - UrlNav[] navs = (UrlNav[]) request.getAttribute("navs"); - Number sample = (Number) request.getAttribute("sample"); - DecimalFormat integerFormat = new DecimalFormat("#,###,###,###,##0"); - DecimalFormat percentFormat = new DecimalFormat("0.0000%"); - DecimalFormat oneDecimalFormat = new DecimalFormat("###,##0.0"); - DecimalFormat totalPercentFormat = new DecimalFormat("0.0000%"); - int lastIndex = -1; - - if (contextPath == null) { - contextPath = request.getContextPath(); - } - if (domain == null) { - domain = Constants.CAT; - } - if (displayDomain == null) { - displayDomain = domain; - } - if (ipAddress == null) { - ipAddress = Constants.ALL; - } - if (date == null) { - date = ""; - } - if (reportType == null || reportType.length() == 0) { - reportType = "day"; - } - if (encodedType == null) { - encodedType = ""; - } - String navPrefix = "ip=" + ipAddress + "&domain=" + domain + (type == null ? "" : "&type=" + encodedType); -%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + + + + + @@ -71,23 +17,23 @@ CAT - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + -<% if ("All".equals(ipAddress) && distributionDetails != null) { %> + - + - <% for (DistributionDetail item : distributionDetails) { %> + - - - - + + + + - <% } %> +
分布统计
鍒嗗竷缁熻
Ip Total Failure Failure%
<%=html(item.getIp())%><%=integerFormat.format(item.getTotalCount())%><%=integerFormat.format(item.getFailCount())%><%=percentFormat.format(item.getFailPercent() / 100)%>

- + -<% } %> +

-<%! - private String html(String value) { - if (value == null) { - return ""; - } - return value.replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """); - } -%> diff --git a/cat-home/src/main/webapp/jsp/spring/report/transaction/transaction.jsp b/cat-home/src/main/webapp/jsp/spring/report/transaction/transaction.jsp index dfa6d43e9d..023def1385 100644 --- a/cat-home/src/main/webapp/jsp/spring/report/transaction/transaction.jsp +++ b/cat-home/src/main/webapp/jsp/spring/report/transaction/transaction.jsp @@ -1,65 +1,12 @@ <%@ page session="false" language="java" pageEncoding="UTF-8" %> <%@ page contentType="text/html; charset=utf-8" %> -<%@ page import="java.text.DecimalFormat" %> -<%@ page import="java.util.List" %> -<%@ page import="java.util.Map" %> -<%@ page import="com.dianping.cat.Constants" %> -<%@ page import="com.dianping.cat.consumer.transaction.model.entity.TransactionName" %> -<%@ page import="com.dianping.cat.consumer.transaction.model.entity.TransactionReport" %> -<%@ page import="com.dianping.cat.consumer.transaction.model.entity.TransactionType" %> -<%@ page import="com.dianping.cat.mvc.UrlNav" %> -<%@ page import="com.dianping.cat.report.page.transaction.DisplayNames" %> -<%@ page import="com.dianping.cat.report.page.transaction.DisplayNames.TransactionNameModel" %> -<%@ page import="com.dianping.cat.report.page.transaction.DisplayTypes" %> -<%@ page import="com.dianping.cat.report.page.transaction.DisplayTypes.TransactionTypeModel" %> -<%@ page import="com.dianping.cat.service.ProjectService.Department" %> -<%@ page import="com.dianping.cat.service.ProjectService.ProjectLine" %> -<% - String contextPath = (String) request.getAttribute("contextPath"); - String domain = (String) request.getAttribute("domain"); - String displayDomain = (String) request.getAttribute("displayDomain"); - String ipAddress = (String) request.getAttribute("ipAddress"); - String date = (String) request.getAttribute("date"); - String reportType = (String) request.getAttribute("reportType"); - String type = (String) request.getAttribute("type"); - String encodedType = (String) request.getAttribute("encodedType"); - String queryName = (String) request.getAttribute("queryName"); - String reportStart = (String) request.getAttribute("reportStart"); - String reportEnd = (String) request.getAttribute("reportEnd"); - String ipToHostnameStr = (String) request.getAttribute("ipToHostnameStr"); - String pieChart = (String) request.getAttribute("pieChart"); - TransactionReport report = (TransactionReport) request.getAttribute("report"); - DisplayTypes displayTypeReport = (DisplayTypes) request.getAttribute("displayTypeReport"); - DisplayNames displayNameReport = (DisplayNames) request.getAttribute("displayNameReport"); - List ips = (List) request.getAttribute("ips"); - List groups = (List) request.getAttribute("groups"); - Map domainGroups = (Map) request.getAttribute("domainGroups"); - UrlNav[] navs = (UrlNav[]) request.getAttribute("navs"); - Double sample = (Double) request.getAttribute("sample"); - DecimalFormat integerFormat = new DecimalFormat("#,###,###,###,##0"); - DecimalFormat percentFormat = new DecimalFormat("0.0000%"); - DecimalFormat totalPercentFormat = new DecimalFormat("0.00%"); - DecimalFormat oneDecimalFormat = new DecimalFormat("###,##0.0"); - DecimalFormat optionalDecimalFormat = new DecimalFormat("###,##0.#"); - - if (contextPath == null) { - contextPath = request.getContextPath(); - } - if (displayDomain == null) { - displayDomain = domain; - } - if (queryName == null) { - queryName = ""; - } - if (encodedType == null) { - encodedType = ""; - } - if (reportType == null || reportType.length() == 0) { - reportType = "day"; - } - String navPrefix = "ip=" + ipAddress + "&queryname=" + queryName + "&domain=" + domain - + (type == null ? "" : "&type=" + encodedType); -%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + + @@ -67,23 +14,23 @@ CAT - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - <%=graph1 == null ? "" : graph1%> - <%=graph2 == null ? "" : graph2%> - <%=graph3 == null ? "" : graph3%> - <%=graph4 == null ? "" : graph4%> + + + + -<% if ("All".equals(ipAddress) && distributionDetails != null) { %> + - + @@ -53,30 +35,30 @@ - <% for (DistributionDetail item : distributionDetails) { %> + - - - - - - - - + + + + + + + + - <% } %> +
鍒嗗竷缁熻
分布统计
Ip TotalAvg(ms) Std(ms)
<%=item.getIp()%><%=integerFormat.format(item.getTotalCount())%><%=integerFormat.format(item.getFailCount())%><%=percentFormat.format(item.getFailPercent() / 100)%><%=optionalDecimalFormat.format(item.getMin())%><%=optionalDecimalFormat.format(item.getMax())%><%=oneDecimalFormat.format(item.getAvg())%><%=oneDecimalFormat.format(item.getStd())%>

- + -<% } %> +

From 6f3eeab02dae7fd4384ef8d91c4a14eb268b2fbf Mon Sep 17 00:00:00 2001 From: Shang Date: Wed, 24 Jun 2026 09:46:44 +0800 Subject: [PATCH 185/231] =?UTF-8?q?=E9=87=8D=E6=9E=84problem=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/web/SpringMvcMigrationServlet.java | 4 + .../web/SpringMvcProblemController.java | 322 ++++++++++++ .../spring/web/SpringMvcTopController.java | 97 +++- .../spring/report/common/reportSidebar.jsp | 77 +++ .../webapp/jsp/spring/report/event/event.jsp | 77 +-- .../webapp/jsp/spring/report/home/home.jsp | 150 +++--- .../report/problem/problemHourlyGraphs.jsp | 48 ++ .../spring/report/problem/problemStatics.jsp | 367 +++++++++++++ .../main/webapp/jsp/spring/report/top/top.jsp | 480 +++++++++--------- .../spring/report/transaction/transaction.jsp | 57 +-- 10 files changed, 1235 insertions(+), 444 deletions(-) create mode 100644 cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcProblemController.java create mode 100644 cat-home/src/main/webapp/jsp/spring/report/common/reportSidebar.jsp create mode 100644 cat-home/src/main/webapp/jsp/spring/report/problem/problemHourlyGraphs.jsp create mode 100644 cat-home/src/main/webapp/jsp/spring/report/problem/problemStatics.jsp diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java index 4f3c444464..a31102edda 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcMigrationServlet.java @@ -34,6 +34,8 @@ public class SpringMvcMigrationServlet extends HttpServlet { private SpringMvcProjectController m_projectController; + private SpringMvcProblemController m_problemController; + private SpringMvcRouterController m_routerController; private SpringMvcTopController m_topController; @@ -59,6 +61,7 @@ public void init(ServletConfig config) throws ServletException { m_loginController = context.getBean(SpringMvcLoginController.class); m_pluginController = context.getBean(SpringMvcPluginController.class); m_projectController = context.getBean(SpringMvcProjectController.class); + m_problemController = context.getBean(SpringMvcProblemController.class); m_routerController = context.getBean(SpringMvcRouterController.class); m_topController = context.getBean(SpringMvcTopController.class); m_transactionController = context.getBean(SpringMvcTransactionController.class); @@ -90,6 +93,7 @@ private Map buildRoutes() { register(routes, "GET", "/r/top", m_topController::top); register(routes, "GET", "/r/t", m_transactionController::transaction); register(routes, "GET", "/r/e", m_eventController::event); + register(routes, "GET", "/r/p", m_problemController::problem); register(routes, "POST", "/s/login", m_loginController::submit); return Collections.unmodifiableMap(routes); diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcProblemController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcProblemController.java new file mode 100644 index 0000000000..abf3fe5b2f --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcProblemController.java @@ -0,0 +1,322 @@ +package com.dianping.cat.home.spring.web; + +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.dianping.cat.Constants; +import com.dianping.cat.config.sample.SampleConfigManager; +import com.dianping.cat.config.server.ServerConfigManager; +import com.dianping.cat.configuration.server.entity.Domain; +import com.dianping.cat.consumer.problem.model.entity.Machine; +import com.dianping.cat.consumer.problem.model.entity.ProblemReport; +import com.dianping.cat.helper.JsonBuilder; +import com.dianping.cat.helper.TimeHelper; +import com.dianping.cat.mvc.UrlNav; +import com.dianping.cat.report.page.DomainGroupConfigManager; +import com.dianping.cat.report.page.problem.LongConfig; +import com.dianping.cat.report.page.problem.transform.HourlyLineChartVisitor; +import com.dianping.cat.report.page.problem.transform.PieGraphChartVisitor; +import com.dianping.cat.report.page.problem.transform.ProblemStatistics; +import com.dianping.cat.report.service.ModelRequest; +import com.dianping.cat.report.service.ModelResponse; +import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.sample.entity.SampleConfig; +import com.dianping.cat.service.HostinfoService; +import com.dianping.cat.service.ProjectService; +import com.dianping.cat.service.ProjectService.Department; +import jakarta.annotation.Resource; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class SpringMvcProblemController { + private final SimpleDateFormat m_hourlyFormat = new SimpleDateFormat("yyyyMMddHH"); + + private final SimpleDateFormat m_subtitleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + @Resource + private DomainGroupConfigManager m_configManager; + + @Resource + private HostinfoService m_hostinfoService; + + @Resource + private ProjectService m_projectService; + + @Resource + private SampleConfigManager m_sampleConfigManager; + + @Resource + private ServerConfigManager m_serverConfigManager; + + @Resource + @Qualifier("problemModelService") + private ModelService m_problemService; + + @GetMapping("/mvc/r/p") + public void problem(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Map model = problemModel(request); + String view = "hourlyGraph".equals(model.get("action")) ? "/jsp/spring/report/problem/problemHourlyGraphs.jsp" + : "/jsp/spring/report/problem/problemStatics.jsp"; + + for (Map.Entry entry : model.entrySet()) { + request.setAttribute(entry.getKey(), entry.getValue()); + } + + RequestDispatcher dispatcher = request.getRequestDispatcher(view); + + dispatcher.forward(request, response); + } + + Map problemModel(HttpServletRequest request) { + Map model = new LinkedHashMap(); + String contextPath = request.getContextPath(); + String action = parameter(request, "op", "view"); + String domain = parameter(request, "domain", Constants.CAT); + String ipAddress = parameter(request, "ip", Constants.ALL); + String reportType = parameter(request, "reportType", "day"); + String type = emptyToNull(request.getParameter("type")); + String status = emptyToNull(request.getParameter("status")); + String group = emptyToNull(request.getParameter("group")); + int urlThreshold = intParameter(request, "urlThreshold", 1000); + int sqlThreshold = intParameter(request, "sqlThreshold", 100); + int serviceThreshold = intParameter(request, "serviceThreshold", 50); + int cacheThreshold = intParameter(request, "cacheThreshold", 10); + int callThreshold = intParameter(request, "callThreshold", 50); + long date = date(request.getParameter("date"), intParameter(request, "step", 0)); + LongConfig longConfig = new LongConfig().setUrlThreshold(urlThreshold).setSqlThreshold(sqlThreshold) + .setServiceThreshold(serviceThreshold).setCacheThreshold(cacheThreshold).setCallThreshold(callThreshold); + + if (StringUtils.isEmpty(group)) { + group = m_configManager.queryDefaultGroup(domain); + } + + ProblemReport report = queryHourlyReport(domain, ipAddress, type, status, date, + "hourlyGraph".equals(action) ? "detail" : "view"); + + if (report == null) { + report = new ProblemReport(domain); + report.setStartTime(new Date(date)); + report.setEndTime(new Date(date + TimeHelper.ONE_HOUR)); + } + + List ips = report.getIps() == null ? new ArrayList() : new ArrayList(report.getIps()); + + if ("hourlyGraph".equals(action)) { + buildHourlyGraphs(model, report, ipAddress, type, status); + } else { + ProblemStatistics statistics = new ProblemStatistics().setLongConfig(longConfig); + + if (Constants.ALL.equals(ipAddress)) { + statistics.setAllIp(true); + } else { + statistics.setIp(ipAddress); + } + statistics.visitProblemReport(report); + model.put("allStatistics", statistics); + model.put("defaultThreshold", defaultUrlThreshold(domain)); + model.put("defaultSqlThreshold", defaultSqlThreshold(domain)); + } + + model.put("action", action); + model.put("contextPath", contextPath); + model.put("domain", report.getDomain()); + model.put("displayDomain", domain); + model.put("ipAddress", ipAddress); + model.put("reportType", reportType); + model.put("type", type); + model.put("status", status); + model.put("date", m_hourlyFormat.format(new Date(date))); + model.put("longDate", date); + model.put("report", report); + model.put("reportStart", m_subtitleFormat.format(report.getStartTime())); + model.put("reportEnd", m_subtitleFormat.format(report.getEndTime())); + model.put("ips", ips); + model.put("ipToHostnameStr", new JsonBuilder().toJson(ipToHostname(ips))); + model.put("groups", m_configManager.queryDomainGroup(domain)); + model.put("group", group); + model.put("groupIps", m_configManager.queryIpByDomainAndGroup(domain, group)); + model.put("domainGroups", domainGroups()); + model.put("navs", UrlNav.values()); + model.put("baseUri", contextPath + "/mvc/r/p"); + model.put("sample", sample(report.getDomain())); + model.put("queryString", queryString(urlThreshold, sqlThreshold, serviceThreshold, cacheThreshold, callThreshold)); + model.put("urlThreshold", urlThreshold); + model.put("sqlThreshold", sqlThreshold); + model.put("serviceThreshold", serviceThreshold); + model.put("cacheThreshold", cacheThreshold); + model.put("callThreshold", callThreshold); + model.put("navPrefix", "op=view&domain=" + report.getDomain() + "&ip=" + ipAddress + + queryString(urlThreshold, sqlThreshold, serviceThreshold, cacheThreshold, callThreshold)); + return model; + } + + private void buildHourlyGraphs(Map model, ProblemReport report, String ipAddress, String type, + String status) { + HourlyLineChartVisitor visitor = new HourlyLineChartVisitor(ipAddress, type, status, report.getStartTime()); + + visitor.visitProblemReport(report); + model.put("errorsTrend", new JsonBuilder().toJson(visitor.getGraphItem())); + + if (Constants.ALL.equalsIgnoreCase(ipAddress)) { + PieGraphChartVisitor pieChart = new PieGraphChartVisitor(type, status); + + pieChart.visitProblemReport(report); + model.put("distributionChart", pieChart.getPieChart().getJsonString()); + } + } + + private long date(String value, int step) { + long current = System.currentTimeMillis(); + long currentHour = current - current % TimeHelper.ONE_HOUR; + long result = currentHour; + + if (value != null && value.length() > 0) { + try { + result = value.length() == 10 ? m_hourlyFormat.parse(value).getTime() + : new SimpleDateFormat("yyyyMMdd").parse(value).getTime(); + } catch (ParseException e) { + result = currentHour; + } + } + result = result + step * TimeHelper.ONE_HOUR; + return Math.min(result, currentHour); + } + + private String defaultSqlThreshold(String domain) { + Map domains = m_serverConfigManager.getLongConfigDomains(); + Domain config = domains.get(domain); + + if (config != null) { + int threshold = config.getSqlThreshold(); + + if (threshold != 100 && threshold != 500 && threshold != 1000) { + NumberFormat format = new DecimalFormat("#"); + + return ""; + } + } + return ""; + } + + private String defaultUrlThreshold(String domain) { + Map domains = m_serverConfigManager.getLongConfigDomains(); + Domain config = domains.get(domain); + + if (config != null) { + int threshold = config.getUrlThreshold() == null ? m_serverConfigManager.getLongUrlDefaultThreshold() + : config.getUrlThreshold(); + + if (threshold != 500 && threshold != 1000 && threshold != 2000 && threshold != 3000 && threshold != 4000 + && threshold != 5000) { + NumberFormat format = new DecimalFormat("#.##"); + + return ""; + } + } + return ""; + } + + private Map domainGroups() { + Collection domains = m_projectService.findAllDomains(); + + return m_projectService.findDepartments(domains); + } + + private String emptyToNull(String value) { + return value == null || value.length() == 0 ? null : value; + } + + private int intParameter(HttpServletRequest request, String name, int defaultValue) { + String value = request.getParameter(name); + + if (value != null && value.length() > 0) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + return defaultValue; + } + } + return defaultValue; + } + + private Map ipToHostname(List ips) { + Map result = new LinkedHashMap(); + + for (String ip : ips) { + String hostname = m_hostinfoService.queryHostnameByIp(ip); + + if (hostname != null && !"null".equalsIgnoreCase(hostname)) { + result.put(ip, hostname); + } + } + return result; + } + + private String parameter(HttpServletRequest request, String name, String defaultValue) { + String value = request.getParameter(name); + + if (value == null || value.length() == 0) { + return defaultValue; + } + return value; + } + + private ProblemReport queryHourlyReport(String domain, String ipAddress, String type, String status, long date, + String queryType) { + ModelRequest request = new ModelRequest(domain, date).setProperty("queryType", queryType); + + if (!Constants.ALL.equals(ipAddress)) { + request.setProperty("ip", ipAddress); + } + if (!StringUtils.isEmpty(type)) { + request.setProperty("type", type); + } + if (!StringUtils.isEmpty(status)) { + request.setProperty("name", status); + } + if (m_problemService.isEligable(request)) { + ModelResponse response = m_problemService.invoke(request); + + return response.getModel(); + } + return null; + } + + private String queryString(int urlThreshold, int sqlThreshold, int serviceThreshold, int cacheThreshold, + int callThreshold) { + return "&urlThreshold=" + urlThreshold + "&sqlThreshold=" + sqlThreshold + "&serviceThreshold=" + + serviceThreshold + "&cacheThreshold=" + cacheThreshold + "&callThreshold=" + callThreshold; + } + + private double sample(String domain) { + SampleConfig config = m_sampleConfigManager.getConfig(); + com.dianping.cat.sample.entity.Domain sampleDomain = config.findDomain(domain); + + return sampleDomain == null ? 1.0 : sampleDomain.getSample(); + } + + @SuppressWarnings("unused") + private String encode(String value) { + return value == null ? "" : URLEncoder.encode(value, StandardCharsets.UTF_8); + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTopController.java b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTopController.java index 9a897c2904..ba98e35ae2 100644 --- a/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTopController.java +++ b/cat-home/src/main/java/com/dianping/cat/home/spring/web/SpringMvcTopController.java @@ -5,7 +5,6 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; @@ -19,7 +18,10 @@ import com.dianping.cat.Constants; import com.dianping.cat.consumer.top.model.entity.TopReport; import com.dianping.cat.helper.TimeHelper; +import com.dianping.cat.mvc.UrlNav; +import com.dianping.cat.config.sample.SampleConfigManager; import com.dianping.cat.report.alert.exception.ExceptionRuleConfigManager; +import com.dianping.cat.report.page.DomainGroupConfigManager; import com.dianping.cat.report.page.dependency.TopExceptionExclude; import com.dianping.cat.report.page.dependency.TopMetric; import com.dianping.cat.report.page.state.StateBuilder; @@ -27,6 +29,9 @@ import com.dianping.cat.report.service.ModelRequest; import com.dianping.cat.report.service.ModelResponse; import com.dianping.cat.report.service.ModelService; +import com.dianping.cat.sample.entity.Domain; +import com.dianping.cat.service.ProjectService; +import com.dianping.cat.service.ProjectService.Department; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; @@ -41,6 +46,15 @@ public class SpringMvcTopController { @Resource private ExceptionRuleConfigManager m_configManager; + @Resource + private DomainGroupConfigManager m_domainGroupConfigManager; + + @Resource + private ProjectService m_projectService; + + @Resource + private SampleConfigManager m_sampleConfigManager; + @Resource private StateBuilder m_stateBuilder; @@ -117,6 +131,12 @@ Map topModel(HttpServletRequest request) { model.put("topReport", report); model.put("topMetric", topMetric); model.put("topResult", topMetric.getError().getResult()); + model.put("topResultView", topResultView(topMetric.getError().getResult())); + model.put("domainGroups", domainGroups()); + model.put("groups", m_domainGroupConfigManager.queryDomainGroup(domain)); + model.put("navs", UrlNav.values()); + model.put("baseUri", contextPath + "/mvc/r/top"); + model.put("sample", sample(domain)); model.put("homeUrl", contextPath + "/mvc/r/home"); model.put("model", model); return model; @@ -188,6 +208,10 @@ private List minutes() { return minutes; } + private Map domainGroups() { + return m_projectService.findDepartments(m_projectService.findAllDomains()); + } + private String parameter(HttpServletRequest request, String name, String defaultValue) { String value = request.getParameter(name); @@ -197,6 +221,77 @@ private String parameter(HttpServletRequest request, String name, String default return value; } + private Map> topResultView(Map> topResult) { + Map> result = new LinkedHashMap>(); + + for (Map.Entry> entry : topResult.entrySet()) { + List items = new ArrayList(); + + for (TopMetric.Item item : entry.getValue()) { + items.add(new TopItemView(item)); + } + result.put(entry.getKey(), items); + } + return result; + } + + private double sample(String domain) { + Domain sampleDomain = m_sampleConfigManager.getConfig().findDomain(domain); + + return sampleDomain == null ? 1.0 : sampleDomain.getSample(); + } + + public static class TopItemView { + private final TopMetric.Item m_item; + + private final String m_linkStyle; + + private final String m_shortDomain; + + private final String m_style; + + public TopItemView(TopMetric.Item item) { + m_item = item; + m_shortDomain = item == null ? "" : item.getDomain() == null ? "" : item.getDomain().length() <= 18 + ? item.getDomain() : item.getDomain().substring(0, 18); + + if (item != null && item.getAlert() == 2) { + m_style = "background-color:red;color:white;"; + m_linkStyle = "color:white;"; + } else if (item != null && item.getAlert() == 1) { + m_style = "background-color:#bfa22f;color:white;"; + m_linkStyle = "color:white;"; + } else { + m_style = ""; + m_linkStyle = ""; + } + } + + public String getDomain() { + return m_item.getDomain(); + } + + public String getErrorInfo() { + return m_item.getErrorInfo(); + } + + public String getLinkStyle() { + return m_linkStyle; + } + + public String getShortDomain() { + return m_shortDomain; + } + + public String getStyle() { + return m_style; + } + + public double getValue() { + return m_item.getValue(); + } + } + private TopReport queryTopReport(long date) { ModelRequest request = new ModelRequest(Constants.CAT, date).setProperty("date", String.valueOf(date)); diff --git a/cat-home/src/main/webapp/jsp/spring/report/common/reportSidebar.jsp b/cat-home/src/main/webapp/jsp/spring/report/common/reportSidebar.jsp new file mode 100644 index 0000000000..48ef8ffd93 --- /dev/null +++ b/cat-home/src/main/webapp/jsp/spring/report/common/reportSidebar.jsp @@ -0,0 +1,77 @@ +<%@ page session="false" language="java" pageEncoding="UTF-8" %> +<%@ page contentType="text/html; charset=utf-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + + diff --git a/cat-home/src/main/webapp/jsp/spring/report/event/event.jsp b/cat-home/src/main/webapp/jsp/spring/report/event/event.jsp index 6949afa796..cb1894ab0a 100644 --- a/cat-home/src/main/webapp/jsp/spring/report/event/event.jsp +++ b/cat-home/src/main/webapp/jsp/spring/report/event/event.jsp @@ -53,7 +53,7 @@
- + +
@@ -144,8 +91,8 @@